APB-DOCS-PLACE
Field field_apb_target_placement points at vocabulary apb_tax_target_placement. The term — not the paragraph — carries field_apb_tx_container_locator and field_apb_tx_insert_method. Components must not implement placement themselves. apb-placement.js is the only implementation.
How a move happens
Preprocess emits JSON on data-apb-target-placement, for example {"name":"presentation_region","container_locator":"#presentation-region","insert_method":"appendTo"}. If container_locator is non-empty and the name is not current_position, preprocess also sets data-apb-placement-pending. CSS hides pending paragraphs with display:none !important until the move succeeds.
Placement runs once on setTimeout(0). There is no retry. Missing locators leave the paragraph hidden. Server HTML still contains pending attributes; that is expected until JS runs.
Locator matrix (apbuilder_theme)
| Label | machine_name | Locator | Method | Works? |
|---|---|---|---|---|
| Body | current_position | (empty) | stay | Yes — default |
| Top region | presentation_region | #presentation-region | appendTo | Yes. Hides #page-title. Two parents keep field order. |
| Main Content Top | main_content_top | #apb-main-content | prependTo | Yes. Two parents reverse field order. |
| Main Content Bottom | main_content_bottom | #apb-main-content | appendTo | Yes. |
| Main Content - No container | main_content_no_container | #main-content-no-container | appendTo | Yes. Outside #apb-main-content. |
| Sidebar Top / Bottom | sidebar_top / sidebar_bottom | #sidebar-top / #sidebar-bottom | appendTo | No on this theme unless sidebar_first has a block. Twig prints those IDs only inside that region. Parents hide forever. |
| Internal Placement 1–3 | internal_placement_1…3 | #internal-placement-N | prependTo | Conditional. Emit the id with a simple-content region item titled exactly internal-placement-N, Active Region on, earlier in the field than the consumer. A late region stays pending (one-pass). Duplicate HTML ids are invalid. |
Overlay Content has no placement field and always stays in the host field.
WOW fade-in does not follow relocated parents
The orchestrator adds wow animate__fadeIn to field items and no-container paragraphs, then inits WOW, then placement moves the inner paragraph. Top region, main-content top/bottom, sidebars, and internal drop zones do not get the animation on the moved node. Empty field__item wrappers can remain in the field.
The Advanced Pages placement gauntlet on the demo exercises every locator.