plutonium 0.62.2 → 0.64.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 (256) hide show
  1. checksums.yaml +4 -4
  2. data/.claude/skills/plutonium/SKILL.md +44 -0
  3. data/.claude/skills/plutonium-app/SKILL.md +3 -3
  4. data/.claude/skills/plutonium-async-interactions/SKILL.md +191 -0
  5. data/.claude/skills/plutonium-auth/SKILL.md +36 -0
  6. data/.claude/skills/plutonium-behavior/SKILL.md +121 -24
  7. data/.claude/skills/plutonium-kanban/SKILL.md +17 -3
  8. data/.claude/skills/plutonium-resource/SKILL.md +259 -12
  9. data/.claude/skills/plutonium-tenancy/SKILL.md +32 -3
  10. data/.claude/skills/plutonium-ui/SKILL.md +115 -14
  11. data/.claude/skills/plutonium-wizard/SKILL.md +73 -4
  12. data/.standard.yml +1 -1
  13. data/CHANGELOG.md +73 -0
  14. data/CLAUDE.md +87 -0
  15. data/Rakefile +34 -0
  16. data/SECURITY.md +1 -1
  17. data/app/assets/plutonium.css +1 -1
  18. data/app/assets/plutonium.js +685 -102
  19. data/app/assets/plutonium.js.map +4 -4
  20. data/app/assets/plutonium.min.js +53 -53
  21. data/app/assets/plutonium.min.js.map +4 -4
  22. data/app/views/rodauth/_login_form.html.erb +13 -0
  23. data/db/migrate/async_interactions/20260817000001_create_plutonium_async_runs.rb +170 -0
  24. data/docs/.vitepress/config.ts +81 -3
  25. data/docs/.vitepress/theme/blog.data.ts +44 -0
  26. data/docs/.vitepress/theme/components/BlogIndex.vue +87 -0
  27. data/docs/.vitepress/theme/components/BlogMeta.vue +47 -0
  28. data/docs/.vitepress/theme/components/HomeFeatureTour.vue +293 -0
  29. data/docs/.vitepress/theme/components/HomeHero.vue +3 -3
  30. data/docs/.vitepress/theme/components/HomeInTheBox.vue +8 -0
  31. data/docs/.vitepress/theme/components/HomeStopWriting.vue +1 -0
  32. data/docs/.vitepress/theme/components/HomeWhyPlutonium.vue +84 -0
  33. data/docs/.vitepress/theme/index.ts +8 -4
  34. data/docs/blog/association-inputs-post-signed-ids.md +70 -0
  35. data/docs/blog/fix-the-model-not-the-policy.md +122 -0
  36. data/docs/blog/fractional-ordering-runs-out-of-room.md +67 -0
  37. data/docs/blog/half-finished-forms-are-pii.md +76 -0
  38. data/docs/blog/index.md +13 -0
  39. data/docs/blog/interactions-are-presentation-objects.md +152 -0
  40. data/docs/blog/introducing-plutonium.md +253 -0
  41. data/docs/blog/jobs-are-not-permission-snapshots.md +100 -0
  42. data/docs/blog/plutonium-and-ai-agents.md +48 -0
  43. data/docs/blog/realtime-is-one-line-and-four-dependencies.md +70 -0
  44. data/docs/blog/two-forms-one-dom-id.md +69 -0
  45. data/docs/blog/whats-new-async-kanban-wizards.md +130 -0
  46. data/docs/getting-started/tutorial/04-authorization.md +12 -3
  47. data/docs/getting-started/tutorial/06-nested-resources.md +3 -1
  48. data/docs/getting-started/tutorial/07-author-portal.md +2 -2
  49. data/docs/guides/authentication.md +73 -0
  50. data/docs/guides/authorization.md +2 -0
  51. data/docs/guides/creating-packages.md +5 -3
  52. data/docs/guides/custom-actions.md +74 -12
  53. data/docs/guides/customizing-ui.md +9 -2
  54. data/docs/guides/index.md +1 -0
  55. data/docs/guides/kanban.md +7 -5
  56. data/docs/guides/nested-resources.md +11 -1
  57. data/docs/guides/performance.md +104 -0
  58. data/docs/guides/user-invites.md +1 -1
  59. data/docs/guides/wizards.md +9 -1
  60. data/docs/index.md +3 -3
  61. data/docs/public/images/home/tour-actions.png +0 -0
  62. data/docs/public/images/home/tour-async.png +0 -0
  63. data/docs/public/images/home/tour-kanban.png +0 -0
  64. data/docs/public/images/home/tour-tenancy.png +0 -0
  65. data/docs/public/images/home/tour-wizard.png +0 -0
  66. data/docs/public/images/reference/async-progress-page.png +0 -0
  67. data/docs/public/images/reference/async-running-banner.png +0 -0
  68. data/docs/public/templates/experimental.rb +34 -0
  69. data/docs/public/templates/pluton8.rb +14 -0
  70. data/docs/reference/app/portals.md +15 -3
  71. data/docs/reference/auth/accounts.md +19 -0
  72. data/docs/reference/behavior/async-interactions.md +295 -0
  73. data/docs/reference/behavior/controllers.md +17 -4
  74. data/docs/reference/behavior/index.md +7 -1
  75. data/docs/reference/behavior/interactions.md +152 -22
  76. data/docs/reference/configuration.md +5 -0
  77. data/docs/reference/index.md +1 -0
  78. data/docs/reference/kanban/dsl.md +7 -4
  79. data/docs/reference/kanban/index.md +1 -1
  80. data/docs/reference/kanban/positioning.md +26 -4
  81. data/docs/reference/positioning.md +568 -0
  82. data/docs/reference/resource/actions.md +97 -4
  83. data/docs/reference/resource/definition.md +181 -9
  84. data/docs/reference/tenancy/invites.md +1 -1
  85. data/docs/reference/tenancy/nested-resources.md +60 -2
  86. data/docs/reference/ui/assets.md +4 -0
  87. data/docs/reference/ui/components.md +57 -4
  88. data/docs/reference/ui/displays.md +20 -10
  89. data/docs/reference/ui/index.md +1 -1
  90. data/docs/reference/wizard/dsl.md +33 -0
  91. data/docs/reference/wizard/storage-config.md +1 -0
  92. data/docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md +624 -0
  93. data/docs/superpowers/plans/2026-07-16-homepage-depth-upgrade.md.tasks.json +32 -0
  94. data/docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md +1787 -0
  95. data/docs/superpowers/plans/2026-07-31-positioned-drag-and-drop.md.tasks.json +91 -0
  96. data/docs/superpowers/plans/2026-08-17-async-interactions.md +1414 -0
  97. data/docs/superpowers/plans/2026-08-17-async-interactions.md.tasks.json +66 -0
  98. data/docs/superpowers/specs/2026-07-16-homepage-depth-upgrade-design.md +111 -0
  99. data/docs/superpowers/specs/2026-07-17-action-html-attributes-design.md +124 -0
  100. data/docs/superpowers/specs/2026-07-31-positioned-drag-and-drop-design.md +506 -0
  101. data/docs/superpowers/specs/2026-08-17-async-interactions-design.md +185 -0
  102. data/gemfiles/postgres.gemfile.lock +85 -85
  103. data/gemfiles/rails_7.gemfile.lock +323 -141
  104. data/gemfiles/rails_8.0.gemfile.lock +126 -116
  105. data/gemfiles/rails_8.1.gemfile.lock +127 -117
  106. data/lib/generators/pu/async_interactions/install_generator.rb +111 -0
  107. data/lib/generators/pu/async_interactions/templates/app/controllers/async_runs_controller.rb.tt +15 -0
  108. data/lib/generators/pu/core/typespec/typespec_generator.rb +7 -4
  109. data/lib/generators/pu/invites/install_generator.rb +3 -3
  110. data/lib/generators/pu/invites/templates/packages/invites/app/views/layouts/invites/invitation.html.erb.tt +2 -2
  111. data/lib/generators/pu/lib/plutonium_generators/concerns/mounts_engines.rb +47 -2
  112. data/lib/generators/pu/lib/plutonium_generators/concerns/resource_registration.rb +41 -0
  113. data/lib/generators/pu/lite/litestream/litestream_generator.rb +1 -1
  114. data/lib/generators/pu/lite/solid_queue/solid_queue_generator.rb +1 -1
  115. data/lib/generators/pu/res/conn/conn_generator.rb +19 -39
  116. data/lib/generators/pu/res/conn/templates/app/controllers/resource_controller.rb.tt +4 -0
  117. data/lib/generators/pu/rodauth/templates/app/rodauth/account_rodauth_plugin.rb.tt +15 -6
  118. data/lib/generators/pu/rodauth/templates/app/rodauth/rodauth_plugin.rb.tt +7 -0
  119. data/lib/generators/pu/saas/welcome/templates/app/views/layouts/welcome.html.erb.tt +2 -2
  120. data/lib/generators/pu/wizards/install_generator.rb +78 -0
  121. data/lib/plutonium/action/base.rb +71 -9
  122. data/lib/plutonium/action/interactive.rb +9 -0
  123. data/lib/plutonium/attachments.rb +254 -0
  124. data/lib/plutonium/configuration.rb +82 -1
  125. data/lib/plutonium/core/controller.rb +50 -7
  126. data/lib/plutonium/core/controllers/authorizable.rb +16 -0
  127. data/lib/plutonium/core/controllers/entity_scoping.rb +12 -2
  128. data/lib/plutonium/definition/base.rb +51 -0
  129. data/lib/plutonium/definition/display_layout.rb +112 -0
  130. data/lib/plutonium/definition/index_views.rb +8 -7
  131. data/lib/plutonium/definition/input_aliases.rb +38 -0
  132. data/lib/plutonium/definition/page_widths.rb +65 -0
  133. data/lib/plutonium/definition/positioning.rb +126 -0
  134. data/lib/plutonium/definition/sorting.rb +17 -2
  135. data/lib/plutonium/helpers/turbo_helper.rb +7 -0
  136. data/lib/plutonium/interaction/README.md +61 -24
  137. data/lib/plutonium/interaction/async/configuration.rb +38 -0
  138. data/lib/plutonium/interaction/async/context.rb +419 -0
  139. data/lib/plutonium/interaction/async/executor.rb +422 -0
  140. data/lib/plutonium/interaction/async/job.rb +80 -0
  141. data/lib/plutonium/interaction/async/reap_job.rb +81 -0
  142. data/lib/plutonium/interaction/async/run.rb +394 -0
  143. data/lib/plutonium/interaction/async/run_definition.rb +155 -0
  144. data/lib/plutonium/interaction/async/run_policy.rb +86 -0
  145. data/lib/plutonium/interaction/base.rb +34 -7
  146. data/lib/plutonium/interaction/concerns/dispatchable.rb +518 -0
  147. data/lib/plutonium/interaction/concerns/scoping.rb +70 -9
  148. data/lib/plutonium/interaction/response/redirect.rb +11 -3
  149. data/lib/plutonium/kanban/board.rb +14 -0
  150. data/lib/plutonium/kanban/column.rb +4 -2
  151. data/lib/plutonium/kanban/dsl.rb +4 -1
  152. data/lib/plutonium/kanban/grouping.rb +9 -22
  153. data/lib/plutonium/kanban/positioning.rb +5 -65
  154. data/lib/plutonium/positioning/config.rb +94 -0
  155. data/lib/plutonium/positioning/model.rb +128 -0
  156. data/lib/plutonium/positioning.rb +25 -86
  157. data/lib/plutonium/railtie.rb +1 -0
  158. data/lib/plutonium/resource/controller.rb +118 -38
  159. data/lib/plutonium/resource/controllers/crud_actions/index_action.rb +32 -2
  160. data/lib/plutonium/resource/controllers/crud_actions.rb +30 -2
  161. data/lib/plutonium/resource/controllers/eager_loading.rb +87 -0
  162. data/lib/plutonium/resource/controllers/export_csv.rb +10 -1
  163. data/lib/plutonium/resource/controllers/kanban_actions.rb +53 -14
  164. data/lib/plutonium/resource/controllers/position_actions.rb +390 -0
  165. data/lib/plutonium/resource/controllers/presentable.rb +19 -13
  166. data/lib/plutonium/resource/controllers/queryable.rb +5 -1
  167. data/lib/plutonium/resource/controllers/wizard_actions.rb +21 -0
  168. data/lib/plutonium/resource/policy.rb +33 -0
  169. data/lib/plutonium/resource/query_object.rb +36 -0
  170. data/lib/plutonium/routing/mapper_extensions.rb +100 -8
  171. data/lib/plutonium/routing/route_set_extensions.rb +15 -1
  172. data/lib/plutonium/routing/wizard_registration.rb +4 -0
  173. data/lib/plutonium/testing/resource_policy.rb +6 -2
  174. data/lib/plutonium/ui/action_button.rb +12 -7
  175. data/lib/plutonium/ui/actions_dropdown.rb +1 -1
  176. data/lib/plutonium/ui/block.rb +21 -1
  177. data/lib/plutonium/ui/breadcrumbs.rb +187 -55
  178. data/lib/plutonium/ui/component/methods.rb +5 -0
  179. data/lib/plutonium/ui/component/positionable.rb +112 -0
  180. data/lib/plutonium/ui/component/resolves_tags.rb +57 -0
  181. data/lib/plutonium/ui/component/section.rb +185 -0
  182. data/lib/plutonium/ui/display/base.rb +13 -1
  183. data/lib/plutonium/ui/display/components/formatted_value.rb +26 -0
  184. data/lib/plutonium/ui/display/components/section.rb +18 -0
  185. data/lib/plutonium/ui/display/resource.rb +141 -22
  186. data/lib/plutonium/ui/display/theme.rb +20 -1
  187. data/lib/plutonium/ui/export_button.rb +1 -1
  188. data/lib/plutonium/ui/form/base.rb +8 -7
  189. data/lib/plutonium/ui/form/components/intl_tel_input.rb +1 -1
  190. data/lib/plutonium/ui/form/components/section.rb +7 -62
  191. data/lib/plutonium/ui/form/components/uppy.rb +12 -1
  192. data/lib/plutonium/ui/form/concerns/renders_nested_resource_fields.rb +16 -3
  193. data/lib/plutonium/ui/form/concerns/renders_structured_inputs.rb +5 -1
  194. data/lib/plutonium/ui/form/query.rb +2 -4
  195. data/lib/plutonium/ui/form/resource.rb +92 -15
  196. data/lib/plutonium/ui/form/theme.rb +17 -0
  197. data/lib/plutonium/ui/form/wizard.rb +25 -1
  198. data/lib/plutonium/ui/grid/card.rb +79 -11
  199. data/lib/plutonium/ui/grid/resource.rb +47 -5
  200. data/lib/plutonium/ui/interaction/async/run_progress.rb +227 -0
  201. data/lib/plutonium/ui/interaction/async/running_banner.rb +65 -0
  202. data/lib/plutonium/ui/kanban/card.rb +2 -1
  203. data/lib/plutonium/ui/kanban/column.rb +12 -6
  204. data/lib/plutonium/ui/kanban/resource.rb +6 -7
  205. data/lib/plutonium/ui/layout/base.rb +10 -3
  206. data/lib/plutonium/ui/nav_grid_menu.rb +1 -0
  207. data/lib/plutonium/ui/page/base.rb +19 -0
  208. data/lib/plutonium/ui/page/edit.rb +4 -1
  209. data/lib/plutonium/ui/page/index.rb +69 -18
  210. data/lib/plutonium/ui/page/interactive_action.rb +5 -1
  211. data/lib/plutonium/ui/page/new.rb +4 -1
  212. data/lib/plutonium/ui/page/show.rb +27 -10
  213. data/lib/plutonium/ui/page/wizard.rb +10 -1
  214. data/lib/plutonium/ui/page/wizard_chooser.rb +36 -11
  215. data/lib/plutonium/ui/page_width.rb +58 -0
  216. data/lib/plutonium/ui/table/base.rb +34 -1
  217. data/lib/plutonium/ui/table/components/attachment.rb +1 -1
  218. data/lib/plutonium/ui/table/components/bulk_actions_toolbar.rb +32 -8
  219. data/lib/plutonium/ui/table/components/drag_handle.rb +120 -0
  220. data/lib/plutonium/ui/table/components/filter_form.rb +1 -4
  221. data/lib/plutonium/ui/table/components/filter_pills.rb +1 -1
  222. data/lib/plutonium/ui/table/components/row_actions_dropdown.rb +1 -1
  223. data/lib/plutonium/ui/table/resource.rb +50 -5
  224. data/lib/plutonium/ui/table/theme.rb +59 -2
  225. data/lib/plutonium/ui/wizard/review.rb +4 -2
  226. data/lib/plutonium/ui/wizard/summary_display.rb +42 -14
  227. data/lib/plutonium/version.rb +1 -1
  228. data/lib/plutonium/wizard/attachments.rb +32 -197
  229. data/lib/plutonium/wizard/base.rb +6 -1
  230. data/lib/plutonium/wizard/configuration.rb +12 -0
  231. data/lib/plutonium/wizard/controller.rb +14 -0
  232. data/lib/plutonium/wizard/driving.rb +99 -15
  233. data/lib/plutonium/wizard/dsl.rb +23 -0
  234. data/lib/plutonium/wizard/resume.rb +127 -49
  235. data/lib/plutonium/wizard/runner.rb +46 -2
  236. data/lib/plutonium/wizard/step_adapter.rb +1 -1
  237. data/lib/plutonium/wizard/sweep_job.rb +16 -0
  238. data/lib/plutonium.rb +21 -0
  239. data/lib/rodauth/features/session_isolation.rb +92 -0
  240. data/lib/rodauth/plugins.rb +1 -0
  241. data/package.json +2 -1
  242. data/plutonium.gemspec +20 -20
  243. data/src/css/components.css +89 -1
  244. data/src/css/slim_select.css +20 -0
  245. data/src/js/controllers/breadcrumbs_controller.js +112 -0
  246. data/src/js/controllers/bulk_actions_controller.js +10 -2
  247. data/src/js/controllers/kanban_controller.js +30 -21
  248. data/src/js/controllers/positioned_controller.js +452 -0
  249. data/src/js/controllers/register_controllers.js +6 -0
  250. data/src/js/controllers/resource_drop_down_controller.js +5 -0
  251. data/src/js/controllers/run_progress_controller.js +73 -0
  252. data/src/js/drag/sortable.js +186 -0
  253. data/yarn.lock +108 -63
  254. metadata +101 -22
  255. data/docs/.vitepress/theme/components/HomeAudienceSplit.vue +0 -53
  256. data/docs/.vitepress/theme/components/HomePillars.vue +0 -42
@@ -0,0 +1,186 @@
1
+ // Shared native HTML5 drag-and-drop mechanics.
2
+ //
3
+ // Deliberately knows nothing about kanban columns, tables, WIP limits, or
4
+ // Turbo. Consumers wire it to their own DOM contract and own the transport
5
+ // (which element is draggable, what a "drop" means, what gets POSTed where).
6
+ //
7
+ // Everything here is a pure function over an event / element / geometry — no
8
+ // module state, so two controllers can be live on the same page without
9
+ // interfering.
10
+ //
11
+ // Consumers: kanban_controller.js, positioned_controller.js
12
+
13
+ // Returns the 0-based insertion index for a drop at `clientY` among `items`,
14
+ // by comparing the cursor against each item's vertical midpoint: the drop goes
15
+ // BEFORE the first item whose midpoint is below the cursor, or after all of
16
+ // them when the cursor is below every midpoint.
17
+ //
18
+ // `items` must already exclude the dragged element itself — otherwise a
19
+ // same-container reorder computes an index that counts the item being moved.
20
+ export function computeDropIndex(clientY, items) {
21
+ for (let i = 0; i < items.length; i++) {
22
+ const rect = items[i].getBoundingClientRect()
23
+ if (clientY < rect.top + rect.height / 2) return i
24
+ }
25
+ return items.length
26
+ }
27
+
28
+ // Horizontal variant of the above, for grid / card layouts that flow in rows
29
+ // rather than stacking in a column.
30
+ //
31
+ // Scoped to ONE visual row. A wrapped grid gives every row the same left edge,
32
+ // so an X comparison across rows is meaningless — the caller narrows to a row
33
+ // first and passes only that row's items (see positioned_controller's
34
+ // #dropIndex, which does exactly that).
35
+ export function computeDropIndexHorizontal(clientX, items) {
36
+ for (let i = 0; i < items.length; i++) {
37
+ const rect = items[i].getBoundingClientRect()
38
+ if (clientX < rect.left + rect.width / 2) return i
39
+ }
40
+ return items.length
41
+ }
42
+
43
+ // Applies the drag payload + the dragging class to `element`.
44
+ //
45
+ // The class change is deferred one frame ON PURPOSE: the browser captures the
46
+ // drag ghost image from the element's rendered state during dragstart, so
47
+ // adding an opacity class synchronously produces an already-faded ghost. One
48
+ // requestAnimationFrame is enough for the ghost to be snapshotted first and the
49
+ // source element to then dim in place.
50
+ //
51
+ // `payload` is written to text/plain so a drop OUTSIDE the consumer's own
52
+ // container still carries data natively instead of erroring.
53
+ // `dragImage` names the element the browser should ghost. Pass it whenever the
54
+ // draggable node is a HANDLE inside the thing being moved rather than the thing
55
+ // itself: the browser ghosts whatever carries draggable="true", so a table's
56
+ // grip button drags a picture of the grip and the row appears not to move at
57
+ // all. Consumers whose whole element is draggable (a kanban card) can omit it —
58
+ // the default ghost is already the right picture.
59
+ export function beginDrag(event, element, { draggingClass, payload, dragImage = null }) {
60
+ event.dataTransfer.effectAllowed = "move"
61
+ event.dataTransfer.setData("text/plain", payload)
62
+
63
+ if (dragImage) {
64
+ // Anchor the ghost where the pointer actually grabbed, so it tracks under
65
+ // the cursor instead of snapping its corner to it.
66
+ const rect = dragImage.getBoundingClientRect()
67
+ event.dataTransfer.setDragImage(dragImage, event.clientX - rect.left, event.clientY - rect.top)
68
+ }
69
+
70
+ requestAnimationFrame(() => element.classList.add(draggingClass))
71
+ }
72
+
73
+ // Undoes beginDrag's visual half. Callers own the rest of their teardown
74
+ // (highlights, hints, cached references) — this only knows about the class it
75
+ // added, plus the insertion marker, which no caller should have to remember to
76
+ // clean up separately.
77
+ export function endDrag(element, { draggingClass }) {
78
+ element.classList.remove(draggingClass)
79
+ hideInsertionMarker()
80
+ }
81
+
82
+ // ─── insertion marker ────────────────────────────────────────────────────────
83
+ //
84
+ // A line showing WHERE the drop will land. Without it the only feedback during
85
+ // a drag is the ghost following the cursor, which says what you are moving but
86
+ // never where it will end up — the user is guessing until they release.
87
+ //
88
+ // One marker element, created lazily and reused, parked on <body> and
89
+ // positioned in viewport coordinates (position: fixed). Deliberately NOT
90
+ // inserted between the items it points at: a table would need a full-width
91
+ // placeholder <tr> to sit between rows, and mutating the collection's own DOM
92
+ // mid-drag fights the Turbo stream that replaces it on drop.
93
+
94
+ const MARKER_ID = "pu-drag-insertion-marker"
95
+
96
+ function insertionMarker() {
97
+ let marker = document.getElementById(MARKER_ID)
98
+ if (!marker) {
99
+ marker = document.createElement("div")
100
+ marker.id = MARKER_ID
101
+ marker.className = "pu-drag-marker"
102
+ // Decorative: it duplicates information the drag itself conveys, and a
103
+ // live region announcing every dragover would flood a screen reader.
104
+ marker.setAttribute("aria-hidden", "true")
105
+ document.body.appendChild(marker)
106
+ }
107
+ return marker
108
+ }
109
+
110
+ // Draws the marker at insertion point `index` within `items` — the same index
111
+ // computeDropIndex/computeDropIndexHorizontal return, so the line always agrees
112
+ // with where the drop actually goes.
113
+ //
114
+ // `items` must exclude the dragged element, exactly as it does for the index
115
+ // computation. `axis` is "vertical" for stacked rows/cards (a horizontal rule
116
+ // between them) and "horizontal" for grids (a vertical rule between cards).
117
+ // `container` is the fallback for an empty target — an empty kanban column
118
+ // still needs to say "it lands here".
119
+ // BETWEEN two items the line is centred in the gap the layout already leaves,
120
+ // so it gets equal air on both sides whatever that spacing is — a board's roomy
121
+ // column and a table's tight rows both come out balanced with no per-consumer
122
+ // tuning. `gap` only covers the two ENDS, where there is no facing item to
123
+ // measure against and the clearance has to be invented. One marker element is
124
+ // shared by every consumer, so an unset gap must RESET the property rather than
125
+ // inherit whichever consumer drew last.
126
+ export function showInsertionMarker(items, index, { axis = "vertical", container = null, gap = null } = {}) {
127
+ const marker = insertionMarker()
128
+
129
+ if (gap) {
130
+ marker.style.setProperty("--pu-drag-marker-gap", gap)
131
+ } else {
132
+ marker.style.removeProperty("--pu-drag-marker-gap")
133
+ }
134
+
135
+ const vertical = axis !== "horizontal"
136
+ const near = rect => (vertical ? rect.top : rect.left)
137
+ const far = rect => (vertical ? rect.bottom : rect.right)
138
+
139
+ // `span` supplies the cross-axis extent (a row's width, a card's height);
140
+ // `offset` is where the line sits along the drag axis.
141
+ let span
142
+ let offset
143
+ let edge
144
+ if (items.length === 0) {
145
+ if (!container) return hideInsertionMarker()
146
+ span = container.getBoundingClientRect()
147
+ offset = near(span)
148
+ edge = "leading"
149
+ } else if (index <= 0) {
150
+ span = items[0].getBoundingClientRect()
151
+ offset = near(span)
152
+ edge = "leading"
153
+ } else if (index >= items.length) {
154
+ span = items[items.length - 1].getBoundingClientRect()
155
+ offset = far(span)
156
+ edge = "trailing"
157
+ } else {
158
+ span = items[index].getBoundingClientRect()
159
+ offset = (far(items[index - 1].getBoundingClientRect()) + near(span)) / 2
160
+ edge = "between"
161
+ }
162
+
163
+ if (vertical) {
164
+ marker.style.left = `${span.left}px`
165
+ marker.style.top = `${offset}px`
166
+ marker.style.width = `${span.width}px`
167
+ marker.style.height = ""
168
+ } else {
169
+ marker.style.left = `${offset}px`
170
+ marker.style.top = `${span.top}px`
171
+ marker.style.height = `${span.height}px`
172
+ marker.style.width = ""
173
+ }
174
+
175
+ marker.dataset.axis = axis
176
+ // Which edge the line is anchored to. "between" is already centred in a real
177
+ // gap and only needs the line's own thickness taken off; the ends have to be
178
+ // pushed clear of the single item they touch.
179
+ marker.dataset.edge = edge
180
+ marker.style.display = "block"
181
+ }
182
+
183
+ export function hideInsertionMarker() {
184
+ const marker = document.getElementById(MARKER_ID)
185
+ if (marker) marker.style.display = "none"
186
+ }
data/yarn.lock CHANGED
@@ -268,14 +268,14 @@ __metadata:
268
268
  languageName: node
269
269
  linkType: hard
270
270
 
271
- "@braintree/sanitize-url@npm:^7.1.1":
272
- version: 7.1.1
273
- resolution: "@braintree/sanitize-url@npm:7.1.1"
274
- checksum: 10c0/fdfc1759c4244e287693ce1e9d42d649423e7c203fdccf27a571f8951ddfe34baa5273b7e6a8dd3007d7676859c7a0a9819be0ab42a3505f8505ad0eefecf7c1
271
+ "@braintree/sanitize-url@npm:^7.1.2":
272
+ version: 7.1.2
273
+ resolution: "@braintree/sanitize-url@npm:7.1.2"
274
+ checksum: 10c0/62f2aa0cf58626e3880b2dc1025c42064b4639abd157ae4e1c35f4c2f5031e9273772046a423979845069c814e27ff818e8e669280dc53585e6f033d5b7a59cb
275
275
  languageName: node
276
276
  linkType: hard
277
277
 
278
- "@chevrotain/types@npm:~11.1.1":
278
+ "@chevrotain/types@npm:~11.1.2":
279
279
  version: 11.1.2
280
280
  resolution: "@chevrotain/types@npm:11.1.2"
281
281
  checksum: 10c0/c0c4679a3d407df34e18d5adfa7ac599b4a2bfddbf68da6e43678b9b3e16ab911de7766b37b9fc466261c3dead3db1b620e2e344f800fa9f0f381720475eda8f
@@ -812,12 +812,12 @@ __metadata:
812
812
  languageName: node
813
813
  linkType: hard
814
814
 
815
- "@mermaid-js/parser@npm:^1.1.1":
816
- version: 1.1.1
817
- resolution: "@mermaid-js/parser@npm:1.1.1"
815
+ "@mermaid-js/parser@npm:^1.2.1":
816
+ version: 1.2.1
817
+ resolution: "@mermaid-js/parser@npm:1.2.1"
818
818
  dependencies:
819
- "@chevrotain/types": "npm:~11.1.1"
820
- checksum: 10c0/66414d9d66f3a86a6751427cb8890a00beaaee2b7eba34c21b34b60cdaf9237d21e9b50b9bf1f560a01a600ee332d33b949fd8f12cbda3238aba50edc0dfdf15
819
+ "@chevrotain/types": "npm:~11.1.2"
820
+ checksum: 10c0/a28e72f874670accb15e057b1802ac917f5d80d3e9b4be9a5094833ee0239d1290ff31c2d50236e909cbd42bea4550c7872d2bfcec0bc0588df6e34ba5dc0498
821
821
  languageName: node
822
822
  linkType: hard
823
823
 
@@ -891,6 +891,7 @@ __metadata:
891
891
  dompurify: "npm:^3.4.11"
892
892
  esbuild: "npm:^0.28.1"
893
893
  esbuild-plugin-manifest: "npm:^1.0.3"
894
+ feed: "npm:^6.0.0"
894
895
  flowbite-typography: "npm:^1.0.5"
895
896
  lodash.debounce: "npm:^4.0.8"
896
897
  marked: "npm:^15.0.3"
@@ -2791,10 +2792,10 @@ __metadata:
2791
2792
  languageName: node
2792
2793
  linkType: hard
2793
2794
 
2794
- "cytoscape@npm:^3.33.1":
2795
- version: 3.33.3
2796
- resolution: "cytoscape@npm:3.33.3"
2797
- checksum: 10c0/f0d01f682d3e443cbeea9aa294ccd6934442362df3ce259e7b0fe3b9a8ce534d901840c503db8b53da814542bc1508f7f14a69e4fe725f919c25483a7200efe7
2795
+ "cytoscape@npm:^3.34.0":
2796
+ version: 3.34.1
2797
+ resolution: "cytoscape@npm:3.34.1"
2798
+ checksum: 10c0/1fefc274d8fbbb59273606d71e7875bfe6d7b7f3cafbd5af0083b1b19a431af93440c7273c0896ce5002ccdd54e28cfa4b0d54638017c69ebba0c1860a1c282b
2798
2799
  languageName: node
2799
2800
  linkType: hard
2800
2801
 
@@ -3170,10 +3171,10 @@ __metadata:
3170
3171
  languageName: node
3171
3172
  linkType: hard
3172
3173
 
3173
- "dayjs@npm:^1.11.19":
3174
- version: 1.11.20
3175
- resolution: "dayjs@npm:1.11.20"
3176
- checksum: 10c0/8af525e2aa100c8db9923d706c42b2b2d30579faf89456619413a5c10916efc92c2b166e193c27c02eb3174b30aa440ee1e7b72b0a2876b3da651d204db848a0
3174
+ "dayjs@npm:^1.11.21":
3175
+ version: 1.11.23
3176
+ resolution: "dayjs@npm:1.11.23"
3177
+ checksum: 10c0/69ab04bf19c676e44ab50cc2fca223d265f3dafd107151ef3b0f3ad74d360c37caa602abe62f87cb25d90bd9f6bee003698af47df5b0dbf10a998b7b5f3bb3f1
3177
3178
  languageName: node
3178
3179
  linkType: hard
3179
3180
 
@@ -3271,15 +3272,15 @@ __metadata:
3271
3272
  languageName: node
3272
3273
  linkType: hard
3273
3274
 
3274
- "dompurify@npm:^3.3.1, dompurify@npm:^3.4.11":
3275
- version: 3.4.11
3276
- resolution: "dompurify@npm:3.4.11"
3275
+ "dompurify@npm:^3.3.3, dompurify@npm:^3.4.11":
3276
+ version: 3.4.14
3277
+ resolution: "dompurify@npm:3.4.14"
3277
3278
  dependencies:
3278
3279
  "@types/trusted-types": "npm:^2.0.7"
3279
3280
  dependenciesMeta:
3280
3281
  "@types/trusted-types":
3281
3282
  optional: true
3282
- checksum: 10c0/31439481c7e8fc3805d40c376936fd66936620fb1b1a31a2ec097f6165412c37f2d868e082c9ceba62bb37661c1ea132a5db4d5213434317e30df68d4aca9cc9
3283
+ checksum: 10c0/feca07ece3805d1d4e33e847c11196888dcdc97b2afe0bb8a2fd11de4e62bfdc434c2403ee3fb3c7771e903325041d062febec6c5518796391fdc0419a90a873
3283
3284
  languageName: node
3284
3285
  linkType: hard
3285
3286
 
@@ -3613,6 +3614,15 @@ __metadata:
3613
3614
  languageName: node
3614
3615
  linkType: hard
3615
3616
 
3617
+ "fastdom@npm:1.0.12":
3618
+ version: 1.0.12
3619
+ resolution: "fastdom@npm:1.0.12"
3620
+ dependencies:
3621
+ strictdom: "npm:^1.0.1"
3622
+ checksum: 10c0/d1727eb5d803aa0e1dc9a98b2eef1f138bad3776fa7471145216dba34f435f86e8e514658d0b1717fa83a987f44a8d26f2353a515f2bf782f32d3c9ead6d1994
3623
+ languageName: node
3624
+ linkType: hard
3625
+
3616
3626
  "fault@npm:^2.0.0":
3617
3627
  version: 2.0.1
3618
3628
  resolution: "fault@npm:2.0.1"
@@ -3634,6 +3644,15 @@ __metadata:
3634
3644
  languageName: node
3635
3645
  linkType: hard
3636
3646
 
3647
+ "feed@npm:^6.0.0":
3648
+ version: 6.0.0
3649
+ resolution: "feed@npm:6.0.0"
3650
+ dependencies:
3651
+ xml-js: "npm:^1.6.11"
3652
+ checksum: 10c0/0cfabb62037cc97bb935b778a5d98fae808e27d5842173774c0cd07a276e7e881b5f0dccb0575214938218af9a0cad3039a20b48db966799b72d9fde49048cb5
3653
+ languageName: node
3654
+ linkType: hard
3655
+
3637
3656
  "fill-range@npm:^7.1.1":
3638
3657
  version: 7.1.1
3639
3658
  resolution: "fill-range@npm:7.1.1"
@@ -3903,9 +3922,9 @@ __metadata:
3903
3922
  linkType: hard
3904
3923
 
3905
3924
  "ip-address@npm:^10.0.1":
3906
- version: 10.2.0
3907
- resolution: "ip-address@npm:10.2.0"
3908
- checksum: 10c0/5a00aada6e922c9c69dfc800ed5d0fa3348675ebdeed0e1575f503f27ca385b5f534363c9af7ad1daf64c1f1409388cdd3cc2e9b9b0fe1c924a431378d55075a
3925
+ version: 10.5.0
3926
+ resolution: "ip-address@npm:10.5.0"
3927
+ checksum: 10c0/c6616bc99c90b552dad2beb850ca697c1ea3e2b89662d652a4439cd72a549b0c9af100a54be0d25be86599e2b089db87ef5303157d142e5b4c21bd2a1301dfa7
3909
3928
  languageName: node
3910
3929
  linkType: hard
3911
3930
 
@@ -4009,14 +4028,14 @@ __metadata:
4009
4028
  linkType: hard
4010
4029
 
4011
4030
  "js-yaml@npm:^3.13.1":
4012
- version: 3.15.0
4013
- resolution: "js-yaml@npm:3.15.0"
4031
+ version: 3.15.1
4032
+ resolution: "js-yaml@npm:3.15.1"
4014
4033
  dependencies:
4015
4034
  argparse: "npm:^1.0.7"
4016
4035
  esprima: "npm:^4.0.0"
4017
4036
  bin:
4018
4037
  js-yaml: bin/js-yaml.js
4019
- checksum: 10c0/ca966bd354ac5b1b7a4694ebdba46526796aa3a6a99529fa540af2abf85918bd155a50ccc0166b413130a00622999973754458ec01e7095bc902177bfdbd5b64
4038
+ checksum: 10c0/6c693b8c59ffe12021df3b36994b090df19d920826dd810baab81652b40861e1974509dd11fe92225ab4c00cc14de053300c94db015c2c0e211edea39b118737
4020
4039
  languageName: node
4021
4040
  linkType: hard
4022
4041
 
@@ -4033,14 +4052,14 @@ __metadata:
4033
4052
  languageName: node
4034
4053
  linkType: hard
4035
4054
 
4036
- "katex@npm:^0.16.25":
4037
- version: 0.16.46
4038
- resolution: "katex@npm:0.16.46"
4055
+ "katex@npm:^0.16.47":
4056
+ version: 0.16.47
4057
+ resolution: "katex@npm:0.16.47"
4039
4058
  dependencies:
4040
4059
  commander: "npm:^8.3.0"
4041
4060
  bin:
4042
4061
  katex: cli.js
4043
- checksum: 10c0/c0a1006e0decae978832cfe19c4e316eceebb047dc0f918be041c956b67fd35791a6e0a868ef5f51eaf600d2c62e53114dbc94a34a89e11f95fcf24b0abd2d5f
4062
+ checksum: 10c0/b10f4d0651c60771a48444879e4227255e26e2b2ec061b1ee4b08934863ad2324ba8dbb772455f7768aeb14dfcc13bcd309174a0ddd5ef954a607f644a197710
4044
4063
  languageName: node
4045
4064
  linkType: hard
4046
4065
 
@@ -4200,11 +4219,11 @@ __metadata:
4200
4219
  linkType: hard
4201
4220
 
4202
4221
  "linkify-it@npm:^5.0.1":
4203
- version: 5.0.1
4204
- resolution: "linkify-it@npm:5.0.1"
4222
+ version: 5.0.2
4223
+ resolution: "linkify-it@npm:5.0.2"
4205
4224
  dependencies:
4206
4225
  uc.micro: "npm:^2.0.0"
4207
- checksum: 10c0/d06d04f1ed03be131740fc900a5e74ea1f49886b052213599e306d469d5ffe2303db76dd8f771de9f28e2b0b38852de22ec46ae597d245f8b66439b0ceb19b10
4226
+ checksum: 10c0/dd70b1735a13d41a2cff0a058ac3771166038f23f6aff004dd53873cf985c64b107902fe0b544a5b3d1ff6e63249cf9c648fb3ae9f285481db48f56887adb0d6
4208
4227
  languageName: node
4209
4228
  linkType: hard
4210
4229
 
@@ -4488,31 +4507,32 @@ __metadata:
4488
4507
  linkType: hard
4489
4508
 
4490
4509
  "mermaid@npm:^11.15.0":
4491
- version: 11.15.0
4492
- resolution: "mermaid@npm:11.15.0"
4510
+ version: 11.17.0
4511
+ resolution: "mermaid@npm:11.17.0"
4493
4512
  dependencies:
4494
- "@braintree/sanitize-url": "npm:^7.1.1"
4513
+ "@braintree/sanitize-url": "npm:^7.1.2"
4495
4514
  "@iconify/utils": "npm:^3.0.2"
4496
- "@mermaid-js/parser": "npm:^1.1.1"
4515
+ "@mermaid-js/parser": "npm:^1.2.1"
4497
4516
  "@types/d3": "npm:^7.4.3"
4498
4517
  "@upsetjs/venn.js": "npm:^2.0.0"
4499
- cytoscape: "npm:^3.33.1"
4518
+ cytoscape: "npm:^3.34.0"
4500
4519
  cytoscape-cose-bilkent: "npm:^4.1.0"
4501
4520
  cytoscape-fcose: "npm:^2.2.0"
4502
4521
  d3: "npm:^7.9.0"
4503
4522
  d3-sankey: "npm:^0.12.3"
4504
4523
  dagre-d3-es: "npm:7.0.14"
4505
- dayjs: "npm:^1.11.19"
4506
- dompurify: "npm:^3.3.1"
4524
+ dayjs: "npm:^1.11.21"
4525
+ dompurify: "npm:^3.3.3"
4507
4526
  es-toolkit: "npm:^1.45.1"
4508
- katex: "npm:^0.16.25"
4527
+ fastdom: "npm:1.0.12"
4528
+ katex: "npm:^0.16.47"
4509
4529
  khroma: "npm:^2.1.0"
4510
4530
  marked: "npm:^16.3.0"
4511
4531
  roughjs: "npm:^4.6.6"
4512
4532
  stylis: "npm:^4.3.6"
4513
4533
  ts-dedent: "npm:^2.2.0"
4514
4534
  uuid: "npm:^11.1.0 || ^12 || ^13 || ^14.0.0"
4515
- checksum: 10c0/9085b47c30b66a1e94e07c93951d9e53e5c89ec8c9fff8814233bddeecf6b8eaf9036d3168e4d1360c3f5d07cd051c666da96860eb0f22f064bd749499a0c83f
4535
+ checksum: 10c0/43c9a51bb93482cf882119595828900567a737401ad52b91c6fd415f839302b56080102376536cbb285d7aad3eb31b101e92e18d604647915195c1e10b879ec5
4516
4536
  languageName: node
4517
4537
  linkType: hard
4518
4538
 
@@ -4924,21 +4944,21 @@ __metadata:
4924
4944
  languageName: node
4925
4945
  linkType: hard
4926
4946
 
4927
- "nanoid@npm:^3.3.12":
4928
- version: 3.3.15
4929
- resolution: "nanoid@npm:3.3.15"
4947
+ "nanoid@npm:^3.3.16":
4948
+ version: 3.3.18
4949
+ resolution: "nanoid@npm:3.3.18"
4930
4950
  bin:
4931
4951
  nanoid: bin/nanoid.cjs
4932
- checksum: 10c0/e0b12e3a1d361f74150fa4b25631d0ae29f7162dab01a12f0f1be1f53b7a2a219f9b729504e474d4821207d0fe349bd3c97569ab5cf7ec2fff6aa94711956c93
4952
+ checksum: 10c0/b994b4e396730f8be2520923284e2040d61eaee55cc6d4935ef6d38d34bafdc46133eda4d3faea5073bda545aa6079d82b886caeac5c731cf9ac18bcc1301425
4933
4953
  languageName: node
4934
4954
  linkType: hard
4935
4955
 
4936
4956
  "nanoid@npm:^5.0.9":
4937
- version: 5.1.6
4938
- resolution: "nanoid@npm:5.1.6"
4957
+ version: 5.1.16
4958
+ resolution: "nanoid@npm:5.1.16"
4939
4959
  bin:
4940
4960
  nanoid: bin/nanoid.js
4941
- checksum: 10c0/27b5b055ad8332cf4f0f9f6e2a494aa7e5ded89df4cab8c8490d4eabefe72c4423971d2745d22002868b1d50576a5e42b7b05214733b19f576382323282dd26e
4961
+ checksum: 10c0/04b4f96237f5639716da0e98f453361b313bebaf458bb67dea2d384724fc8b3340a28f032a4373052150bcf3b801d122e291d81ae4fc522969f55c134f4401a3
4942
4962
  languageName: node
4943
4963
  linkType: hard
4944
4964
 
@@ -5601,13 +5621,13 @@ __metadata:
5601
5621
  linkType: hard
5602
5622
 
5603
5623
  "postcss@npm:^8.4.43, postcss@npm:^8.5.10, postcss@npm:^8.5.14, postcss@npm:^8.5.6":
5604
- version: 8.5.16
5605
- resolution: "postcss@npm:8.5.16"
5624
+ version: 8.5.25
5625
+ resolution: "postcss@npm:8.5.25"
5606
5626
  dependencies:
5607
- nanoid: "npm:^3.3.12"
5627
+ nanoid: "npm:^3.3.16"
5608
5628
  picocolors: "npm:^1.1.1"
5609
5629
  source-map-js: "npm:^1.2.1"
5610
- checksum: 10c0/625de7a02f662f3a340964d14b487bd5097adf16f5f171e257d19005ba37aea8768ee446557500e88e91ca46b4d14d6cb4a0bf033c6ec0c8c0b660d85719f1ef
5630
+ checksum: 10c0/0a12c1e74b456c57122e81f684e02fd98ff4d57526f794d10c996df1147158808f5ae373ac82b988c8de6cbbaa82dbd7b13803b14f5dd3cf7cc6a42ccad5c9f2
5611
5631
  languageName: node
5612
5632
  linkType: hard
5613
5633
 
@@ -5783,14 +5803,14 @@ __metadata:
5783
5803
 
5784
5804
  "resolve@patch:resolve@npm%3A^1.1.7#optional!builtin<compat/resolve>":
5785
5805
  version: 1.22.10
5786
- resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin<compat/resolve>::version=1.22.10&hash=c3c19d"
5806
+ resolution: "resolve@patch:resolve@npm%3A1.22.10#optional!builtin<compat/resolve>::version=1.22.10&hash=9bd1a5"
5787
5807
  dependencies:
5788
5808
  is-core-module: "npm:^2.16.0"
5789
5809
  path-parse: "npm:^1.0.7"
5790
5810
  supports-preserve-symlinks-flag: "npm:^1.0.0"
5791
5811
  bin:
5792
5812
  resolve: bin/resolve
5793
- checksum: 10c0/52a4e505bbfc7925ac8f4cd91fd8c4e096b6a89728b9f46861d3b405ac9a1ccf4dcbf8befb4e89a2e11370dacd0160918163885cbc669369590f2f31f4c58939
5813
+ checksum: 10c0/da5c4a85971e6eeb821805d117092321c6c257a6e1e45382c0b7ef41368a7e98690e01a08bac88b111443410a49e2fb17d1802ac5c51c8fc5532d77bef9f4be9
5794
5814
  languageName: node
5795
5815
  linkType: hard
5796
5816
 
@@ -5947,6 +5967,13 @@ __metadata:
5947
5967
  languageName: node
5948
5968
  linkType: hard
5949
5969
 
5970
+ "sax@npm:^1.2.4":
5971
+ version: 1.6.1
5972
+ resolution: "sax@npm:1.6.1"
5973
+ checksum: 10c0/c91a71043d60da50fdf1e2cee936fc7ad4c9376afb8d1022aef5655f279433640859ec06b3b49abfcbe578fc7da2828cc1661e45aaedf835f5393496193437fa
5974
+ languageName: node
5975
+ linkType: hard
5976
+
5950
5977
  "sax@npm:^1.5.0":
5951
5978
  version: 1.6.0
5952
5979
  resolution: "sax@npm:1.6.0"
@@ -6135,6 +6162,13 @@ __metadata:
6135
6162
  languageName: node
6136
6163
  linkType: hard
6137
6164
 
6165
+ "strictdom@npm:^1.0.1":
6166
+ version: 1.0.1
6167
+ resolution: "strictdom@npm:1.0.1"
6168
+ checksum: 10c0/3006ffccaa89ecc0ce2679d2726b7ea4901faa91152bf0211d11685de1c710f09a178c9dbc5ab1496e6101b686192595ff2aa78f128a814fd838793e4f29edc5
6169
+ languageName: node
6170
+ linkType: hard
6171
+
6138
6172
  "string-width@npm:^3.0.0, string-width@npm:^3.1.0":
6139
6173
  version: 3.1.0
6140
6174
  resolution: "string-width@npm:3.1.0"
@@ -6246,8 +6280,8 @@ __metadata:
6246
6280
  linkType: hard
6247
6281
 
6248
6282
  "svgo@npm:^4.0.0":
6249
- version: 4.0.1
6250
- resolution: "svgo@npm:4.0.1"
6283
+ version: 4.0.2
6284
+ resolution: "svgo@npm:4.0.2"
6251
6285
  dependencies:
6252
6286
  commander: "npm:^11.1.0"
6253
6287
  css-select: "npm:^5.1.0"
@@ -6258,7 +6292,7 @@ __metadata:
6258
6292
  sax: "npm:^1.5.0"
6259
6293
  bin:
6260
6294
  svgo: ./bin/svgo.js
6261
- checksum: 10c0/f61f9957b42e0c97593b49a01f3b93cb239b2e818efccb056fcc866d622704d9021c4ef8bd0287264c3e4f33da60e4af14d841b4a624b87ff8888e3b896d13d5
6295
+ checksum: 10c0/d58c9446d2701dd57ef62a29b4299b157cfc32e2282f82fc68dd7cdca2e1efdf0d8bb0fb30ba0499f322d20b6304be277ffbc60a6b6a75489fa30c5300694b9a
6262
6296
  languageName: node
6263
6297
  linkType: hard
6264
6298
 
@@ -6284,15 +6318,15 @@ __metadata:
6284
6318
  linkType: hard
6285
6319
 
6286
6320
  "tar@npm:^7.5.4":
6287
- version: 7.5.19
6288
- resolution: "tar@npm:7.5.19"
6321
+ version: 7.5.22
6322
+ resolution: "tar@npm:7.5.22"
6289
6323
  dependencies:
6290
6324
  "@isaacs/fs-minipass": "npm:^4.0.0"
6291
6325
  chownr: "npm:^3.0.0"
6292
6326
  minipass: "npm:^7.1.2"
6293
6327
  minizlib: "npm:^3.1.0"
6294
6328
  yallist: "npm:^5.0.0"
6295
- checksum: 10c0/7022e8cb04a8ceccc0689f2c731743fa2aab2e3c3f559f7dbc37b65ef7d5913049b427284eded2ec0765c5db5ff72dd7939fe2ae15785ff422cef2116c95d798
6329
+ checksum: 10c0/1311f6be85a8157ac4c9147bae43e13923d2a1aae15e4aa1bd5239e4e03d2cf53cfe103dde7f35832fbb4c938b042856bc8e9a0afd29abd05e2d1608788c4fea
6296
6330
  languageName: node
6297
6331
  linkType: hard
6298
6332
 
@@ -6703,6 +6737,17 @@ __metadata:
6703
6737
  languageName: node
6704
6738
  linkType: hard
6705
6739
 
6740
+ "xml-js@npm:^1.6.11":
6741
+ version: 1.6.11
6742
+ resolution: "xml-js@npm:1.6.11"
6743
+ dependencies:
6744
+ sax: "npm:^1.2.4"
6745
+ bin:
6746
+ xml-js: ./bin/cli.js
6747
+ checksum: 10c0/c83631057f10bf90ea785cee434a8a1a0030c7314fe737ad9bf568a281083b565b28b14c9e9ba82f11fc9dc582a3a907904956af60beb725be1c9ad4b030bc5a
6748
+ languageName: node
6749
+ linkType: hard
6750
+
6706
6751
  "y18n@npm:^4.0.0":
6707
6752
  version: 4.0.3
6708
6753
  resolution: "y18n@npm:4.0.3"