@byline/ui 0.9.3

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 (368) hide show
  1. package/LICENSE +373 -0
  2. package/README.md +17 -0
  3. package/dist/admin/components/admin-account/change-password.d.ts +9 -0
  4. package/dist/admin/components/admin-account/change-password.d.ts.map +1 -0
  5. package/dist/admin/components/admin-account/change-password.js +192 -0
  6. package/dist/admin/components/admin-account/change-password.module.js +8 -0
  7. package/dist/admin/components/admin-account/change-password_module.css +27 -0
  8. package/dist/admin/components/admin-account/container.d.ts +30 -0
  9. package/dist/admin/components/admin-account/container.d.ts.map +1 -0
  10. package/dist/admin/components/admin-account/container.js +299 -0
  11. package/dist/admin/components/admin-account/container.module.js +28 -0
  12. package/dist/admin/components/admin-account/container_module.css +106 -0
  13. package/dist/admin/components/admin-account/update.d.ts +9 -0
  14. package/dist/admin/components/admin-account/update.d.ts.map +1 -0
  15. package/dist/admin/components/admin-account/update.js +207 -0
  16. package/dist/admin/components/admin-account/update.module.js +8 -0
  17. package/dist/admin/components/admin-account/update_module.css +27 -0
  18. package/dist/admin/components/admin-permissions/inspector.d.ts +5 -0
  19. package/dist/admin/components/admin-permissions/inspector.d.ts.map +1 -0
  20. package/dist/admin/components/admin-permissions/inspector.js +284 -0
  21. package/dist/admin/components/admin-permissions/inspector.module.js +56 -0
  22. package/dist/admin/components/admin-permissions/inspector_module.css +238 -0
  23. package/dist/admin/components/admin-roles/create.d.ts +8 -0
  24. package/dist/admin/components/admin-roles/create.d.ts.map +1 -0
  25. package/dist/admin/components/admin-roles/create.js +177 -0
  26. package/dist/admin/components/admin-roles/create.module.js +8 -0
  27. package/dist/admin/components/admin-roles/create_module.css +27 -0
  28. package/dist/admin/components/admin-roles/permissions.d.ts +11 -0
  29. package/dist/admin/components/admin-roles/permissions.d.ts.map +1 -0
  30. package/dist/admin/components/admin-roles/permissions.js +303 -0
  31. package/dist/admin/components/admin-roles/permissions.module.js +44 -0
  32. package/dist/admin/components/admin-roles/permissions_module.css +192 -0
  33. package/dist/admin/components/admin-roles/update.d.ts +9 -0
  34. package/dist/admin/components/admin-roles/update.d.ts.map +1 -0
  35. package/dist/admin/components/admin-roles/update.js +166 -0
  36. package/dist/admin/components/admin-roles/update.module.js +8 -0
  37. package/dist/admin/components/admin-roles/update_module.css +27 -0
  38. package/dist/admin/components/admin-users/create.d.ts +9 -0
  39. package/dist/admin/components/admin-users/create.d.ts.map +1 -0
  40. package/dist/admin/components/admin-users/create.js +268 -0
  41. package/dist/admin/components/admin-users/create.module.js +10 -0
  42. package/dist/admin/components/admin-users/create_module.css +45 -0
  43. package/dist/admin/components/admin-users/roles.d.ts +12 -0
  44. package/dist/admin/components/admin-users/roles.d.ts.map +1 -0
  45. package/dist/admin/components/admin-users/roles.js +148 -0
  46. package/dist/admin/components/admin-users/roles.module.js +18 -0
  47. package/dist/admin/components/admin-users/roles_module.css +75 -0
  48. package/dist/admin/components/admin-users/set-password.d.ts +9 -0
  49. package/dist/admin/components/admin-users/set-password.d.ts.map +1 -0
  50. package/dist/admin/components/admin-users/set-password.js +170 -0
  51. package/dist/admin/components/admin-users/set-password.module.js +9 -0
  52. package/dist/admin/components/admin-users/set-password_module.css +31 -0
  53. package/dist/admin/components/admin-users/update.d.ts +9 -0
  54. package/dist/admin/components/admin-users/update.d.ts.map +1 -0
  55. package/dist/admin/components/admin-users/update.js +254 -0
  56. package/dist/admin/components/admin-users/update.module.js +9 -0
  57. package/dist/admin/components/admin-users/update_module.css +34 -0
  58. package/dist/admin/components/auth/sign-in-form.d.ts +14 -0
  59. package/dist/admin/components/auth/sign-in-form.d.ts.map +1 -0
  60. package/dist/admin/components/auth/sign-in-form.js +107 -0
  61. package/dist/admin/components/auth/sign-in-form.module.js +10 -0
  62. package/dist/admin/components/auth/sign-in-form_module.css +35 -0
  63. package/dist/admin/components/collections/diff-modal.d.ts +23 -0
  64. package/dist/admin/components/collections/diff-modal.d.ts.map +1 -0
  65. package/dist/admin/components/collections/diff-modal.js +147 -0
  66. package/dist/admin/components/collections/diff-modal.module.js +14 -0
  67. package/dist/admin/components/collections/diff-modal_module.css +56 -0
  68. package/dist/admin/components/collections/status-badge.d.ts +26 -0
  69. package/dist/admin/components/collections/status-badge.d.ts.map +1 -0
  70. package/dist/admin/components/collections/status-badge.js +35 -0
  71. package/dist/admin/components/collections/status-badge.module.js +7 -0
  72. package/dist/admin/components/collections/status-badge_module.css +20 -0
  73. package/dist/admin/group.d.ts +28 -0
  74. package/dist/admin/group.d.ts.map +1 -0
  75. package/dist/admin/group.js +14 -0
  76. package/dist/admin/group.module.js +6 -0
  77. package/dist/admin/group_module.css +19 -0
  78. package/dist/admin/row.d.ts +26 -0
  79. package/dist/admin/row.d.ts.map +1 -0
  80. package/dist/admin/row.js +8 -0
  81. package/dist/admin/row.module.js +5 -0
  82. package/dist/admin/row_module.css +18 -0
  83. package/dist/admin/tabs.d.ts +33 -0
  84. package/dist/admin/tabs.d.ts.map +1 -0
  85. package/dist/admin/tabs.js +34 -0
  86. package/dist/admin/tabs.module.js +10 -0
  87. package/dist/admin/tabs_module.css +68 -0
  88. package/dist/dnd/draggable-sortable/demo/draggable-list-demo.js +105 -0
  89. package/dist/dnd/draggable-sortable/demo/draggable-list-demo.module.js +12 -0
  90. package/dist/dnd/draggable-sortable/demo/draggable-list-demo_module.css +39 -0
  91. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.d.ts +19 -0
  92. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.d.ts.map +1 -0
  93. package/dist/dnd/draggable-sortable/draggable-sortable-item/index.js +27 -0
  94. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.d.ts +25 -0
  95. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.d.ts.map +1 -0
  96. package/dist/dnd/draggable-sortable/draggable-sortable-item/types.js +1 -0
  97. package/dist/dnd/draggable-sortable/draggable-sortable.d.ts +17 -0
  98. package/dist/dnd/draggable-sortable/draggable-sortable.d.ts.map +1 -0
  99. package/dist/dnd/draggable-sortable/draggable-sortable.js +46 -0
  100. package/dist/dnd/draggable-sortable/index.d.ts +5 -0
  101. package/dist/dnd/draggable-sortable/index.d.ts.map +1 -0
  102. package/dist/dnd/draggable-sortable/index.js +4 -0
  103. package/dist/dnd/draggable-sortable/types.d.ts +26 -0
  104. package/dist/dnd/draggable-sortable/types.d.ts.map +1 -0
  105. package/dist/dnd/draggable-sortable/types.js +1 -0
  106. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.d.ts +16 -0
  107. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.d.ts.map +1 -0
  108. package/dist/dnd/draggable-sortable/use-draggable-sortable/index.js +28 -0
  109. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.d.ts +23 -0
  110. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.d.ts.map +1 -0
  111. package/dist/dnd/draggable-sortable/use-draggable-sortable/types.js +1 -0
  112. package/dist/dnd/draggable-sortable/utils.d.ts +14 -0
  113. package/dist/dnd/draggable-sortable/utils.d.ts.map +1 -0
  114. package/dist/dnd/draggable-sortable/utils.js +10 -0
  115. package/dist/fields/array/array-field.d.ts +15 -0
  116. package/dist/fields/array/array-field.d.ts.map +1 -0
  117. package/dist/fields/array/array-field.js +176 -0
  118. package/dist/fields/array/array-field.module.js +11 -0
  119. package/dist/fields/array/array-field_module.css +32 -0
  120. package/dist/fields/blocks/blocks-field.d.ts +14 -0
  121. package/dist/fields/blocks/blocks-field.d.ts.map +1 -0
  122. package/dist/fields/blocks/blocks-field.js +244 -0
  123. package/dist/fields/blocks/blocks-field.module.js +26 -0
  124. package/dist/fields/blocks/blocks-field_module.css +107 -0
  125. package/dist/fields/checkbox/checkbox-field.d.ts +17 -0
  126. package/dist/fields/checkbox/checkbox-field.d.ts.map +1 -0
  127. package/dist/fields/checkbox/checkbox-field.js +27 -0
  128. package/dist/fields/column-formatter.d.ts +21 -0
  129. package/dist/fields/column-formatter.d.ts.map +1 -0
  130. package/dist/fields/column-formatter.js +15 -0
  131. package/dist/fields/date-time-formatter.d.ts +17 -0
  132. package/dist/fields/date-time-formatter.d.ts.map +1 -0
  133. package/dist/fields/date-time-formatter.js +8 -0
  134. package/dist/fields/datetime/datetime-field.d.ts +17 -0
  135. package/dist/fields/datetime/datetime-field.d.ts.map +1 -0
  136. package/dist/fields/datetime/datetime-field.js +37 -0
  137. package/dist/fields/datetime/datetime-field.module.js +5 -0
  138. package/dist/fields/datetime/datetime-field_module.css +4 -0
  139. package/dist/fields/draggable-context-menu.d.ts +7 -0
  140. package/dist/fields/draggable-context-menu.d.ts.map +1 -0
  141. package/dist/fields/draggable-context-menu.js +83 -0
  142. package/dist/fields/draggable-context-menu.module.js +15 -0
  143. package/dist/fields/draggable-context-menu_module.css +91 -0
  144. package/dist/fields/field-helpers.d.ts +27 -0
  145. package/dist/fields/field-helpers.d.ts.map +1 -0
  146. package/dist/fields/field-helpers.js +48 -0
  147. package/dist/fields/field-renderer.d.ts +31 -0
  148. package/dist/fields/field-renderer.d.ts.map +1 -0
  149. package/dist/fields/field-renderer.js +189 -0
  150. package/dist/fields/field-renderer.module.js +8 -0
  151. package/dist/fields/field-renderer_module.css +11 -0
  152. package/dist/fields/file/file-field.d.ts +18 -0
  153. package/dist/fields/file/file-field.d.ts.map +1 -0
  154. package/dist/fields/file/file-field.js +125 -0
  155. package/dist/fields/file/file-field.module.js +13 -0
  156. package/dist/fields/file/file-field_module.css +64 -0
  157. package/dist/fields/group/group-field.d.ts +16 -0
  158. package/dist/fields/group/group-field.d.ts.map +1 -0
  159. package/dist/fields/group/group-field.js +59 -0
  160. package/dist/fields/group/group-field.module.js +9 -0
  161. package/dist/fields/group/group-field_module.css +27 -0
  162. package/dist/fields/image/image-field.d.ts +20 -0
  163. package/dist/fields/image/image-field.d.ts.map +1 -0
  164. package/dist/fields/image/image-field.js +198 -0
  165. package/dist/fields/image/image-field.module.js +21 -0
  166. package/dist/fields/image/image-field_module.css +96 -0
  167. package/dist/fields/image/image-upload-field.d.ts +22 -0
  168. package/dist/fields/image/image-upload-field.d.ts.map +1 -0
  169. package/dist/fields/image/image-upload-field.js +187 -0
  170. package/dist/fields/image/image-upload-field.module.js +19 -0
  171. package/dist/fields/image/image-upload-field_module.css +92 -0
  172. package/dist/fields/local-date-time.d.ts +28 -0
  173. package/dist/fields/local-date-time.d.ts.map +1 -0
  174. package/dist/fields/local-date-time.js +49 -0
  175. package/dist/fields/locale-badge.d.ts +19 -0
  176. package/dist/fields/locale-badge.d.ts.map +1 -0
  177. package/dist/fields/locale-badge.js +10 -0
  178. package/dist/fields/locale-badge.module.js +5 -0
  179. package/dist/fields/locale-badge_module.css +27 -0
  180. package/dist/fields/numerical/numerical-field.d.ts +19 -0
  181. package/dist/fields/numerical/numerical-field.d.ts.map +1 -0
  182. package/dist/fields/numerical/numerical-field.js +73 -0
  183. package/dist/fields/relation/relation-display.d.ts +41 -0
  184. package/dist/fields/relation/relation-display.d.ts.map +1 -0
  185. package/dist/fields/relation/relation-display.js +58 -0
  186. package/dist/fields/relation/relation-display.module.js +9 -0
  187. package/dist/fields/relation/relation-display_module.css +21 -0
  188. package/dist/fields/relation/relation-field.d.ts +19 -0
  189. package/dist/fields/relation/relation-field.d.ts.map +1 -0
  190. package/dist/fields/relation/relation-field.js +133 -0
  191. package/dist/fields/relation/relation-field.module.js +13 -0
  192. package/dist/fields/relation/relation-field_module.css +62 -0
  193. package/dist/fields/relation/relation-picker.d.ts +50 -0
  194. package/dist/fields/relation/relation-picker.d.ts.map +1 -0
  195. package/dist/fields/relation/relation-picker.js +233 -0
  196. package/dist/fields/relation/relation-picker.module.js +26 -0
  197. package/dist/fields/relation/relation-picker_module.css +124 -0
  198. package/dist/fields/relation/relation-summary.d.ts +32 -0
  199. package/dist/fields/relation/relation-summary.d.ts.map +1 -0
  200. package/dist/fields/relation/relation-summary.js +50 -0
  201. package/dist/fields/relation/relation-summary.module.js +11 -0
  202. package/dist/fields/relation/relation-summary_module.css +37 -0
  203. package/dist/fields/select/select-field.d.ts +17 -0
  204. package/dist/fields/select/select-field.d.ts.map +1 -0
  205. package/dist/fields/select/select-field.js +42 -0
  206. package/dist/fields/select/select-field.module.js +5 -0
  207. package/dist/fields/select/select-field_module.css +4 -0
  208. package/dist/fields/sortable-item.d.ts +16 -0
  209. package/dist/fields/sortable-item.d.ts.map +1 -0
  210. package/dist/fields/sortable-item.js +80 -0
  211. package/dist/fields/sortable-item.module.js +22 -0
  212. package/dist/fields/sortable-item_module.css +124 -0
  213. package/dist/fields/text/text-field.d.ts +21 -0
  214. package/dist/fields/text/text-field.d.ts.map +1 -0
  215. package/dist/fields/text/text-field.js +104 -0
  216. package/dist/fields/text/text-field.module.js +6 -0
  217. package/dist/fields/text/text-field_module.css +5 -0
  218. package/dist/fields/text-area/text-area-field.d.ts +21 -0
  219. package/dist/fields/text-area/text-area-field.d.ts.map +1 -0
  220. package/dist/fields/text-area/text-area-field.js +105 -0
  221. package/dist/fields/text-area/text-area-field.module.js +6 -0
  222. package/dist/fields/text-area/text-area-field_module.css +5 -0
  223. package/dist/fields/use-field-change-handler.d.ts +24 -0
  224. package/dist/fields/use-field-change-handler.d.ts.map +1 -0
  225. package/dist/fields/use-field-change-handler.js +52 -0
  226. package/dist/forms/document-actions.d.ts +14 -0
  227. package/dist/forms/document-actions.d.ts.map +1 -0
  228. package/dist/forms/document-actions.js +153 -0
  229. package/dist/forms/document-actions.module.js +18 -0
  230. package/dist/forms/document-actions_module.css +66 -0
  231. package/dist/forms/form-context.d.ts +78 -0
  232. package/dist/forms/form-context.d.ts.map +1 -0
  233. package/dist/forms/form-context.js +420 -0
  234. package/dist/forms/form-renderer.d.ts +66 -0
  235. package/dist/forms/form-renderer.d.ts.map +1 -0
  236. package/dist/forms/form-renderer.js +555 -0
  237. package/dist/forms/form-renderer.module.js +46 -0
  238. package/dist/forms/form-renderer_module.css +242 -0
  239. package/dist/forms/navigation-guard.d.ts +55 -0
  240. package/dist/forms/navigation-guard.d.ts.map +1 -0
  241. package/dist/forms/navigation-guard.js +22 -0
  242. package/dist/forms/path-widget.d.ts +33 -0
  243. package/dist/forms/path-widget.d.ts.map +1 -0
  244. package/dist/forms/path-widget.js +101 -0
  245. package/dist/forms/path-widget.module.js +8 -0
  246. package/dist/forms/path-widget_module.css +29 -0
  247. package/dist/forms/upload-executor.d.ts +58 -0
  248. package/dist/forms/upload-executor.d.ts.map +1 -0
  249. package/dist/forms/upload-executor.js +92 -0
  250. package/dist/react.d.ts +55 -0
  251. package/dist/react.d.ts.map +1 -0
  252. package/dist/react.js +48 -0
  253. package/dist/services/admin-services-context.d.ts +17 -0
  254. package/dist/services/admin-services-context.d.ts.map +1 -0
  255. package/dist/services/admin-services-context.js +13 -0
  256. package/dist/services/admin-services-types.d.ts +130 -0
  257. package/dist/services/admin-services-types.d.ts.map +1 -0
  258. package/dist/services/admin-services-types.js +1 -0
  259. package/dist/services/field-services-context.d.ts +17 -0
  260. package/dist/services/field-services-context.d.ts.map +1 -0
  261. package/dist/services/field-services-context.js +13 -0
  262. package/dist/services/field-services-types.d.ts +64 -0
  263. package/dist/services/field-services-types.d.ts.map +1 -0
  264. package/dist/services/field-services-types.js +1 -0
  265. package/package.json +133 -0
  266. package/src/admin/components/admin-account/change-password.module.css +40 -0
  267. package/src/admin/components/admin-account/change-password.tsx +232 -0
  268. package/src/admin/components/admin-account/container.module.css +158 -0
  269. package/src/admin/components/admin-account/container.tsx +230 -0
  270. package/src/admin/components/admin-account/update.module.css +40 -0
  271. package/src/admin/components/admin-account/update.tsx +263 -0
  272. package/src/admin/components/admin-permissions/inspector.module.css +326 -0
  273. package/src/admin/components/admin-permissions/inspector.tsx +298 -0
  274. package/src/admin/components/admin-roles/create.module.css +40 -0
  275. package/src/admin/components/admin-roles/create.tsx +218 -0
  276. package/src/admin/components/admin-roles/permissions.module.css +279 -0
  277. package/src/admin/components/admin-roles/permissions.tsx +396 -0
  278. package/src/admin/components/admin-roles/update.module.css +40 -0
  279. package/src/admin/components/admin-roles/update.tsx +218 -0
  280. package/src/admin/components/admin-users/create.module.css +63 -0
  281. package/src/admin/components/admin-users/create.tsx +323 -0
  282. package/src/admin/components/admin-users/roles.module.css +119 -0
  283. package/src/admin/components/admin-users/roles.tsx +172 -0
  284. package/src/admin/components/admin-users/set-password.module.css +46 -0
  285. package/src/admin/components/admin-users/set-password.tsx +199 -0
  286. package/src/admin/components/admin-users/update.module.css +49 -0
  287. package/src/admin/components/admin-users/update.tsx +328 -0
  288. package/src/admin/components/auth/sign-in-form.module.css +53 -0
  289. package/src/admin/components/auth/sign-in-form.tsx +118 -0
  290. package/src/admin/components/collections/diff-modal.module.css +79 -0
  291. package/src/admin/components/collections/diff-modal.tsx +171 -0
  292. package/src/admin/components/collections/status-badge.module.css +31 -0
  293. package/src/admin/components/collections/status-badge.tsx +69 -0
  294. package/src/admin/group.module.css +41 -0
  295. package/src/admin/group.tsx +40 -0
  296. package/src/admin/row.module.css +32 -0
  297. package/src/admin/row.tsx +33 -0
  298. package/src/admin/tabs.module.css +107 -0
  299. package/src/admin/tabs.tsx +74 -0
  300. package/src/declarations.d.ts +4 -0
  301. package/src/dnd/draggable-sortable/demo/draggable-list-demo.module.css +65 -0
  302. package/src/dnd/draggable-sortable/demo/draggable-list-demo.tsx +117 -0
  303. package/src/dnd/draggable-sortable/draggable-sortable-item/index.tsx +54 -0
  304. package/src/dnd/draggable-sortable/draggable-sortable-item/types.ts +30 -0
  305. package/src/dnd/draggable-sortable/draggable-sortable.tsx +86 -0
  306. package/src/dnd/draggable-sortable/index.ts +5 -0
  307. package/src/dnd/draggable-sortable/types.ts +24 -0
  308. package/src/dnd/draggable-sortable/use-draggable-sortable/index.tsx +50 -0
  309. package/src/dnd/draggable-sortable/use-draggable-sortable/types.ts +25 -0
  310. package/src/dnd/draggable-sortable/utils.ts +29 -0
  311. package/src/fields/array/array-field.module.css +48 -0
  312. package/src/fields/array/array-field.tsx +266 -0
  313. package/src/fields/blocks/blocks-field.module.css +148 -0
  314. package/src/fields/blocks/blocks-field.tsx +312 -0
  315. package/src/fields/checkbox/checkbox-field.tsx +53 -0
  316. package/src/fields/column-formatter.tsx +31 -0
  317. package/src/fields/date-time-formatter.tsx +22 -0
  318. package/src/fields/datetime/datetime-field.module.css +13 -0
  319. package/src/fields/datetime/datetime-field.tsx +54 -0
  320. package/src/fields/draggable-context-menu.module.css +127 -0
  321. package/src/fields/draggable-context-menu.tsx +85 -0
  322. package/src/fields/field-helpers.ts +66 -0
  323. package/src/fields/field-renderer.module.css +22 -0
  324. package/src/fields/field-renderer.tsx +255 -0
  325. package/src/fields/file/file-field.module.css +88 -0
  326. package/src/fields/file/file-field.tsx +107 -0
  327. package/src/fields/group/group-field.module.css +43 -0
  328. package/src/fields/group/group-field.tsx +84 -0
  329. package/src/fields/image/image-field.module.css +129 -0
  330. package/src/fields/image/image-field.tsx +212 -0
  331. package/src/fields/image/image-upload-field.module.css +123 -0
  332. package/src/fields/image/image-upload-field.tsx +270 -0
  333. package/src/fields/local-date-time.tsx +88 -0
  334. package/src/fields/locale-badge.module.css +37 -0
  335. package/src/fields/locale-badge.tsx +32 -0
  336. package/src/fields/numerical/numerical-field.tsx +112 -0
  337. package/src/fields/relation/relation-display.module.css +36 -0
  338. package/src/fields/relation/relation-display.tsx +130 -0
  339. package/src/fields/relation/relation-field.module.css +83 -0
  340. package/src/fields/relation/relation-field.tsx +202 -0
  341. package/src/fields/relation/relation-picker.module.css +168 -0
  342. package/src/fields/relation/relation-picker.tsx +325 -0
  343. package/src/fields/relation/relation-summary.module.css +55 -0
  344. package/src/fields/relation/relation-summary.tsx +123 -0
  345. package/src/fields/select/select-field.module.css +13 -0
  346. package/src/fields/select/select-field.tsx +56 -0
  347. package/src/fields/sortable-item.module.css +167 -0
  348. package/src/fields/sortable-item.tsx +101 -0
  349. package/src/fields/text/text-field.module.css +13 -0
  350. package/src/fields/text/text-field.tsx +146 -0
  351. package/src/fields/text-area/text-area-field.module.css +13 -0
  352. package/src/fields/text-area/text-area-field.tsx +147 -0
  353. package/src/fields/use-field-change-handler.ts +112 -0
  354. package/src/forms/document-actions.module.css +94 -0
  355. package/src/forms/document-actions.tsx +149 -0
  356. package/src/forms/form-context.tsx +620 -0
  357. package/src/forms/form-renderer.module.css +318 -0
  358. package/src/forms/form-renderer.tsx +786 -0
  359. package/src/forms/navigation-guard.tsx +98 -0
  360. package/src/forms/path-widget.module.css +41 -0
  361. package/src/forms/path-widget.test.tsx +217 -0
  362. package/src/forms/path-widget.tsx +141 -0
  363. package/src/forms/upload-executor.ts +190 -0
  364. package/src/react.ts +79 -0
  365. package/src/services/admin-services-context.tsx +35 -0
  366. package/src/services/admin-services-types.ts +177 -0
  367. package/src/services/field-services-context.tsx +35 -0
  368. package/src/services/field-services-types.ts +68 -0
@@ -0,0 +1,171 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ import { useEffect, useState } from 'react'
10
+
11
+ import { CloseIcon, IconButton, LoaderRing, Modal } from '@infonomic/uikit/react'
12
+ import cx from 'classnames'
13
+ import ReactDiffViewer, { DiffMethod } from 'react-diff-viewer-continued'
14
+
15
+ import { useBylineAdminServices } from '../../../services/admin-services-context.js'
16
+ import styles from './diff-modal.module.css'
17
+
18
+ // Keys that are per-version metadata rather than content — strip before diffing
19
+ // so the diff focuses on meaningful content changes. ClientDocument-shape
20
+ // metadata keys after the Phase 7 admin migration.
21
+ const STRIP_KEYS = new Set([
22
+ 'id',
23
+ 'versionId',
24
+ 'path',
25
+ 'status',
26
+ 'createdAt',
27
+ 'updatedAt',
28
+ 'hasPublishedVersion',
29
+ '_publishedVersion',
30
+ ])
31
+
32
+ function stripMeta(doc: Record<string, unknown>): Record<string, unknown> {
33
+ // With the nested document shape, extract just the fields for diffing.
34
+ if (doc.fields && typeof doc.fields === 'object') {
35
+ return doc.fields as Record<string, unknown>
36
+ }
37
+ return Object.fromEntries(Object.entries(doc).filter(([k]) => !STRIP_KEYS.has(k)))
38
+ }
39
+
40
+ export interface DiffModalProps {
41
+ isOpen: boolean
42
+ onDismiss: () => void
43
+ collection: string
44
+ documentId: string
45
+ /** The `versionId` of the historical version to compare. */
46
+ versionId: string
47
+ /** A human-readable label for the historical version (e.g. a date string). */
48
+ versionLabel: string
49
+ /** The already-loaded current (latest) version of the document. */
50
+ currentDocument: Record<string, unknown>
51
+ /** Content locale to compare — undefined / 'all' shows all locales. */
52
+ locale?: string
53
+ }
54
+
55
+ export function DiffModal({
56
+ isOpen,
57
+ onDismiss,
58
+ collection,
59
+ documentId,
60
+ versionId,
61
+ versionLabel,
62
+ currentDocument,
63
+ locale,
64
+ }: DiffModalProps) {
65
+ const { getCollectionDocumentVersion } = useBylineAdminServices()
66
+ const [historicalDoc, setHistoricalDoc] = useState<Record<string, unknown> | null>(null)
67
+ const [loading, setLoading] = useState(false)
68
+ const [error, setError] = useState<string | null>(null)
69
+
70
+ useEffect(() => {
71
+ if (!isOpen || !versionId) return
72
+
73
+ let cancelled = false
74
+ setLoading(true)
75
+ setError(null)
76
+ setHistoricalDoc(null)
77
+
78
+ getCollectionDocumentVersion(collection, documentId, versionId, locale)
79
+ .then((doc) => {
80
+ if (cancelled) return
81
+ setHistoricalDoc(doc)
82
+ })
83
+ .catch((err) => {
84
+ if (cancelled) return
85
+ setError(err instanceof Error ? err.message : 'Failed to load version')
86
+ })
87
+ .finally(() => {
88
+ if (!cancelled) setLoading(false)
89
+ })
90
+
91
+ return () => {
92
+ cancelled = true
93
+ }
94
+ }, [isOpen, collection, documentId, versionId, locale, getCollectionDocumentVersion])
95
+
96
+ const currentStr = currentDocument ? JSON.stringify(stripMeta(currentDocument), null, 2) : ''
97
+
98
+ const historicalStr = historicalDoc ? JSON.stringify(stripMeta(historicalDoc), null, 2) : ''
99
+
100
+ return (
101
+ <Modal isOpen={isOpen} closeOnOverlayClick={true} onDismiss={onDismiss}>
102
+ <Modal.Container
103
+ style={{
104
+ width: '96vw',
105
+ maxWidth: '96vw',
106
+ height: '90vh',
107
+ maxHeight: '90vh',
108
+ display: 'flex',
109
+ flexDirection: 'column',
110
+ overflow: 'hidden',
111
+ }}
112
+ >
113
+ <Modal.Header className={cx('byline-diff-modal-header', styles.header)}>
114
+ <div className={cx('byline-diff-modal-title-stack', styles['title-stack'])}>
115
+ <h3 className={cx('byline-diff-modal-title', styles.title)}>Version Comparison</h3>
116
+ <p className={cx('byline-diff-modal-subtitle', styles.subtitle)}>
117
+ Comparing{' '}
118
+ <span className={cx('byline-diff-modal-version', styles.version)}>
119
+ {versionLabel}
120
+ </span>{' '}
121
+ (left) against current version (right)
122
+ </p>
123
+ </div>
124
+ <IconButton onClick={onDismiss} size="xs" aria-label="Close comparison">
125
+ <CloseIcon width="15px" height="15px" />
126
+ </IconButton>
127
+ </Modal.Header>
128
+
129
+ <Modal.Content
130
+ className={cx('byline-diff-modal-content', styles.content)}
131
+ style={{ minHeight: 0 }}
132
+ >
133
+ {loading && (
134
+ <div className={cx('byline-diff-modal-state', styles.state)}>
135
+ <LoaderRing size={28} color="#666666" />
136
+ <span>Loading version…</span>
137
+ </div>
138
+ )}
139
+
140
+ {error && (
141
+ <div
142
+ className={cx(
143
+ 'byline-diff-modal-state',
144
+ 'byline-diff-modal-error',
145
+ styles.state,
146
+ styles.error
147
+ )}
148
+ >
149
+ {error}
150
+ </div>
151
+ )}
152
+
153
+ {!loading && !error && historicalDoc && (
154
+ <div className={cx('byline-diff-modal-viewer', styles.viewer)}>
155
+ <ReactDiffViewer
156
+ oldValue={historicalStr}
157
+ newValue={currentStr}
158
+ splitView={true}
159
+ compareMethod={DiffMethod.LINES}
160
+ useDarkTheme={true}
161
+ leftTitle={versionLabel}
162
+ rightTitle="Current version"
163
+ hideLineNumbers={false}
164
+ />
165
+ </div>
166
+ )}
167
+ </Modal.Content>
168
+ </Modal.Container>
169
+ </Modal>
170
+ )
171
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * StatusBadge — workflow-status pill, optionally preceded by a "live" dot.
3
+ *
4
+ * Override handles:
5
+ * .byline-status-badge-wrap — the outer flex container
6
+ * .byline-status-badge-dot — the green "published version live" dot
7
+ * .byline-status-badge — the badge itself
8
+ */
9
+
10
+ .wrap,
11
+ :global(.byline-status-badge-wrap) {
12
+ display: inline-flex;
13
+ align-items: center;
14
+ gap: var(--spacing-4);
15
+ }
16
+
17
+ .dot,
18
+ :global(.byline-status-badge-dot) {
19
+ display: inline-block;
20
+ width: 0.5rem;
21
+ height: 0.5rem;
22
+ border-radius: var(--border-radius-full);
23
+ background-color: var(--green-500);
24
+ }
25
+
26
+ .badge,
27
+ :global(.byline-status-badge) {
28
+ padding: 0 0.375rem;
29
+ font-size: 0.65rem;
30
+ line-height: 1.5;
31
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ import type { WorkflowStatus } from '@byline/core'
10
+ import {
11
+ WORKFLOW_STATUS_ARCHIVED,
12
+ WORKFLOW_STATUS_DRAFT,
13
+ WORKFLOW_STATUS_PUBLISHED,
14
+ } from '@byline/core'
15
+ import { Badge } from '@infonomic/uikit/react'
16
+ import cx from 'classnames'
17
+
18
+ import styles from './status-badge.module.css'
19
+
20
+ function statusIntent(status: string): 'success' | 'warning' | 'info' | 'noeffect' {
21
+ switch (status) {
22
+ case WORKFLOW_STATUS_PUBLISHED:
23
+ return 'success'
24
+ case WORKFLOW_STATUS_DRAFT:
25
+ return 'warning'
26
+ case WORKFLOW_STATUS_ARCHIVED:
27
+ return 'info'
28
+ default:
29
+ return 'noeffect'
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Compact badge for workflow status values. Maps the three built-in
35
+ * statuses (draft, published, archived) to semantic intents and falls
36
+ * back to `noeffect` for any custom workflow statuses.
37
+ *
38
+ * When `hasPublishedVersion` is true and the current status is not
39
+ * `published`, a small green dot is rendered before the badge to
40
+ * indicate that a published version is live.
41
+ *
42
+ * Stable override handles: `.byline-status-badge-wrap`,
43
+ * `.byline-status-badge-dot`, `.byline-status-badge`.
44
+ */
45
+ export const StatusBadge = ({
46
+ status,
47
+ workflowStatuses,
48
+ hasPublishedVersion,
49
+ }: {
50
+ status: string
51
+ workflowStatuses: WorkflowStatus[]
52
+ hasPublishedVersion?: boolean
53
+ }) => {
54
+ const label = workflowStatuses.find((s) => s.name === status)?.label ?? String(status ?? '')
55
+
56
+ return (
57
+ <span className={cx('byline-status-badge-wrap', styles.wrap)}>
58
+ {hasPublishedVersion === true && status !== 'published' && (
59
+ <span
60
+ title="A published version is live"
61
+ className={cx('byline-status-badge-dot', styles.dot)}
62
+ />
63
+ )}
64
+ <Badge intent={statusIntent(status)} className={cx('byline-status-badge', styles.badge)}>
65
+ {label}
66
+ </Badge>
67
+ </span>
68
+ )
69
+ }
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Group — labelled fieldset clustering related fields together.
3
+ *
4
+ * Used by `FormRenderer` when a `CollectionAdminConfig` declares a
5
+ * `groups` primitive. Renders a bordered, padded `<fieldset>` with an
6
+ * optional `<legend>` for the label.
7
+ *
8
+ * Override handles: `.byline-admin-group` (the fieldset) and
9
+ * `.byline-admin-group-legend` (the optional heading) are exposed as
10
+ * stable global classes for host overrides.
11
+ *
12
+ * Note: this is the *admin layout* group primitive, not the schema-level
13
+ * `group` field type. Field widgets use `byline-field-*` handles to keep
14
+ * the namespaces disambiguated.
15
+ */
16
+
17
+ .group,
18
+ :global(.byline-admin-group) {
19
+ display: flex;
20
+ flex-direction: column;
21
+ gap: var(--spacing-16);
22
+ padding: var(--spacing-12);
23
+ border: var(--border-width-thin) var(--border-style-solid) var(--gray-200);
24
+ border-radius: var(--border-radius-md);
25
+ }
26
+
27
+ .legend,
28
+ :global(.byline-admin-group-legend) {
29
+ padding-inline: var(--spacing-4);
30
+ font-size: var(--font-size-sm);
31
+ font-weight: var(--font-weight-medium);
32
+ }
33
+
34
+ /* ─── Dark theme variants ───────────────────────────────────── */
35
+
36
+ :is([data-theme="dark"], :global(.dark)) {
37
+ .group,
38
+ :global(.byline-admin-group) {
39
+ border-color: var(--gray-700);
40
+ }
41
+ }
@@ -0,0 +1,40 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ import type { ReactNode } from 'react'
10
+
11
+ import cx from 'classnames'
12
+
13
+ import styles from './group.module.css'
14
+
15
+ interface GroupProps {
16
+ /** Optional heading rendered as a `<legend>` above the cluster. */
17
+ label?: string
18
+ children: ReactNode
19
+ className?: string
20
+ }
21
+
22
+ /**
23
+ * Labelled fieldset clustering related fields together.
24
+ *
25
+ * Used by `FormRenderer` when a `CollectionAdminConfig` declares a `groups`
26
+ * primitive. Renders a bordered, padded `<fieldset>` with an optional
27
+ * `<legend>` for the label.
28
+ *
29
+ * Stable override handles: `.byline-admin-group` on the fieldset and
30
+ * `.byline-admin-group-legend` on the legend (alongside the hashed
31
+ * CSS-modules locals).
32
+ */
33
+ export const Group = ({ label, children, className }: GroupProps) => {
34
+ return (
35
+ <fieldset className={cx('byline-admin-group', styles.group, className)}>
36
+ {label && <legend className={cx('byline-admin-group-legend', styles.legend)}>{label}</legend>}
37
+ {children}
38
+ </fieldset>
39
+ )
40
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Row — horizontal flex layout for admin form fields.
3
+ *
4
+ * Members render side-by-side at `sm` and above, stack vertically below.
5
+ * `flex: 1` + `min-width: 0` on direct children lets two text inputs
6
+ * share the row evenly without overflowing.
7
+ *
8
+ * Override handle: `.byline-admin-row` is exposed as a stable global
9
+ * class so hosts can target this element from their own stylesheet
10
+ * without referring to the hashed local name.
11
+ */
12
+
13
+ .row,
14
+ :global(.byline-admin-row) {
15
+ display: flex;
16
+ flex-direction: column;
17
+ align-items: flex-start;
18
+ gap: var(--spacing-16);
19
+ }
20
+
21
+ .row > *,
22
+ :global(.byline-admin-row) > * {
23
+ flex: 1;
24
+ min-width: 0;
25
+ }
26
+
27
+ @media (min-width: 40rem) {
28
+ .row,
29
+ :global(.byline-admin-row) {
30
+ flex-direction: row;
31
+ }
32
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ import type { ReactNode } from 'react'
10
+
11
+ import cx from 'classnames'
12
+
13
+ import styles from './row.module.css'
14
+
15
+ interface RowProps {
16
+ children: ReactNode
17
+ className?: string
18
+ }
19
+
20
+ /**
21
+ * Horizontal flex-row layout for admin form fields.
22
+ *
23
+ * Used by `FormRenderer` when a `CollectionAdminConfig` declares a `rows`
24
+ * primitive. Members are rendered side-by-side above the `sm` breakpoint
25
+ * and stack vertically below it. `flex-1` + `min-width: 0` lets two text
26
+ * inputs share the row evenly without overflowing.
27
+ *
28
+ * The element carries `.byline-admin-row` as a stable global class for
29
+ * host overrides (alongside the hashed CSS-modules local).
30
+ */
31
+ export const Row = ({ children, className }: RowProps) => {
32
+ return <div className={cx('byline-admin-row', styles.row, className)}>{children}</div>
33
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Tabs — navigation bar for admin form layouts.
3
+ *
4
+ * Override handles:
5
+ * .byline-admin-tabs — the tablist container
6
+ * .byline-admin-tab — each tab button
7
+ * .byline-admin-tab-active — added when the tab is the active one
8
+ * .byline-admin-tab-label — the inner label span (with optional badge)
9
+ * .byline-admin-tab-badge — the inline error-count badge
10
+ */
11
+
12
+ .tabs,
13
+ :global(.byline-admin-tabs) {
14
+ display: flex;
15
+ gap: var(--spacing-16);
16
+ border-bottom: var(--border-width-thin) var(--border-style-solid) var(--gray-200);
17
+ }
18
+
19
+ .tab,
20
+ :global(.byline-admin-tab) {
21
+ position: relative;
22
+ margin-bottom: -1px;
23
+ padding: 0.625rem 0;
24
+ border-bottom: 2px solid transparent;
25
+ background: none;
26
+ color: var(--gray-500);
27
+ font-size: 1.1rem;
28
+ font-weight: var(--font-weight-medium);
29
+ cursor: pointer;
30
+ transition:
31
+ color 150ms ease,
32
+ border-color 150ms ease;
33
+ outline: none;
34
+ }
35
+
36
+ .tab:hover,
37
+ :global(.byline-admin-tab):hover {
38
+ color: var(--gray-800);
39
+ border-bottom-color: var(--gray-300);
40
+ }
41
+
42
+ .tab:focus-visible,
43
+ :global(.byline-admin-tab):focus-visible {
44
+ box-shadow: 0 0 0 2px var(--blue-500);
45
+ }
46
+
47
+ .tab-active,
48
+ :global(.byline-admin-tab-active) {
49
+ color: var(--primary-600);
50
+ border-bottom-color: var(--primary-400);
51
+ }
52
+
53
+ .tab-active:hover,
54
+ :global(.byline-admin-tab-active):hover {
55
+ color: var(--primary-600);
56
+ border-bottom-color: var(--primary-400);
57
+ }
58
+
59
+ .label,
60
+ :global(.byline-admin-tab-label) {
61
+ display: flex;
62
+ align-items: center;
63
+ gap: 0.375rem;
64
+ }
65
+
66
+ .badge,
67
+ :global(.byline-admin-tab-badge) {
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: center;
71
+ min-width: 1.25rem;
72
+ height: 1.25rem;
73
+ padding: 0 0.375rem;
74
+ font-size: 0.7rem;
75
+ }
76
+
77
+ /* ─── Dark theme variants ───────────────────────────────────── */
78
+
79
+ :is([data-theme="dark"], :global(.dark)) {
80
+ .tabs,
81
+ :global(.byline-admin-tabs) {
82
+ border-bottom-color: var(--gray-700);
83
+ }
84
+
85
+ .tab,
86
+ :global(.byline-admin-tab) {
87
+ color: var(--gray-400);
88
+ }
89
+
90
+ .tab:hover,
91
+ :global(.byline-admin-tab):hover {
92
+ color: var(--gray-200);
93
+ border-bottom-color: var(--gray-600);
94
+ }
95
+
96
+ .tab-active,
97
+ :global(.byline-admin-tab-active) {
98
+ color: var(--primary-200);
99
+ border-bottom-color: var(--primary-400);
100
+ }
101
+
102
+ .tab-active:hover,
103
+ :global(.byline-admin-tab-active):hover {
104
+ color: var(--primary-200);
105
+ border-bottom-color: var(--primary-400);
106
+ }
107
+ }
@@ -0,0 +1,74 @@
1
+ /**
2
+ * This Source Code is subject to the terms of the Mozilla Public
3
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
4
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5
+ *
6
+ * Copyright (c) Infonomic Company Limited
7
+ */
8
+
9
+ import { Badge } from '@infonomic/uikit/react'
10
+ import cx from 'classnames'
11
+
12
+ import styles from './tabs.module.css'
13
+
14
+ export interface TabItem {
15
+ name: string
16
+ label: string
17
+ }
18
+
19
+ interface TabsProps {
20
+ tabs: TabItem[]
21
+ activeTab: string
22
+ onChange: (name: string) => void
23
+ /** Error counts keyed by tab name — shows a danger badge when > 0. */
24
+ errorCounts?: Record<string, number>
25
+ className?: string
26
+ }
27
+
28
+ /**
29
+ * Tabs navigation bar for admin form layouts.
30
+ *
31
+ * Used by FormRenderer when a CollectionAdminConfig declares a `tabs` array.
32
+ * Each tab is a simple button with a bottom-border active indicator.
33
+ * Inactive tabs show a subtle hover state. Fully dark-mode aware.
34
+ *
35
+ * Stable override handles: `.byline-admin-tabs`, `.byline-admin-tab`,
36
+ * `.byline-admin-tab-active`, `.byline-admin-tab-label`,
37
+ * `.byline-admin-tab-badge`.
38
+ */
39
+ export const Tabs = ({ tabs, activeTab, onChange, errorCounts, className }: TabsProps) => {
40
+ return (
41
+ <div
42
+ role="tablist"
43
+ aria-label="Form tabs"
44
+ className={cx('byline-admin-tabs', styles.tabs, className)}
45
+ >
46
+ {tabs.map((tab) => {
47
+ const isActive = tab.name === activeTab
48
+ return (
49
+ <button
50
+ key={tab.name}
51
+ type="button"
52
+ role="tab"
53
+ aria-selected={isActive}
54
+ onClick={() => onChange(tab.name)}
55
+ className={cx(
56
+ 'byline-admin-tab',
57
+ styles.tab,
58
+ isActive && ['byline-admin-tab-active', styles['tab-active']]
59
+ )}
60
+ >
61
+ <span className={cx('byline-admin-tab-label', styles.label)}>
62
+ {tab.label}
63
+ {(errorCounts?.[tab.name] ?? 0) > 0 && (
64
+ <Badge intent="danger" className={cx('byline-admin-tab-badge', styles.badge)}>
65
+ {errorCounts?.[tab.name]}
66
+ </Badge>
67
+ )}
68
+ </span>
69
+ </button>
70
+ )
71
+ })}
72
+ </div>
73
+ )
74
+ }
@@ -0,0 +1,4 @@
1
+ declare module '*.css' {
2
+ const classes: { [key: string]: string }
3
+ export default classes
4
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * DraggableList demo — example of how to assemble DraggableSortable +
3
+ * useSortable into a working list. Not part of the public surface; kept as
4
+ * a documentation example.
5
+ *
6
+ * Override handles:
7
+ * .byline-demo-list — root list container
8
+ * .byline-demo-card — single draggable card
9
+ * .byline-demo-card-dragging — added while the card is mid-drag
10
+ * .byline-demo-card-header — gripper + title row
11
+ * .byline-demo-card-grip — drag handle column
12
+ */
13
+
14
+ .list,
15
+ :global(.byline-demo-list) {
16
+ position: relative;
17
+ margin-inline: auto;
18
+ max-width: 600px;
19
+ }
20
+
21
+ .card,
22
+ :global(.byline-demo-card) {
23
+ display: flex;
24
+ flex-direction: column;
25
+ position: relative;
26
+ min-width: 100%;
27
+ max-width: 24rem;
28
+ margin-bottom: var(--spacing-16);
29
+ padding: 1.5rem;
30
+ border: var(--border-width-thin) var(--border-style-solid) var(--canvas-25);
31
+ border-radius: var(--border-radius-lg);
32
+ background-color: white;
33
+ box-shadow:
34
+ 0 4px 6px -1px rgb(0 0 0 / 0.1),
35
+ 0 2px 4px -2px rgb(0 0 0 / 0.1);
36
+ text-decoration: none;
37
+ }
38
+
39
+ .card-dragging,
40
+ :global(.byline-demo-card-dragging) {
41
+ box-shadow:
42
+ 0 10px 15px -3px rgb(0 0 0 / 0.1),
43
+ 0 4px 6px -4px rgb(0 0 0 / 0.1);
44
+ }
45
+
46
+ .card-header,
47
+ :global(.byline-demo-card-header) {
48
+ display: flex;
49
+ align-items: center;
50
+ justify-content: flex-start;
51
+ }
52
+
53
+ .card-grip,
54
+ :global(.byline-demo-card-grip) {
55
+ margin-right: var(--spacing-8);
56
+ }
57
+
58
+ /* ─── Dark theme variants ───────────────────────────────────── */
59
+
60
+ :is([data-theme="dark"], :global(.dark)) {
61
+ .card,
62
+ :global(.byline-demo-card) {
63
+ background-color: var(--canvas-800);
64
+ }
65
+ }