@riducms/admin 0.2.2 → 0.3.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 (352) hide show
  1. package/THIRD_PARTY_NOTICES.md +60 -37
  2. package/package.json +27 -15
  3. package/src/app/admin-core-view-route.svelte +38 -53
  4. package/src/app/admin-extension-route.svelte +19 -0
  5. package/src/app/admin-layout.scss +175 -0
  6. package/src/app/admin-layout.svelte +144 -410
  7. package/src/app/admin-navigation-progress.svelte +11 -77
  8. package/src/app/admin-page-title.svelte +17 -85
  9. package/src/app/admin-page-title.ts +136 -0
  10. package/src/app/admin-route-error.svelte +24 -0
  11. package/src/app/admin-router-provider.svelte +34 -0
  12. package/src/app/admin-router-root.svelte +41 -0
  13. package/src/app/admin-routes.svelte +56 -19
  14. package/src/app/loading-boundary.svelte +3 -1
  15. package/src/app-meta.ts +13 -0
  16. package/src/app.css +138 -496
  17. package/src/app.svelte +60 -26
  18. package/src/components/brand/ridu-logo.svelte +19 -5
  19. package/src/components/data/list-table.scss +63 -0
  20. package/src/components/icons/LICENSE.md +24 -0
  21. package/src/components/icons/chevron.svelte +8 -0
  22. package/src/components/icons/plus.svelte +12 -0
  23. package/src/components/icons/search.svelte +12 -0
  24. package/src/components/icons/x.svelte +8 -0
  25. package/src/components/json-tree/json-tree-node.svelte +61 -67
  26. package/src/components/json-tree/json-viewer.scss +153 -0
  27. package/src/components/json-tree/json-viewer.svelte +57 -96
  28. package/src/components/ui/banner/banner.scss +28 -0
  29. package/src/components/ui/banner/banner.svelte +9 -8
  30. package/src/components/ui/banner/index.ts +1 -5
  31. package/src/components/ui/code-editor/code-editor.scss +20 -0
  32. package/src/components/ui/code-editor/code-editor.svelte +71 -0
  33. package/src/components/ui/code-editor/code-editor.ts +151 -0
  34. package/src/components/ui/code-editor/code-languages.ts +29 -0
  35. package/src/components/ui/collapsible-panel/collapsible-panel.scss +38 -0
  36. package/src/components/ui/collapsible-panel/collapsible-panel.svelte +13 -0
  37. package/src/components/ui/collapsible-panel/index.ts +1 -0
  38. package/src/components/ui/combobox/combobox.scss +163 -0
  39. package/src/components/ui/combobox/index.ts +22 -0
  40. package/src/components/ui/date-value-control/date-value-calendar.svelte +128 -16
  41. package/src/components/ui/date-value-control/date-value-control-loader.scss +26 -0
  42. package/src/components/ui/date-value-control/date-value-control-loader.svelte +35 -13
  43. package/src/components/ui/date-value-control/date-value-control.scss +223 -0
  44. package/src/components/ui/date-value-control/date-value-control.svelte +62 -44
  45. package/src/components/ui/drawer/drawer-depth.ts +8 -0
  46. package/src/components/ui/dropdown-menu/dropdown-menu-content.svelte +2 -5
  47. package/src/components/ui/dropdown-menu/dropdown-menu-item.svelte +2 -5
  48. package/src/components/ui/dropdown-menu/dropdown-menu-separator.svelte +2 -2
  49. package/src/components/ui/dropdown-menu/dropdown-menu.scss +62 -0
  50. package/src/components/ui/kbd/kbd.scss +17 -0
  51. package/src/components/ui/kbd/kbd.svelte +3 -10
  52. package/src/components/ui/navigation-drawer/navigation-drawer.scss +40 -0
  53. package/src/components/ui/navigation-drawer/navigation-drawer.svelte +38 -0
  54. package/src/components/ui/popover/popover-content.svelte +3 -5
  55. package/src/components/ui/popover/popover.scss +18 -0
  56. package/src/components/ui/radio-group/index.ts +0 -1
  57. package/src/components/ui/radio-group/radio-card-item.svelte +7 -12
  58. package/src/components/ui/radio-group/radio-group.svelte +2 -2
  59. package/src/components/ui/radio-group/radio.scss +45 -0
  60. package/src/components/ui/select/select-content.svelte +5 -6
  61. package/src/components/ui/select/select-item.svelte +8 -8
  62. package/src/components/ui/select/select-scroll-down-button.svelte +3 -5
  63. package/src/components/ui/select/select-scroll-up-button.svelte +3 -5
  64. package/src/components/ui/select/select-trigger.svelte +6 -7
  65. package/src/components/ui/select/select.scss +126 -0
  66. package/src/components/ui/sheet/sheet-content.svelte +6 -34
  67. package/src/components/ui/sheet/sheet-description.svelte +2 -2
  68. package/src/components/ui/sheet/sheet-overlay.svelte +2 -21
  69. package/src/components/ui/sheet/sheet-title.svelte +2 -2
  70. package/src/components/ui/sheet/sheet.scss +221 -0
  71. package/src/components/ui/skeleton/skeleton.scss +20 -0
  72. package/src/components/ui/skeleton/skeleton.svelte +4 -16
  73. package/src/components/ui/sonner/sonner.scss +121 -0
  74. package/src/components/ui/sonner/sonner.svelte +11 -10
  75. package/src/components/ui/status-indicator/status-indicator.scss +48 -0
  76. package/src/components/ui/status-indicator/status-indicator.svelte +14 -14
  77. package/src/components/ui/tabs/tabs-content.svelte +2 -2
  78. package/src/components/ui/tabs/tabs-list.svelte +7 -7
  79. package/src/components/ui/tabs/tabs-trigger.svelte +2 -8
  80. package/src/components/ui/tabs/tabs.scss +86 -0
  81. package/src/components/ui/tabs/tabs.svelte +2 -2
  82. package/src/components/ui/timezone-picker/timezone-picker.svelte +152 -0
  83. package/src/core/api/admin-client.ts +2 -2
  84. package/src/core/bootstrap/admin-bootstrap.ts +396 -0
  85. package/src/core/bootstrap/admin-prepared-state.ts +213 -0
  86. package/src/core/bootstrap/admin-route-modules.ts +66 -0
  87. package/src/core/clipboard/copy-feedback.svelte.ts +43 -0
  88. package/src/core/forms/embedded-fields.ts +4 -8
  89. package/src/core/forms/field-editor-authoring.ts +8 -0
  90. package/src/core/forms/field-issue-focus.ts +4 -4
  91. package/src/core/forms/field-occurrence.ts +4 -7
  92. package/src/core/forms/form-controller.svelte.ts +14 -21
  93. package/src/core/forms/form-draft-recovery.ts +17 -4
  94. package/src/core/forms/form-issue-correlation.ts +13 -13
  95. package/src/core/forms/form-path.ts +17 -0
  96. package/src/core/forms/form-schema.ts +12 -43
  97. package/src/core/forms/form-validation.ts +7 -46
  98. package/src/core/forms/plugin-field-authoring.ts +6 -2
  99. package/src/core/forms/plugin-field-write.ts +2 -6
  100. package/src/core/i18n/admin-i18n.svelte.ts +18 -0
  101. package/src/core/i18n/format-admin-date-time.ts +19 -0
  102. package/src/core/i18n/humanize-identifier.ts +5 -0
  103. package/src/core/i18n/time-zone-label.ts +20 -0
  104. package/src/core/loaders/admin-view-host.svelte +72 -0
  105. package/src/core/loaders/admin-view-loader.svelte.ts +90 -0
  106. package/src/core/notifications/validation-toast.svelte +2 -2
  107. package/src/core/plugins/field-registry.ts +7 -8
  108. package/src/core/routing/admin-paths.ts +53 -2
  109. package/src/core/routing/admin-scroll.svelte.ts +74 -0
  110. package/src/core/routing/admin-view-selection.ts +78 -0
  111. package/src/core/runtime/admin-runtime.svelte.ts +121 -124
  112. package/src/core/schema/field-default.ts +33 -0
  113. package/src/core/schema/field-localization.ts +15 -0
  114. package/src/core/schema/read-document-path.ts +11 -0
  115. package/src/features/account/account-menu.scss +37 -0
  116. package/src/features/account/account-menu.svelte +115 -0
  117. package/src/features/{auth → account}/account-navigation.svelte +16 -19
  118. package/src/features/{auth → account}/account-route.svelte +206 -49
  119. package/src/features/account/account-security-controller.svelte.ts +157 -0
  120. package/src/features/{auth → account}/account-security-route.svelte +140 -42
  121. package/src/features/api-reference/api-reference-code.svelte +64 -0
  122. package/src/features/api-reference/api-reference-content.svelte +258 -0
  123. package/src/features/api-reference/api-reference-drawer.scss +74 -0
  124. package/src/features/api-reference/api-reference-examples.ts +381 -0
  125. package/src/features/api-reference/api-reference-schema.ts +332 -0
  126. package/src/features/api-reference/api-reference.scss +190 -0
  127. package/src/features/api-reference/api-reference.svelte +74 -0
  128. package/src/features/auth/auth-brand.svelte +5 -3
  129. package/src/features/auth/auth-field.svelte +92 -0
  130. package/src/features/auth/auth-frame.svelte +5 -8
  131. package/src/features/auth/auth.scss +122 -0
  132. package/src/features/auth/create-first-user-controller.svelte.ts +20 -51
  133. package/src/features/auth/create-first-user-route.svelte +83 -122
  134. package/src/features/auth/forgot-password-route.svelte +31 -23
  135. package/src/features/auth/login-route.svelte +68 -116
  136. package/src/features/auth/logout-button.scss +34 -0
  137. package/src/features/auth/logout-button.svelte +52 -0
  138. package/src/features/auth/request-verification-route.svelte +27 -22
  139. package/src/features/auth/reset-password-route.svelte +108 -41
  140. package/src/features/auth/verify-email-route.svelte +49 -15
  141. package/src/features/bulk-edit/bulk-edit-fields.ts +23 -0
  142. package/src/features/bulk-edit/bulk-edit.scss +152 -0
  143. package/src/features/bulk-edit/field-picker.svelte +176 -0
  144. package/src/features/collections/bulk/bulk-actions.svelte +148 -0
  145. package/src/features/collections/bulk/bulk-confirmation.svelte +153 -0
  146. package/src/features/collections/bulk/bulk-editor-loader.svelte +95 -0
  147. package/src/features/collections/bulk/bulk-editor.svelte +186 -0
  148. package/src/features/collections/collection-list-cell-values.ts +144 -0
  149. package/src/features/collections/collection-list-controller.svelte.ts +268 -379
  150. package/src/features/collections/collection-list-preferences-controller.svelte.ts +54 -40
  151. package/src/features/collections/collection-list-query.ts +223 -0
  152. package/src/features/collections/collection-list-results.svelte +205 -329
  153. package/src/features/collections/collection-list-route.svelte +143 -884
  154. package/src/features/collections/collection-list.scss +261 -0
  155. package/src/features/collections/collection-list.svelte.ts +362 -0
  156. package/src/features/collections/controls/column-picker.svelte +110 -0
  157. package/src/features/collections/controls/column-pill.svelte +62 -0
  158. package/src/features/collections/controls/filter-builder.svelte +193 -0
  159. package/src/features/collections/controls/filter-row.svelte +142 -0
  160. package/src/features/collections/controls/list-controls.scss +196 -0
  161. package/src/features/collections/controls/list-options.svelte +203 -0
  162. package/src/features/collections/controls/list-pagination.scss +78 -0
  163. package/src/features/collections/controls/list-pagination.svelte +115 -0
  164. package/src/features/collections/controls/list-toolbar.svelte +132 -0
  165. package/src/features/collections/controls/sort-heading.scss +52 -0
  166. package/src/features/collections/controls/sort-heading.svelte +78 -0
  167. package/src/features/collections/list-columns.ts +43 -0
  168. package/src/features/collections/list-workspace.ts +155 -54
  169. package/src/features/dashboard/dashboard-route.svelte +82 -86
  170. package/src/features/dashboard/dashboard.scss +131 -0
  171. package/src/features/development/development-tools.svelte +20 -36
  172. package/src/features/documents/document-action-bar.svelte +438 -0
  173. package/src/features/documents/document-api-view-loader.svelte +17 -6
  174. package/src/features/documents/document-api-view.scss +120 -0
  175. package/src/features/documents/document-api-view.svelte +169 -454
  176. package/src/features/documents/document-controller.svelte.ts +526 -613
  177. package/src/features/documents/document-credentials.scss +37 -0
  178. package/src/features/documents/document-credentials.svelte +72 -0
  179. package/src/features/documents/{document-route-dirty.ts → document-credentials.ts} +25 -0
  180. package/src/features/documents/document-field-sections.scss +39 -0
  181. package/src/features/documents/document-field-sections.svelte +4 -13
  182. package/src/features/documents/document-loading.scss +24 -0
  183. package/src/features/documents/document-lock-controller.svelte.ts +187 -0
  184. package/src/features/documents/document-operation-dialogs.svelte +110 -0
  185. package/src/features/documents/document-route-loader.svelte +17 -5
  186. package/src/features/documents/document-route.svelte +305 -811
  187. package/src/features/documents/document-schedule.scss +127 -0
  188. package/src/features/documents/document-schedule.svelte +323 -0
  189. package/src/features/documents/document-title.ts +25 -0
  190. package/src/features/documents/document.scss +274 -0
  191. package/src/features/documents/live-preview-panel.scss +117 -0
  192. package/src/features/documents/live-preview-panel.svelte +167 -168
  193. package/src/features/documents/live-preview.ts +2 -10
  194. package/src/features/documents/upload-document-preview-loader.svelte +26 -23
  195. package/src/features/localization/content-locale-switcher.scss +43 -0
  196. package/src/features/localization/content-locale-switcher.svelte +24 -17
  197. package/src/features/navigation/admin-breadcrumbs.scss +56 -0
  198. package/src/features/navigation/admin-breadcrumbs.svelte +102 -37
  199. package/src/features/navigation/admin-command-menu.svelte +38 -15
  200. package/src/features/navigation/admin-navigation.scss +133 -0
  201. package/src/features/navigation/admin-navigation.svelte +169 -0
  202. package/src/features/navigation/breadcrumb-context.svelte.ts +15 -0
  203. package/src/features/navigation/navigation-preference.svelte.ts +70 -0
  204. package/src/features/reference-browser/reference-browser-editor.svelte +180 -0
  205. package/src/features/reference-browser/reference-browser-list.scss +113 -0
  206. package/src/features/reference-browser/reference-browser-list.svelte +370 -0
  207. package/src/features/reference-browser/reference-browser-loader.svelte +26 -8
  208. package/src/features/reference-browser/reference-browser-workflow.svelte.ts +335 -236
  209. package/src/features/reference-browser/reference-browser.scss +217 -0
  210. package/src/features/reference-browser/reference-browser.svelte +154 -797
  211. package/src/features/reference-browser/reference-collection-picker.svelte +116 -0
  212. package/src/features/reference-browser/reference-list-query.ts +35 -0
  213. package/src/features/uploads/bulk-upload-controller.svelte.ts +604 -0
  214. package/src/features/uploads/bulk-upload-edit-all.svelte +92 -0
  215. package/src/features/uploads/bulk-upload-editor.svelte +191 -0
  216. package/src/features/uploads/bulk-upload-file-picker.svelte +70 -0
  217. package/src/features/uploads/bulk-upload-remote.svelte +100 -0
  218. package/src/features/uploads/bulk-upload-route-loader.svelte +54 -0
  219. package/src/features/uploads/bulk-upload-route.svelte +172 -592
  220. package/src/features/uploads/bulk-upload-sidebar.svelte +125 -0
  221. package/src/features/uploads/bulk-upload.scss +526 -0
  222. package/src/features/uploads/bulk-upload.ts +105 -14
  223. package/src/features/uploads/crop-surface.ts +150 -0
  224. package/src/features/uploads/image-editor.svelte +231 -0
  225. package/src/features/uploads/rendition-preview.svelte +64 -0
  226. package/src/features/uploads/upload-control.svelte +340 -0
  227. package/src/features/uploads/upload-document-contracts.ts +30 -0
  228. package/src/features/uploads/upload-draft.svelte.ts +294 -0
  229. package/src/features/uploads/upload-metadata-fields.scss +32 -0
  230. package/src/features/uploads/upload-metadata-fields.svelte +8 -7
  231. package/src/features/uploads/upload-thumbnail.svelte +47 -0
  232. package/src/features/uploads/upload.scss +361 -0
  233. package/src/features/versions/version-comparison.svelte +361 -0
  234. package/src/features/versions/version-diff-fields.svelte +136 -0
  235. package/src/features/versions/version-diff.ts +296 -41
  236. package/src/features/versions/version-history-controller.svelte.ts +311 -0
  237. package/src/features/versions/version-history-route-loader.svelte +32 -0
  238. package/src/features/versions/version-history-route.svelte +157 -522
  239. package/src/features/versions/version-history.scss +444 -0
  240. package/src/features/versions/version-history.ts +45 -0
  241. package/src/features/versions/version-table.svelte +91 -0
  242. package/src/fields/embedded-schema-draft-editor.scss +48 -0
  243. package/src/fields/embedded-schema-draft-editor.svelte +24 -16
  244. package/src/fields/field-collapsible.svelte +14 -8
  245. package/src/fields/field-layout.scss +171 -0
  246. package/src/fields/field-layout.svelte +3 -5
  247. package/src/fields/field-renderer.svelte +17 -29
  248. package/src/fields/field-shell.svelte +1 -1
  249. package/src/fields/field-tab-layout.svelte +25 -19
  250. package/src/fields/join/join-field-controller.svelte.ts +513 -0
  251. package/src/fields/join/join-field-values.ts +111 -0
  252. package/src/fields/join/join-field.scss +189 -0
  253. package/src/fields/join/join-field.svelte +164 -332
  254. package/src/fields/live-validation-feedback.svelte +4 -3
  255. package/src/fields/local-field-editor.svelte +2 -2
  256. package/src/fields/nested/block-name-input.svelte +11 -12
  257. package/src/fields/nested/block-picker.scss +128 -0
  258. package/src/fields/nested/block-picker.svelte +81 -0
  259. package/src/fields/nested/block-placeholder.svg +2 -0
  260. package/src/fields/nested/nested-field.scss +331 -0
  261. package/src/fields/nested/nested-field.svelte +265 -245
  262. package/src/fields/nested/sortable-row.svelte +9 -7
  263. package/src/fields/plugin-field.svelte +4 -6
  264. package/src/fields/point/point-field.svelte +51 -38
  265. package/src/fields/primitive-list/primitive-list-field.svelte +63 -19
  266. package/src/fields/primitive-list/primitive-list.scss +109 -0
  267. package/src/fields/radio/radio-field.svelte +2 -1
  268. package/src/fields/relationship/relationship-field-controller.svelte.ts +81 -41
  269. package/src/fields/relationship/relationship-field.svelte +144 -175
  270. package/src/fields/relationship/relationship-lookup-controller.svelte.ts +58 -30
  271. package/src/fields/relationship/relationship-query.ts +2 -10
  272. package/src/fields/relationship/relationship-quick-picker-controller.svelte.ts +36 -62
  273. package/src/fields/relationship/relationship-quick-picker.svelte +178 -227
  274. package/src/fields/relationship/relationship-selection.svelte +120 -0
  275. package/src/fields/relationship/relationship-value.ts +46 -7
  276. package/src/fields/relationship/relationship.scss +182 -0
  277. package/src/fields/scalar/code-field.svelte +101 -0
  278. package/src/fields/scalar/date-control-value.ts +13 -0
  279. package/src/fields/scalar/scalar-field.svelte +25 -67
  280. package/src/fields/select/select-field.svelte +132 -94
  281. package/src/fields/text/slug-field.scss +28 -0
  282. package/src/fields/text/slug-field.svelte +19 -15
  283. package/src/fields/text/text-field.svelte +1 -2
  284. package/src/fields/ui/ui-field.svelte +7 -4
  285. package/src/fields/virtual/virtual-field.svelte +2 -5
  286. package/src/index.ts +1 -2
  287. package/src/routing.ts +2 -0
  288. package/src/app/deferred-redirect.svelte +0 -23
  289. package/src/components/code-block/code-block.svelte +0 -107
  290. package/src/components/ui/bulk-action-bar/bulk-action-bar.svelte +0 -50
  291. package/src/components/ui/bulk-action-bar/index.ts +0 -1
  292. package/src/components/ui/button/index.ts +0 -8
  293. package/src/components/ui/calendar/calendar-caption.svelte +0 -72
  294. package/src/components/ui/calendar/calendar-cell.svelte +0 -20
  295. package/src/components/ui/calendar/calendar-day.svelte +0 -27
  296. package/src/components/ui/calendar/calendar-grid-row.svelte +0 -13
  297. package/src/components/ui/calendar/calendar-grid.svelte +0 -17
  298. package/src/components/ui/calendar/calendar-head-cell.svelte +0 -20
  299. package/src/components/ui/calendar/calendar-header.svelte +0 -20
  300. package/src/components/ui/calendar/calendar-heading.svelte +0 -17
  301. package/src/components/ui/calendar/calendar-month-select.svelte +0 -45
  302. package/src/components/ui/calendar/calendar-month.svelte +0 -16
  303. package/src/components/ui/calendar/calendar-months.svelte +0 -20
  304. package/src/components/ui/calendar/calendar-nav.svelte +0 -20
  305. package/src/components/ui/calendar/calendar-next-button.svelte +0 -30
  306. package/src/components/ui/calendar/calendar-prev-button.svelte +0 -30
  307. package/src/components/ui/calendar/calendar-year-select.svelte +0 -44
  308. package/src/components/ui/calendar/calendar.svelte +0 -118
  309. package/src/components/ui/calendar/index.ts +0 -1
  310. package/src/components/ui/checkbox/checkbox.svelte +0 -35
  311. package/src/components/ui/checkbox/index.ts +0 -1
  312. package/src/components/ui/dialog/dialog-close.svelte +0 -11
  313. package/src/components/ui/dialog/dialog-content.svelte +0 -52
  314. package/src/components/ui/dialog/dialog-description.svelte +0 -20
  315. package/src/components/ui/dialog/dialog-footer.svelte +0 -20
  316. package/src/components/ui/dialog/dialog-header.svelte +0 -20
  317. package/src/components/ui/dialog/dialog-overlay.svelte +0 -20
  318. package/src/components/ui/dialog/dialog-title.svelte +0 -17
  319. package/src/components/ui/dialog/dialog-trigger.svelte +0 -11
  320. package/src/components/ui/dialog/dialog.svelte +0 -7
  321. package/src/components/ui/dialog/index.ts +0 -8
  322. package/src/components/ui/empty-state/empty-state.svelte +0 -34
  323. package/src/components/ui/empty-state/index.ts +0 -1
  324. package/src/components/ui/input/index.ts +0 -1
  325. package/src/components/ui/pagination/index.ts +0 -1
  326. package/src/components/ui/pagination/pagination.svelte +0 -88
  327. package/src/components/ui/radio-group/radio-group-item.svelte +0 -17
  328. package/src/components/ui/slider/index.ts +0 -3
  329. package/src/components/ui/slider/slider-content.svelte +0 -59
  330. package/src/components/ui/slider/slider.svelte +0 -35
  331. package/src/components/ui/table/index.ts +0 -6
  332. package/src/components/ui/table/table-body.svelte +0 -20
  333. package/src/components/ui/table/table-cell.svelte +0 -23
  334. package/src/components/ui/table/table-head.svelte +0 -23
  335. package/src/components/ui/table/table-header.svelte +0 -20
  336. package/src/components/ui/table/table-row.svelte +0 -23
  337. package/src/components/ui/table/table.svelte +0 -22
  338. package/src/components/ui/textarea/index.ts +0 -1
  339. package/src/components/ui/tooltip/index.ts +0 -4
  340. package/src/components/ui/tooltip/tooltip-content.svelte +0 -50
  341. package/src/components/ui/tooltip/tooltip-provider.svelte +0 -7
  342. package/src/components/ui/tooltip/tooltip-trigger.svelte +0 -7
  343. package/src/components/ui/tooltip/tooltip.svelte +0 -7
  344. package/src/features/auth/account-menu.svelte +0 -159
  345. package/src/features/auth/account-security-controller.svelte.ts +0 -119
  346. package/src/features/collections/collection-list-bulk-actions.svelte +0 -143
  347. package/src/features/collections/collection-list-bulk-editor.svelte +0 -157
  348. package/src/features/collections/collection-list-filter-popover.svelte +0 -238
  349. package/src/features/collections/collection-list-workspace-toolbar.svelte +0 -409
  350. package/src/features/collections/collection-table-skeleton.svelte +0 -44
  351. package/src/features/documents/document-heading.ts +0 -20
  352. package/src/features/documents/upload-document-preview.svelte +0 -525
@@ -2,14 +2,12 @@
2
2
  import BookOpenIcon from "~icons/lucide/book-open";
3
3
  import ExternalLinkIcon from "~icons/lucide/external-link";
4
4
  import LoaderCircleIcon from "~icons/lucide/loader-circle";
5
- import { onDestroy } from "svelte";
6
5
 
7
6
  import RiduLogo from "@admin/components/brand/ridu-logo.svelte";
8
- import { Button } from "@admin/components/ui/button";
7
+ import { Button } from "@riducms/ui";
9
8
  import { Popover, PopoverContent, PopoverTrigger } from "@admin/components/ui/popover";
10
9
  import { StatusIndicator } from "@admin/components/ui/status-indicator";
11
10
  import { getAdminRuntime } from "@admin/core/runtime/admin-runtime.svelte";
12
- import { cn } from "@riducms/ui";
13
11
 
14
12
  type SchemaUpdateNotice = {
15
13
  tone: "success" | "error";
@@ -22,7 +20,6 @@
22
20
  let popoverOpen = $state(false);
23
21
  let recoveryAvailable = $state(runtime.manifestRefreshError !== undefined);
24
22
  let refreshObserved = false;
25
- let noticeTimer: number | undefined;
26
23
  const status = $derived(
27
24
  runtime.refreshingManifest
28
25
  ? {
@@ -45,23 +42,13 @@
45
42
  }
46
43
  );
47
44
 
48
- function hideNotice() {
49
- if (noticeTimer !== undefined) window.clearTimeout(noticeTimer);
50
- notice = undefined;
51
- noticeTimer = undefined;
52
- }
53
-
54
- function showNotice(next: SchemaUpdateNotice, duration: number) {
55
- hideNotice();
56
- notice = next;
57
- noticeTimer = window.setTimeout(() => {
58
- notice = undefined;
59
- noticeTimer = undefined;
60
- }, duration);
61
- }
62
-
63
- onDestroy(() => {
64
- if (noticeTimer !== undefined) window.clearTimeout(noticeTimer);
45
+ $effect(() => {
46
+ if (notice === undefined) return;
47
+ const timer = window.setTimeout(
48
+ () => (notice = undefined),
49
+ notice.tone === "error" ? 7_000 : 4_500
50
+ );
51
+ return () => window.clearTimeout(timer);
65
52
  });
66
53
 
67
54
  function retrySchema() {
@@ -74,7 +61,7 @@
74
61
  const error = runtime.manifestRefreshError;
75
62
  if (refreshing) {
76
63
  refreshObserved = true;
77
- hideNotice();
64
+ notice = undefined;
78
65
  updateApplied = false;
79
66
  return;
80
67
  }
@@ -83,12 +70,9 @@
83
70
 
84
71
  if (error !== undefined) {
85
72
  recoveryAvailable = true;
86
- showNotice({ tone: "error", label: runtime.i18n.t("development:schemaUpdateFailed") }, 7_000);
73
+ notice = { tone: "error", label: runtime.i18n.t("development:schemaUpdateFailed") };
87
74
  } else {
88
- showNotice(
89
- { tone: "success", label: runtime.i18n.t("development:schemaUpdateApplied") },
90
- 4_500
91
- );
75
+ notice = { tone: "success", label: runtime.i18n.t("development:schemaUpdateApplied") };
92
76
  updateApplied = true;
93
77
  if (recoveryAvailable) popoverOpen = false;
94
78
  recoveryAvailable = false;
@@ -99,12 +83,12 @@
99
83
  <div class="fixed end-3 bottom-3 z-30" data-ridu-development-tools>
100
84
  {#if notice !== undefined}
101
85
  <div
102
- class={cn(
86
+ class={[
103
87
  "ridu-popover-enter pointer-events-none absolute end-full bottom-0 me-2 flex h-9 max-w-[calc(100vw-4.5rem)] items-center gap-2 whitespace-nowrap rounded-[8px] border bg-popover px-3 text-[12.5px] font-medium shadow-[var(--shadow-popover)]",
104
88
  notice.tone === "error"
105
89
  ? "border-destructive/30 text-destructive"
106
- : "border-success/30 text-success"
107
- )}
90
+ : "border-success/30 text-success",
91
+ ]}
108
92
  role={notice.tone === "error" ? "alert" : "status"}
109
93
  data-ridu-development-toast
110
94
  data-tone={notice.tone}
@@ -116,14 +100,14 @@
116
100
 
117
101
  <Popover bind:open={popoverOpen}>
118
102
  <PopoverTrigger
119
- class={cn(
103
+ class={[
120
104
  "relative inline-grid size-9 cursor-pointer place-items-center rounded-full border bg-popover text-popover-foreground shadow-[var(--shadow-popover)] transition-[background-color,border-color,color] duration-150 outline-none hover:bg-control-hover focus-visible:outline-2 focus-visible:outline-ring/70 focus-visible:outline-offset-2",
121
105
  runtime.manifestRefreshError !== undefined
122
106
  ? "border-destructive/55"
123
107
  : updateApplied
124
108
  ? "border-success/55"
125
- : "border-control-border"
126
- )}
109
+ : "border-control-border",
110
+ ]}
127
111
  aria-label={runtime.i18n.t("development:toolsStatus", { status: status.label })}
128
112
  title={runtime.i18n.t("development:tools")}
129
113
  data-ridu-development-trigger
@@ -137,14 +121,14 @@
137
121
  <RiduLogo variant="arch" class="h-4 text-foreground" />
138
122
  {/if}
139
123
  <span
140
- class={cn(
124
+ class={[
141
125
  "absolute top-0 end-0 size-2.5 rounded-full border-2 border-popover",
142
126
  runtime.manifestRefreshError !== undefined
143
127
  ? "bg-destructive"
144
128
  : updateApplied
145
129
  ? "bg-success"
146
- : "bg-primary"
147
- )}
130
+ : "bg-primary",
131
+ ]}
148
132
  aria-hidden="true"
149
133
  ></span>
150
134
  </PopoverTrigger>
@@ -0,0 +1,438 @@
1
+ <script lang="ts">
2
+ import type { AdminDocumentExtensionHost } from "@riducms/plugin";
3
+ import type { DocumentController } from "@admin/features/documents/document-controller.svelte";
4
+ import { getAdminRuntime } from "@admin/core/runtime/admin-runtime.svelte";
5
+ import { Button, buttonVariants } from "@riducms/ui";
6
+ import { Popover, PopoverContent, PopoverTrigger } from "@admin/components/ui/popover";
7
+ import { Select, SelectContent, SelectItem, SelectTrigger } from "@admin/components/ui/select";
8
+ import { Link } from "@hvniel/svelte-router";
9
+ import { createDocumentPath, withContentLocale } from "@admin/core/routing/admin-paths";
10
+ import DocumentSchedule from "@admin/features/documents/document-schedule.svelte";
11
+ import ChevronDownIcon from "~icons/lucide/chevron-down";
12
+ import "@admin/features/documents/document-schedule.scss";
13
+ import KeyRoundIcon from "~icons/lucide/key-round";
14
+ import EyeIcon from "~icons/lucide/eye";
15
+ import MoreVerticalIcon from "~icons/lucide/more-vertical";
16
+ import LockKeyholeIcon from "~icons/lucide/lock-keyhole";
17
+
18
+ const runtime = getAdminRuntime();
19
+ let {
20
+ controller,
21
+ extensionHost,
22
+ localeEnabled,
23
+ activeLocale,
24
+ livePreviewOpen,
25
+ onTogglePreview,
26
+ onSave,
27
+ onPublish,
28
+ }: {
29
+ controller: DocumentController;
30
+ extensionHost: AdminDocumentExtensionHost;
31
+ localeEnabled: boolean;
32
+ activeLocale: string | undefined;
33
+ livePreviewOpen: boolean;
34
+ onTogglePreview: () => void;
35
+ onSave: (event: Event) => Promise<void>;
36
+ onPublish: (event: Event) => Promise<void>;
37
+ } = $props();
38
+ // The document controller owns one form for its full lifetime.
39
+ // svelte-ignore state_referenced_locally
40
+ const form = controller.form;
41
+ const localization = $derived(runtime.manifest?.application.localization);
42
+ const livePreview = $derived(controller.collection?.admin.livePreview);
43
+ let moreActionsOpen = $state(false);
44
+ let publishMenuOpen = $state(false);
45
+ let scheduleOpen = $state(false);
46
+ let now = $state.raw(Date.now());
47
+ $effect(() => {
48
+ if (
49
+ controller.lastSavedAt === undefined ||
50
+ !controller.collection?.versionSettings?.autosaveIntervalSeconds
51
+ )
52
+ return;
53
+ now = Date.now();
54
+ const timer = window.setInterval(() => (now = Date.now()), 30_000);
55
+ return () => window.clearInterval(timer);
56
+ });
57
+ const lastSavedDistance = $derived.by(() => {
58
+ if (controller.lastSavedAt === undefined) return undefined;
59
+ const elapsedMinutes = Math.floor(Math.max(0, now - controller.lastSavedAt) / 60_000);
60
+ if (elapsedMinutes === 0) return runtime.i18n.t("documents:lessThanMinuteAgo");
61
+ const relative = new Intl.RelativeTimeFormat(runtime.i18n.language, { numeric: "always" });
62
+ if (elapsedMinutes < 60) return relative.format(-elapsedMinutes, "minute");
63
+ const elapsedHours = Math.floor(elapsedMinutes / 60);
64
+ if (elapsedHours < 24) return relative.format(-elapsedHours, "hour");
65
+ return relative.format(-Math.floor(elapsedHours / 24), "day");
66
+ });
67
+ const showCopyLocale = $derived(
68
+ localeEnabled &&
69
+ activeLocale !== undefined &&
70
+ localization !== undefined &&
71
+ !controller.creating &&
72
+ controller.currentDocument !== undefined &&
73
+ localization.locales.length > 1
74
+ );
75
+ const showSchedule = $derived(
76
+ !controller.globalResource &&
77
+ !controller.creating &&
78
+ controller.versionedCollection &&
79
+ (controller.canPublish ||
80
+ (controller.currentStatus === "published" && controller.canUnpublish))
81
+ );
82
+ const customDocumentActions = $derived(
83
+ controller.globalResource
84
+ ? []
85
+ : runtime.config.extensions.documentActions.filter(
86
+ (action) =>
87
+ (action.collection === undefined || action.collection === controller.collectionSlug) &&
88
+ (action.requires === undefined || form.access?.operations[action.requires] === true)
89
+ )
90
+ );
91
+ const showDuplicate = $derived(
92
+ !controller.globalResource && !controller.creating && controller.canDuplicate
93
+ );
94
+ const showDownload = $derived(
95
+ !controller.globalResource &&
96
+ !controller.creating &&
97
+ controller.uploadCollection &&
98
+ controller.assetURL !== undefined
99
+ );
100
+ const showUnpublish = $derived(
101
+ !controller.creating &&
102
+ controller.versionedCollection &&
103
+ controller.currentStatus === "published" &&
104
+ controller.canUnpublish
105
+ );
106
+ const showCreate = $derived(
107
+ !controller.globalResource &&
108
+ !controller.creating &&
109
+ runtime.collectionOperations[controller.collectionSlug]?.create === true
110
+ );
111
+ const showDelete = $derived(
112
+ !controller.globalResource && !controller.creating && controller.canDelete
113
+ );
114
+
115
+ const primarySave = $derived.by(() => {
116
+ const publishesOnCreate =
117
+ controller.creating &&
118
+ controller.versionedCollection &&
119
+ (!controller.draftsCollection || controller.canPublish);
120
+ if (publishesOnCreate)
121
+ return {
122
+ label: runtime.i18n.t("documents:publish"),
123
+ disabled: !controller.canSave || !controller.canPublish,
124
+ onclick: onPublish,
125
+ };
126
+ if (
127
+ !controller.creating &&
128
+ controller.versionedCollection &&
129
+ (controller.currentStatus === "published" || controller.canPublish)
130
+ ) {
131
+ const publishingUnchangedDraft =
132
+ controller.currentStatus === "draft" && !controller.hasUnsavedChanges;
133
+ const publishBlocked = publishingUnchangedDraft
134
+ ? controller.currentDocument === undefined ||
135
+ controller.publicationOperation ||
136
+ controller.saveOutcomeUncertain ||
137
+ controller.upload.busy ||
138
+ form.submitting ||
139
+ controller.loading
140
+ : !controller.canSave;
141
+ return {
142
+ label: runtime.i18n.t("documents:publishChanges"),
143
+ disabled: !controller.canPublish || publishBlocked,
144
+ onclick: onPublish,
145
+ };
146
+ }
147
+ return {
148
+ label: runtime.i18n.t(
149
+ controller.versionedCollection && controller.draftsCollection
150
+ ? "documents:saveDraft"
151
+ : "documents:save"
152
+ ),
153
+ disabled:
154
+ !controller.canSave ||
155
+ (controller.versionedCollection &&
156
+ controller.currentStatus === "published" &&
157
+ !controller.canPublish),
158
+ onclick: onSave,
159
+ };
160
+ });
161
+ </script>
162
+
163
+ <div class="ridu-document-bar">
164
+ <div class="ridu-document-metadata">
165
+ {#if controller.creating}
166
+ <span>
167
+ {runtime.i18n.t("documents:creatingLabel", { label: controller.collectionSingularLabel })}
168
+ </span>
169
+ {:else if controller.versionedCollection}
170
+ <span>
171
+ {runtime.i18n.t("documents:status")}:
172
+ <strong class="ridu-document-metadata-value">
173
+ {runtime.i18n.t(
174
+ controller.currentStatus === "draft" ? "documents:draft" : "documents:published"
175
+ )}
176
+ </strong>
177
+ </span>
178
+ {/if}
179
+ {#if controller.lastSavedAt !== undefined && lastSavedDistance !== undefined && controller.collection?.versionSettings?.autosaveIntervalSeconds}
180
+ <span class="ridu-document-metadata__saved">
181
+ {runtime.i18n.t("documents:lastSavedAgo", { distance: lastSavedDistance })}
182
+ </span>
183
+ {/if}
184
+ {#if !controller.creating && controller.currentDocument !== undefined}
185
+ <span>
186
+ {runtime.i18n.t("documents:lastModifiedLabel")}:
187
+ <strong class="ridu-document-metadata-value">
188
+ {controller.documentDate(controller.currentDocument.updatedAt)}
189
+ </strong>
190
+ </span>
191
+ <span>
192
+ {runtime.i18n.t("documents:createdLabelPlain")}:
193
+ <strong class="ridu-document-metadata-value">
194
+ {controller.documentDate(controller.currentDocument.createdAt)}
195
+ </strong>
196
+ </span>
197
+ {/if}
198
+ </div>
199
+
200
+ <div class="ridu-document-actions">
201
+ {#if controller.collection !== undefined && controller.currentDocument !== undefined && !controller.lock.lockedByAnotherEditor}
202
+ {#each customDocumentActions as action (action.key)}
203
+ <action.component
204
+ collection={controller.collection}
205
+ document={controller.currentDocument}
206
+ host={extensionHost}
207
+ i18n={runtime.i18n}
208
+ />
209
+ {/each}
210
+ {/if}
211
+
212
+ {#if !controller.creating && controller.currentDocument !== undefined && livePreview !== undefined}
213
+ <Button
214
+ variant="outline"
215
+ size="icon-sm"
216
+ onclick={onTogglePreview}
217
+ aria-label={runtime.i18n.t("documents:livePreview")}
218
+ aria-pressed={livePreviewOpen}
219
+ >
220
+ <EyeIcon aria-hidden="true" />
221
+ </Button>
222
+ {/if}
223
+ {#if controller.lock.canTakeOver}
224
+ <Button
225
+ variant="outline"
226
+ size="sm"
227
+ disabled={controller.lock.operation}
228
+ onclick={controller.lock.takeOver}
229
+ >
230
+ <LockKeyholeIcon aria-hidden="true" />{controller.lock.operation
231
+ ? runtime.i18n.t("documents:takingOver")
232
+ : runtime.i18n.t("documents:takeOver")}
233
+ </Button>
234
+ {/if}
235
+
236
+ {const offersDraftChoice = $derived(
237
+ controller.draftsCollection &&
238
+ controller.canPublish &&
239
+ !controller.creatingAuthUser &&
240
+ (controller.creating ||
241
+ ((controller.collection?.versionSettings?.autosaveIntervalSeconds ?? 0) === 0 &&
242
+ controller.currentStatus === "draft"))
243
+ )}
244
+ {#if offersDraftChoice}
245
+ <Button
246
+ variant="outline"
247
+ size="sm"
248
+ disabled={!controller.canSave}
249
+ aria-busy={form.submitting}
250
+ onclick={onSave}
251
+ >
252
+ {runtime.i18n.t("documents:saveDraft")}
253
+ </Button>
254
+ {/if}
255
+ <div class={{ "ridu-document-publish": showSchedule }}>
256
+ <Button
257
+ size="sm"
258
+ disabled={primarySave.disabled}
259
+ aria-busy={form.submitting}
260
+ onclick={primarySave.onclick}
261
+ >
262
+ {primarySave.label}
263
+ </Button>
264
+ {#if showSchedule}
265
+ <Popover bind:open={publishMenuOpen}>
266
+ <PopoverTrigger
267
+ class={[
268
+ buttonVariants({ size: "sm", class: "ridu-document-publish__toggle" }),
269
+ { "ridu-document-publish__toggle--inactive": primarySave.disabled },
270
+ ]}
271
+ aria-label={runtime.i18n.t("documents:schedule")}
272
+ >
273
+ <ChevronDownIcon />
274
+ </PopoverTrigger>
275
+ <PopoverContent align="end" class="ridu-document-menu">
276
+ <Button
277
+ variant="ghost"
278
+ class="ridu-document-menu__item"
279
+ onclick={() => {
280
+ publishMenuOpen = false;
281
+ scheduleOpen = true;
282
+ }}
283
+ >
284
+ {runtime.i18n.t("versions:schedulePublication")}
285
+ </Button>
286
+ </PopoverContent>
287
+ </Popover>
288
+ {/if}
289
+ </div>
290
+
291
+ <div class="ridu-document-actions__menu">
292
+ {#if showDuplicate || showDownload || showUnpublish || showDelete || controller.canForceUnlock || showCopyLocale || showCreate}
293
+ <Popover bind:open={moreActionsOpen}>
294
+ <PopoverTrigger
295
+ class={buttonVariants({
296
+ variant: "outline",
297
+ size: "sm",
298
+ class: "ridu-document-actions__more",
299
+ })}
300
+ aria-label={runtime.i18n.t("documents:moreActions")}
301
+ >
302
+ <MoreVerticalIcon aria-hidden="true" />
303
+ </PopoverTrigger>
304
+ <PopoverContent align="end" class="ridu-document-menu">
305
+ {#if showCopyLocale && localization}
306
+ <div class="ridu-document-menu__locale">
307
+ <Select
308
+ type="single"
309
+ value=""
310
+ disabled={controller.hasUnsavedChanges ||
311
+ controller.loading ||
312
+ form.submitting ||
313
+ controller.copyLocaleOperation}
314
+ onValueChange={controller.copyFromLocale}
315
+ >
316
+ <SelectTrigger
317
+ size="compact"
318
+ class="ridu-document-menu__locale-trigger"
319
+ aria-label={runtime.i18n.t("documents:copyFromLocale")}
320
+ >
321
+ <span>
322
+ {controller.copyLocaleOperation
323
+ ? runtime.i18n.t("documents:copying")
324
+ : runtime.i18n.t("documents:copyFrom")}
325
+ </span>
326
+ </SelectTrigger>
327
+ <SelectContent>
328
+ {#each localization.locales.filter((locale) => locale.code !== activeLocale) as locale (locale.code)}
329
+ <SelectItem value={locale.code} label={locale.label}>
330
+ <span>{locale.label}</span>
331
+ <span class="ridu-document-menu__locale-code">{locale.code}</span>
332
+ </SelectItem>
333
+ {/each}
334
+ </SelectContent>
335
+ </Select>
336
+ </div>
337
+ {/if}
338
+
339
+ {#if showCreate}
340
+ <Link
341
+ class="ridu-document-menu__item ridu-document-menu__link"
342
+ to={withContentLocale(createDocumentPath(controller.collectionSlug), activeLocale)}
343
+ >
344
+ {runtime.i18n.t("collections:createNewButton")}
345
+ </Link>
346
+ {/if}
347
+ {#if showDuplicate}
348
+ <Button
349
+ variant="ghost"
350
+ class="ridu-document-menu__item"
351
+ disabled={controller.duplicateOperation}
352
+ onclick={() => {
353
+ moreActionsOpen = false;
354
+ controller.duplicate();
355
+ }}
356
+ >
357
+ {controller.duplicateOperation
358
+ ? runtime.i18n.t("documents:duplicating")
359
+ : runtime.i18n.t("documents:duplicate")}
360
+ </Button>
361
+ {/if}
362
+ {#if showDownload}
363
+ <Button
364
+ variant="ghost"
365
+ class="ridu-document-menu__item"
366
+ href={controller.assetURL}
367
+ download={controller.assetFilename}
368
+ >
369
+ {runtime.i18n.t("documents:download")}
370
+ </Button>
371
+ {/if}
372
+ {#if showUnpublish}
373
+ <Button
374
+ variant="ghost"
375
+ class="ridu-document-menu__item"
376
+ disabled={controller.publicationOperation ||
377
+ controller.hasUnsavedChanges ||
378
+ form.submitting}
379
+ onclick={() => {
380
+ moreActionsOpen = false;
381
+ controller.changePublication("draft");
382
+ }}
383
+ >
384
+ {runtime.i18n.t("documents:unpublish")}
385
+ </Button>
386
+ {/if}
387
+ {#if showDelete}
388
+ <Button
389
+ variant="ghost"
390
+ class="ridu-document-menu__item"
391
+ onclick={() => {
392
+ moreActionsOpen = false;
393
+ controller.deleteDialogOpen = true;
394
+ }}
395
+ >
396
+ {runtime.i18n.t(
397
+ controller.uploadCollection ? "documents:deleteAsset" : "documents:deleteDocument"
398
+ )}
399
+ </Button>
400
+ {/if}
401
+ {#if controller.canForceUnlock}
402
+ <Button
403
+ variant="ghost"
404
+ class="ridu-document-menu__item"
405
+ disabled={controller.unlockOperation}
406
+ onclick={() => {
407
+ moreActionsOpen = false;
408
+ controller.forceUnlock();
409
+ }}
410
+ >
411
+ <KeyRoundIcon aria-hidden="true" />{controller.unlockOperation
412
+ ? runtime.i18n.t("documents:unlocking")
413
+ : runtime.i18n.t("documents:forceUnlock")}
414
+ </Button>
415
+ {/if}
416
+ </PopoverContent>
417
+ </Popover>
418
+ {/if}
419
+ </div>
420
+ </div>
421
+ </div>
422
+
423
+ {#if scheduleOpen && showSchedule && controller.documentID}
424
+ {#key `${controller.collectionSlug}:${controller.documentID}:${activeLocale}`}
425
+ <DocumentSchedule
426
+ slug={controller.collectionSlug}
427
+ documentID={controller.documentID}
428
+ title={controller.documentHeading}
429
+ revision={controller.currentRevision}
430
+ editable={!controller.lock.lockedByAnotherEditor && !form.submitting}
431
+ canPublish={controller.canPublish}
432
+ canUnpublish={controller.canUnpublish}
433
+ status={controller.currentStatus}
434
+ dirty={controller.hasUnsavedChanges}
435
+ onClose={() => (scheduleOpen = false)}
436
+ />
437
+ {/key}
438
+ {/if}
@@ -1,31 +1,42 @@
1
1
  <script lang="ts">
2
+ import { Button } from "@riducms/ui";
2
3
  import { getAdminI18n } from "@riducms/plugin";
4
+ import { preparedAdminModule } from "@admin/core/bootstrap/admin-route-modules";
5
+ import type { AdminDocumentV1, AdminReadResultV1 } from "@riducms/protocol";
3
6
 
4
7
  type DocumentAPIViewProps = {
5
8
  resourceSlug: string;
6
- resourceLabel: string;
7
9
  documentID?: string;
8
10
  globalResource?: boolean;
11
+ contentLocale?: string;
9
12
  fallbackValue: unknown;
13
+ prepared?: AdminReadResultV1<AdminDocumentV1>;
10
14
  };
11
15
 
12
16
  let props: DocumentAPIViewProps = $props();
13
17
  const i18n = getAdminI18n();
14
- const view = import("@admin/features/documents/document-api-view.svelte");
18
+ const view =
19
+ preparedAdminModule<typeof import("@admin/features/documents/document-api-view.svelte")>(
20
+ "document-api"
21
+ ) ?? import("@admin/features/documents/document-api-view.svelte");
22
+
23
+ import "@admin/features/documents/document-loading.scss";
15
24
  </script>
16
25
 
17
26
  {#await view}
18
27
  <section
19
- class="grid min-h-72 place-items-center"
28
+ class="ridu-document-module"
29
+ data-ridu-loading-surface="document-api-module"
20
30
  aria-busy="true"
21
31
  aria-label={i18n.t("documents:loadingAPIView")}
22
32
  >
23
- <p class="text-[12px] text-foreground-faint">{i18n.t("documents:loadingAPIView")}</p>
33
+ <p class="ridu-document-module__message">{i18n.t("documents:loadingAPIView")}</p>
24
34
  </section>
25
35
  {:then { default: DocumentAPIView }}
26
36
  <DocumentAPIView {...props} />
27
37
  {:catch}
28
- <section class="grid min-h-72 place-items-center" role="alert">
29
- <p class="text-[12px] text-destructive">{i18n.t("documents:apiViewLoadFailed")}</p>
38
+ <section class="ridu-document-module ridu-document-module--error" role="alert">
39
+ <p class="ridu-document-module__message">{i18n.t("documents:apiViewLoadFailed")}</p>
40
+ <Button onclick={() => window.location.reload()}>{i18n.t("general:reloadPage")}</Button>
30
41
  </section>
31
42
  {/await}