@adia-ai/a2ui-corpus 0.6.37 → 0.6.39

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 (246) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/catalog-a2ui_0_9.json +641 -5
  3. package/catalog-a2ui_0_9_rules.txt +24 -0
  4. package/chunk-embeddings.json +1 -1
  5. package/chunks/_index.json +30 -4
  6. package/chunks/accordion-settings.json +1 -1
  7. package/chunks/agent-activity-feed.json +1 -1
  8. package/chunks/agent-canvas-shell.json +1 -1
  9. package/chunks/agent-command-palette-search.json +1 -1
  10. package/chunks/agent-reasoning-collapsed.json +1 -1
  11. package/chunks/agent-tool-call-result.json +1 -1
  12. package/chunks/agent-trace-timeline.json +1 -1
  13. package/chunks/ai-streaming-response.json +1 -1
  14. package/chunks/alert-banner.json +1 -1
  15. package/chunks/auth-account-deleted-actions.json +1 -1
  16. package/chunks/auth-account-deleted.json +1 -1
  17. package/chunks/auth-card-content.json +1 -1
  18. package/chunks/auth-card-header.json +1 -1
  19. package/chunks/auth-email-entry.json +1 -1
  20. package/chunks/auth-email-verify-confirm.json +1 -1
  21. package/chunks/auth-email-verify.json +1 -1
  22. package/chunks/auth-forbidden-actions.json +1 -1
  23. package/chunks/auth-forbidden.json +1 -1
  24. package/chunks/auth-invite-actions.json +1 -1
  25. package/chunks/auth-invite-team-card.json +1 -1
  26. package/chunks/auth-link-expired-form.json +1 -1
  27. package/chunks/auth-link-expired.json +1 -1
  28. package/chunks/auth-locked-account.json +1 -1
  29. package/chunks/auth-locked-recovery-options.json +1 -1
  30. package/chunks/auth-mfa-enrollment-submit.json +1 -1
  31. package/chunks/auth-mfa-enrollment.json +1 -1
  32. package/chunks/auth-mfa-fallback-actions.json +1 -1
  33. package/chunks/auth-mfa-recovery.json +1 -1
  34. package/chunks/auth-new-password-form.json +1 -1
  35. package/chunks/auth-new-password.json +1 -1
  36. package/chunks/auth-oauth-fallback-actions.json +1 -1
  37. package/chunks/auth-oauth-interstitial.json +1 -1
  38. package/chunks/auth-password-challenge.json +1 -1
  39. package/chunks/auth-password-reset-form.json +1 -1
  40. package/chunks/auth-password-reset.json +1 -1
  41. package/chunks/auth-profile-form.json +1 -1
  42. package/chunks/auth-profile-setup.json +1 -1
  43. package/chunks/auth-reset-sent.json +1 -1
  44. package/chunks/auth-session-expired-actions.json +1 -1
  45. package/chunks/auth-session-expired.json +1 -1
  46. package/chunks/auth-signin-card-email.json +1 -1
  47. package/chunks/auth-signin-card-magic-link.json +1 -1
  48. package/chunks/auth-signin-card-mfa.json +1 -1
  49. package/chunks/auth-signin-card-otp.json +1 -1
  50. package/chunks/auth-signin-card-password.json +1 -1
  51. package/chunks/auth-signin-card-recovery.json +1 -1
  52. package/chunks/auth-signout-actions.json +1 -1
  53. package/chunks/auth-signout.json +1 -1
  54. package/chunks/auth-signup-email-entry.json +1 -1
  55. package/chunks/auth-signup-entry.json +1 -1
  56. package/chunks/auth-signup-social-auths.json +1 -1
  57. package/chunks/auth-signup-verify.json +1 -1
  58. package/chunks/auth-social-auths.json +1 -1
  59. package/chunks/auth-sso-providers.json +1 -1
  60. package/chunks/auth-sso-required.json +1 -1
  61. package/chunks/auth-team-invite.json +1 -1
  62. package/chunks/avatar-group-overflow.json +1 -1
  63. package/chunks/breadcrumb-nav.json +1 -1
  64. package/chunks/calendar-month-view.json +1 -1
  65. package/chunks/card-header-with-description.json +1 -1
  66. package/chunks/chart-with-filter-pills.json +1 -1
  67. package/chunks/chat-page-shell.json +1 -1
  68. package/chunks/chat-streaming-surface.json +1 -1
  69. package/chunks/color-picker-swatches.json +1 -1
  70. package/chunks/command-palette.json +1 -1
  71. package/chunks/commerce-pricing-tiers.json +1 -1
  72. package/chunks/comparison-table.json +1 -1
  73. package/chunks/conversion-funnel-6step.json +1 -1
  74. package/chunks/dashboard-acquisition-panel.json +1 -1
  75. package/chunks/dashboard-admin-page.json +1 -1
  76. package/chunks/dashboard-audience-kpis.json +1 -1
  77. package/chunks/dashboard-audience-panel.json +1 -1
  78. package/chunks/dashboard-behavior-panel.json +1 -1
  79. package/chunks/dashboard-chart-recent.json +1 -1
  80. package/chunks/dashboard-cohort-retention.json +1 -1
  81. package/chunks/dashboard-conversion-panel.json +1 -1
  82. package/chunks/dashboard-country-list.json +1 -1
  83. package/chunks/dashboard-filter-bar.json +1 -1
  84. package/chunks/dashboard-funnel.json +1 -1
  85. package/chunks/dashboard-kpi-grid.json +1 -1
  86. package/chunks/dashboard-notifications-feed.json +1 -1
  87. package/chunks/dashboard-notifications-panel.json +1 -1
  88. package/chunks/dashboard-overview-panel.json +1 -1
  89. package/chunks/dashboard-page-header.json +1 -1
  90. package/chunks/dashboard-pages-table.json +1 -1
  91. package/chunks/dashboard-quick-actions.json +1 -1
  92. package/chunks/dashboard-reports-panel.json +1 -1
  93. package/chunks/dashboard-reports-table.json +1 -1
  94. package/chunks/dashboard-spark-cards.json +1 -1
  95. package/chunks/dashboard-storage-card.json +1 -1
  96. package/chunks/dashboard-tabs.json +1 -1
  97. package/chunks/dashboard-team-actions-storage.json +1 -1
  98. package/chunks/dashboard-team-list.json +1 -1
  99. package/chunks/dashboard-traffic-channels.json +1 -1
  100. package/chunks/dashboard-transactions-table.json +1 -1
  101. package/chunks/date-time-picker-form.json +1 -1
  102. package/chunks/destructive-confirm-modal.json +1 -1
  103. package/chunks/divider-text-label.json +1 -1
  104. package/chunks/doc-editor-shell.json +1 -1
  105. package/chunks/drawer-2fa-key.json +1 -1
  106. package/chunks/drawer-2fa-sms.json +1 -1
  107. package/chunks/drawer-2fa-totp.json +1 -1
  108. package/chunks/drawer-cancel-sub.json +202 -33
  109. package/chunks/drawer-change-plan.json +1 -1
  110. package/chunks/drawer-custom-roles.json +1 -1
  111. package/chunks/drawer-data-start.json +1 -1
  112. package/chunks/drawer-delete-account.json +1 -1
  113. package/chunks/drawer-delete-workspace.json +1 -1
  114. package/chunks/drawer-discord.json +1 -1
  115. package/chunks/drawer-figma.json +1 -1
  116. package/chunks/drawer-first-dashboard.json +1 -1
  117. package/chunks/drawer-gcal.json +1 -1
  118. package/chunks/drawer-github.json +1 -1
  119. package/chunks/drawer-invite.json +1 -1
  120. package/chunks/drawer-payment-method.json +1 -1
  121. package/chunks/drawer-report.json +1 -1
  122. package/chunks/drawer-revoke-session.json +1 -1
  123. package/chunks/drawer-role.json +1 -1
  124. package/chunks/drawer-slack.json +1 -1
  125. package/chunks/drawer-smtp.json +1 -1
  126. package/chunks/drawer-source.json +1 -1
  127. package/chunks/drawer-transaction.json +1 -1
  128. package/chunks/editor-code-pane.json +1 -1
  129. package/chunks/editor-page-shell.json +1 -1
  130. package/chunks/editor-preview-pane.json +1 -1
  131. package/chunks/empty-state-danger.json +1 -1
  132. package/chunks/empty-state-minimal.json +1 -1
  133. package/chunks/empty-state-warning.json +1 -1
  134. package/chunks/empty-state.json +1 -1
  135. package/chunks/error-404-actions.json +1 -1
  136. package/chunks/error-404.json +1 -1
  137. package/chunks/error-500-actions.json +1 -1
  138. package/chunks/error-500.json +1 -1
  139. package/chunks/error-maintenance-actions.json +1 -1
  140. package/chunks/error-maintenance.json +1 -1
  141. package/chunks/error-page-shell.json +1 -1
  142. package/chunks/faq-accordion.json +1 -1
  143. package/chunks/file-upload-dnd.json +1 -1
  144. package/chunks/footer-multi-column.json +1 -1
  145. package/chunks/footer-primary-only.json +1 -1
  146. package/chunks/form-page-shell.json +1 -1
  147. package/chunks/gallery-page-shell.json +1 -1
  148. package/chunks/hero-section-split.json +1 -1
  149. package/chunks/icon-text-row.json +1 -1
  150. package/chunks/image-carousel.json +1 -1
  151. package/chunks/image-tile.json +1 -1
  152. package/chunks/image-upload-preview.json +1 -1
  153. package/chunks/import-mapping-flow.json +934 -0
  154. package/chunks/inventory-list-stock.json +1 -1
  155. package/chunks/kanban-board-3col.json +1 -1
  156. package/chunks/kanban-page-shell.json +1 -1
  157. package/chunks/kbd-shortcuts.json +1 -1
  158. package/chunks/labeled-textarea.json +1 -1
  159. package/chunks/leaderboard-table.json +1 -1
  160. package/chunks/linked-record-row.json +1 -1
  161. package/chunks/marketing-hero-cta.json +1 -1
  162. package/chunks/marketing-page-shell.json +1 -1
  163. package/chunks/masonry-gallery.json +1 -1
  164. package/chunks/member-edit-drawer.json +1 -1
  165. package/chunks/metadata-description-list.json +1 -1
  166. package/chunks/multi-step-wizard.json +1 -1
  167. package/chunks/notification-toast-row.json +1 -1
  168. package/chunks/onb-completion.json +1 -1
  169. package/chunks/onb-extension-install.json +1 -1
  170. package/chunks/onb-hero-welcome.json +1 -1
  171. package/chunks/onb-import-picker.json +1 -1
  172. package/chunks/onb-mobile-handoff.json +1 -1
  173. package/chunks/onb-notification-prefs.json +1 -1
  174. package/chunks/onb-persona-picker.json +1 -1
  175. package/chunks/onb-provider-tiles.json +1 -1
  176. package/chunks/onb-settings-review.json +1 -1
  177. package/chunks/onb-step-footer.json +1 -1
  178. package/chunks/onb-step-header.json +1 -1
  179. package/chunks/onb-step-progress.json +1 -1
  180. package/chunks/onb-step-shell.json +1 -1
  181. package/chunks/onb-story-pane.json +1 -1
  182. package/chunks/onb-tutorial-steps.json +1 -1
  183. package/chunks/pagination-controls.json +1 -1
  184. package/chunks/playground-a2ui.json +1 -1
  185. package/chunks/playground-app-shell.json +1 -1
  186. package/chunks/playground-chat.json +1 -1
  187. package/chunks/playground-construct-canvas.json +1 -1
  188. package/chunks/playground-css-channel.json +1 -1
  189. package/chunks/playground-gen-ui.json +1 -1
  190. package/chunks/playground-render-preview.json +1 -1
  191. package/chunks/playground-streams-bridge.json +1 -1
  192. package/chunks/playground-table-toolbar.json +1 -1
  193. package/chunks/popover-with-content.json +1 -1
  194. package/chunks/progress-tracker-milestones.json +1 -1
  195. package/chunks/real-time-metrics-dashboard.json +1 -1
  196. package/chunks/reg-address-form.json +1 -1
  197. package/chunks/reg-billing-card.json +1 -1
  198. package/chunks/reg-brand-scrape.json +1 -1
  199. package/chunks/reg-departments-toggle.json +1 -1
  200. package/chunks/reg-extended-profile.json +1 -1
  201. package/chunks/reg-final-done.json +1 -1
  202. package/chunks/reg-helpdesk-grid.json +1 -1
  203. package/chunks/reg-import-picker.json +1 -1
  204. package/chunks/reg-integrations-grid.json +1 -1
  205. package/chunks/reg-invite-form.json +1 -1
  206. package/chunks/reg-legal-entity.json +1 -1
  207. package/chunks/reg-org-chart-review.json +1 -1
  208. package/chunks/reg-profile-identity.json +1 -1
  209. package/chunks/reg-step-footer.json +1 -1
  210. package/chunks/reg-step-header.json +1 -1
  211. package/chunks/reg-step-progress.json +1 -1
  212. package/chunks/reg-step-shell.json +1 -1
  213. package/chunks/reg-story-pane.json +1 -1
  214. package/chunks/reg-success-summary.json +1 -1
  215. package/chunks/reg-team-size.json +1 -1
  216. package/chunks/reg-usecase-picker.json +1 -1
  217. package/chunks/reg-workspace-name.json +1 -1
  218. package/chunks/responsive-grid-pattern.json +1 -1
  219. package/chunks/responsive-kpi-grid.json +1 -1
  220. package/chunks/responsive-row-pattern.json +1 -1
  221. package/chunks/responsive-wrap-at-pattern.json +1 -1
  222. package/chunks/search-with-filters.json +1 -1
  223. package/chunks/section-with-stack.json +1 -1
  224. package/chunks/select-multiple-preselected.json +1 -1
  225. package/chunks/settings-admin-page.json +1 -1
  226. package/chunks/settings-appearance.json +1 -1
  227. package/chunks/settings-billing-plan.json +1 -1
  228. package/chunks/settings-general-form.json +1 -1
  229. package/chunks/settings-integrations.json +1 -1
  230. package/chunks/settings-members-invite.json +1 -1
  231. package/chunks/settings-notifications.json +1 -1
  232. package/chunks/settings-page-shell.json +1 -1
  233. package/chunks/settings-profile-security.json +1 -1
  234. package/chunks/sidebar-collapsible-nav.json +1 -1
  235. package/chunks/slider-range-controls.json +1 -1
  236. package/chunks/tabs-with-panels.json +1 -1
  237. package/chunks/testimonial-grid.json +1 -1
  238. package/chunks/text-card.json +1 -1
  239. package/chunks/timeline-events.json +1 -1
  240. package/chunks/toolbar-icons.json +1 -1
  241. package/chunks/toolbar-tooltips.json +1 -1
  242. package/chunks/user-identity-row.json +1 -1
  243. package/chunks/user-profile-card.json +1 -1
  244. package/chunks/users-table-badge.json +1 -1
  245. package/chunks/video-player-controls.json +1 -1
  246. package/package.json +1 -1
@@ -0,0 +1,934 @@
1
+ {
2
+ "name": "import-mapping-flow",
3
+ "kind": "block",
4
+ "primary": "col-ui",
5
+ "page": "/catalog/ui-patterns/app/import-mapping/import-mapping.contents.html",
6
+ "slots": [],
7
+ "nested": [],
8
+ "attrs": {
9
+ "gap": "5"
10
+ },
11
+ "html": "<col-ui\n gap=\"5\" style=\"max-width: 880px; margin-inline: auto; padding: var(--a-space-6);\">\n\n <!-- ═══════════════ Header + step progress ═══════════════ -->\n <col-ui gap=\"3\">\n <h1 style=\"margin: 0;\">Import customer data</h1>\n <text-ui color=\"subtle\">Upload a CSV or JSON file, map your columns to our fields, then preview before committing the import.</text-ui>\n <!-- step-progress-ui ships with `flex: 0 1 18rem` (designed for the\n registration shell's row-flex layout). In a col-flex parent that\n flex-basis becomes a 288px vertical bloat — override here. -->\n <step-progress-ui value=\"2\" total=\"3\" caption=\"Step 2 of 3 · Map fields\" style=\"flex: none;\"></step-progress-ui>\n </col-ui>\n\n <!-- ═══════════════ Step 1 — Upload (collapsed) ═══════════════ -->\n <card-ui>\n <header>\n <span slot=\"icon\"><avatar-ui icon=\"check\" variant=\"success\" size=\"sm\"></avatar-ui></span>\n <span slot=\"heading\">\n <text-ui strong>1. Upload file</text-ui>\n <badge-ui text=\"Done\" variant=\"success\"></badge-ui>\n </span>\n <span slot=\"description\">\n <text-ui color=\"subtle\" size=\"sm\">customers-2026-q1.csv · 1,243 rows · 8 columns</text-ui>\n </span>\n <span slot=\"action\">\n <button-ui text=\"Replace\" variant=\"ghost\" size=\"sm\" icon-leading=\"arrow-counter-clockwise\"></button-ui>\n </span>\n </header>\n </card-ui>\n\n <!-- ═══════════════ Step 2 — Field mapping (active) ═══════════════ -->\n <card-ui>\n <header>\n <span slot=\"icon\"><avatar-ui icon=\"arrows-horizontal\" size=\"sm\"></avatar-ui></span>\n <span slot=\"heading\">\n <text-ui strong>2. Map your columns to our fields</text-ui>\n </span>\n <span slot=\"description\">\n <text-ui color=\"subtle\" size=\"sm\">We auto-detected 5 of 8 columns. Review and adjust before continuing — required fields are marked.</text-ui>\n </span>\n </header>\n <section>\n <col-ui gap=\"3\">\n <alert-ui variant=\"info\" icon=\"info\" text=\"Pro tip — pick 'Don't import' to skip a column. You can always re-run the import to bring more fields later.\"></alert-ui>\n\n <!-- Mapping rows — each row is source column + arrow + target dropdown.\n list-ui[divider] gives us per-row separators; grid-ui inside each\n row creates the 3-column structure (source | sample | target).\n NOTE: declarative <tr>/<td> inside <table-ui> would be stripped by\n the HTML parser (foster-parented). table-ui takes programmatic\n columns/data; for control-row layouts like this, list-ui composition\n is the canonical pattern. -->\n <list-ui id=\"import-mapping-list\" divider>\n <list-item-ui>\n <grid-ui slot=\"content\" gap=\"3\" style=\"grid-template-columns: 1fr auto 1fr; align-items: center;\">\n <col-ui gap=\"0\" align=\"end\" style=\"text-align: end;\">\n <text-ui strong>full_name</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">Avery Chen</text-ui>\n </col-ui>\n <icon-ui name=\"arrow-right\" color=\"subtle\" style=\"justify-self: center;\"></icon-ui>\n <select-ui value=\"name\" name=\"map_full_name\">\n <option value=\"\">Don't import</option>\n <option value=\"name\" selected>Name</option>\n <option value=\"email\">Email</option>\n <option value=\"role\">Role</option>\n <option value=\"team\">Team</option>\n </select-ui>\n </grid-ui>\n </list-item-ui>\n <list-item-ui>\n <grid-ui slot=\"content\" gap=\"3\" style=\"grid-template-columns: 1fr auto 1fr; align-items: center;\">\n <col-ui gap=\"0\" align=\"end\" style=\"text-align: end;\">\n <text-ui strong>email_addr</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">avery@acme.com</text-ui>\n </col-ui>\n <icon-ui name=\"arrow-right\" color=\"subtle\" style=\"justify-self: center;\"></icon-ui>\n <select-ui value=\"email\" name=\"map_email_addr\">\n <option value=\"\">Don't import</option>\n <option value=\"name\">Name</option>\n <option value=\"email\" selected>Email (required)</option>\n <option value=\"role\">Role</option>\n <option value=\"team\">Team</option>\n </select-ui>\n </grid-ui>\n </list-item-ui>\n <list-item-ui>\n <grid-ui slot=\"content\" gap=\"3\" style=\"grid-template-columns: 1fr auto 1fr; align-items: center;\">\n <col-ui gap=\"0\" align=\"end\" style=\"text-align: end;\">\n <text-ui strong>company</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">Acme Inc</text-ui>\n </col-ui>\n <icon-ui name=\"arrow-right\" color=\"subtle\" style=\"justify-self: center;\"></icon-ui>\n <select-ui value=\"team\" name=\"map_company\">\n <option value=\"\">Don't import</option>\n <option value=\"name\">Name</option>\n <option value=\"email\">Email</option>\n <option value=\"role\">Role</option>\n <option value=\"team\" selected>Team / Company</option>\n </select-ui>\n </grid-ui>\n </list-item-ui>\n <list-item-ui>\n <grid-ui slot=\"content\" gap=\"3\" style=\"grid-template-columns: 1fr auto 1fr; align-items: center;\">\n <col-ui gap=\"0\" align=\"end\" style=\"text-align: end;\">\n <text-ui strong>job_title</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">Senior Engineer</text-ui>\n </col-ui>\n <icon-ui name=\"arrow-right\" color=\"subtle\" style=\"justify-self: center;\"></icon-ui>\n <select-ui value=\"role\" name=\"map_job_title\">\n <option value=\"\">Don't import</option>\n <option value=\"name\">Name</option>\n <option value=\"email\">Email</option>\n <option value=\"role\" selected>Role / Title</option>\n <option value=\"team\">Team</option>\n </select-ui>\n </grid-ui>\n </list-item-ui>\n <list-item-ui>\n <grid-ui slot=\"content\" gap=\"3\" style=\"grid-template-columns: 1fr auto 1fr; align-items: center;\">\n <col-ui gap=\"0\" align=\"end\" style=\"text-align: end;\">\n <text-ui strong>signup_date</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">2026-03-15</text-ui>\n </col-ui>\n <icon-ui name=\"arrow-right\" color=\"subtle\" style=\"justify-self: center;\"></icon-ui>\n <select-ui value=\"\" name=\"map_signup_date\">\n <option value=\"\" selected>Don't import</option>\n <option value=\"created_at\">Created at</option>\n </select-ui>\n </grid-ui>\n </list-item-ui>\n <list-item-ui>\n <grid-ui slot=\"content\" gap=\"3\" style=\"grid-template-columns: 1fr auto 1fr; align-items: center;\">\n <col-ui gap=\"0\" align=\"end\" style=\"text-align: end;\">\n <text-ui strong>region</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">EMEA</text-ui>\n </col-ui>\n <icon-ui name=\"arrow-right\" color=\"subtle\" style=\"justify-self: center;\"></icon-ui>\n <select-ui value=\"\" name=\"map_region\">\n <option value=\"\" selected>Don't import</option>\n <option value=\"region\">Region</option>\n <option value=\"team\">Team</option>\n </select-ui>\n </grid-ui>\n </list-item-ui>\n <list-item-ui>\n <grid-ui slot=\"content\" gap=\"3\" style=\"grid-template-columns: 1fr auto 1fr; align-items: center;\">\n <col-ui gap=\"0\" align=\"end\" style=\"text-align: end;\">\n <text-ui strong>notes</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">\"VIP — handle with care\"</text-ui>\n </col-ui>\n <icon-ui name=\"arrow-right\" color=\"subtle\" style=\"justify-self: center;\"></icon-ui>\n <select-ui value=\"\" name=\"map_notes\">\n <option value=\"\" selected>Don't import</option>\n <option value=\"notes\">Notes</option>\n </select-ui>\n </grid-ui>\n </list-item-ui>\n <list-item-ui>\n <grid-ui slot=\"content\" gap=\"3\" style=\"grid-template-columns: 1fr auto 1fr; align-items: center;\">\n <col-ui gap=\"0\" align=\"end\" style=\"text-align: end;\">\n <text-ui strong>internal_id</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">cust_5392</text-ui>\n </col-ui>\n <icon-ui name=\"arrow-right\" color=\"subtle\" style=\"justify-self: center;\"></icon-ui>\n <select-ui value=\"\" name=\"map_internal_id\">\n <option value=\"\" selected>Don't import</option>\n <option value=\"external_id\">External ID</option>\n </select-ui>\n </grid-ui>\n </list-item-ui>\n </list-ui>\n\n <!-- Validation summary — what'll get imported -->\n <row-ui gap=\"3\" align=\"center\" style=\"background: var(--a-bg-muted); padding: var(--a-space-3); border-radius: var(--a-radius-md);\">\n <icon-ui name=\"check-circle\" color=\"success\"></icon-ui>\n <col-ui gap=\"0\" style=\"flex: 1;\">\n <text-ui strong>4 fields mapped · 4 columns skipped</text-ui>\n <text-ui color=\"subtle\" size=\"sm\">1,243 rows ready to import. Email column passed validation (no malformed addresses).</text-ui>\n </col-ui>\n </row-ui>\n </col-ui>\n </section>\n <footer slot=\"footer\">\n <row-ui gap=\"2\" justify=\"space-between\" style=\"width: 100%;\">\n <button-ui text=\"Back\" variant=\"ghost\"></button-ui>\n <row-ui gap=\"2\">\n <button-ui text=\"Cancel\" variant=\"outline\"></button-ui>\n <button-ui text=\"Preview import →\" variant=\"primary\"></button-ui>\n </row-ui>\n </row-ui>\n </footer>\n </card-ui>\n\n <!-- ═══════════════ Step 3 — Preview (pending) ═══════════════ -->\n <card-ui>\n <header>\n <span slot=\"icon\"><avatar-ui icon=\"eye\" size=\"sm\"></avatar-ui></span>\n <span slot=\"heading\">\n <text-ui strong color=\"subtle\">3. Preview &amp; confirm</text-ui>\n </span>\n <span slot=\"description\">\n <text-ui color=\"subtle\" size=\"sm\">Final check before we commit 1,243 rows.</text-ui>\n </span>\n </header>\n </card-ui>\n\n <!-- Composition notes (rendered as a footnote for the demo, not part of\n the production UI). Helps future authors understand why this shape. -->\n <col-ui gap=\"2\" style=\"margin-top: var(--a-space-6); padding-block-start: var(--a-space-5); border-top: 1px solid var(--a-border);\">\n <text-ui size=\"sm\" color=\"subtle\"><strong>Composition rules.</strong> Three steps: upload → map → preview, each as a card-ui with header (icon + heading + status badge). The mapping itself is a list-ui[divider] of source-column / target-field rows — NOT a table-ui (the HTML parser strips declarative &lt;tr&gt; inside custom elements; table-ui takes programmatic .columns/.data instead). Each row is a 3-col grid (source label + sample → arrow → target select). The \"fields mapped\" summary lives at the bottom of the active card; the footer action bar carries Back + Cancel + primary Continue.</text-ui>\n </col-ui>\n\n</col-ui>",
12
+ "source": "catalog/ui-patterns/app/import-mapping/import-mapping.contents.html",
13
+ "metadata": {
14
+ "domain": "data-management",
15
+ "description": "Multi-step CSV/file import flow — upload, field mapping (source columns ↔ target fields), preview, import. Shows the field-mapping step prominently since it's the part most often missing from import patterns.",
16
+ "keywords": [
17
+ "import",
18
+ "csv",
19
+ "upload",
20
+ "mapping",
21
+ "fields",
22
+ "columns",
23
+ "bulk",
24
+ "data",
25
+ "migration"
26
+ ]
27
+ },
28
+ "captured_at": "2026-05-26T04:00:28.271Z",
29
+ "template": [
30
+ {
31
+ "id": "text",
32
+ "component": "Text",
33
+ "variant": "display",
34
+ "textContent": "Import customer data"
35
+ },
36
+ {
37
+ "id": "text-2",
38
+ "component": "Text",
39
+ "color": "subtle",
40
+ "textContent": "Upload a CSV or JSON file, map your columns to our fields, then preview before committing the import."
41
+ },
42
+ {
43
+ "id": "column-2",
44
+ "component": "Column"
45
+ },
46
+ {
47
+ "id": "column",
48
+ "component": "Column",
49
+ "gap": "3",
50
+ "children": [
51
+ "text",
52
+ "text-2",
53
+ "column-2"
54
+ ]
55
+ },
56
+ {
57
+ "id": "text-3",
58
+ "component": "Text",
59
+ "variant": "body"
60
+ },
61
+ {
62
+ "id": "text-4",
63
+ "component": "Text",
64
+ "variant": "body",
65
+ "textContent": "1. Upload file"
66
+ },
67
+ {
68
+ "id": "text-5",
69
+ "component": "Text",
70
+ "variant": "body",
71
+ "textContent": "customers-2026-q1.csv · 1,243 rows · 8 columns"
72
+ },
73
+ {
74
+ "id": "text-6",
75
+ "component": "Text",
76
+ "variant": "body"
77
+ },
78
+ {
79
+ "id": "header",
80
+ "component": "Header",
81
+ "children": [
82
+ "text-3",
83
+ "text-4",
84
+ "text-5",
85
+ "text-6"
86
+ ]
87
+ },
88
+ {
89
+ "id": "card",
90
+ "component": "Card",
91
+ "children": [
92
+ "header"
93
+ ]
94
+ },
95
+ {
96
+ "id": "text-7",
97
+ "component": "Text",
98
+ "variant": "body"
99
+ },
100
+ {
101
+ "id": "text-8",
102
+ "component": "Text",
103
+ "variant": "body",
104
+ "textContent": "2. Map your columns to our fields"
105
+ },
106
+ {
107
+ "id": "text-9",
108
+ "component": "Text",
109
+ "variant": "body",
110
+ "textContent": "We auto-detected 5 of 8 columns. Review and adjust before continuing — required fields are marked."
111
+ },
112
+ {
113
+ "id": "header-2",
114
+ "component": "Header",
115
+ "children": [
116
+ "text-7",
117
+ "text-8",
118
+ "text-9"
119
+ ]
120
+ },
121
+ {
122
+ "id": "alert",
123
+ "component": "Alert",
124
+ "icon": "info",
125
+ "text": "Pro tip — pick 'Don't import' to skip a column. You can always re-run the import to bring more fields later.",
126
+ "variant": "info"
127
+ },
128
+ {
129
+ "id": "text-10",
130
+ "component": "Text",
131
+ "strong": true,
132
+ "textContent": "full_name"
133
+ },
134
+ {
135
+ "id": "text-11",
136
+ "component": "Text",
137
+ "color": "subtle",
138
+ "size": "sm",
139
+ "textContent": "Avery Chen"
140
+ },
141
+ {
142
+ "id": "column-4",
143
+ "component": "Column",
144
+ "align": "end",
145
+ "gap": "0",
146
+ "children": [
147
+ "text-10",
148
+ "text-11"
149
+ ]
150
+ },
151
+ {
152
+ "id": "arrow-right",
153
+ "component": "Icon",
154
+ "name": "arrow-right"
155
+ },
156
+ {
157
+ "id": "text-12",
158
+ "component": "Text",
159
+ "textContent": "Don't import",
160
+ "variant": "body"
161
+ },
162
+ {
163
+ "id": "text-13",
164
+ "component": "Text",
165
+ "textContent": "Name",
166
+ "variant": "body"
167
+ },
168
+ {
169
+ "id": "text-14",
170
+ "component": "Text",
171
+ "textContent": "Email",
172
+ "variant": "body"
173
+ },
174
+ {
175
+ "id": "text-15",
176
+ "component": "Text",
177
+ "textContent": "Role",
178
+ "variant": "body"
179
+ },
180
+ {
181
+ "id": "text-16",
182
+ "component": "Text",
183
+ "textContent": "Team",
184
+ "variant": "body"
185
+ },
186
+ {
187
+ "id": "map-full-name",
188
+ "component": "ChoicePicker",
189
+ "name": "map_full_name",
190
+ "value": "name",
191
+ "children": [
192
+ "text-12",
193
+ "text-13",
194
+ "text-14",
195
+ "text-15",
196
+ "text-16"
197
+ ]
198
+ },
199
+ {
200
+ "id": "grid",
201
+ "component": "Grid",
202
+ "gap": "3",
203
+ "children": [
204
+ "column-4",
205
+ "arrow-right",
206
+ "map-full-name"
207
+ ]
208
+ },
209
+ {
210
+ "id": "list-item",
211
+ "component": "ListItem",
212
+ "children": [
213
+ "grid"
214
+ ]
215
+ },
216
+ {
217
+ "id": "text-17",
218
+ "component": "Text",
219
+ "strong": true,
220
+ "textContent": "email_addr"
221
+ },
222
+ {
223
+ "id": "text-18",
224
+ "component": "Text",
225
+ "color": "subtle",
226
+ "size": "sm",
227
+ "textContent": "avery@acme.com"
228
+ },
229
+ {
230
+ "id": "column-10",
231
+ "component": "Column",
232
+ "align": "end",
233
+ "gap": "0",
234
+ "children": [
235
+ "text-17",
236
+ "text-18"
237
+ ]
238
+ },
239
+ {
240
+ "id": "icon",
241
+ "component": "Icon",
242
+ "name": "arrow-right"
243
+ },
244
+ {
245
+ "id": "text-19",
246
+ "component": "Text",
247
+ "textContent": "Don't import",
248
+ "variant": "body"
249
+ },
250
+ {
251
+ "id": "text-20",
252
+ "component": "Text",
253
+ "textContent": "Name",
254
+ "variant": "body"
255
+ },
256
+ {
257
+ "id": "text-21",
258
+ "component": "Text",
259
+ "textContent": "Email (required)",
260
+ "variant": "body"
261
+ },
262
+ {
263
+ "id": "text-22",
264
+ "component": "Text",
265
+ "textContent": "Role",
266
+ "variant": "body"
267
+ },
268
+ {
269
+ "id": "text-23",
270
+ "component": "Text",
271
+ "textContent": "Team",
272
+ "variant": "body"
273
+ },
274
+ {
275
+ "id": "map-email-addr",
276
+ "component": "ChoicePicker",
277
+ "name": "map_email_addr",
278
+ "value": "email",
279
+ "children": [
280
+ "text-19",
281
+ "text-20",
282
+ "text-21",
283
+ "text-22",
284
+ "text-23"
285
+ ]
286
+ },
287
+ {
288
+ "id": "grid-2",
289
+ "component": "Grid",
290
+ "gap": "3",
291
+ "children": [
292
+ "column-10",
293
+ "icon",
294
+ "map-email-addr"
295
+ ]
296
+ },
297
+ {
298
+ "id": "list-item-2",
299
+ "component": "ListItem",
300
+ "children": [
301
+ "grid-2"
302
+ ]
303
+ },
304
+ {
305
+ "id": "text-24",
306
+ "component": "Text",
307
+ "strong": true,
308
+ "textContent": "company"
309
+ },
310
+ {
311
+ "id": "text-25",
312
+ "component": "Text",
313
+ "color": "subtle",
314
+ "size": "sm",
315
+ "textContent": "Acme Inc"
316
+ },
317
+ {
318
+ "id": "column-16",
319
+ "component": "Column",
320
+ "align": "end",
321
+ "gap": "0",
322
+ "children": [
323
+ "text-24",
324
+ "text-25"
325
+ ]
326
+ },
327
+ {
328
+ "id": "icon-2",
329
+ "component": "Icon",
330
+ "name": "arrow-right"
331
+ },
332
+ {
333
+ "id": "text-26",
334
+ "component": "Text",
335
+ "textContent": "Don't import",
336
+ "variant": "body"
337
+ },
338
+ {
339
+ "id": "text-27",
340
+ "component": "Text",
341
+ "textContent": "Name",
342
+ "variant": "body"
343
+ },
344
+ {
345
+ "id": "text-28",
346
+ "component": "Text",
347
+ "textContent": "Email",
348
+ "variant": "body"
349
+ },
350
+ {
351
+ "id": "text-29",
352
+ "component": "Text",
353
+ "textContent": "Role",
354
+ "variant": "body"
355
+ },
356
+ {
357
+ "id": "text-30",
358
+ "component": "Text",
359
+ "textContent": "Team / Company",
360
+ "variant": "body"
361
+ },
362
+ {
363
+ "id": "map-company",
364
+ "component": "ChoicePicker",
365
+ "name": "map_company",
366
+ "value": "team",
367
+ "children": [
368
+ "text-26",
369
+ "text-27",
370
+ "text-28",
371
+ "text-29",
372
+ "text-30"
373
+ ]
374
+ },
375
+ {
376
+ "id": "grid-3",
377
+ "component": "Grid",
378
+ "gap": "3",
379
+ "children": [
380
+ "column-16",
381
+ "icon-2",
382
+ "map-company"
383
+ ]
384
+ },
385
+ {
386
+ "id": "list-item-3",
387
+ "component": "ListItem",
388
+ "children": [
389
+ "grid-3"
390
+ ]
391
+ },
392
+ {
393
+ "id": "text-31",
394
+ "component": "Text",
395
+ "strong": true,
396
+ "textContent": "job_title"
397
+ },
398
+ {
399
+ "id": "text-32",
400
+ "component": "Text",
401
+ "color": "subtle",
402
+ "size": "sm",
403
+ "textContent": "Senior Engineer"
404
+ },
405
+ {
406
+ "id": "column-22",
407
+ "component": "Column",
408
+ "align": "end",
409
+ "gap": "0",
410
+ "children": [
411
+ "text-31",
412
+ "text-32"
413
+ ]
414
+ },
415
+ {
416
+ "id": "icon-3",
417
+ "component": "Icon",
418
+ "name": "arrow-right"
419
+ },
420
+ {
421
+ "id": "text-33",
422
+ "component": "Text",
423
+ "textContent": "Don't import",
424
+ "variant": "body"
425
+ },
426
+ {
427
+ "id": "text-34",
428
+ "component": "Text",
429
+ "textContent": "Name",
430
+ "variant": "body"
431
+ },
432
+ {
433
+ "id": "text-35",
434
+ "component": "Text",
435
+ "textContent": "Email",
436
+ "variant": "body"
437
+ },
438
+ {
439
+ "id": "text-36",
440
+ "component": "Text",
441
+ "textContent": "Role / Title",
442
+ "variant": "body"
443
+ },
444
+ {
445
+ "id": "text-37",
446
+ "component": "Text",
447
+ "textContent": "Team",
448
+ "variant": "body"
449
+ },
450
+ {
451
+ "id": "map-job-title",
452
+ "component": "ChoicePicker",
453
+ "name": "map_job_title",
454
+ "value": "role",
455
+ "children": [
456
+ "text-33",
457
+ "text-34",
458
+ "text-35",
459
+ "text-36",
460
+ "text-37"
461
+ ]
462
+ },
463
+ {
464
+ "id": "grid-4",
465
+ "component": "Grid",
466
+ "gap": "3",
467
+ "children": [
468
+ "column-22",
469
+ "icon-3",
470
+ "map-job-title"
471
+ ]
472
+ },
473
+ {
474
+ "id": "list-item-4",
475
+ "component": "ListItem",
476
+ "children": [
477
+ "grid-4"
478
+ ]
479
+ },
480
+ {
481
+ "id": "text-38",
482
+ "component": "Text",
483
+ "strong": true,
484
+ "textContent": "signup_date"
485
+ },
486
+ {
487
+ "id": "text-39",
488
+ "component": "Text",
489
+ "color": "subtle",
490
+ "size": "sm",
491
+ "textContent": "2026-03-15"
492
+ },
493
+ {
494
+ "id": "column-28",
495
+ "component": "Column",
496
+ "align": "end",
497
+ "gap": "0",
498
+ "children": [
499
+ "text-38",
500
+ "text-39"
501
+ ]
502
+ },
503
+ {
504
+ "id": "icon-4",
505
+ "component": "Icon",
506
+ "name": "arrow-right"
507
+ },
508
+ {
509
+ "id": "text-40",
510
+ "component": "Text",
511
+ "textContent": "Don't import",
512
+ "variant": "body"
513
+ },
514
+ {
515
+ "id": "text-41",
516
+ "component": "Text",
517
+ "textContent": "Created at",
518
+ "variant": "body"
519
+ },
520
+ {
521
+ "id": "map-signup-date",
522
+ "component": "ChoicePicker",
523
+ "name": "map_signup_date",
524
+ "children": [
525
+ "text-40",
526
+ "text-41"
527
+ ]
528
+ },
529
+ {
530
+ "id": "grid-5",
531
+ "component": "Grid",
532
+ "gap": "3",
533
+ "children": [
534
+ "column-28",
535
+ "icon-4",
536
+ "map-signup-date"
537
+ ]
538
+ },
539
+ {
540
+ "id": "list-item-5",
541
+ "component": "ListItem",
542
+ "children": [
543
+ "grid-5"
544
+ ]
545
+ },
546
+ {
547
+ "id": "text-42",
548
+ "component": "Text",
549
+ "strong": true,
550
+ "textContent": "region"
551
+ },
552
+ {
553
+ "id": "text-43",
554
+ "component": "Text",
555
+ "color": "subtle",
556
+ "size": "sm",
557
+ "textContent": "EMEA"
558
+ },
559
+ {
560
+ "id": "column-31",
561
+ "component": "Column",
562
+ "align": "end",
563
+ "gap": "0",
564
+ "children": [
565
+ "text-42",
566
+ "text-43"
567
+ ]
568
+ },
569
+ {
570
+ "id": "icon-5",
571
+ "component": "Icon",
572
+ "name": "arrow-right"
573
+ },
574
+ {
575
+ "id": "text-44",
576
+ "component": "Text",
577
+ "textContent": "Don't import",
578
+ "variant": "body"
579
+ },
580
+ {
581
+ "id": "text-45",
582
+ "component": "Text",
583
+ "textContent": "Region",
584
+ "variant": "body"
585
+ },
586
+ {
587
+ "id": "text-46",
588
+ "component": "Text",
589
+ "textContent": "Team",
590
+ "variant": "body"
591
+ },
592
+ {
593
+ "id": "map-region",
594
+ "component": "ChoicePicker",
595
+ "name": "map_region",
596
+ "children": [
597
+ "text-44",
598
+ "text-45",
599
+ "text-46"
600
+ ]
601
+ },
602
+ {
603
+ "id": "grid-6",
604
+ "component": "Grid",
605
+ "gap": "3",
606
+ "children": [
607
+ "column-31",
608
+ "icon-5",
609
+ "map-region"
610
+ ]
611
+ },
612
+ {
613
+ "id": "list-item-6",
614
+ "component": "ListItem",
615
+ "children": [
616
+ "grid-6"
617
+ ]
618
+ },
619
+ {
620
+ "id": "text-47",
621
+ "component": "Text",
622
+ "strong": true,
623
+ "textContent": "notes"
624
+ },
625
+ {
626
+ "id": "text-48",
627
+ "component": "Text",
628
+ "color": "subtle",
629
+ "size": "sm",
630
+ "textContent": "\"VIP — handle with care\""
631
+ },
632
+ {
633
+ "id": "column-35",
634
+ "component": "Column",
635
+ "align": "end",
636
+ "gap": "0",
637
+ "children": [
638
+ "text-47",
639
+ "text-48"
640
+ ]
641
+ },
642
+ {
643
+ "id": "icon-6",
644
+ "component": "Icon",
645
+ "name": "arrow-right"
646
+ },
647
+ {
648
+ "id": "text-49",
649
+ "component": "Text",
650
+ "textContent": "Don't import",
651
+ "variant": "body"
652
+ },
653
+ {
654
+ "id": "text-50",
655
+ "component": "Text",
656
+ "textContent": "Notes",
657
+ "variant": "body"
658
+ },
659
+ {
660
+ "id": "map-notes",
661
+ "component": "ChoicePicker",
662
+ "name": "map_notes",
663
+ "children": [
664
+ "text-49",
665
+ "text-50"
666
+ ]
667
+ },
668
+ {
669
+ "id": "grid-7",
670
+ "component": "Grid",
671
+ "gap": "3",
672
+ "children": [
673
+ "column-35",
674
+ "icon-6",
675
+ "map-notes"
676
+ ]
677
+ },
678
+ {
679
+ "id": "list-item-7",
680
+ "component": "ListItem",
681
+ "children": [
682
+ "grid-7"
683
+ ]
684
+ },
685
+ {
686
+ "id": "text-51",
687
+ "component": "Text",
688
+ "strong": true,
689
+ "textContent": "internal_id"
690
+ },
691
+ {
692
+ "id": "text-52",
693
+ "component": "Text",
694
+ "color": "subtle",
695
+ "size": "sm",
696
+ "textContent": "cust_5392"
697
+ },
698
+ {
699
+ "id": "column-38",
700
+ "component": "Column",
701
+ "align": "end",
702
+ "gap": "0",
703
+ "children": [
704
+ "text-51",
705
+ "text-52"
706
+ ]
707
+ },
708
+ {
709
+ "id": "icon-7",
710
+ "component": "Icon",
711
+ "name": "arrow-right"
712
+ },
713
+ {
714
+ "id": "text-53",
715
+ "component": "Text",
716
+ "textContent": "Don't import",
717
+ "variant": "body"
718
+ },
719
+ {
720
+ "id": "text-54",
721
+ "component": "Text",
722
+ "textContent": "External ID",
723
+ "variant": "body"
724
+ },
725
+ {
726
+ "id": "map-internal-id",
727
+ "component": "ChoicePicker",
728
+ "name": "map_internal_id",
729
+ "children": [
730
+ "text-53",
731
+ "text-54"
732
+ ]
733
+ },
734
+ {
735
+ "id": "grid-8",
736
+ "component": "Grid",
737
+ "gap": "3",
738
+ "children": [
739
+ "column-38",
740
+ "icon-7",
741
+ "map-internal-id"
742
+ ]
743
+ },
744
+ {
745
+ "id": "list-item-8",
746
+ "component": "ListItem",
747
+ "children": [
748
+ "grid-8"
749
+ ]
750
+ },
751
+ {
752
+ "id": "import-mapping-list",
753
+ "component": "List",
754
+ "divider": true,
755
+ "children": [
756
+ "list-item",
757
+ "list-item-2",
758
+ "list-item-3",
759
+ "list-item-4",
760
+ "list-item-5",
761
+ "list-item-6",
762
+ "list-item-7",
763
+ "list-item-8"
764
+ ]
765
+ },
766
+ {
767
+ "id": "check-circle",
768
+ "component": "Icon",
769
+ "name": "check-circle"
770
+ },
771
+ {
772
+ "id": "text-55",
773
+ "component": "Text",
774
+ "strong": true,
775
+ "textContent": "4 fields mapped · 4 columns skipped"
776
+ },
777
+ {
778
+ "id": "text-56",
779
+ "component": "Text",
780
+ "color": "subtle",
781
+ "size": "sm",
782
+ "textContent": "1,243 rows ready to import. Email column passed validation (no malformed addresses)."
783
+ },
784
+ {
785
+ "id": "column-41",
786
+ "component": "Column",
787
+ "gap": "0",
788
+ "children": [
789
+ "text-55",
790
+ "text-56"
791
+ ]
792
+ },
793
+ {
794
+ "id": "row",
795
+ "component": "Row",
796
+ "align": "center",
797
+ "gap": "3",
798
+ "children": [
799
+ "check-circle",
800
+ "column-41"
801
+ ]
802
+ },
803
+ {
804
+ "id": "column-3",
805
+ "component": "Column",
806
+ "gap": "3",
807
+ "children": [
808
+ "alert",
809
+ "import-mapping-list",
810
+ "row"
811
+ ]
812
+ },
813
+ {
814
+ "id": "section",
815
+ "component": "Section",
816
+ "children": [
817
+ "column-3"
818
+ ]
819
+ },
820
+ {
821
+ "id": "button",
822
+ "component": "Button",
823
+ "text": "Back",
824
+ "variant": "ghost"
825
+ },
826
+ {
827
+ "id": "button-2",
828
+ "component": "Button",
829
+ "text": "Cancel",
830
+ "variant": "outline"
831
+ },
832
+ {
833
+ "id": "button-3",
834
+ "component": "Button",
835
+ "text": "Preview import →",
836
+ "variant": "primary"
837
+ },
838
+ {
839
+ "id": "row-3",
840
+ "component": "Row",
841
+ "gap": "2",
842
+ "children": [
843
+ "button-2",
844
+ "button-3"
845
+ ]
846
+ },
847
+ {
848
+ "id": "row-2",
849
+ "component": "Row",
850
+ "gap": "2",
851
+ "justify": "space-between",
852
+ "children": [
853
+ "button",
854
+ "row-3"
855
+ ]
856
+ },
857
+ {
858
+ "id": "footer",
859
+ "component": "Footer",
860
+ "children": [
861
+ "row-2"
862
+ ]
863
+ },
864
+ {
865
+ "id": "card-2",
866
+ "component": "Card",
867
+ "children": [
868
+ "header-2",
869
+ "section",
870
+ "footer"
871
+ ]
872
+ },
873
+ {
874
+ "id": "text-57",
875
+ "component": "Text",
876
+ "variant": "body"
877
+ },
878
+ {
879
+ "id": "text-58",
880
+ "component": "Text",
881
+ "variant": "body",
882
+ "textContent": "3. Preview &amp; confirm"
883
+ },
884
+ {
885
+ "id": "text-59",
886
+ "component": "Text",
887
+ "variant": "body",
888
+ "textContent": "Final check before we commit 1,243 rows."
889
+ },
890
+ {
891
+ "id": "header-3",
892
+ "component": "Header",
893
+ "children": [
894
+ "text-57",
895
+ "text-58",
896
+ "text-59"
897
+ ]
898
+ },
899
+ {
900
+ "id": "card-3",
901
+ "component": "Card",
902
+ "children": [
903
+ "header-3"
904
+ ]
905
+ },
906
+ {
907
+ "id": "text-60",
908
+ "component": "Text",
909
+ "color": "subtle",
910
+ "size": "sm",
911
+ "textContent": "Composition rules. Three steps: upload → map → preview, each as a card-ui with header (icon + heading + status badge). The mapping itself is a list-ui[divider] of source-column / target-field rows — NOT a table-ui (the HTML parser strips declarative &lt;tr&gt; inside custom elements; table-ui takes programmatic .columns/.data instead). Each row is a 3-col grid (source label + sample → arrow → target select). The \"fields mapped\" summary lives at the bottom of the active card; the footer action bar carries Back + Cancel + primary Continue."
912
+ },
913
+ {
914
+ "id": "column-42",
915
+ "component": "Column",
916
+ "gap": "2",
917
+ "children": [
918
+ "text-60"
919
+ ]
920
+ },
921
+ {
922
+ "id": "root",
923
+ "component": "Column",
924
+ "gap": "5",
925
+ "children": [
926
+ "column",
927
+ "card",
928
+ "card-2",
929
+ "card-3",
930
+ "column-42"
931
+ ]
932
+ }
933
+ ]
934
+ }