includio-cms 0.25.0 → 0.27.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 (411) hide show
  1. package/API.md +97 -4
  2. package/CHANGELOG.md +118 -0
  3. package/DOCS.md +1 -1
  4. package/README.md +2 -0
  5. package/ROADMAP.md +14 -0
  6. package/dist/admin/auth-client.d.ts +42 -42
  7. package/dist/admin/client/account/lang.d.ts +1 -0
  8. package/dist/admin/client/account/lang.js +4 -2
  9. package/dist/admin/client/account/profile-section.svelte +2 -2
  10. package/dist/admin/client/account/security-section.svelte +27 -4
  11. package/dist/admin/client/account/sessions-section.svelte +1 -1
  12. package/dist/admin/client/admin/admin-after-login-layout-content.svelte +1 -1
  13. package/dist/admin/client/admin/admin-layout.svelte +12 -2
  14. package/dist/admin/client/admin/admin-layout.svelte.d.ts +2 -1
  15. package/dist/admin/client/admin/dashboard-page.svelte +34 -10
  16. package/dist/admin/client/collection/bulk-actions-bar.svelte +86 -44
  17. package/dist/admin/client/collection/bulk-actions-bar.svelte.d.ts +3 -1
  18. package/dist/admin/client/collection/collection-entries.svelte +52 -36
  19. package/dist/admin/client/collection/collection-entries.svelte.d.ts +3 -0
  20. package/dist/admin/client/collection/collection.svelte +28 -14
  21. package/dist/admin/client/collection/collection.svelte.d.ts +3 -0
  22. package/dist/admin/client/collection/data-table.svelte +240 -130
  23. package/dist/admin/client/collection/data-table.svelte.d.ts +9 -0
  24. package/dist/admin/client/collection/date-cell.svelte +4 -4
  25. package/dist/admin/client/collection/row-actions.svelte +2 -1
  26. package/dist/admin/client/collection/sortable-header.svelte +33 -9
  27. package/dist/admin/client/collection/state-display.svelte +102 -0
  28. package/dist/admin/client/collection/state-display.svelte.d.ts +12 -0
  29. package/dist/admin/client/collection/status-badge.svelte +99 -11
  30. package/dist/admin/client/collection/status-badge.svelte.d.ts +15 -1
  31. package/dist/admin/client/collection/table-pagination.svelte +21 -6
  32. package/dist/admin/client/collection/table-toolbar.svelte +105 -80
  33. package/dist/admin/client/collection/table-toolbar.svelte.d.ts +11 -8
  34. package/dist/admin/client/entry/entry-form.svelte +36 -11
  35. package/dist/admin/client/entry/entry-form.svelte.d.ts +1 -0
  36. package/dist/admin/client/entry/entry-header.svelte +22 -15
  37. package/dist/admin/client/entry/entry-header.svelte.d.ts +1 -0
  38. package/dist/admin/client/entry/entry.svelte +269 -165
  39. package/dist/admin/client/entry/header/a11y-header-badge.svelte +47 -0
  40. package/dist/admin/client/entry/header/a11y-header-badge.svelte.d.ts +8 -0
  41. package/dist/admin/client/entry/header/publish-panel.svelte +69 -13
  42. package/dist/admin/client/entry/header/save-indicator.svelte +57 -28
  43. package/dist/admin/client/entry/header/save-indicator.svelte.d.ts +1 -0
  44. package/dist/admin/client/entry/header/status-badge.svelte +60 -15
  45. package/dist/admin/client/entry/header/status-badge.svelte.d.ts +1 -2
  46. package/dist/admin/client/entry/header/version-history-sheet.svelte +1 -1
  47. package/dist/admin/client/entry/hybrid/hybrid-layout.svelte +74 -23
  48. package/dist/admin/client/entry/hybrid/hybrid-preview.svelte +1 -1
  49. package/dist/admin/client/entry/utils.d.ts +14 -0
  50. package/dist/admin/client/entry/utils.js +28 -0
  51. package/dist/admin/client/form/form-submission/form-submission.svelte +2 -2
  52. package/dist/admin/client/form/form-submissions.svelte +143 -194
  53. package/dist/admin/client/form/form-submissions.svelte.d.ts +2 -0
  54. package/dist/admin/client/login/lang.d.ts +3 -0
  55. package/dist/admin/client/login/lang.js +10 -4
  56. package/dist/admin/client/login/login-form.svelte +8 -1
  57. package/dist/admin/client/login/reset-password-page.svelte +24 -3
  58. package/dist/admin/client/login/schema.d.ts +14 -2
  59. package/dist/admin/client/login/schema.js +19 -8
  60. package/dist/admin/client/maintenance/maintenance-page.svelte +16 -17
  61. package/dist/admin/client/media/media-page.svelte +1 -1
  62. package/dist/admin/client/shop/coupon-edit-page.svelte +117 -13
  63. package/dist/admin/client/shop/coupon-form.svelte +282 -138
  64. package/dist/admin/client/shop/coupon-form.svelte.d.ts +1 -9
  65. package/dist/admin/client/shop/coupon-new-page.svelte +40 -10
  66. package/dist/admin/client/shop/coupon-new-page.svelte.d.ts +2 -17
  67. package/dist/admin/client/shop/coupon-schema.d.ts +28 -0
  68. package/dist/admin/client/shop/coupon-schema.js +53 -0
  69. package/dist/admin/client/shop/coupons-list-page.svelte +262 -118
  70. package/dist/admin/client/shop/coupons-list-page.svelte.d.ts +16 -1
  71. package/dist/admin/client/shop/refund-dialog.svelte +37 -1
  72. package/dist/admin/client/shop/refund-dialog.svelte.d.ts +3 -0
  73. package/dist/admin/client/shop/shipping-method-edit-page.svelte +108 -59
  74. package/dist/admin/client/shop/shipping-method-form.svelte +36 -9
  75. package/dist/admin/client/shop/shipping-method-new-page.svelte +44 -13
  76. package/dist/admin/client/shop/shipping-methods-list-page.svelte +101 -59
  77. package/dist/admin/client/shop/shop-order-detail-page.svelte +220 -84
  78. package/dist/admin/client/shop/shop-orders-list-page.svelte +302 -152
  79. package/dist/admin/client/shop/shop-orders-list-page.svelte.d.ts +18 -1
  80. package/dist/admin/client/shop/shop-products-list-page.svelte +355 -118
  81. package/dist/admin/client/shop/shop-products-list-page.svelte.d.ts +19 -1
  82. package/dist/admin/client/users/accept-invite-page.svelte +24 -3
  83. package/dist/admin/client/users/create-user-dialog.svelte +3 -8
  84. package/dist/admin/client/users/lang.d.ts +2 -0
  85. package/dist/admin/client/users/lang.js +4 -0
  86. package/dist/admin/client/users/pending-invitations.svelte +2 -9
  87. package/dist/admin/client/users/user-name-cell.svelte +20 -0
  88. package/dist/admin/client/users/user-name-cell.svelte.d.ts +9 -0
  89. package/dist/admin/client/users/user-role-badge.svelte +16 -0
  90. package/dist/admin/client/users/user-role-badge.svelte.d.ts +7 -0
  91. package/dist/admin/client/users/user-row-actions.svelte +72 -0
  92. package/dist/admin/client/users/user-row-actions.svelte.d.ts +20 -0
  93. package/dist/admin/client/users/user-sessions-sheet.svelte +2 -11
  94. package/dist/admin/client/users/users-page.svelte +283 -497
  95. package/dist/admin/client/users/users-page.svelte.d.ts +12 -1
  96. package/dist/admin/components/dashboard/form-submissions-widget.svelte +59 -74
  97. package/dist/admin/components/dashboard/recent-activity.svelte +17 -5
  98. package/dist/admin/components/dashboard/recent-entries.svelte +19 -7
  99. package/dist/admin/components/dialogs/confirmation-dialog.svelte +105 -0
  100. package/dist/admin/components/dialogs/confirmation-dialog.svelte.d.ts +13 -0
  101. package/dist/admin/components/fields/block-picker-modal.svelte +6 -0
  102. package/dist/admin/components/fields/blocks-field.svelte +46 -1
  103. package/dist/admin/components/fields/boolean-field.svelte +1 -1
  104. package/dist/admin/components/fields/field-renderer.svelte +29 -22
  105. package/dist/admin/components/fields/file-field.svelte +344 -30
  106. package/dist/admin/components/fields/icon-field.svelte +86 -0
  107. package/dist/admin/components/fields/icon-field.svelte.d.ts +8 -0
  108. package/dist/admin/components/fields/icon-picker-dialog.svelte +174 -0
  109. package/dist/admin/components/fields/icon-picker-dialog.svelte.d.ts +11 -0
  110. package/dist/admin/components/fields/media-field.svelte +16 -2
  111. package/dist/admin/components/fields/object-field.svelte +27 -7
  112. package/dist/admin/components/fields/radio-field.svelte +22 -0
  113. package/dist/admin/components/fields/relation-field.svelte +123 -97
  114. package/dist/admin/components/fields/relation-picker-dialog.svelte +2 -2
  115. package/dist/admin/components/fields/seo-field.svelte +60 -30
  116. package/dist/admin/components/fields/shop-field.svelte +219 -24
  117. package/dist/admin/components/fields/simple-array-field.svelte +321 -151
  118. package/dist/admin/components/fields/simple-array-field.svelte.d.ts +3 -0
  119. package/dist/admin/components/fields/slug-field.svelte +146 -21
  120. package/dist/admin/components/fields/text-field-wrapper.svelte +37 -20
  121. package/dist/admin/components/fields/text-field.svelte +7 -2
  122. package/dist/admin/components/fields/url-field-wrapper.svelte +10 -0
  123. package/dist/admin/components/fields/url-field.svelte +36 -23
  124. package/dist/admin/components/forms/form-error-summary.svelte +143 -0
  125. package/dist/admin/components/forms/form-error-summary.svelte.d.ts +27 -0
  126. package/dist/admin/components/layout/app-sidebar.svelte +7 -2
  127. package/dist/admin/components/layout/detail-page-shell.svelte +71 -0
  128. package/dist/admin/components/layout/detail-page-shell.svelte.d.ts +24 -0
  129. package/dist/admin/components/layout/lang.d.ts +5 -0
  130. package/dist/admin/components/layout/lang.js +10 -0
  131. package/dist/admin/components/layout/layout-renderer.svelte +71 -2
  132. package/dist/admin/components/layout/layout-renderer.svelte.d.ts +1 -0
  133. package/dist/admin/components/layout/layout-tabs.svelte +173 -0
  134. package/dist/admin/components/layout/layout-tabs.svelte.d.ts +24 -0
  135. package/dist/admin/components/layout/nav-breadcrumbs.svelte +25 -7
  136. package/dist/admin/components/layout/nav-collections.svelte +23 -36
  137. package/dist/admin/components/layout/nav-forms.svelte +19 -35
  138. package/dist/admin/components/layout/nav-main.svelte +3 -28
  139. package/dist/admin/components/layout/nav-search.svelte +70 -2
  140. package/dist/admin/components/layout/nav-section.svelte +77 -0
  141. package/dist/admin/components/layout/nav-section.svelte.d.ts +22 -0
  142. package/dist/admin/components/layout/nav-shop.svelte +3 -27
  143. package/dist/admin/components/layout/nav-singletons.svelte +16 -28
  144. package/dist/admin/components/layout/page-header.stories.svelte +93 -0
  145. package/dist/admin/components/layout/page-header.stories.svelte.d.ts +27 -0
  146. package/dist/admin/components/layout/page-header.svelte +68 -0
  147. package/dist/admin/components/layout/page-header.svelte.d.ts +17 -0
  148. package/dist/admin/components/layout/site-header.svelte +9 -0
  149. package/dist/admin/components/layout/site-header.svelte.d.ts +2 -17
  150. package/dist/admin/components/media/file/file-name-input.svelte +6 -2
  151. package/dist/admin/components/media/file/file-preview.svelte +130 -17
  152. package/dist/admin/components/media/file-upload.svelte +16 -7
  153. package/dist/admin/components/media/file-upload.svelte.d.ts +1 -0
  154. package/dist/admin/components/media/files-list.svelte +153 -53
  155. package/dist/admin/components/media/files-list.svelte.d.ts +1 -0
  156. package/dist/admin/components/media/media-library.svelte +577 -198
  157. package/dist/admin/components/media/media-library.svelte.d.ts +4 -0
  158. package/dist/admin/components/media/media-selector.svelte +4 -2
  159. package/dist/admin/components/media/media-selector.svelte.d.ts +1 -0
  160. package/dist/admin/components/media/tag-sidebar.svelte +4 -4
  161. package/dist/admin/components/tiptap/FigureNodeView.svelte +10 -0
  162. package/dist/admin/components/tiptap/bubble-menu.svelte +104 -0
  163. package/dist/admin/components/tiptap/bubble-menu.svelte.d.ts +19 -0
  164. package/dist/admin/components/tiptap/content-editor.svelte +28 -24
  165. package/dist/admin/components/tiptap/editor-toolbar.svelte +7 -7
  166. package/dist/admin/components/tiptap/extensions.js +5 -1
  167. package/dist/admin/components/tiptap/image-dialog.svelte +5 -1
  168. package/dist/admin/components/tiptap/link-dialog.svelte +2 -0
  169. package/dist/admin/components/tiptap/tiptap-editor.svelte +18 -20
  170. package/dist/admin/components/tiptap/video-dialog.svelte +1 -1
  171. package/dist/admin/components/variant-form/VariantAttributeRenderer.svelte +109 -0
  172. package/dist/admin/components/variant-form/VariantAttributeRenderer.svelte.d.ts +9 -0
  173. package/dist/admin/helpers/build-icon-set-map.d.ts +8 -0
  174. package/dist/admin/helpers/build-icon-set-map.js +16 -0
  175. package/dist/admin/helpers/index.d.ts +2 -0
  176. package/dist/admin/helpers/index.js +2 -0
  177. package/dist/admin/i18n/errors.d.ts +140 -0
  178. package/dist/admin/i18n/errors.js +151 -0
  179. package/dist/admin/remote/entry.remote.d.ts +59 -4
  180. package/dist/admin/remote/entry.remote.js +239 -62
  181. package/dist/admin/remote/shop.remote.d.ts +87 -48
  182. package/dist/admin/remote/shop.remote.js +70 -8
  183. package/dist/admin/shared/password-generate.d.ts +6 -0
  184. package/dist/admin/shared/password-generate.js +40 -0
  185. package/dist/admin/shared/password-schema.d.ts +6 -0
  186. package/dist/admin/shared/password-schema.js +10 -3
  187. package/dist/admin/state/icon-sets.svelte.d.ts +9 -0
  188. package/dist/admin/state/icon-sets.svelte.js +20 -0
  189. package/dist/admin/styles/admin.css +23 -6
  190. package/dist/admin/styles/tokens.md +244 -0
  191. package/dist/admin/utils/accordionActivation.d.ts +13 -0
  192. package/dist/admin/utils/accordionActivation.js +35 -0
  193. package/dist/admin/utils/entryLabel.d.ts +23 -0
  194. package/dist/admin/utils/entryLabel.js +51 -12
  195. package/dist/admin/utils/field-a11y.d.ts +29 -0
  196. package/dist/admin/utils/field-a11y.js +23 -0
  197. package/dist/admin/utils/fieldPathElement.d.ts +9 -0
  198. package/dist/admin/utils/fieldPathElement.js +18 -0
  199. package/dist/admin/utils/fileDisplay.d.ts +10 -0
  200. package/dist/admin/utils/fileDisplay.js +26 -0
  201. package/dist/admin/utils/flattenFormErrors.d.ts +19 -0
  202. package/dist/admin/utils/flattenFormErrors.js +102 -0
  203. package/dist/admin/utils/formatters.d.ts +12 -0
  204. package/dist/admin/utils/{formatDate.js → formatters.js} +23 -2
  205. package/dist/admin/utils/scrollWithin.d.ts +9 -0
  206. package/dist/admin/utils/scrollWithin.js +32 -0
  207. package/dist/admin/utils/tabActivation.d.ts +12 -0
  208. package/dist/admin/utils/tabActivation.js +24 -0
  209. package/dist/cli/scaffold/admin.js +2 -2
  210. package/dist/cms/runtime/schema.d.ts +1 -0
  211. package/dist/cms/runtime/schema.js +1 -0
  212. package/dist/cms/runtime/types.d.ts +80 -7
  213. package/dist/components/ui/accordion/accordion-content.svelte +17 -3
  214. package/dist/components/ui/accordion/accordion.stories.svelte +21 -1
  215. package/dist/components/ui/alert/alert.stories.svelte +14 -0
  216. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte +45 -0
  217. package/dist/components/ui/alert-dialog/alert-dialog.stories.svelte.d.ts +27 -0
  218. package/dist/components/ui/avatar/avatar.stories.svelte +27 -0
  219. package/dist/components/ui/badge/badge.stories.svelte +15 -0
  220. package/dist/components/ui/breadcrumb/breadcrumb.stories.svelte +47 -0
  221. package/dist/components/ui/breadcrumb/breadcrumb.svelte +1 -1
  222. package/dist/components/ui/button/button.stories.svelte +53 -6
  223. package/dist/components/ui/button/button.svelte +39 -5
  224. package/dist/components/ui/button/button.svelte.d.ts +4 -0
  225. package/dist/components/ui/button-group/button-group.stories.svelte +44 -0
  226. package/dist/components/ui/button-group/button-group.stories.svelte.d.ts +27 -0
  227. package/dist/components/ui/calendar/calendar.stories.svelte +36 -0
  228. package/dist/components/ui/calendar/calendar.stories.svelte.d.ts +27 -0
  229. package/dist/components/ui/card/card.stories.svelte +7 -0
  230. package/dist/components/ui/carousel/carousel.stories.svelte +43 -0
  231. package/dist/components/ui/carousel/carousel.stories.svelte.d.ts +27 -0
  232. package/dist/components/ui/checkbox/checkbox.stories.svelte +67 -0
  233. package/dist/components/ui/checkbox/checkbox.stories.svelte.d.ts +27 -0
  234. package/dist/components/ui/checkbox/checkbox.svelte +1 -1
  235. package/dist/components/ui/command/command.stories.svelte +18 -0
  236. package/dist/components/ui/data-table/data-table.stories.svelte +61 -0
  237. package/dist/components/ui/data-table/data-table.stories.svelte.d.ts +18 -0
  238. package/dist/components/ui/dialog/dialog-content.svelte +5 -0
  239. package/dist/components/ui/dialog/dialog-content.svelte.d.ts +2 -0
  240. package/dist/components/ui/dialog/dialog.stories.svelte +35 -0
  241. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte +74 -0
  242. package/dist/components/ui/dropdown-menu/dropdown-menu.stories.svelte.d.ts +27 -0
  243. package/dist/components/ui/field/field-context.svelte.d.ts +22 -0
  244. package/dist/components/ui/field/field-context.svelte.js +9 -0
  245. package/dist/components/ui/field/field-control.svelte +18 -0
  246. package/dist/components/ui/field/field-control.svelte.d.ts +8 -0
  247. package/dist/components/ui/field/field-description.svelte +12 -0
  248. package/dist/components/ui/field/field-error.svelte +14 -6
  249. package/dist/components/ui/field/field-label.svelte +10 -0
  250. package/dist/components/ui/field/field.stories.svelte +95 -9
  251. package/dist/components/ui/field/field.svelte +57 -0
  252. package/dist/components/ui/field/field.svelte.d.ts +2 -0
  253. package/dist/components/ui/field/index.d.ts +3 -1
  254. package/dist/components/ui/field/index.js +4 -2
  255. package/dist/components/ui/form/form-field-errors.svelte +1 -1
  256. package/dist/components/ui/form/form.stories.svelte +25 -0
  257. package/dist/components/ui/form/form.stories.svelte.d.ts +26 -0
  258. package/dist/components/ui/input/input.stories.svelte +26 -0
  259. package/dist/components/ui/input-group/input-group-input.svelte.d.ts +1 -1
  260. package/dist/components/ui/input-group/input-group.stories.svelte +43 -0
  261. package/dist/components/ui/input-group/input-group.stories.svelte.d.ts +27 -0
  262. package/dist/components/ui/item/item.stories.svelte +61 -0
  263. package/dist/components/ui/item/item.stories.svelte.d.ts +27 -0
  264. package/dist/components/ui/label/label.stories.svelte +7 -0
  265. package/dist/components/ui/live-region/index.d.ts +1 -0
  266. package/dist/components/ui/live-region/index.js +1 -0
  267. package/dist/components/ui/live-region/live-region-demo.svelte +32 -0
  268. package/dist/components/ui/live-region/live-region-demo.svelte.d.ts +7 -0
  269. package/dist/components/ui/live-region/live-region.stories.svelte +23 -0
  270. package/dist/components/ui/live-region/live-region.stories.svelte.d.ts +26 -0
  271. package/dist/components/ui/live-region/live-region.svelte +12 -0
  272. package/dist/components/ui/live-region/live-region.svelte.d.ts +8 -0
  273. package/dist/components/ui/popover/popover.stories.svelte +34 -0
  274. package/dist/components/ui/radio-group/radio-group.stories.svelte +58 -0
  275. package/dist/components/ui/radio-group/radio-group.stories.svelte.d.ts +27 -0
  276. package/dist/components/ui/resizable/resizable.stories.svelte +56 -0
  277. package/dist/components/ui/resizable/resizable.stories.svelte.d.ts +27 -0
  278. package/dist/components/ui/select/select.stories.svelte +49 -0
  279. package/dist/components/ui/separator/separator.stories.svelte +18 -0
  280. package/dist/components/ui/sheet/sheet.stories.svelte +34 -0
  281. package/dist/components/ui/sidebar/sidebar-input.svelte.d.ts +1 -1
  282. package/dist/components/ui/sidebar/sidebar-menu-button.svelte +1 -0
  283. package/dist/components/ui/sidebar/sidebar-trigger.svelte +1 -1
  284. package/dist/components/ui/sidebar/sidebar.stories.svelte +72 -0
  285. package/dist/components/ui/sidebar/sidebar.stories.svelte.d.ts +27 -0
  286. package/dist/components/ui/skeleton/skeleton.stories.svelte +39 -0
  287. package/dist/components/ui/skeleton/skeleton.stories.svelte.d.ts +27 -0
  288. package/dist/components/ui/skeleton/skeleton.svelte +6 -0
  289. package/dist/components/ui/sonner/index.d.ts +1 -1
  290. package/dist/components/ui/sonner/index.js +1 -1
  291. package/dist/components/ui/sonner/sonner.stories.svelte +7 -0
  292. package/dist/components/ui/sonner/sonner.svelte +17 -1
  293. package/dist/components/ui/sonner/sonner.svelte.d.ts +6 -0
  294. package/dist/components/ui/spinner/spinner.stories.svelte +30 -0
  295. package/dist/components/ui/spinner/spinner.stories.svelte.d.ts +27 -0
  296. package/dist/components/ui/switch/switch.stories.svelte +56 -0
  297. package/dist/components/ui/switch/switch.stories.svelte.d.ts +27 -0
  298. package/dist/components/ui/table/table-cell.svelte +1 -1
  299. package/dist/components/ui/table/table-head.svelte +1 -1
  300. package/dist/components/ui/table/table.stories.svelte +68 -0
  301. package/dist/components/ui/table/table.stories.svelte.d.ts +27 -0
  302. package/dist/components/ui/table/table.svelte +1 -1
  303. package/dist/components/ui/tabs/tabs.stories.svelte +48 -0
  304. package/dist/components/ui/tabs/tabs.stories.svelte.d.ts +27 -0
  305. package/dist/components/ui/textarea/textarea.stories.svelte +21 -0
  306. package/dist/components/ui/toggle/toggle.stories.svelte +23 -0
  307. package/dist/components/ui/toggle-group/toggle-group.stories.svelte +43 -0
  308. package/dist/components/ui/tooltip/tooltip.stories.svelte +46 -6
  309. package/dist/core/cms.d.ts +11 -2
  310. package/dist/core/cms.js +29 -0
  311. package/dist/core/fields/fieldSchemaToTs.d.ts +7 -0
  312. package/dist/core/fields/fieldSchemaToTs.js +241 -90
  313. package/dist/core/fields/layoutUtils.d.ts +4 -1
  314. package/dist/core/fields/layoutUtils.js +41 -4
  315. package/dist/core/fields/resolveSeo.d.ts +70 -0
  316. package/dist/core/fields/resolveSeo.js +88 -0
  317. package/dist/core/fields/seoFieldDescriptor.d.ts +43 -0
  318. package/dist/core/fields/seoFieldDescriptor.js +74 -0
  319. package/dist/core/fields/slugPath.d.ts +13 -0
  320. package/dist/core/fields/slugPath.js +32 -0
  321. package/dist/core/fields/urlUtils.d.ts +8 -0
  322. package/dist/core/fields/urlUtils.js +27 -0
  323. package/dist/core/index.d.ts +1 -0
  324. package/dist/core/index.js +1 -0
  325. package/dist/core/server/entries/operations/create.js +13 -0
  326. package/dist/core/server/entries/operations/get.d.ts +7 -0
  327. package/dist/core/server/entries/operations/get.js +10 -6
  328. package/dist/core/server/entries/operations/slugUniqueness.d.ts +37 -0
  329. package/dist/core/server/entries/operations/slugUniqueness.js +116 -0
  330. package/dist/core/server/entries/operations/update.d.ts +6 -1
  331. package/dist/core/server/entries/operations/update.js +24 -1
  332. package/dist/core/server/fields/slugResolver.d.ts +3 -13
  333. package/dist/core/server/fields/slugResolver.js +8 -37
  334. package/dist/core/server/generator/fields.d.ts +2 -0
  335. package/dist/core/server/generator/fields.js +44 -18
  336. package/dist/core/server/generator/formFields.js +2 -1
  337. package/dist/core/server/generator/generator.js +6 -5
  338. package/dist/core/server/generator/utils.d.ts +1 -0
  339. package/dist/core/server/generator/utils.js +4 -0
  340. package/dist/db-postgres/schema/shop/order.d.ts +37 -1
  341. package/dist/db-postgres/schema/shop/order.js +3 -1
  342. package/dist/db-postgres/schema/shop/payment.d.ts +20 -0
  343. package/dist/db-postgres/schema/shop/payment.js +4 -1
  344. package/dist/db-postgres/schema/shop/product.d.ts +20 -0
  345. package/dist/db-postgres/schema/shop/product.js +3 -1
  346. package/dist/db-postgres/schema/shop/productVariant.d.ts +12 -2
  347. package/dist/db-postgres/schema/shop/productVariant.js +22 -0
  348. package/dist/shop/cart/types.d.ts +1 -0
  349. package/dist/shop/client/index.d.ts +54 -0
  350. package/dist/shop/client/index.js +5 -1
  351. package/dist/shop/expiry.d.ts +35 -0
  352. package/dist/shop/expiry.js +68 -0
  353. package/dist/shop/http/balance-handler.d.ts +20 -0
  354. package/dist/shop/http/balance-handler.js +91 -0
  355. package/dist/shop/http/cart-handler.js +19 -0
  356. package/dist/shop/http/checkout-handler.js +19 -1
  357. package/dist/shop/http/index.d.ts +2 -0
  358. package/dist/shop/http/index.js +2 -0
  359. package/dist/shop/http/upcoming-handler.d.ts +16 -0
  360. package/dist/shop/http/upcoming-handler.js +65 -0
  361. package/dist/shop/http/webhook-handler.js +46 -9
  362. package/dist/shop/index.d.ts +4 -1
  363. package/dist/shop/index.js +7 -1
  364. package/dist/shop/server/balance-payment.d.ts +40 -0
  365. package/dist/shop/server/balance-payment.js +140 -0
  366. package/dist/shop/server/cart-hydrate.js +2 -0
  367. package/dist/shop/server/init.d.ts +14 -0
  368. package/dist/shop/server/init.js +35 -0
  369. package/dist/shop/server/orders.d.ts +35 -0
  370. package/dist/shop/server/orders.js +155 -2
  371. package/dist/shop/server/payment-policy.d.ts +35 -0
  372. package/dist/shop/server/payment-policy.js +55 -0
  373. package/dist/shop/server/payments.d.ts +29 -0
  374. package/dist/shop/server/payments.js +64 -0
  375. package/dist/shop/server/populate.d.ts +1 -1
  376. package/dist/shop/server/refund.d.ts +17 -12
  377. package/dist/shop/server/refund.js +96 -13
  378. package/dist/shop/server/shop-data.d.ts +6 -1
  379. package/dist/shop/server/shop-data.js +44 -7
  380. package/dist/shop/template.d.ts +13 -0
  381. package/dist/shop/template.js +98 -0
  382. package/dist/shop/types.d.ts +142 -1
  383. package/dist/shop/variant-attributes.d.ts +28 -0
  384. package/dist/shop/variant-attributes.js +69 -0
  385. package/dist/sveltekit/server/handle.js +17 -0
  386. package/dist/sveltekit/server/index.d.ts +1 -0
  387. package/dist/sveltekit/server/index.js +2 -0
  388. package/dist/types/cms.d.ts +4 -3
  389. package/dist/types/cms.schema.d.ts +1 -1
  390. package/dist/types/cms.schema.js +13 -2
  391. package/dist/types/fields.d.ts +56 -2
  392. package/dist/types/index.d.ts +2 -2
  393. package/dist/types/index.js +1 -1
  394. package/dist/types/layout.d.ts +35 -2
  395. package/dist/types/plugins.d.ts +40 -0
  396. package/dist/types/plugins.js +4 -1
  397. package/dist/updates/0.26.0/index.d.ts +2 -0
  398. package/dist/updates/0.26.0/index.js +51 -0
  399. package/dist/updates/0.26.1/index.d.ts +2 -0
  400. package/dist/updates/0.26.1/index.js +19 -0
  401. package/dist/updates/0.27.0/index.d.ts +2 -0
  402. package/dist/updates/0.27.0/index.js +50 -0
  403. package/dist/updates/index.js +7 -1
  404. package/package.json +29 -7
  405. package/dist/admin/client/collection/empty-state.svelte +0 -28
  406. package/dist/admin/client/collection/empty-state.svelte.d.ts +0 -9
  407. package/dist/admin/client/form/submission-status-badge.svelte +0 -41
  408. package/dist/admin/client/form/submission-status-badge.svelte.d.ts +0 -7
  409. package/dist/admin/components/media/file-preview.svelte +0 -51
  410. package/dist/admin/components/media/file-preview.svelte.d.ts +0 -6
  411. package/dist/admin/utils/formatDate.d.ts +0 -5
@@ -1,7 +1,11 @@
1
+ import type { MediaFile } from '../../../types/media.js';
1
2
  type Props = {
2
3
  selected?: string[] | string;
3
4
  multiple?: boolean;
4
5
  accept?: string;
6
+ showHeader?: boolean;
7
+ data?: MediaFile[];
8
+ state?: 'loading' | 'error' | 'ok';
5
9
  };
6
10
  declare const MediaLibrary: import("svelte").Component<Props, {}, "selected">;
7
11
  type MediaLibrary = ReturnType<typeof MediaLibrary>;
@@ -42,7 +42,7 @@
42
42
  cancel: 'Anuluj',
43
43
  confirm: 'Potwierdź',
44
44
  selectedCount: 'Wybrano',
45
- clickToSelect: '{lang[interfaceLanguage.current].clickToSelect}',
45
+ clickToSelect: 'Kliknij plik, aby go wybrać',
46
46
  selectedFile: 'Wybrany plik:'
47
47
  },
48
48
  en: {
@@ -66,11 +66,12 @@
66
66
  selected?: string[] | string;
67
67
  multiple?: boolean;
68
68
  accept?: string;
69
+ maxSizeMB?: number;
69
70
  onConfirm?: () => void;
70
71
  onCancel?: () => void;
71
72
  };
72
73
 
73
- let { selected = $bindable([]), multiple = false, accept, onConfirm, onCancel }: Props = $props();
74
+ let { selected = $bindable([]), multiple = false, accept, maxSizeMB, onConfirm, onCancel }: Props = $props();
74
75
 
75
76
  const PAGE_SIZE = 48;
76
77
 
@@ -209,6 +210,7 @@
209
210
  <FileUpload
210
211
  onUpload={() => { page = 0; loadedFiles = []; filesQuery.refresh(); countQuery.refresh(); tagCountsQuery.refresh(); totalCountQuery.refresh(); untaggedCountQuery.refresh(); }}
211
212
  {accept}
213
+ {maxSizeMB}
212
214
  bind:dropZoneRef
213
215
  tagIds={activeTagFilter && activeTagFilter !== 'untagged' ? [activeTagFilter] : undefined}
214
216
  />
@@ -2,6 +2,7 @@ type Props = {
2
2
  selected?: string[] | string;
3
3
  multiple?: boolean;
4
4
  accept?: string;
5
+ maxSizeMB?: number;
5
6
  onConfirm?: () => void;
6
7
  onCancel?: () => void;
7
8
  };
@@ -137,9 +137,9 @@
137
137
 
138
138
  <div class="flex h-full flex-col">
139
139
  <div class="flex-1 overflow-y-auto py-2 scrollbar-thin" role="listbox" aria-label="Filtry tagów">
140
- <ul class="flex flex-col gap-px px-1.5">
140
+ <ul class="flex flex-col gap-px px-1.5" role="presentation">
141
141
  <!-- All files -->
142
- <li>
142
+ <li role="presentation">
143
143
  <button
144
144
  type="button"
145
145
  role="option"
@@ -161,7 +161,7 @@
161
161
  </li>
162
162
 
163
163
  <!-- Untagged -->
164
- <li>
164
+ <li role="presentation">
165
165
  <button
166
166
  type="button"
167
167
  role="option"
@@ -187,7 +187,7 @@
187
187
 
188
188
  <!-- User tags -->
189
189
  {#each tags as tag (tag.id)}
190
- <li>
190
+ <li role="presentation">
191
191
  {#if editingTagId === tag.id}
192
192
  <form
193
193
  class="flex items-center gap-1 px-1"
@@ -269,6 +269,11 @@
269
269
  border-color: var(--primary);
270
270
  }
271
271
 
272
+ .caption-input:focus-visible {
273
+ outline: 2px solid var(--ring);
274
+ outline-offset: 1px;
275
+ }
276
+
272
277
  /* Alt text field */
273
278
  .figure-alt-row {
274
279
  margin-top: 0.375rem;
@@ -320,4 +325,9 @@
320
325
  outline: none;
321
326
  border-color: var(--primary);
322
327
  }
328
+
329
+ .figure-alt-input:focus-visible {
330
+ outline: 2px solid var(--ring);
331
+ outline-offset: 1px;
332
+ }
323
333
  </style>
@@ -0,0 +1,104 @@
1
+ <!--
2
+ @component
3
+ @internal
4
+ -->
5
+ <script lang="ts">
6
+ import { onMount, type Snippet } from 'svelte';
7
+ import { BubbleMenuPlugin, type BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';
8
+ import { PluginKey } from '@tiptap/pm/state';
9
+ import type { Editor } from '@tiptap/core';
10
+
11
+ type Props = {
12
+ editor: Editor;
13
+ pluginKey?: BubbleMenuPluginProps['pluginKey'];
14
+ updateDelay?: BubbleMenuPluginProps['updateDelay'];
15
+ resizeDelay?: BubbleMenuPluginProps['resizeDelay'];
16
+ appendTo?: BubbleMenuPluginProps['appendTo'];
17
+ shouldShow?: BubbleMenuPluginProps['shouldShow'];
18
+ getReferencedVirtualElement?: BubbleMenuPluginProps['getReferencedVirtualElement'];
19
+ options?: BubbleMenuPluginProps['options'];
20
+ class?: string;
21
+ children: Snippet;
22
+ };
23
+
24
+ let {
25
+ editor,
26
+ pluginKey,
27
+ updateDelay,
28
+ resizeDelay,
29
+ appendTo,
30
+ shouldShow = null,
31
+ getReferencedVirtualElement,
32
+ options,
33
+ class: className,
34
+ children
35
+ }: Props = $props();
36
+
37
+ // svelte-ignore state_referenced_locally
38
+ const resolvedKey = pluginKey ?? new PluginKey('bubbleMenu');
39
+
40
+ let root = $state<HTMLDivElement | null>(null);
41
+ let skipFirst = true;
42
+
43
+ onMount(() => {
44
+ if (!root || !editor || editor.isDestroyed) return;
45
+
46
+ root.style.visibility = 'hidden';
47
+ root.style.position = 'absolute';
48
+
49
+ editor.registerPlugin(
50
+ BubbleMenuPlugin({
51
+ editor,
52
+ element: root,
53
+ pluginKey: resolvedKey,
54
+ updateDelay,
55
+ resizeDelay,
56
+ appendTo,
57
+ shouldShow,
58
+ getReferencedVirtualElement,
59
+ options
60
+ })
61
+ );
62
+
63
+ return () => {
64
+ editor.unregisterPlugin(resolvedKey);
65
+ requestAnimationFrame(() => {
66
+ // RAF: defer past in-flight Floating UI update
67
+ root?.parentNode?.removeChild(root);
68
+ });
69
+ };
70
+ });
71
+
72
+ $effect(() => {
73
+ updateDelay;
74
+ resizeDelay;
75
+ appendTo;
76
+ shouldShow;
77
+ getReferencedVirtualElement;
78
+ options;
79
+
80
+ if (skipFirst) {
81
+ skipFirst = false;
82
+ return;
83
+ }
84
+ if (!editor || editor.isDestroyed) return;
85
+
86
+ editor.view.dispatch(
87
+ editor.state.tr.setMeta(resolvedKey, {
88
+ type: 'updateOptions',
89
+ options: {
90
+ updateDelay,
91
+ resizeDelay,
92
+ appendTo,
93
+ shouldShow,
94
+ getReferencedVirtualElement,
95
+ options
96
+ }
97
+ })
98
+ );
99
+ });
100
+ </script>
101
+
102
+ <div bind:this={root} class={className}>
103
+ {@render children()}
104
+ </div>
@@ -0,0 +1,19 @@
1
+ import { type Snippet } from 'svelte';
2
+ import { type BubbleMenuPluginProps } from '@tiptap/extension-bubble-menu';
3
+ import type { Editor } from '@tiptap/core';
4
+ type Props = {
5
+ editor: Editor;
6
+ pluginKey?: BubbleMenuPluginProps['pluginKey'];
7
+ updateDelay?: BubbleMenuPluginProps['updateDelay'];
8
+ resizeDelay?: BubbleMenuPluginProps['resizeDelay'];
9
+ appendTo?: BubbleMenuPluginProps['appendTo'];
10
+ shouldShow?: BubbleMenuPluginProps['shouldShow'];
11
+ getReferencedVirtualElement?: BubbleMenuPluginProps['getReferencedVirtualElement'];
12
+ options?: BubbleMenuPluginProps['options'];
13
+ class?: string;
14
+ children: Snippet;
15
+ };
16
+ /** @internal */
17
+ declare const BubbleMenu: import("svelte").Component<Props, {}, "">;
18
+ type BubbleMenu = ReturnType<typeof BubbleMenu>;
19
+ export default BubbleMenu;
@@ -1,8 +1,8 @@
1
1
  <script lang="ts">
2
2
  import { onMount, getAllContexts } from 'svelte';
3
3
  import { Editor, type Editor as EditorType } from '@tiptap/core';
4
- import BubbleMenu from '@tiptap/extension-bubble-menu';
5
4
  import { extensions } from './extensions.js';
5
+ import BubbleMenu from './bubble-menu.svelte';
6
6
  import ToolbarButton from './toolbar-button.svelte';
7
7
  import EditorToolbar from './editor-toolbar.svelte';
8
8
  import LinkDialog from './link-dialog.svelte';
@@ -52,7 +52,6 @@
52
52
 
53
53
  let element = $state<HTMLDivElement | null>(null);
54
54
  let editorState = $state<{ editor: EditorType | null }>({ editor: null });
55
- let bubbleMenu = $state<HTMLDivElement | null>(null);
56
55
 
57
56
  // Dialog states
58
57
  let linkDialogOpen = $state(false);
@@ -80,9 +79,6 @@
80
79
  ...extensions,
81
80
  ...extraExtensions,
82
81
  HeadingA11yPlugin,
83
- BubbleMenu.configure({
84
- element: bubbleMenu!
85
- }),
86
82
  Placeholder.configure({
87
83
  showOnlyCurrent: false,
88
84
  placeholder: ({ node, hasAnchor, editor }) => {
@@ -154,16 +150,35 @@
154
150
  {/if}
155
151
 
156
152
  <!-- Bubble Menu -->
157
- <div bind:this={bubbleMenu} class="bubble-menu">
158
- {#if ed}
159
- <div class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md">
153
+ {#if ed}
154
+ <BubbleMenu
155
+ editor={ed}
156
+ appendTo={() => document.body}
157
+ options={{ scrollTarget: element!, placement: 'bottom', offset: 8 }}
158
+ shouldShow={({ editor, from, to }) =>
159
+ from !== to &&
160
+ !editor.isActive('image') &&
161
+ !editor.isActive('video') &&
162
+ !editor.isActive('figure') &&
163
+ !editor.isActive('codeBlock')}
164
+ >
165
+ <div
166
+ class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md"
167
+ >
160
168
  {#if ed.isActive('link')}
161
169
  {#if ed.getAttributes('link').target === '_blank'}
162
- <span class="text-muted-foreground flex items-center px-1" title="Otwiera w nowej karcie">
170
+ <span
171
+ class="text-muted-foreground flex items-center px-1"
172
+ title="Otwiera w nowej karcie"
173
+ >
163
174
  <ExternalLink class="h-4 w-4" />
164
175
  </span>
165
176
  {/if}
166
- <ToolbarButton label="Edytuj link" active={false} onclick={() => (linkDialogOpen = true)}>
177
+ <ToolbarButton
178
+ label="Edytuj link"
179
+ active={false}
180
+ onclick={() => (linkDialogOpen = true)}
181
+ >
167
182
  <Pencil class="h-4 w-4" />
168
183
  </ToolbarButton>
169
184
  <ToolbarButton
@@ -270,13 +285,13 @@
270
285
  </ToolbarButton>
271
286
  {/if}
272
287
  </div>
273
- {/if}
274
- </div>
288
+ </BubbleMenu>
289
+ {/if}
275
290
 
276
291
  <!-- Editor content -->
277
292
  <div
278
293
  bind:this={element}
279
- class="prose prose-sm dark:prose-invert max-w-none p-4 focus:outline-none overflow-y-auto max-h-[70vh] [&_.ProseMirror]:min-h-[200px] [&_.ProseMirror]:outline-none [&_.ProseMirror]:scroll-padding-top-12"
294
+ class="prose prose-sm dark:prose-invert [&_.ProseMirror]:scroll-padding-top-12 max-h-112 max-w-none overflow-y-auto p-4 focus:outline-none [&_.ProseMirror]:min-h-[200px] [&_.ProseMirror]:outline-none"
280
295
  ></div>
281
296
  </div>
282
297
  </Tooltip.Provider>
@@ -287,14 +302,3 @@
287
302
  <VideoDialog bind:open={videoDialogOpen} editor={ed} />
288
303
  <TableDialog bind:open={tableDialogOpen} editor={ed} />
289
304
 
290
- <style>
291
- .bubble-menu {
292
- height: 0;
293
- overflow: visible;
294
- visibility: hidden;
295
- opacity: 0;
296
- transition:
297
- visibility 0.1s ease,
298
- opacity 0.1s ease;
299
- }
300
- </style>
@@ -86,7 +86,7 @@
86
86
  <LetterP class="h-4 w-4" />
87
87
  </ToolbarButton>
88
88
 
89
- <Separator orientation="vertical" class="mx-1 h-6" />
89
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
90
90
 
91
91
  <!-- Text formatting -->
92
92
  <ToolbarButton
@@ -125,7 +125,7 @@
125
125
  <Highlight class="h-4 w-4" />
126
126
  </ToolbarButton>
127
127
 
128
- <Separator orientation="vertical" class="mx-1 h-6" />
128
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
129
129
 
130
130
  <!-- Alignment -->
131
131
  <ToolbarButton
@@ -157,7 +157,7 @@
157
157
  <AlignJustified class="h-4 w-4" />
158
158
  </ToolbarButton>
159
159
 
160
- <Separator orientation="vertical" class="mx-1 h-6" />
160
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
161
161
 
162
162
  <!-- Lists & Quote -->
163
163
  <ToolbarButton
@@ -182,7 +182,7 @@
182
182
  <Quote class="h-4 w-4" />
183
183
  </ToolbarButton>
184
184
 
185
- <Separator orientation="vertical" class="mx-1 h-6" />
185
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
186
186
 
187
187
  <!-- Link, Image, Table -->
188
188
  <ToolbarButton label={t.link} active={ed.isActive('link')} onclick={onLinkDialog}>
@@ -198,7 +198,7 @@
198
198
  <Table class="h-4 w-4" />
199
199
  </ToolbarButton>
200
200
 
201
- <Separator orientation="vertical" class="mx-1 h-6" />
201
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
202
202
 
203
203
  <!-- Code -->
204
204
  <ToolbarButton
@@ -217,14 +217,14 @@
217
217
  </ToolbarButton>
218
218
 
219
219
  {#if showInsertBlock && onInsertBlock}
220
- <Separator orientation="vertical" class="mx-1 h-6" />
220
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
221
221
  <ToolbarButton label={t.insertBlock} active={false} onclick={onInsertBlock}>
222
222
  <Plus class="h-4 w-4" />
223
223
  </ToolbarButton>
224
224
  {/if}
225
225
 
226
226
  {#if showCodeView && onToggleCodeView}
227
- <Separator orientation="vertical" class="mx-1 h-6" />
227
+ <Separator orientation="vertical" class="mx-1 hidden h-6 sm:block" />
228
228
 
229
229
  <!-- HTML View -->
230
230
  <ToolbarButton label={t.htmlView} active={isCodeViewActive} onclick={onToggleCodeView}>
@@ -15,7 +15,11 @@ import { FigureNode } from './figure-node.js';
15
15
  const lowlight = createLowlight(common);
16
16
  export const extensions = [
17
17
  StarterKit.configure({
18
- codeBlock: false
18
+ // StarterKit (TipTap v3) ships Link + Underline; we register CustomLink and
19
+ // Underline ourselves, so disable them here to avoid duplicate extensions.
20
+ codeBlock: false,
21
+ link: false,
22
+ underline: false
19
23
  }),
20
24
  CustomLink.configure({
21
25
  openOnClick: false,
@@ -81,7 +81,7 @@
81
81
 
82
82
  <!-- Dialog 1: Media selector -->
83
83
  <Dialog.Root bind:open {onOpenChange}>
84
- <Dialog.Content class="max-w-5xl! sm:max-w-5xl!">
84
+ <Dialog.Content fullscreenMobile class="max-w-5xl! sm:max-w-5xl!">
85
85
  <Dialog.Header>
86
86
  <Dialog.Title>{t.insertImage}</Dialog.Title>
87
87
  </Dialog.Header>
@@ -183,6 +183,10 @@
183
183
  .image-alt-input:focus {
184
184
  border-color: var(--primary);
185
185
  }
186
+ .image-alt-input:focus-visible {
187
+ outline: 2px solid var(--ring);
188
+ outline-offset: 1px;
189
+ }
186
190
  .image-alt-actions {
187
191
  display: flex;
188
192
  gap: 8px;
@@ -256,6 +256,7 @@
256
256
  <button
257
257
  type="button"
258
258
  class="flex w-full items-center gap-1 text-sm font-medium"
259
+ aria-expanded={a11yOpen}
259
260
  onclick={() => (a11yOpen = !a11yOpen)}
260
261
  >
261
262
  {#if a11yOpen}
@@ -291,6 +292,7 @@
291
292
  <button
292
293
  type="button"
293
294
  class="flex w-full items-center gap-1 text-sm font-medium"
295
+ aria-expanded={relOpen}
294
296
  onclick={() => (relOpen = !relOpen)}
295
297
  >
296
298
  {#if relOpen}
@@ -1,9 +1,9 @@
1
1
  <script lang="ts">
2
2
  import { onMount } from 'svelte';
3
3
  import { Editor, type Editor as EditorType } from '@tiptap/core';
4
- import BubbleMenu from '@tiptap/extension-bubble-menu';
5
4
  import { extensions } from './extensions.js';
6
5
  import Placeholder from '@tiptap/extension-placeholder';
6
+ import BubbleMenu from './bubble-menu.svelte';
7
7
  import ToolbarButton from './toolbar-button.svelte';
8
8
  import EditorToolbar from './editor-toolbar.svelte';
9
9
  import LinkDialog from './link-dialog.svelte';
@@ -40,7 +40,6 @@
40
40
 
41
41
  let element = $state<HTMLDivElement | null>(null);
42
42
  let editorState = $state<{ editor: EditorType | null }>({ editor: null });
43
- let bubbleMenu = $state<HTMLDivElement | null>(null);
44
43
  let isCodeViewActive = $state(false);
45
44
 
46
45
  // Dialog states
@@ -54,9 +53,6 @@
54
53
  element: element!,
55
54
  extensions: [
56
55
  ...extensions,
57
- BubbleMenu.configure({
58
- element: bubbleMenu!
59
- }),
60
56
  Placeholder.configure({
61
57
  placeholder: 'Wpisz treść...',
62
58
  showOnlyCurrent: true
@@ -109,9 +105,21 @@
109
105
  {/if}
110
106
 
111
107
  <!-- Bubble Menu -->
112
- <div bind:this={bubbleMenu} class="bubble-menu">
113
- {#if ed}
114
- <div class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md">
108
+ {#if ed}
109
+ <BubbleMenu
110
+ editor={ed}
111
+ appendTo={() => document.body}
112
+ options={{ scrollTarget: element!, placement: 'bottom', offset: 8 }}
113
+ shouldShow={({ editor, from, to }) =>
114
+ from !== to &&
115
+ !editor.isActive('image') &&
116
+ !editor.isActive('video') &&
117
+ !editor.isActive('figure') &&
118
+ !editor.isActive('codeBlock')}
119
+ >
120
+ <div
121
+ class="bg-popover text-popover-foreground flex items-center gap-0.5 rounded-lg border p-1 shadow-md"
122
+ >
115
123
  {#if ed.isActive('link')}
116
124
  {#if ed.getAttributes('link').target === '_blank'}
117
125
  <span class="text-muted-foreground flex items-center px-1" title="Otwiera w nowej karcie">
@@ -225,8 +233,8 @@
225
233
  </ToolbarButton>
226
234
  {/if}
227
235
  </div>
228
- {/if}
229
- </div>
236
+ </BubbleMenu>
237
+ {/if}
230
238
 
231
239
  <!-- Editor content -->
232
240
  <div
@@ -250,16 +258,6 @@
250
258
  <TableDialog bind:open={tableDialogOpen} editor={ed} />
251
259
 
252
260
  <style>
253
- .bubble-menu {
254
- height: 0;
255
- overflow: visible;
256
- visibility: hidden;
257
- opacity: 0;
258
- transition:
259
- visibility 0.1s ease,
260
- opacity 0.1s ease;
261
- }
262
-
263
261
  :global(.tiptap-highlight) {
264
262
  background-color: rgb(250 204 21 / 0.4);
265
263
  padding: 0.125em 0.25em;
@@ -63,7 +63,7 @@
63
63
  </script>
64
64
 
65
65
  <Dialog.Root bind:open {onOpenChange}>
66
- <Dialog.Content class="max-w-5xl! sm:max-w-5xl!">
66
+ <Dialog.Content fullscreenMobile class="max-w-5xl! sm:max-w-5xl!">
67
67
  <Dialog.Header>
68
68
  <Dialog.Title>{t.insertVideo}</Dialog.Title>
69
69
  </Dialog.Header>
@@ -0,0 +1,109 @@
1
+ <script lang="ts">
2
+ import type { VariantAttribute } from '../../../shop/types.js';
3
+ import { useInterfaceLanguage } from '../../state/interface-language.svelte.js';
4
+ import { getLocalizedLabel } from '../../utils/collectionLabel.js';
5
+ import TextField from '../fields/text-field.svelte';
6
+ import NumberField from '../fields/number-field.svelte';
7
+ import DatetimeField from '../fields/datetime-field.svelte';
8
+ import SelectField from '../fields/select-field.svelte';
9
+ import BooleanField from '../fields/boolean-field.svelte';
10
+ import Input from '../../../components/ui/input/input.svelte';
11
+ import type {
12
+ TextField as TextFieldType,
13
+ NumberField as NumberFieldType,
14
+ DateTimeField as DateTimeFieldType,
15
+ SelectField as SelectFieldType,
16
+ BooleanField as BooleanFieldType
17
+ } from '../../../types/fields.js';
18
+
19
+ type Props = {
20
+ attrKey: string;
21
+ attrConfig: VariantAttribute;
22
+ value: unknown;
23
+ };
24
+
25
+ let { attrKey, attrConfig, value = $bindable() }: Props = $props();
26
+
27
+ const interfaceLanguage = useInterfaceLanguage();
28
+ const label = $derived(
29
+ getLocalizedLabel(attrConfig.label, interfaceLanguage.current) || attrKey
30
+ );
31
+
32
+ // Adapter — VariantAttribute → CMS Field shape that each field component expects.
33
+ // Booleans render their own label inline; everything else uses our outer <label>.
34
+ const textField = $derived<TextFieldType>({
35
+ type: 'text',
36
+ slug: attrKey,
37
+ label,
38
+ required: attrConfig.required,
39
+ multiline: false
40
+ });
41
+ const numberField = $derived<NumberFieldType>({
42
+ type: 'number',
43
+ slug: attrKey,
44
+ label,
45
+ required: attrConfig.required
46
+ });
47
+ const datetimeField = $derived<DateTimeFieldType>({
48
+ type: 'datetime',
49
+ slug: attrKey,
50
+ label,
51
+ required: attrConfig.required
52
+ });
53
+ const selectField = $derived<SelectFieldType>(
54
+ attrConfig.type === 'select'
55
+ ? {
56
+ type: 'select',
57
+ slug: attrKey,
58
+ label,
59
+ required: attrConfig.required,
60
+ options: attrConfig.options
61
+ }
62
+ : ({} as SelectFieldType)
63
+ );
64
+ const booleanField = $derived<BooleanFieldType>({
65
+ type: 'boolean',
66
+ slug: attrKey,
67
+ label,
68
+ required: attrConfig.required,
69
+ defaultValue: false
70
+ });
71
+ </script>
72
+
73
+ {#if attrConfig.type === 'boolean'}
74
+ <!-- boolean-field renders its own label, asterisk, and switch row -->
75
+ <BooleanField field={booleanField} bind:value={value as boolean | undefined} />
76
+ {:else}
77
+ <label class="block">
78
+ <span class="text-muted-foreground mb-1 block text-xs font-semibold">
79
+ {label}
80
+ {#if attrConfig.required}<span class="text-destructive ml-0.5" aria-hidden="true"
81
+ >*</span
82
+ >{/if}
83
+ </span>
84
+
85
+ {#if attrConfig.type === 'text'}
86
+ <TextField field={textField} bind:value={value as string | undefined} />
87
+ {:else if attrConfig.type === 'number'}
88
+ <NumberField field={numberField} bind:value={value as number | undefined} />
89
+ {:else if attrConfig.type === 'datetime'}
90
+ <DatetimeField field={datetimeField} bind:value={value as string | undefined} />
91
+ {:else if attrConfig.type === 'select'}
92
+ <SelectField field={selectField} bind:value={value as string | undefined} />
93
+ {:else if attrConfig.type === 'slug'}
94
+ <Input
95
+ bind:value={value as string | undefined}
96
+ type="text"
97
+ pattern="[a-z0-9-]+"
98
+ placeholder="moj-slug"
99
+ />
100
+ {:else if attrConfig.type === 'image' || attrConfig.type === 'entry'}
101
+ <!-- Pełny picker UI defer post-1.0; tymczasowo: wklej UUID -->
102
+ <Input
103
+ bind:value={value as string | undefined}
104
+ type="text"
105
+ placeholder="UUID ({attrConfig.type === 'image' ? 'media' : 'wpis'})"
106
+ />
107
+ {/if}
108
+ </label>
109
+ {/if}
@@ -0,0 +1,9 @@
1
+ import type { VariantAttribute } from '../../../shop/types.js';
2
+ type Props = {
3
+ attrKey: string;
4
+ attrConfig: VariantAttribute;
5
+ value: unknown;
6
+ };
7
+ declare const VariantAttributeRenderer: import("svelte").Component<Props, {}, "value">;
8
+ type VariantAttributeRenderer = ReturnType<typeof VariantAttributeRenderer>;
9
+ export default VariantAttributeRenderer;
@@ -0,0 +1,8 @@
1
+ import type { IconSetPlugin } from '../../types/plugins.js';
2
+ /**
3
+ * Build a Map<slug, IconSetPlugin> from icon-set plugin instances.
4
+ * Use in consumer's admin `+layout.svelte` to pass `iconSets` to AdminLayout —
5
+ * Svelte icon components cannot serialize through SvelteKit data, so the same
6
+ * plugin instances must be imported on the client and forwarded explicitly.
7
+ */
8
+ export declare function buildIconSetMap(...plugins: IconSetPlugin[]): Map<string, IconSetPlugin>;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Build a Map<slug, IconSetPlugin> from icon-set plugin instances.
3
+ * Use in consumer's admin `+layout.svelte` to pass `iconSets` to AdminLayout —
4
+ * Svelte icon components cannot serialize through SvelteKit data, so the same
5
+ * plugin instances must be imported on the client and forwarded explicitly.
6
+ */
7
+ export function buildIconSetMap(...plugins) {
8
+ const map = new Map();
9
+ for (const p of plugins) {
10
+ if (map.has(p.slug)) {
11
+ throw new Error(`Duplicate icon-set plugin slug: "${p.slug}"`);
12
+ }
13
+ map.set(p.slug, p);
14
+ }
15
+ return map;
16
+ }