@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
@@ -0,0 +1,121 @@
1
+ @use "@riducms/ui/styles.scss" as ui;
2
+
3
+ @layer ridu.components {
4
+ .ridu-toast {
5
+ --toast-surface: var(--control-surface);
6
+ --toast-color: var(--ink-strong);
7
+ --toast-border: var(--control-border);
8
+ position: relative;
9
+ display: flex;
10
+ align-items: center;
11
+ gap: 13px;
12
+ width: 100%;
13
+ padding: 16px;
14
+ border: 1px solid var(--toast-border);
15
+ border-radius: 4px;
16
+ background: var(--toast-surface);
17
+ color: var(--toast-color);
18
+ font-family: var(--font-sans);
19
+ font-size: var(--font-size-body);
20
+ line-height: 20px;
21
+ box-shadow:
22
+ 0 10px 4px -8px rgb(0 2 4 / 2%),
23
+ 0 2px 3px rgb(0 2 4 / 5%);
24
+
25
+ &[data-type="error"] {
26
+ --toast-surface: var(--status-error-surface);
27
+ --toast-color: var(--status-error-foreground);
28
+ --toast-border: var(--status-error-border);
29
+ }
30
+ &[data-type="success"] {
31
+ --toast-surface: var(--status-success-surface);
32
+ --toast-color: var(--status-success-foreground);
33
+ --toast-border: var(--status-success-border);
34
+ }
35
+ &[data-type="warning"] {
36
+ --toast-surface: var(--status-warning-surface);
37
+ --toast-color: var(--status-warning-foreground);
38
+ --toast-border: var(--status-warning-border);
39
+ }
40
+ &[data-type="info"] {
41
+ --toast-surface: var(--background-layer);
42
+ --toast-border: var(--control-border-hover);
43
+ }
44
+ }
45
+ .ridu-toast__content {
46
+ min-width: 0;
47
+ width: 100%;
48
+ overflow-wrap: anywhere;
49
+ }
50
+ .ridu-toast__title {
51
+ font-weight: 600;
52
+ line-height: 20px;
53
+ }
54
+ .ridu-validation-toast__fields {
55
+ list-style: circle outside;
56
+ margin: 0;
57
+ padding-inline-start: 20px;
58
+ li {
59
+ display: list-item;
60
+ padding-inline-start: 0;
61
+ }
62
+ }
63
+
64
+ .ridu-toast__description {
65
+ margin-top: 2px;
66
+ font-weight: 400;
67
+ }
68
+ .ridu-toast__icon {
69
+ display: flex;
70
+ align-items: center;
71
+ justify-content: center;
72
+ flex-shrink: 0;
73
+ width: 16px;
74
+ height: 16px;
75
+ margin: 0;
76
+ }
77
+ .ridu-toast__loader {
78
+ width: 14px;
79
+ height: 14px;
80
+ animation: ridu-toast-spin 1s linear infinite;
81
+ }
82
+ .ridu-toast__close {
83
+ --normal-bg: var(--toast-close-surface);
84
+ --normal-bg-hover: var(--toast-close-surface);
85
+ --normal-border-hover: var(--toast-close-border);
86
+ --normal-text: var(--toast-close-color);
87
+ --normal-border: var(--toast-close-border);
88
+ position: absolute;
89
+ top: -7px;
90
+ inset-inline-start: -7px;
91
+ display: flex;
92
+ align-items: center;
93
+ justify-content: center;
94
+ width: 20px;
95
+ height: 20px;
96
+ padding: 0;
97
+ border: 1px solid var(--toast-close-border);
98
+ border-radius: 50%;
99
+ background: var(--toast-close-surface);
100
+ color: var(--toast-close-color);
101
+ cursor: pointer;
102
+
103
+ &:focus-visible {
104
+ @include ui.focus-outline;
105
+ }
106
+ }
107
+ .ridu-toast[data-front="false"]:not([data-expanded="true"]) .ridu-toast__close {
108
+ display: none;
109
+ }
110
+ @media (prefers-reduced-motion: reduce) {
111
+ .ridu-toast__loader {
112
+ animation: none;
113
+ }
114
+ }
115
+ }
116
+
117
+ @keyframes ridu-toast-spin {
118
+ to {
119
+ transform: rotate(360deg);
120
+ }
121
+ }
@@ -1,4 +1,5 @@
1
1
  <script lang="ts">
2
+ import "@admin/components/ui/sonner/sonner.scss";
2
3
  import LoaderCircleIcon from "~icons/lucide/loader-circle";
3
4
  import { Toaster as Sonner, type ToasterProps } from "svelte-sonner";
4
5
  import { getAdminI18n } from "@riducms/plugin";
@@ -11,11 +12,12 @@
11
12
  closeButton = true,
12
13
  pauseWhenPageIsHidden = true,
13
14
  visibleToasts = 4,
14
- offset = 16,
15
- mobileOffset = 12,
15
+ offset = 32,
16
+ mobileOffset = 16,
16
17
  toastOptions,
17
18
  ...restProps
18
19
  }: ToasterProps = $props();
20
+
19
21
  const resolvedPosition = $derived(
20
22
  position ?? (i18n.direction === "rtl" ? "bottom-left" : "bottom-right")
21
23
  );
@@ -24,13 +26,12 @@
24
26
  unstyled: true,
25
27
  ...toastOptions,
26
28
  classes: {
27
- toast:
28
- "ridu-toast flex w-[min(calc(100vw-2rem),390px)] items-start gap-2.5 rounded-[10px] py-3 pe-3.5 ps-5 shadow-[var(--shadow-popover)]",
29
- content: "min-w-0 flex-1",
30
- title: "text-[13.5px] leading-5 font-semibold",
31
- description: "mt-0.5 text-[12.5px] leading-5",
32
- icon: "mt-0.75 shrink-0",
33
- closeButton: "outline-none focus-visible:outline-2 focus-visible:outline-primary/60",
29
+ toast: "ridu-toast",
30
+ content: "ridu-toast__content",
31
+ title: "ridu-toast__title",
32
+ description: "ridu-toast__description",
33
+ icon: "ridu-toast__icon",
34
+ closeButton: "ridu-toast__close",
34
35
  ...toastOptions?.classes,
35
36
  },
36
37
  });
@@ -50,6 +51,6 @@
50
51
  {...restProps}
51
52
  >
52
53
  {#snippet loadingIcon()}
53
- <LoaderCircleIcon class="size-3.5 animate-spin" aria-hidden="true" />
54
+ <LoaderCircleIcon class="ridu-toast__loader" aria-hidden="true" />
54
55
  {/snippet}
55
56
  </Sonner>
@@ -0,0 +1,48 @@
1
+ @use "@riducms/ui/styles.scss" as ui;
2
+
3
+ @layer ridu.components {
4
+ .ridu-status-indicator {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ gap: 7px;
8
+ color: var(--foreground-muted);
9
+ font-size: 12.5px;
10
+ }
11
+
12
+ .ridu-status-indicator--live {
13
+ color: var(--primary);
14
+ }
15
+
16
+ .ridu-status-indicator--warning {
17
+ color: var(--warning);
18
+ }
19
+
20
+ .ridu-status-indicator--muted {
21
+ color: var(--foreground-muted);
22
+ }
23
+
24
+ .ridu-status-indicator--destructive {
25
+ color: var(--destructive);
26
+ }
27
+
28
+ .ridu-status-indicator--success {
29
+ color: var(--success);
30
+ }
31
+
32
+ .ridu-status-indicator__dot {
33
+ flex-shrink: 0;
34
+ width: 7px;
35
+ height: 7px;
36
+ border-radius: 50%;
37
+ background: currentColor;
38
+ }
39
+
40
+ .ridu-status-indicator__dot--muted {
41
+ border: 1px solid currentColor;
42
+ background: transparent;
43
+ }
44
+
45
+ .ridu-status-indicator__dot--pulse {
46
+ box-shadow: 0 0 9px currentColor;
47
+ }
48
+ }
@@ -1,15 +1,15 @@
1
1
  <script lang="ts" module>
2
- import { tv, type VariantProps } from "@riducms/ui";
2
+ import { cv, type VariantProps } from "@riducms/ui";
3
3
 
4
- export const statusIndicatorVariants = tv({
5
- base: "inline-flex items-center gap-1.75 text-[12.5px] text-foreground-muted",
4
+ export const statusIndicatorVariants = cv({
5
+ base: "ridu-status-indicator",
6
6
  variants: {
7
7
  tone: {
8
- live: "text-primary",
9
- warning: "text-warning",
10
- muted: "text-foreground-muted",
11
- destructive: "text-destructive",
12
- success: "text-success",
8
+ live: "ridu-status-indicator--live",
9
+ warning: "ridu-status-indicator--warning",
10
+ muted: "ridu-status-indicator--muted",
11
+ destructive: "ridu-status-indicator--destructive",
12
+ success: "ridu-status-indicator--success",
13
13
  },
14
14
  },
15
15
  defaultVariants: { tone: "muted" },
@@ -20,8 +20,8 @@
20
20
 
21
21
  <script lang="ts">
22
22
  import type { HTMLAttributes } from "svelte/elements";
23
-
24
- import { cn, type WithElementRef } from "@riducms/ui";
23
+ import type { WithElementRef } from "@riducms/ui";
24
+ import "@admin/components/ui/status-indicator/status-indicator.scss";
25
25
 
26
26
  let {
27
27
  ref = $bindable(null),
@@ -39,14 +39,14 @@
39
39
  <span
40
40
  bind:this={ref}
41
41
  data-slot="status-indicator"
42
- class={cn(statusIndicatorVariants({ tone }), className)}
42
+ class={[statusIndicatorVariants({ tone }), className]}
43
43
  {...restProps}
44
44
  >
45
45
  <span
46
46
  class={[
47
- "size-1.75 shrink-0 rounded-full",
48
- tone === "muted" ? "border border-current bg-transparent" : "bg-current",
49
- pulse && "shadow-[0_0_9px_currentColor]",
47
+ "ridu-status-indicator__dot",
48
+ { "ridu-status-indicator__dot--muted": tone === "muted" },
49
+ { "ridu-status-indicator__dot--pulse": pulse },
50
50
  ]}
51
51
  aria-hidden="true"
52
52
  ></span>
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { Tabs as TabsPrimitive } from "bits-ui";
3
- import { cn } from "@riducms/ui";
3
+ import "@admin/components/ui/tabs/tabs.scss";
4
4
 
5
5
  let {
6
6
  ref = $bindable(null),
@@ -12,6 +12,6 @@
12
12
  <TabsPrimitive.Content
13
13
  bind:ref
14
14
  data-slot="tabs-content"
15
- class={cn("text-sm flex-1 outline-none", className)}
15
+ class={["ridu-tabs__content", className]}
16
16
  {...restProps}
17
17
  />
@@ -1,12 +1,12 @@
1
1
  <script lang="ts" module>
2
- import { tv, type VariantProps } from "@riducms/ui";
2
+ import { cv, type VariantProps } from "@riducms/ui";
3
3
 
4
- export const tabsListVariants = tv({
5
- base: "rounded-lg p-0.5 group-data-horizontal/tabs:h-8 group-data-vertical/tabs:p-1 data-[variant=line]:rounded-none group/tabs-list inline-flex w-fit items-center justify-center text-muted-foreground group-data-[orientation=vertical]/tabs:h-fit group-data-[orientation=vertical]/tabs:flex-col",
4
+ export const tabsListVariants = cv({
5
+ base: "ridu-tabs__list",
6
6
  variants: {
7
7
  variant: {
8
- default: "cn-tabs-list-variant-default border border-control-border bg-tabs-surface",
9
- line: "cn-tabs-list-variant-line gap-1 bg-transparent",
8
+ default: "ridu-tabs__list--default",
9
+ line: "ridu-tabs__list--line",
10
10
  },
11
11
  },
12
12
  defaultVariants: {
@@ -19,7 +19,7 @@
19
19
 
20
20
  <script lang="ts">
21
21
  import { Tabs as TabsPrimitive } from "bits-ui";
22
- import { cn } from "@riducms/ui";
22
+ import "@admin/components/ui/tabs/tabs.scss";
23
23
 
24
24
  let {
25
25
  ref = $bindable(null),
@@ -35,6 +35,6 @@
35
35
  bind:ref
36
36
  data-slot="tabs-list"
37
37
  data-variant={variant}
38
- class={cn(tabsListVariants({ variant }), className)}
38
+ class={[tabsListVariants({ variant }), className]}
39
39
  {...restProps}
40
40
  />
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { Tabs as TabsPrimitive } from "bits-ui";
3
- import { cn } from "@riducms/ui";
3
+ import "@admin/components/ui/tabs/tabs.scss";
4
4
 
5
5
  let {
6
6
  ref = $bindable(null),
@@ -12,12 +12,6 @@
12
12
  <TabsPrimitive.Trigger
13
13
  bind:ref
14
14
  data-slot="tabs-trigger"
15
- class={cn(
16
- "gap-1.5 rounded-md border border-transparent! px-3.5 py-1 text-[13px] font-medium group-data-vertical/tabs:px-3 group-data-vertical/tabs:py-1 [&_svg:not([class*='size-'])]:size-3.5 relative inline-flex h-[calc(100%-1px)] flex-1 items-center justify-center whitespace-nowrap text-foreground-sub transition-[background-color,color] duration-150 group-data-[orientation=vertical]/tabs:w-full group-data-[orientation=vertical]/tabs:justify-start data-[state=inactive]:hover:text-foreground-muted focus-visible:outline-2 focus-visible:outline-primary/60 focus-visible:outline-offset-2 disabled:pointer-events-none disabled:opacity-45 [&_svg]:pointer-events-none [&_svg]:shrink-0",
17
- "group-data-[variant=line]/tabs-list:bg-transparent group-data-[variant=line]/tabs-list:data-[state=active]:bg-transparent",
18
- "data-[state=active]:bg-tabs-active data-[state=active]:text-tabs-text-active",
19
- "after:absolute after:bg-foreground-strong after:opacity-0 after:transition-opacity data-[orientation=horizontal]:after:inset-x-0 data-[orientation=horizontal]:after:bottom-0 data-[orientation=horizontal]:after:h-0.5 data-[orientation=vertical]:after:inset-y-0 data-[orientation=vertical]:after:-end-1 data-[orientation=vertical]:after:w-0.5 group-data-[variant=line]/tabs-list:data-[state=active]:after:opacity-100",
20
- className
21
- )}
15
+ class={["ridu-tabs__trigger", className]}
22
16
  {...restProps}
23
17
  />
@@ -0,0 +1,86 @@
1
+ @use "@riducms/ui/styles.scss" as ui;
2
+
3
+ @layer ridu.components {
4
+ .ridu-tabs {
5
+ display: flex;
6
+ gap: 20px;
7
+ min-width: 0;
8
+ }
9
+ .ridu-tabs[data-orientation="horizontal"] {
10
+ flex-direction: column;
11
+ }
12
+ .ridu-tabs__list {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ width: fit-content;
16
+ gap: 20px;
17
+ color: var(--foreground-muted);
18
+ }
19
+ .ridu-tabs__list[data-orientation="vertical"] {
20
+ flex-direction: column;
21
+ align-items: stretch;
22
+ }
23
+ .ridu-tabs__list--default {
24
+ padding: 4px;
25
+ gap: 4px;
26
+ background: var(--control-surface);
27
+ border-radius: var(--control-radius);
28
+ }
29
+ .ridu-tabs__trigger {
30
+ position: relative;
31
+ display: inline-flex;
32
+ align-items: center;
33
+ justify-content: center;
34
+ gap: 8px;
35
+ padding: 10px 15px;
36
+ border: 0;
37
+ border-radius: var(--control-radius);
38
+ background: transparent;
39
+ color: inherit;
40
+ font: inherit;
41
+ white-space: nowrap;
42
+ cursor: pointer;
43
+ &:hover,
44
+ &[data-state="active"] {
45
+ color: var(--foreground);
46
+ }
47
+ &:focus-visible {
48
+ @include ui.focus-outline;
49
+ }
50
+ &:disabled {
51
+ opacity: 0.5;
52
+ cursor: not-allowed;
53
+ }
54
+ svg {
55
+ width: 16px;
56
+ height: 16px;
57
+ }
58
+ }
59
+ .ridu-tabs__list--default .ridu-tabs__trigger[data-state="active"] {
60
+ background: var(--control-surface-hover);
61
+ }
62
+ .ridu-tabs__list--line .ridu-tabs__trigger {
63
+ border-radius: 0;
64
+ &::after {
65
+ content: "";
66
+ position: absolute;
67
+ inset-inline: 0;
68
+ bottom: 0;
69
+ height: 2px;
70
+ background: transparent;
71
+ }
72
+ &[data-state="active"]::after {
73
+ background: var(--foreground);
74
+ }
75
+ &[data-orientation="vertical"]::after {
76
+ inset: 0 0 0 auto;
77
+ width: 2px;
78
+ height: auto;
79
+ }
80
+ }
81
+ .ridu-tabs__content {
82
+ flex: 1;
83
+ min-width: 0;
84
+ outline: none;
85
+ }
86
+ }
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { Tabs as TabsPrimitive } from "bits-ui";
3
- import { cn } from "@riducms/ui";
3
+ import "@admin/components/ui/tabs/tabs.scss";
4
4
 
5
5
  let {
6
6
  ref = $bindable(null),
@@ -14,6 +14,6 @@
14
14
  bind:ref
15
15
  bind:value
16
16
  data-slot="tabs"
17
- class={cn("gap-2 group/tabs flex data-[orientation=horizontal]:flex-col", className)}
17
+ class={["ridu-tabs", className]}
18
18
  {...restProps}
19
19
  />
@@ -0,0 +1,152 @@
1
+ <script lang="ts">
2
+ import type { SchemaAdminTimeZone } from "@riducms/protocol";
3
+ import { timeZoneLabel } from "@admin/core/i18n/time-zone-label";
4
+ import { getAdminI18n } from "@riducms/plugin";
5
+ import {
6
+ Combobox,
7
+ ComboboxInput,
8
+ ComboboxTrigger,
9
+ ComboboxPortal,
10
+ ComboboxContent,
11
+ ComboboxViewport,
12
+ ComboboxItem,
13
+ } from "@admin/components/ui/combobox";
14
+ import XIcon from "~icons/lucide/x";
15
+ import ChevronDownIcon from "~icons/lucide/chevron-down";
16
+ import "@admin/components/ui/combobox/combobox.scss";
17
+
18
+ let {
19
+ id,
20
+ value,
21
+ options,
22
+ at,
23
+ disabled = false,
24
+ onValueChange,
25
+ }: {
26
+ id: string;
27
+ value: string;
28
+ options: readonly SchemaAdminTimeZone[];
29
+ at: Date;
30
+ disabled?: boolean;
31
+ onValueChange: (value: string) => void;
32
+ } = $props();
33
+ const i18n = getAdminI18n();
34
+ let anchor = $state<HTMLDivElement | null>(null);
35
+ let open = $state(false);
36
+ let query = $state("");
37
+ // Only the clear handler reads this binding; it does not drive rendering.
38
+ // svelte-ignore non_reactive_update
39
+ let input: HTMLInputElement;
40
+ const label = $derived(i18n.t("fields:timeZone"));
41
+ const placeholder = $derived(i18n.t("fields:select", { label }));
42
+ const items = $derived(
43
+ options.map((option) => ({
44
+ value: option.id,
45
+ label: timeZoneLabel(
46
+ option.id,
47
+ i18n.text(option.label, option.labelTranslations),
48
+ i18n.language,
49
+ at
50
+ ),
51
+ }))
52
+ );
53
+ const selectedLabel = $derived(items.find((option) => option.value === value)?.label ?? value);
54
+ const filtered = $derived(
55
+ items.filter((option) =>
56
+ `${option.label} ${option.value}`
57
+ .toLocaleLowerCase(i18n.language)
58
+ .includes(query.toLocaleLowerCase(i18n.language))
59
+ )
60
+ );
61
+
62
+ function select(next: string) {
63
+ if (!disabled) onValueChange(next);
64
+ }
65
+
66
+ function clear() {
67
+ if (disabled) return;
68
+ input.focus();
69
+ onValueChange("");
70
+ }
71
+ </script>
72
+
73
+ <Combobox
74
+ type="single"
75
+ {value}
76
+ {items}
77
+ onValueChange={select}
78
+ allowDeselect={false}
79
+ {disabled}
80
+ bind:open={
81
+ () => open,
82
+ (next) => {
83
+ open = next;
84
+ if (!next) query = "";
85
+ }
86
+ }
87
+ inputValue={open ? query : selectedLabel}
88
+ >
89
+ <div bind:this={anchor} class="ridu-combobox" data-disabled={disabled}>
90
+ <div class="ridu-combobox-value">
91
+ <ComboboxInput
92
+ {id}
93
+ class="ridu-combobox-input"
94
+ {placeholder}
95
+ aria-label={label}
96
+ autocomplete="off"
97
+ autocorrect="off"
98
+ autocapitalize="none"
99
+ spellcheck={false}
100
+ clearOnDeselect
101
+ onpointerdown={() => {
102
+ if (!disabled) open = true;
103
+ }}
104
+ oninput={(event) => {
105
+ query = event.currentTarget.value;
106
+ open = true;
107
+ }}
108
+ >
109
+ {#snippet child({ props })}
110
+ <input bind:this={input} {...props} value={open ? query : selectedLabel} />
111
+ {/snippet}
112
+ </ComboboxInput>
113
+ </div>
114
+ {#if value}
115
+ <button
116
+ type="button"
117
+ class="ridu-combobox-icon"
118
+ {disabled}
119
+ aria-label={i18n.t("general:clearSelection")}
120
+ onclick={clear}
121
+ >
122
+ <XIcon />
123
+ </button>
124
+ {/if}
125
+ <ComboboxTrigger
126
+ type="button"
127
+ class="ridu-combobox-icon ridu-combobox-trigger"
128
+ aria-label={placeholder}
129
+ >
130
+ <ChevronDownIcon />
131
+ </ComboboxTrigger>
132
+ </div>
133
+ <ComboboxPortal>
134
+ <ComboboxContent
135
+ customAnchor={anchor}
136
+ sideOffset={0}
137
+ align="start"
138
+ class="ridu-combobox-popup"
139
+ dir={i18n.direction}
140
+ >
141
+ <ComboboxViewport>
142
+ {#each filtered as option (option.value)}
143
+ <ComboboxItem value={option.value} label={option.label} class="ridu-combobox-option">
144
+ {option.label}
145
+ </ComboboxItem>
146
+ {:else}
147
+ <p class="ridu-combobox-message">{i18n.t("fields:noMatch", { label })}</p>
148
+ {/each}
149
+ </ComboboxViewport>
150
+ </ComboboxContent>
151
+ </ComboboxPortal>
152
+ </Combobox>
@@ -2,7 +2,7 @@ import {
2
2
  createClient,
3
3
  type CollectionContract,
4
4
  type Version,
5
- type ScheduledPublish,
5
+ type ScheduledPublication,
6
6
  type RiduClient,
7
7
  } from "@riducms/sdk";
8
8
  import type { FieldDocument } from "@riducms/plugin";
@@ -38,7 +38,7 @@ export interface AdminConfig {
38
38
  }
39
39
 
40
40
  export type AdminVersion = Version<AdminDocument>;
41
- export type AdminScheduledPublish = ScheduledPublish;
41
+ export type AdminScheduledPublication = ScheduledPublication;
42
42
 
43
43
  export type AdminClient = RiduClient<AdminConfig>;
44
44