@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,12 +2,14 @@
2
2
  import type { DateValue, Time } from "@internationalized/date";
3
3
  import type { SchemaDateFormat } from "@riducms/protocol";
4
4
  import { DateField, TimeField } from "bits-ui";
5
+ import "@admin/components/ui/date-value-control/date-value-control.scss";
6
+ import XIcon from "~icons/lucide/x";
5
7
  import CalendarIcon from "~icons/lucide/calendar";
6
8
 
7
- import { buttonVariants } from "@admin/components/ui/button";
9
+ import { fieldControlARIA } from "@riducms/ui";
8
10
  import DateValueCalendar from "@admin/components/ui/date-value-control/date-value-calendar.svelte";
9
11
  import { Popover, PopoverContent, PopoverTrigger } from "@admin/components/ui/popover";
10
- import { cn, fieldControlARIA } from "@riducms/ui";
12
+
11
13
  import { getAdminI18n } from "@riducms/plugin";
12
14
  import {
13
15
  datePickerFormValue,
@@ -22,6 +24,7 @@
22
24
  name,
23
25
  appearance = "date",
24
26
  value = "",
27
+ timeZone,
25
28
  disabled = false,
26
29
  readonly = false,
27
30
  required = false,
@@ -36,6 +39,7 @@
36
39
  name?: string;
37
40
  appearance?: SchemaDateFormat;
38
41
  value?: string;
42
+ timeZone?: string;
39
43
  disabled?: boolean;
40
44
  readonly?: boolean;
41
45
  required?: boolean;
@@ -48,27 +52,23 @@
48
52
  } = $props();
49
53
  const i18n = getAdminI18n();
50
54
 
51
- const controlClass = $derived(
52
- cn(
53
- "flex w-full items-center rounded-lg border border-control-border bg-control text-foreground-strong transition-[background-color,border-color,color] duration-150 hover:border-control-border-hover focus-within:border-primary/65 aria-invalid:!border-destructive/65 data-[disabled]:cursor-not-allowed data-[disabled]:border-control-border-disabled data-[disabled]:bg-control-disabled data-[disabled]:opacity-45 data-[readonly]:border-control-border-disabled data-[readonly]:bg-control-disabled",
54
- size === "field" && "h-10.5 px-3.25 text-[14.5px]",
55
- size === "compact" && "h-9 px-3 text-[13px]",
56
- size === "toolbar" && "h-[34px] px-2.5 text-[12.5px]",
57
- className
58
- )
59
- );
60
- const selectedDate = $derived(datePickerValue(value, appearance, i18n.timeZone));
55
+ const resolvedTimeZone = $derived(timeZone ?? i18n.timeZone);
56
+ const selectedDate = $derived(datePickerValue(value, appearance, resolvedTimeZone));
61
57
  const controlARIA = $derived(fieldControlARIA(id, hasDescription, invalid));
62
58
  let open = $state(false);
59
+ let anchor = $state<HTMLDivElement>();
60
+ // Only the autofocus handler reads this DOM binding.
61
+ // svelte-ignore non_reactive_update
62
+ let popup: HTMLElement | null = null;
63
63
 
64
64
  function updateDate(next: DateValue | undefined) {
65
65
  if (disabled || readonly) return;
66
- onValueChange(datePickerFormValue(next, appearance, i18n.timeZone));
66
+ onValueChange(datePickerFormValue(next, appearance, resolvedTimeZone));
67
67
  }
68
68
 
69
69
  function selectCalendarDate(next: DateValue | undefined) {
70
70
  updateDate(next);
71
- open = false;
71
+ if (appearance !== "date-time") open = false;
72
72
  }
73
73
 
74
74
  function updateTime(next: Time | undefined) {
@@ -90,7 +90,7 @@
90
90
  <TimeField.Input
91
91
  {id}
92
92
  {name}
93
- class={cn(controlClass, "gap-0.5 select-none")}
93
+ class={["ridu-date-control ridu-date-control--time", `ridu-date-control--${size}`, className]}
94
94
  data-disabled={disabled ? "" : undefined}
95
95
  data-readonly={readonly ? "" : undefined}
96
96
  {...controlARIA}
@@ -98,12 +98,7 @@
98
98
  >
99
99
  {#snippet children({ segments })}
100
100
  {#each segments as { part, value: segmentValue }, index (`${part}:${index}`)}
101
- <TimeField.Segment
102
- {part}
103
- class={part === "literal"
104
- ? "px-0.5 text-foreground-soft"
105
- : "rounded px-0.5 outline-none hover:bg-control-hover focus:bg-primary/15 aria-[valuetext=Empty]:text-foreground-placeholder"}
106
- >
101
+ <TimeField.Segment {part} class="ridu-date-control__segment">
107
102
  {segmentValue}
108
103
  </TimeField.Segment>
109
104
  {/each}
@@ -111,18 +106,19 @@
111
106
  </TimeField.Input>
112
107
  </TimeField.Root>
113
108
  {:else}
109
+ <!-- Keep the timezone projection authoritative after the author edits individual segments. -->
114
110
  <DateField.Root
115
- value={selectedDate}
111
+ bind:value={() => selectedDate, updateDate}
116
112
  locale={i18n.language}
117
113
  granularity={appearance === "date-time" ? "minute" : "day"}
118
114
  {disabled}
119
115
  {readonly}
120
116
  {required}
121
117
  errorMessageId={controlARIA["aria-errormessage"]}
122
- onValueChange={updateDate}
123
118
  >
124
119
  <div
125
- class={controlClass}
120
+ bind:this={anchor}
121
+ class={["ridu-date-control", `ridu-date-control--${size}`, className]}
126
122
  data-disabled={disabled ? "" : undefined}
127
123
  data-readonly={readonly ? "" : undefined}
128
124
  aria-invalid={controlARIA["aria-invalid"]}
@@ -130,7 +126,7 @@
130
126
  <DateField.Input
131
127
  {id}
132
128
  {name}
133
- class="flex min-w-0 flex-1 items-center gap-0.5 select-none"
129
+ class="ridu-date-control__input"
134
130
  aria-label={label}
135
131
  {...controlARIA}
136
132
  >
@@ -138,36 +134,58 @@
138
134
  {#each segments as { part, value: segmentValue }, index (`${part}:${index}`)}
139
135
  <DateField.Segment
140
136
  {part}
141
- class={part === "literal"
142
- ? "px-0.5 text-foreground-soft"
143
- : "rounded px-0.5 outline-none hover:bg-control-hover focus:bg-primary/15 aria-[valuetext=Empty]:text-foreground-placeholder"}
137
+ class="ridu-date-control__segment"
138
+ onpointerdown={() => {
139
+ // Release the popup's focus trap before the pointer focuses this segment.
140
+ open = false;
141
+ }}
144
142
  >
145
143
  {segmentValue}
146
144
  </DateField.Segment>
147
145
  {/each}
146
+ {#if value && !disabled && !readonly}
147
+ <button
148
+ type="button"
149
+ class="ridu-date-control__button"
150
+ aria-label={i18n.t("general:clearSelection")}
151
+ onclick={() => onValueChange("")}
152
+ >
153
+ <XIcon />
154
+ </button>
155
+ {/if}
148
156
  <Popover bind:open>
149
157
  <PopoverTrigger
150
158
  type="button"
151
- class={buttonVariants({
152
- variant: "ghost",
153
- size: "icon-sm",
154
- class: "ms-auto size-7 text-foreground-soft",
155
- })}
159
+ class="ridu-date-control__button"
156
160
  disabled={disabled || readonly}
157
161
  aria-label={i18n.t("fields:openCalendar")}
158
162
  >
159
- <CalendarIcon class="size-3.5" aria-hidden="true" />
163
+ <CalendarIcon />
160
164
  </PopoverTrigger>
161
- <PopoverContent align="end" sideOffset={6} class="w-auto gap-0 overflow-hidden p-0">
162
- <DateValueCalendar
163
- value={selectedDate}
164
- {disabled}
165
- {readonly}
166
- {required}
167
- locale={i18n.language}
168
- calendarLabel={i18n.t("fields:selectDate")}
169
- onValueChange={selectCalendarDate}
170
- />
165
+ <PopoverContent
166
+ bind:ref={popup}
167
+ onOpenAutoFocus={(event) => {
168
+ event.preventDefault();
169
+ popup?.querySelector<HTMLElement>('[data-calendar-day][tabindex="0"]')?.focus();
170
+ }}
171
+ customAnchor={anchor}
172
+ align="start"
173
+ sideOffset={6}
174
+ class="ridu-date-popup"
175
+ >
176
+ {#key resolvedTimeZone}
177
+ <DateValueCalendar
178
+ timeZone={resolvedTimeZone}
179
+ value={selectedDate}
180
+ withTime={appearance === "date-time"}
181
+ {disabled}
182
+ {readonly}
183
+ {required}
184
+ locale={i18n.language}
185
+ calendarLabel={i18n.t("fields:selectDate")}
186
+ onValueChange={selectCalendarDate}
187
+ />
188
+ {/key}
171
189
  </PopoverContent>
172
190
  </Popover>
173
191
  {/snippet}
@@ -0,0 +1,8 @@
1
+ import { createContext } from "svelte";
2
+
3
+ const [getDepth, setDepth, hasDepth] = createContext<number>();
4
+
5
+ /** Nested authoring keeps a visible edge of each parent drawer. */
6
+ export function provideDrawerDepth() {
7
+ return setDepth((hasDepth() ? getDepth() : 0) + 1);
8
+ }
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
3
- import { cn } from "@riducms/ui";
3
+ import "@admin/components/ui/dropdown-menu/dropdown-menu.scss";
4
4
 
5
5
  let {
6
6
  ref = $bindable(null),
@@ -18,10 +18,7 @@
18
18
  {sideOffset}
19
19
  {align}
20
20
  loop
21
- class={cn(
22
- "ridu-popover-enter z-50 min-w-44 origin-(--bits-menu-content-transform-origin) rounded-[4px] border border-control-border bg-popover p-1 text-[12.5px] text-popover-foreground shadow-[var(--shadow-popover)] outline-none",
23
- className
24
- )}
21
+ class={["ridu-dropdown-menu", className]}
25
22
  {...restProps}
26
23
  />
27
24
  </DropdownMenuPrimitive.Portal>
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
3
- import { cn } from "@riducms/ui";
3
+ import "@admin/components/ui/dropdown-menu/dropdown-menu.scss";
4
4
 
5
5
  let {
6
6
  ref = $bindable(null),
@@ -12,9 +12,6 @@
12
12
  <DropdownMenuPrimitive.Item
13
13
  bind:ref
14
14
  data-slot="dropdown-menu-item"
15
- class={cn(
16
- "data-[highlighted]:bg-control-hover data-[highlighted]:text-foreground flex min-h-8 cursor-default select-none items-center rounded-[3px] px-2.5 py-1.5 text-foreground-muted outline-none data-[disabled]:pointer-events-none data-[disabled]:opacity-40",
17
- className
18
- )}
15
+ class={["ridu-dropdown-menu__item", className]}
19
16
  {...restProps}
20
17
  />
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { DropdownMenu as DropdownMenuPrimitive } from "bits-ui";
3
- import { cn } from "@riducms/ui";
3
+ import "@admin/components/ui/dropdown-menu/dropdown-menu.scss";
4
4
 
5
5
  let {
6
6
  ref = $bindable(null),
@@ -12,6 +12,6 @@
12
12
  <DropdownMenuPrimitive.Separator
13
13
  bind:ref
14
14
  data-slot="dropdown-menu-separator"
15
- class={cn("-mx-1 my-1 h-px bg-control-border", className)}
15
+ class={["ridu-dropdown-menu__separator", className]}
16
16
  {...restProps}
17
17
  />
@@ -0,0 +1,62 @@
1
+ @use "@riducms/ui/styles.scss" as ui;
2
+
3
+ @layer ridu.components {
4
+ .ridu-dropdown-menu {
5
+ z-index: 50;
6
+ min-width: 176px;
7
+ padding: 4px;
8
+ border: 1px solid var(--control-border);
9
+ border-radius: 4px;
10
+ background: var(--popover);
11
+ color: var(--popover-foreground);
12
+ box-shadow: var(--shadow-popover);
13
+ font-size: 12.5px;
14
+ outline: none;
15
+ transform-origin: var(--bits-menu-content-transform-origin);
16
+
17
+ &[data-state="open"] {
18
+ animation: ridu-dropdown-menu-in 100ms ease-out;
19
+ }
20
+ }
21
+
22
+ .ridu-dropdown-menu__item {
23
+ display: flex;
24
+ align-items: center;
25
+ min-height: 32px;
26
+ padding: 6px 10px;
27
+ border-radius: 3px;
28
+ color: var(--foreground-muted);
29
+ cursor: default;
30
+ outline: none;
31
+ user-select: none;
32
+
33
+ &[data-highlighted] {
34
+ background: var(--control-surface-hover);
35
+ color: var(--foreground);
36
+ }
37
+
38
+ &[data-disabled] {
39
+ opacity: 0.4;
40
+ pointer-events: none;
41
+ }
42
+ }
43
+
44
+ .ridu-dropdown-menu__separator {
45
+ height: 1px;
46
+ margin: 4px -4px;
47
+ background: var(--control-border);
48
+ }
49
+
50
+ @media (prefers-reduced-motion: reduce) {
51
+ .ridu-dropdown-menu[data-state="open"] {
52
+ animation: none;
53
+ }
54
+ }
55
+ }
56
+
57
+ @keyframes ridu-dropdown-menu-in {
58
+ from {
59
+ opacity: 0;
60
+ transform: scale(0.98);
61
+ }
62
+ }
@@ -0,0 +1,17 @@
1
+ @use "@riducms/ui/styles.scss" as ui;
2
+
3
+ @layer ridu.components {
4
+ .ridu-kbd {
5
+ display: inline-flex;
6
+ align-items: center;
7
+ justify-content: center;
8
+ min-height: 20px;
9
+ padding-inline: 6px;
10
+ border: 1px solid var(--control-border);
11
+ border-radius: 4px;
12
+ color: var(--ink-faint);
13
+ font-family: var(--font-mono);
14
+ font-size: 10px;
15
+ line-height: 1;
16
+ }
17
+ }
@@ -1,7 +1,8 @@
1
1
  <script lang="ts">
2
2
  import type { HTMLAttributes } from "svelte/elements";
3
3
 
4
- import { cn, type WithElementRef } from "@riducms/ui";
4
+ import { type WithElementRef } from "@riducms/ui";
5
+ import "@admin/components/ui/kbd/kbd.scss";
5
6
 
6
7
  let {
7
8
  ref = $bindable(null),
@@ -11,14 +12,6 @@
11
12
  }: WithElementRef<HTMLAttributes<HTMLElement>> = $props();
12
13
  </script>
13
14
 
14
- <kbd
15
- bind:this={ref}
16
- data-slot="kbd"
17
- class={cn(
18
- "font-mono inline-flex min-h-5 items-center justify-center rounded-[4px] border border-control-border px-1.5 text-[10px] leading-none text-foreground-faint",
19
- className
20
- )}
21
- {...restProps}
22
- >
15
+ <kbd bind:this={ref} data-slot="kbd" class={["ridu-kbd", className]} {...restProps}>
23
16
  {@render children?.()}
24
17
  </kbd>
@@ -0,0 +1,40 @@
1
+ @use "@riducms/ui/styles.scss" as ui;
2
+
3
+ @layer ridu.components {
4
+ .ridu-navigation-drawer {
5
+ position: fixed;
6
+ inset: 0;
7
+ z-index: 50;
8
+ display: flex;
9
+ flex-direction: column;
10
+ background: var(--background);
11
+ color: var(--foreground);
12
+ font-size: 12px;
13
+ line-height: var(--line-height-body);
14
+ outline: none;
15
+ animation: ridu-navigation-enter 150ms linear;
16
+ }
17
+ .ridu-navigation-drawer__header {
18
+ display: flex;
19
+ align-items: flex-start;
20
+ flex-shrink: 0;
21
+ height: var(--admin-header-height);
22
+ padding: 16px var(--admin-gutter) 0;
23
+ }
24
+ .ridu-navigation-drawer__label {
25
+ @include ui.visually-hidden;
26
+ }
27
+ @keyframes ridu-navigation-enter {
28
+ from {
29
+ opacity: 0;
30
+ }
31
+ to {
32
+ opacity: 1;
33
+ }
34
+ }
35
+ @media (prefers-reduced-motion: reduce) {
36
+ .ridu-navigation-drawer {
37
+ animation: none;
38
+ }
39
+ }
40
+ }
@@ -0,0 +1,38 @@
1
+ <script lang="ts">
2
+ import { Dialog } from "bits-ui";
3
+ import type { Snippet } from "svelte";
4
+ import { getAdminI18n } from "@riducms/plugin";
5
+ import MenuIcon from "~icons/lucide/menu";
6
+ import XIcon from "~icons/lucide/x";
7
+ import "@admin/components/ui/navigation-drawer/navigation-drawer.scss";
8
+
9
+ let { open = $bindable(false), children }: { open?: boolean; children: Snippet } = $props();
10
+
11
+ const i18n = getAdminI18n();
12
+ </script>
13
+
14
+ <Dialog.Root bind:open>
15
+ <Dialog.Trigger type="button" class="ridu-nav-toggle" aria-label={i18n.t("navigation:openMenu")}>
16
+ <MenuIcon aria-hidden="true" />
17
+ </Dialog.Trigger>
18
+ <Dialog.Portal>
19
+ <Dialog.Content class="ridu-navigation-drawer" dir={i18n.direction}>
20
+ <Dialog.Title class="ridu-navigation-drawer__label">
21
+ {i18n.t("navigation:adminNavigation")}
22
+ </Dialog.Title>
23
+ <Dialog.Description class="ridu-navigation-drawer__label">
24
+ {i18n.t("navigation:adminNavigationDescription")}
25
+ </Dialog.Description>
26
+ <div class="ridu-navigation-drawer__header">
27
+ <Dialog.Close
28
+ type="button"
29
+ class="ridu-nav-toggle"
30
+ aria-label={i18n.t("navigation:closeMenu")}
31
+ >
32
+ <XIcon aria-hidden="true" />
33
+ </Dialog.Close>
34
+ </div>
35
+ {@render children()}
36
+ </Dialog.Content>
37
+ </Dialog.Portal>
38
+ </Dialog.Root>
@@ -1,6 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { Popover as PopoverPrimitive } from "bits-ui";
3
- import { cn, type WithoutChildrenOrChild } from "@riducms/ui";
3
+ import "@admin/components/ui/popover/popover.scss";
4
+ import { type WithoutChildrenOrChild } from "@riducms/ui";
4
5
 
5
6
  let {
6
7
  ref = $bindable(null),
@@ -20,10 +21,7 @@
20
21
  data-slot="popover-content"
21
22
  {sideOffset}
22
23
  {align}
23
- class={cn(
24
- "ridu-popover-enter flex flex-col gap-4 rounded-[4px] border border-control-border bg-popover p-2 text-sm text-popover-foreground shadow-[var(--shadow-popover)] z-50 w-72 origin-(--bits-popover-content-transform-origin) outline-none",
25
- className
26
- )}
24
+ class={["ridu-popover ridu-popover-enter", className]}
27
25
  {...restProps}
28
26
  />
29
27
  </PopoverPrimitive.Portal>
@@ -0,0 +1,18 @@
1
+ @layer ridu.components {
2
+ .ridu-popover {
3
+ display: flex;
4
+ flex-direction: column;
5
+ gap: 16px;
6
+ width: 288px;
7
+ padding: 8px;
8
+ border: 1px solid var(--control-border);
9
+ border-radius: 4px;
10
+ background: var(--popover);
11
+ color: var(--popover-foreground);
12
+ font-size: var(--font-size-body);
13
+ box-shadow: var(--shadow-popover);
14
+ z-index: 80;
15
+ outline: none;
16
+ transform-origin: var(--bits-popover-content-transform-origin);
17
+ }
18
+ }
@@ -1,3 +1,2 @@
1
1
  export { default as RadioGroup } from "@admin/components/ui/radio-group/radio-group.svelte";
2
- export { default as RadioGroupItem } from "@admin/components/ui/radio-group/radio-group-item.svelte";
3
2
  export { default as RadioCardItem } from "@admin/components/ui/radio-group/radio-card-item.svelte";
@@ -1,7 +1,7 @@
1
1
  <script lang="ts">
2
2
  import { RadioGroup as RadioGroupPrimitive } from "bits-ui";
3
3
 
4
- import { cn } from "@riducms/ui";
4
+ import "@admin/components/ui/radio-group/radio.scss";
5
5
 
6
6
  let {
7
7
  value,
@@ -20,19 +20,14 @@
20
20
  {value}
21
21
  {disabled}
22
22
  data-slot="radio-card-item"
23
- class={cn(
24
- "group/radio inline-flex min-h-6 cursor-pointer items-center gap-2 text-left text-[13px] text-foreground-muted outline-none transition-colors hover:text-foreground focus-visible:ring-2 focus-visible:ring-ring/70 focus-visible:ring-offset-2 focus-visible:ring-offset-background data-[state=checked]:text-foreground data-[disabled]:cursor-not-allowed data-[disabled]:text-foreground-faint",
25
- className
26
- )}
23
+ class={["ridu-radio-option", className]}
27
24
  >
28
25
  {#snippet children({ checked })}
29
- <span
30
- class="grid size-5 shrink-0 place-items-center rounded-full border border-control-border bg-control transition-[border-color,background-color] group-hover/radio:border-control-border-hover data-[checked=true]:border-foreground-muted"
31
- data-checked={checked}
32
- aria-hidden="true"
33
- >
34
- {#if checked}<span class="size-2 rounded-full bg-foreground"></span>{/if}
26
+ <span class="ridu-radio-option__control" data-checked={checked} aria-hidden="true">
27
+ {#if checked}
28
+ <span class="ridu-radio-option__dot"></span>
29
+ {/if}
35
30
  </span>
36
- <span class="min-w-0">{label}</span>
31
+ <span>{label}</span>
37
32
  {/snippet}
38
33
  </RadioGroupPrimitive.Item>
@@ -1,6 +1,6 @@
1
1
  <script lang="ts">
2
2
  import { RadioGroup as RadioGroupPrimitive } from "bits-ui";
3
- import { cn } from "@riducms/ui";
3
+ import "@admin/components/ui/radio-group/radio.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="radio-group"
17
- class={cn("grid gap-2", className)}
17
+ class={className ?? "ridu-radio-group"}
18
18
  {...restProps}
19
19
  />
@@ -0,0 +1,45 @@
1
+ @use "@riducms/ui/styles.scss" as ui;
2
+ @layer ridu.components {
3
+ .ridu-radio-group {
4
+ display: grid;
5
+ gap: 8px;
6
+ }
7
+ .ridu-radio-option {
8
+ display: inline-flex;
9
+ align-items: center;
10
+ gap: 8px;
11
+ min-height: 24px;
12
+ border: 0;
13
+ padding: 0;
14
+ background: transparent;
15
+ color: var(--foreground);
16
+ font: inherit;
17
+ text-align: start;
18
+ cursor: pointer;
19
+ &:focus-visible {
20
+ @include ui.focus-outline;
21
+ }
22
+ &[data-disabled] {
23
+ cursor: not-allowed;
24
+ color: var(--control-disabled-foreground);
25
+ }
26
+ &:hover .ridu-radio-option__control {
27
+ border-color: var(--control-border-hover);
28
+ }
29
+ }
30
+ .ridu-radio-option__control {
31
+ @include ui.control-surface;
32
+ display: grid;
33
+ place-items: center;
34
+ flex-shrink: 0;
35
+ width: 20px;
36
+ height: 20px;
37
+ border-radius: 50%;
38
+ }
39
+ .ridu-radio-option__dot {
40
+ width: 8px;
41
+ height: 8px;
42
+ border-radius: 50%;
43
+ background: var(--foreground);
44
+ }
45
+ }
@@ -1,9 +1,11 @@
1
1
  <script lang="ts">
2
2
  import { Select as SelectPrimitive } from "bits-ui";
3
- import { cn, type WithoutChild, type WithoutChildrenOrChild } from "@riducms/ui";
3
+ import { type WithoutChild, type WithoutChildrenOrChild } from "@riducms/ui";
4
4
  import SelectScrollDownButton from "@admin/components/ui/select/select-scroll-down-button.svelte";
5
5
  import SelectScrollUpButton from "@admin/components/ui/select/select-scroll-up-button.svelte";
6
6
 
7
+ import "@admin/components/ui/select/select.scss";
8
+
7
9
  let {
8
10
  ref = $bindable(null),
9
11
  class: className,
@@ -23,14 +25,11 @@
23
25
  {sideOffset}
24
26
  {preventScroll}
25
27
  data-slot="select-content"
26
- class={cn(
27
- "ridu-popover-enter max-h-(--bits-select-content-available-height) min-w-36 rounded-[10px] border border-control-border bg-popover text-popover-foreground shadow-[var(--shadow-popover)] relative isolate z-50 overflow-x-hidden overflow-y-auto",
28
- className
29
- )}
28
+ class={["ridu-select__content", className]}
30
29
  {...restProps}
31
30
  >
32
31
  <SelectScrollUpButton />
33
- <SelectPrimitive.Viewport class={cn("w-full min-w-(--bits-select-anchor-width) scroll-my-1")}>
32
+ <SelectPrimitive.Viewport class="ridu-select__viewport">
34
33
  {@render children?.()}
35
34
  </SelectPrimitive.Viewport>
36
35
  <SelectScrollDownButton />
@@ -1,7 +1,9 @@
1
1
  <script lang="ts">
2
2
  import { Select as SelectPrimitive } from "bits-ui";
3
3
  import CheckIcon from "~icons/lucide/check";
4
- import { cn, type WithoutChild } from "@riducms/ui";
4
+ import { type WithoutChild } from "@riducms/ui";
5
+
6
+ import "@admin/components/ui/select/select.scss";
5
7
 
6
8
  let {
7
9
  ref = $bindable(null),
@@ -16,20 +18,18 @@
16
18
  <SelectPrimitive.Item
17
19
  bind:ref
18
20
  {value}
21
+ {label}
19
22
  data-slot="select-item"
20
- class={cn(
21
- "min-h-9 gap-2 rounded-md py-2 pe-8 ps-3 text-[14px] text-foreground-body [&_svg:not([class*='size-'])]:size-3.5 *:[span]:last:flex *:[span]:last:items-center *:[span]:last:gap-2 relative flex w-full cursor-default items-center outline-none select-none data-[highlighted]:bg-control-hover data-[highlighted]:text-foreground data-[selected]:text-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-45 [&_svg]:pointer-events-none [&_svg]:shrink-0",
22
- className
23
- )}
23
+ class={["ridu-select__item", className]}
24
24
  {...restProps}
25
25
  >
26
26
  {#snippet children({ selected, highlighted })}
27
- <span class="absolute end-2 flex size-3.5 items-center justify-center">
27
+ <span class="ridu-select__indicator">
28
28
  {#if selected}
29
- <CheckIcon class="cn-select-item-indicator-icon" />
29
+ <CheckIcon class="ridu-select__item-check" />
30
30
  {/if}
31
31
  </span>
32
- <span class="flex flex-1 gap-2 shrink-0 whitespace-nowrap">
32
+ <span class="ridu-select__label">
33
33
  {#if childrenProp}
34
34
  {@render childrenProp({ selected, highlighted })}
35
35
  {:else}