alonso.torres f2b252f842 ♻️ Share code that the component events repeated
- component-changed marked the component modified and sent
  launch-component-sync, its only caller, which opened an undo
  transaction around the syncs of the copies. component-changed sends
  those events itself, in the same order.
- The library update notification found the libraries that would
  change with a lazy filter, so the check ran up to the first one when
  the notification was built and the rest when the user clicked
  "Update". It is a filterv, so the whole check runs when the
  notification is built, as the comment above it says.
- The check that a new name is valid (trimmed, not blank, no trailing
  separator) was written in the shape rename and the component rename;
  cpn/clean-valid-name gives the cleaned name, or nil.
- Paste and the move of shapes into a parent each tested whether they
  put a component head inside a variant; ctn/head-into-variant? does.
- Going to the local main of a component and combining components into
  variants each opened another page and ran their work once it was
  initialized, with the same stream code; dwl/go-to-page-then does it.
- Making components from the selection mapped the check over the
  shapes and then tested every result; every? takes the check.
- generate-components-menu-entries reads the current file and page
  with mf/use-ctx, so it is a hook, and called conditionally it would
  break the order of its caller's hooks. It is
  use-components-menu-entries, and its docstring says why.

The analytics events that paste and duplicate send for each new shape
are built the same way but look up the parent's layout in different
objects, so they stay apart.

No behavior change: the suites are unchanged.

AI-assisted-by: claude-opus-5-5
2026-10-28 15:53:06 +01:00
..
2026-09-25 11:11:44 +02:00
2026-09-25 11:11:44 +02:00