@delmaredigital/payload-experiments 0.2.0-rc.7 → 0.3.0-rc.4

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 (336) hide show
  1. package/README.md +202 -26
  2. package/dist/admin/PreviewLinks.d.ts +2 -1
  3. package/dist/admin/PreviewLinks.js +50 -21
  4. package/dist/admin/TestsNavLink.d.ts +3 -1
  5. package/dist/admin/TestsNavLink.js +2 -2
  6. package/dist/admin/actions/ConfirmDialog.d.ts +7 -4
  7. package/dist/admin/actions/ConfirmDialog.js +37 -82
  8. package/dist/admin/actions/DecideDialog.d.ts +3 -1
  9. package/dist/admin/actions/DecideDialog.js +30 -13
  10. package/dist/admin/actions/MakeContentResult.d.ts +13 -2
  11. package/dist/admin/actions/MakeContentResult.js +115 -16
  12. package/dist/admin/actions/actions.model.d.ts +2 -4
  13. package/dist/admin/actions/actions.model.js +2 -3
  14. package/dist/admin/allocation.model.js +3 -5
  15. package/dist/admin/api.d.ts +10 -4
  16. package/dist/admin/api.js +11 -7
  17. package/dist/admin/armSelect/ArmSelectField.js +14 -22
  18. package/dist/admin/arms/arms.model.d.ts +1 -21
  19. package/dist/admin/arms/arms.model.js +1 -153
  20. package/dist/admin/copy/actions.d.ts +39 -3
  21. package/dist/admin/copy/actions.js +40 -4
  22. package/dist/admin/copy/armSelect.js +5 -5
  23. package/dist/admin/copy/arms.d.ts +1 -6
  24. package/dist/admin/copy/arms.js +1 -16
  25. package/dist/admin/copy/audience.d.ts +2 -1
  26. package/dist/admin/copy/audience.js +3 -2
  27. package/dist/admin/copy/common.d.ts +13 -6
  28. package/dist/admin/copy/common.js +14 -8
  29. package/dist/admin/copy/goals.d.ts +21 -6
  30. package/dist/admin/copy/goals.js +27 -6
  31. package/dist/admin/copy/readiness.d.ts +22 -0
  32. package/dist/admin/copy/readiness.js +21 -0
  33. package/dist/admin/copy/recommendation.d.ts +0 -3
  34. package/dist/admin/copy/recommendation.js +0 -3
  35. package/dist/admin/copy/results.d.ts +43 -2
  36. package/dist/admin/copy/results.js +44 -3
  37. package/dist/admin/copy/review.d.ts +2 -2
  38. package/dist/admin/copy/review.js +2 -2
  39. package/dist/admin/copy/setting.d.ts +2 -0
  40. package/dist/admin/copy/setting.js +2 -0
  41. package/dist/admin/copy/surface.d.ts +7 -5
  42. package/dist/admin/copy/surface.js +9 -5
  43. package/dist/admin/copy/testPage.d.ts +10 -0
  44. package/dist/admin/copy/testPage.js +10 -0
  45. package/dist/admin/format/date.d.ts +2 -0
  46. package/dist/admin/format/date.js +10 -0
  47. package/dist/admin/paths.d.ts +2 -1
  48. package/dist/admin/paths.js +2 -1
  49. package/dist/admin/previewLinks.model.d.ts +4 -2
  50. package/dist/admin/previewLinks.model.js +8 -7
  51. package/dist/admin/results/CiChart.js +11 -21
  52. package/dist/admin/results/DataQualityPanel.d.ts +4 -2
  53. package/dist/admin/results/DataQualityPanel.js +30 -17
  54. package/dist/admin/results/DataTable.d.ts +16 -0
  55. package/dist/admin/results/DataTable.js +152 -0
  56. package/dist/admin/results/StatTile.d.ts +7 -0
  57. package/dist/admin/results/StatTile.js +22 -0
  58. package/dist/admin/results/VerdictHero.d.ts +13 -0
  59. package/dist/admin/results/{VerdictCard.js → VerdictHero.js} +15 -12
  60. package/dist/admin/results/legacy.d.ts +16 -0
  61. package/dist/admin/results/legacy.js +27 -0
  62. package/dist/admin/results/releasePages.model.d.ts +17 -0
  63. package/dist/admin/results/releasePages.model.js +10 -0
  64. package/dist/admin/results/results.css +64 -0
  65. package/dist/admin/results/results.model.d.ts +11 -7
  66. package/dist/admin/results/results.model.js +24 -7
  67. package/dist/admin/results/snapshot.d.ts +14 -0
  68. package/dist/admin/results/snapshot.js +3 -0
  69. package/dist/admin/surface/ResultsRoute.d.ts +1 -1
  70. package/dist/admin/surface/ResultsRoute.js +59 -34
  71. package/dist/admin/surface/SurfaceShell.d.ts +11 -2
  72. package/dist/admin/surface/SurfaceShell.js +49 -14
  73. package/dist/admin/surface/TestsHome.d.ts +6 -1
  74. package/dist/admin/surface/TestsHome.js +182 -114
  75. package/dist/admin/surface/TestsSurface.js +56 -16
  76. package/dist/admin/surface/goals/GoalForm.js +341 -308
  77. package/dist/admin/surface/goals/GoalsList.js +123 -89
  78. package/dist/admin/surface/goals/data.d.ts +8 -2
  79. package/dist/admin/surface/goals/data.js +24 -16
  80. package/dist/admin/surface/goals/goals.css +10 -13
  81. package/dist/admin/surface/home.model.d.ts +8 -8
  82. package/dist/admin/surface/home.model.js +23 -12
  83. package/dist/admin/surface/newTest/NewTest.js +9 -9
  84. package/dist/admin/surface/pageBlock/parts.js +31 -26
  85. package/dist/admin/surface/readiness/ActionDialogs.js +47 -19
  86. package/dist/admin/surface/readiness/Banner.d.ts +3 -0
  87. package/dist/admin/surface/readiness/Banner.js +58 -33
  88. package/dist/admin/surface/readiness/SaveStatus.d.ts +1 -0
  89. package/dist/admin/surface/readiness/SaveStatus.js +6 -3
  90. package/dist/admin/surface/readiness/readiness.model.d.ts +2 -0
  91. package/dist/admin/surface/readiness/readiness.model.js +25 -9
  92. package/dist/admin/surface/readiness/useTransition.d.ts +1 -0
  93. package/dist/admin/surface/readiness/useTransition.js +2 -1
  94. package/dist/admin/surface/results/ReleasePages.d.ts +14 -0
  95. package/dist/admin/surface/results/ReleasePages.js +116 -0
  96. package/dist/admin/surface/results/ResultsBody.d.ts +11 -1
  97. package/dist/admin/surface/results/ResultsBody.js +277 -105
  98. package/dist/admin/surface/results/ResultsHeader.d.ts +10 -0
  99. package/dist/admin/surface/results/ResultsHeader.js +177 -0
  100. package/dist/admin/surface/results/recommendation.model.d.ts +3 -2
  101. package/dist/admin/surface/results/recommendation.model.js +12 -9
  102. package/dist/admin/surface/results/useResults.d.ts +21 -3
  103. package/dist/admin/surface/results/useResults.js +2 -1
  104. package/dist/admin/surface/setting/parts.js +75 -88
  105. package/dist/admin/surface/setting/setting.css +3 -15
  106. package/dist/admin/surface/surface.css +61 -47
  107. package/dist/admin/surface/test/AdvancedSection.js +55 -48
  108. package/dist/admin/surface/test/GoalSection.js +46 -47
  109. package/dist/admin/surface/test/LengthSection.js +46 -34
  110. package/dist/admin/surface/test/Rail.d.ts +4 -0
  111. package/dist/admin/surface/test/Rail.js +83 -0
  112. package/dist/admin/surface/test/ReadinessBar.d.ts +5 -0
  113. package/dist/admin/surface/test/ReadinessBar.js +33 -0
  114. package/dist/admin/surface/test/Section.d.ts +1 -1
  115. package/dist/admin/surface/test/Section.js +36 -16
  116. package/dist/admin/surface/test/TargetingSection.js +168 -142
  117. package/dist/admin/surface/test/TestPage.d.ts +2 -1
  118. package/dist/admin/surface/test/TestPage.js +146 -68
  119. package/dist/admin/surface/test/VersionsSection.js +151 -120
  120. package/dist/admin/surface/test/fields.d.ts +11 -4
  121. package/dist/admin/surface/test/fields.js +84 -85
  122. package/dist/admin/surface/test/jumpToSection.d.ts +3 -0
  123. package/dist/admin/surface/test/jumpToSection.js +10 -0
  124. package/dist/admin/surface/test/pageParts.js +9 -3
  125. package/dist/admin/surface/test/testPage.css +81 -14
  126. package/dist/admin/surface/test/testPage.model.d.ts +2 -3
  127. package/dist/admin/surface/test/testPage.model.js +1 -21
  128. package/dist/admin/surface/useTestDocument.js +12 -5
  129. package/dist/admin/targeting/targeting.model.d.ts +1 -3
  130. package/dist/admin/targeting/targeting.model.js +3 -8
  131. package/dist/admin/theme.css +115 -36
  132. package/dist/admin/theme.d.ts +38 -0
  133. package/dist/admin/theme.js +38 -1
  134. package/dist/admin/useApi.d.ts +17 -2
  135. package/dist/admin/useLayerUsage.js +14 -23
  136. package/dist/admin/views/ExperimentsRootView.js +12 -2
  137. package/dist/admin/views/TestsNavLinkServer.d.ts +2 -0
  138. package/dist/admin/views/TestsNavLinkServer.js +43 -0
  139. package/dist/arms/copy.d.ts +6 -0
  140. package/dist/arms/copy.js +16 -0
  141. package/dist/arms/model.d.ts +23 -0
  142. package/dist/arms/model.js +173 -0
  143. package/dist/collections/experiments/config.js +25 -0
  144. package/dist/collections/experiments/lockHook.js +3 -1
  145. package/dist/collections/identities.js +6 -1
  146. package/dist/collections/metrics.js +7 -0
  147. package/dist/collections/metricsGuards.d.ts +9 -0
  148. package/dist/collections/metricsGuards.js +33 -0
  149. package/dist/contentDone.d.ts +4 -0
  150. package/dist/contentDone.js +5 -0
  151. package/dist/db/appends.d.ts +6 -2
  152. package/dist/db/appends.js +10 -4
  153. package/dist/db/identities.d.ts +8 -7
  154. package/dist/db/identities.js +9 -6
  155. package/dist/db/locks.d.ts +6 -0
  156. package/dist/db/locks.js +13 -1
  157. package/dist/db/metricUsage.d.ts +19 -0
  158. package/dist/db/metricUsage.js +54 -0
  159. package/dist/db/names.d.ts +5 -0
  160. package/dist/db/names.js +5 -0
  161. package/dist/db/pageOccupancy.d.ts +12 -0
  162. package/dist/db/pageOccupancy.js +45 -0
  163. package/dist/db/publishedContent.d.ts +10 -0
  164. package/dist/db/publishedContent.js +43 -0
  165. package/dist/db/results.d.ts +2 -0
  166. package/dist/db/results.js +6 -2
  167. package/dist/db/snapshots.d.ts +18 -6
  168. package/dist/db/snapshots.js +25 -8
  169. package/dist/db/sweep.js +11 -6
  170. package/dist/endpoints/index.js +19 -1
  171. package/dist/endpoints/results.js +5 -0
  172. package/dist/endpoints/sanitizeReadinessDetail.d.ts +1 -0
  173. package/dist/endpoints/sanitizeReadinessDetail.js +2 -0
  174. package/dist/endpoints/summary.js +20 -2
  175. package/dist/endpoints/transitions.d.ts +15 -0
  176. package/dist/endpoints/transitions.js +36 -0
  177. package/dist/errors.d.ts +8 -0
  178. package/dist/errors.js +28 -0
  179. package/dist/exports/adminRsc.d.ts +1 -0
  180. package/dist/exports/adminRsc.js +1 -0
  181. package/dist/exports/index.d.ts +2 -1
  182. package/dist/exports/index.js +1 -0
  183. package/dist/exports/puck.d.ts +2 -1
  184. package/dist/exports/puck.js +1 -1
  185. package/dist/exports/puckEditor.d.ts +4 -1
  186. package/dist/exports/puckEditor.js +3 -1
  187. package/dist/exports/rsc.d.ts +6 -1
  188. package/dist/exports/rsc.js +2 -0
  189. package/dist/hooks/pageGuard.d.ts +5 -0
  190. package/dist/hooks/pageGuard.js +139 -0
  191. package/dist/lib/fetchAllDocs.d.ts +16 -0
  192. package/dist/lib/fetchAllDocs.js +56 -0
  193. package/dist/log.js +6 -3
  194. package/dist/manifest/compile.d.ts +5 -0
  195. package/dist/manifest/compile.js +5 -1
  196. package/dist/options.js +16 -0
  197. package/dist/plugin.js +30 -2
  198. package/dist/puck/ExperimentPicker.js +47 -16
  199. package/dist/puck/ExperimentSlot.d.ts +51 -1
  200. package/dist/puck/ExperimentSlot.js +23 -12
  201. package/dist/puck/copy.d.ts +6 -5
  202. package/dist/puck/copy.js +6 -5
  203. package/dist/puck/editor/CreateExperimentDrawer.js +46 -56
  204. package/dist/puck/editor/ExperimentSlotEditor.d.ts +52 -1
  205. package/dist/puck/editor/ExperimentSlotEditor.js +292 -137
  206. package/dist/puck/editor/ResultsReadout.d.ts +6 -0
  207. package/dist/puck/editor/ResultsReadout.js +99 -0
  208. package/dist/puck/editor/VersionBuilder.d.ts +34 -0
  209. package/dist/puck/editor/VersionBuilder.js +317 -0
  210. package/dist/puck/editor/armWrites.d.ts +7 -0
  211. package/dist/puck/editor/armWrites.js +71 -0
  212. package/dist/puck/editor/armsCache.d.ts +14 -0
  213. package/dist/puck/editor/armsCache.js +78 -0
  214. package/dist/puck/editor/copy.d.ts +33 -1
  215. package/dist/puck/editor/copy.js +45 -8
  216. package/dist/puck/editor/createTest.d.ts +1 -1
  217. package/dist/puck/editor/createTest.js +25 -14
  218. package/dist/puck/editor/editor.chrome.css +121 -0
  219. package/dist/puck/editor/editor.css +288 -204
  220. package/dist/puck/editor/editor.model.d.ts +4 -1
  221. package/dist/puck/editor/editor.model.js +10 -7
  222. package/dist/puck/editor/experimentOutlinePlugin.d.ts +3 -0
  223. package/dist/puck/editor/experimentOutlinePlugin.js +89 -0
  224. package/dist/puck/experimentSlotField.d.ts +2 -0
  225. package/dist/puck/experimentSlotField.js +11 -3
  226. package/dist/puck/hostContext.d.ts +10 -0
  227. package/dist/puck/hostContext.js +12 -0
  228. package/dist/puck/routes.d.ts +12 -0
  229. package/dist/puck/routes.js +11 -0
  230. package/dist/puck/slotConfig.d.ts +1 -1
  231. package/dist/puck/slotConfig.js +2 -2
  232. package/dist/results/aggregate.js +4 -3
  233. package/dist/results/analyse.d.ts +4 -1
  234. package/dist/results/analyse.js +27 -11
  235. package/dist/results/cuped.js +3 -2
  236. package/dist/results/identityCredit.d.ts +15 -7
  237. package/dist/results/identityCredit.js +32 -33
  238. package/dist/results/rolloutUnits.js +2 -1
  239. package/dist/results/snapshot.js +8 -2
  240. package/dist/results/srm.js +2 -1
  241. package/dist/sanitizeReadinessDetail.d.ts +7 -0
  242. package/dist/sanitizeReadinessDetail.js +63 -0
  243. package/dist/server/linkIdentity.d.ts +10 -1
  244. package/dist/server/linkIdentity.js +17 -15
  245. package/dist/server/metadata.d.ts +5 -0
  246. package/dist/server/metadata.js +18 -3
  247. package/dist/server/normaliseContentRelationships.d.ts +7 -0
  248. package/dist/server/normaliseContentRelationships.js +62 -0
  249. package/dist/server/recordContentChange.d.ts +1 -1
  250. package/dist/server/recordContentChange.js +17 -8
  251. package/dist/server/runResults.d.ts +3 -2
  252. package/dist/server/runResults.js +157 -35
  253. package/dist/targeting/values.d.ts +4 -0
  254. package/dist/targeting/values.js +10 -0
  255. package/dist/transitions/addMetric.js +8 -0
  256. package/dist/transitions/archive.js +2 -3
  257. package/dist/transitions/checkStart.d.ts +10 -3
  258. package/dist/transitions/checkStart.js +25 -0
  259. package/dist/transitions/contentFields.d.ts +7 -0
  260. package/dist/transitions/contentFields.js +20 -0
  261. package/dist/transitions/decide.js +22 -2
  262. package/dist/transitions/dismissContentEntry.d.ts +8 -0
  263. package/dist/transitions/dismissContentEntry.js +45 -0
  264. package/dist/transitions/makeContent.d.ts +5 -2
  265. package/dist/transitions/makeContent.js +217 -118
  266. package/dist/transitions/phaseRecord.d.ts +8 -2
  267. package/dist/transitions/placements.d.ts +3 -6
  268. package/dist/transitions/placements.js +12 -1
  269. package/dist/transitions/preflightData.d.ts +9 -1
  270. package/dist/transitions/preflightData.js +138 -20
  271. package/dist/transitions/releasePages.d.ts +8 -0
  272. package/dist/transitions/releasePages.js +26 -0
  273. package/dist/transitions/restoreContentEntry.d.ts +8 -0
  274. package/dist/transitions/restoreContentEntry.js +47 -0
  275. package/dist/transitions/start.js +62 -7
  276. package/dist/types/contracts.d.ts +24 -4
  277. package/dist/types/endpoints.d.ts +34 -3
  278. package/dist/types/index.d.ts +1 -0
  279. package/dist/types/index.js +1 -0
  280. package/dist/types/reasons.d.ts +3 -0
  281. package/dist/types/reasons.js +1 -0
  282. package/dist/types/snapshot.d.ts +6 -1
  283. package/dist/ui/Banner.d.ts +2 -0
  284. package/dist/ui/Banner.js +2 -0
  285. package/dist/ui/Breadcrumb.d.ts +7 -0
  286. package/dist/ui/Breadcrumb.js +25 -0
  287. package/dist/ui/Button.d.ts +15 -0
  288. package/dist/ui/Button.js +32 -0
  289. package/dist/ui/Card.d.ts +12 -0
  290. package/dist/ui/Card.js +40 -0
  291. package/dist/ui/Checkbox.d.ts +2 -0
  292. package/dist/ui/Checkbox.js +2 -0
  293. package/dist/{admin/components → ui}/ChipsInput.d.ts +4 -3
  294. package/dist/{admin/components → ui}/ChipsInput.js +20 -12
  295. package/dist/ui/Dialog.d.ts +13 -0
  296. package/dist/ui/Dialog.js +85 -0
  297. package/dist/ui/EmptyState.d.ts +2 -0
  298. package/dist/ui/EmptyState.js +2 -0
  299. package/dist/ui/Feedback.d.ts +24 -0
  300. package/dist/ui/Feedback.js +40 -0
  301. package/dist/ui/Inputs.d.ts +34 -0
  302. package/dist/ui/Inputs.js +225 -0
  303. package/dist/ui/NumberInput.d.ts +2 -0
  304. package/dist/ui/NumberInput.js +2 -0
  305. package/dist/ui/Range.d.ts +2 -0
  306. package/dist/ui/Range.js +2 -0
  307. package/dist/ui/SearchInput.d.ts +2 -0
  308. package/dist/ui/SearchInput.js +2 -0
  309. package/dist/ui/SectionCard.d.ts +2 -0
  310. package/dist/ui/SectionCard.js +2 -0
  311. package/dist/ui/Select.d.ts +2 -0
  312. package/dist/ui/Select.js +2 -0
  313. package/dist/ui/StatusChip.d.ts +2 -0
  314. package/dist/ui/StatusChip.js +2 -0
  315. package/dist/ui/Tabs.d.ts +16 -0
  316. package/dist/ui/Tabs.js +61 -0
  317. package/dist/ui/TextInput.d.ts +2 -0
  318. package/dist/ui/TextInput.js +2 -0
  319. package/dist/ui/Textarea.d.ts +2 -0
  320. package/dist/ui/Textarea.js +2 -0
  321. package/dist/ui/Toggle.d.ts +2 -0
  322. package/dist/ui/Toggle.js +2 -0
  323. package/dist/ui/accent.d.ts +40 -0
  324. package/dist/ui/accent.js +139 -0
  325. package/dist/ui/index.d.ts +9 -0
  326. package/dist/ui/index.js +9 -0
  327. package/dist/ui/ui.css +92 -0
  328. package/package.json +5 -2
  329. package/dist/admin/components/chipsInput.css +0 -11
  330. package/dist/admin/results/ArmTable.d.ts +0 -8
  331. package/dist/admin/results/ArmTable.js +0 -113
  332. package/dist/admin/results/VerdictCard.d.ts +0 -9
  333. package/dist/admin/surface/goals/GoalsBreadcrumb.d.ts +0 -5
  334. package/dist/admin/surface/goals/GoalsBreadcrumb.js +0 -47
  335. package/dist/admin/surface/test/TestHeader.d.ts +0 -4
  336. package/dist/admin/surface/test/TestHeader.js +0 -70
@@ -1,44 +1,123 @@
1
- /* The Payload token boundary. Recompute aliases for either admin theme. */
1
+ /* The only Payload token boundary. Reference: Payload 3.90.2; nearest neutral
2
+ elevation by RGB distance to the approved mockup, advancing toward the mockup
3
+ on collision so all five surface steps stay distinct (light / dark):
4
+ bg 50/0; surface 0/50; surface-2 100/100; surface-3 150/150;
5
+ accent-subtle 200/200;
6
+ border 100/100; border-strong 250/200; text 850/800;
7
+ text-2 650/550; text-3 450/350; accent 800/800; hover 900/900;
8
+ accent-fg 0/0; focus 800/800; series-muted 300/250.
9
+ Semantic and series hues are fixed mockup literals; only neutrals use Payload. */
2
10
  :root, [data-theme] {
3
- --xp-bg: var(--theme-bg);
4
- --xp-text: var(--theme-text);
5
- --xp-surface: var(--theme-elevation-50);
6
- --xp-surface-raised: var(--theme-elevation-100);
7
- --xp-border: var(--theme-elevation-150);
8
- --xp-border-strong: var(--theme-elevation-200);
11
+ --xp-bg: var(--theme-elevation-50);
12
+ --xp-surface: var(--theme-elevation-0);
13
+ --xp-surface-2: var(--theme-elevation-100);
14
+ --xp-surface-3: var(--theme-elevation-150);
15
+ --xp-border: var(--theme-elevation-100);
16
+ --xp-border-strong: var(--theme-elevation-250);
17
+ --xp-text: var(--theme-elevation-850);
18
+ --xp-text-2: var(--theme-elevation-650);
19
+ --xp-text-3: var(--theme-elevation-450);
20
+ --xp-accent: var(--theme-elevation-800);
21
+ --xp-accent-hover: var(--theme-elevation-900);
22
+ --xp-accent-active: var(--theme-elevation-950);
23
+ --xp-accent-subtle: var(--theme-elevation-200);
24
+ --xp-accent-fg: var(--theme-elevation-0);
25
+ --xp-accent-text: var(--xp-text);
26
+ --xp-accent-text-decoration: none;
27
+ --xp-focus: var(--theme-elevation-800);
28
+ --xp-series-muted: var(--theme-elevation-300);
29
+ --xp-success: #1a6a3a;
30
+ --xp-success-bg: #e8f4ec;
31
+ --xp-success-border: #bddfc9;
32
+ --xp-warning: #8a5a0b;
33
+ --xp-warning-bg: #fbf3e1;
34
+ --xp-warning-border: #ecd6a2;
35
+ --xp-error: #a63030;
36
+ --xp-error-bg: #fbeaea;
37
+ --xp-error-border: #efc3c3;
38
+ --xp-series-a: #2a78d6;
39
+ --xp-series-b: #eb6834;
40
+ --xp-series-c: #8056b3;
41
+ --xp-radius-control: 8px;
42
+ --xp-radius-card: 12px;
43
+ --xp-radius-chip: 6px;
44
+ --xp-font: var(--font-body);
45
+ --xp-mono: var(--font-mono);
46
+ --xp-text-display: 600 28px/32px var(--xp-font);
47
+ --xp-text-title: 600 20px/28px var(--xp-font);
48
+ --xp-text-body: 400 15px/22px var(--xp-font);
49
+ --xp-text-small: 400 13px/18px var(--xp-font);
50
+ --xp-motion: 120ms;
51
+ --xp-space-half: 2px;
52
+ --xp-space-one-half: 6px;
53
+ --xp-version-share-width: 96px;
54
+ --xp-version-share-width-mobile: 84px;
55
+ --xp-version-state-width: 192px;
56
+ --xp-version-remove-width: 128px;
57
+ --xp-targeting-attribute-width: 150px;
58
+ --xp-targeting-comparison-width: 140px;
59
+ --xp-legend-key-size: 10px;
60
+ --xp-legend-key-radius: 3px;
61
+ --xp-space-1: 4px;
62
+ --xp-space-2: 8px;
63
+ --xp-space-3: 12px;
64
+ --xp-space-4: 16px;
65
+ --xp-space-5: 20px;
66
+ --xp-space-6: 24px;
67
+ --xp-space-7: 28px;
68
+ --xp-space-8: 32px;
69
+ --xp-surface-raised: var(--xp-surface-2);
9
70
  --xp-border-control: var(--theme-elevation-250);
10
71
  --xp-input-border: var(--theme-elevation-300);
11
72
  --xp-border-accent: var(--theme-elevation-400);
12
- --xp-accent: var(--theme-elevation-500);
13
- --xp-text-muted: var(--theme-elevation-600);
14
- --xp-text-strong: var(--theme-elevation-800);
15
- --xp-text-emphasis: var(--theme-elevation-900);
73
+ --xp-text-muted: var(--xp-text-2);
74
+ --xp-text-strong: var(--xp-text);
75
+ --xp-text-emphasis: var(--xp-text);
16
76
  --xp-input-bg: var(--theme-input-bg);
17
77
  --xp-overlay: var(--theme-overlay);
18
- --xp-success-surface: var(--theme-success-100);
19
- --xp-success-bg: var(--theme-success-150);
20
- --xp-success: var(--theme-success-500);
21
- --xp-success-text: var(--theme-success-600);
22
- --xp-success-text-strong: var(--theme-success-850);
23
- --xp-warning-surface: var(--theme-warning-100);
24
- --xp-warning-bg: var(--theme-warning-150);
25
- --xp-warning: var(--theme-warning-500);
26
- --xp-warning-text: var(--theme-warning-600);
27
- --xp-warning-text-strong: var(--theme-warning-850);
28
- --xp-error-surface: var(--theme-error-100);
29
- --xp-error: var(--theme-error-500);
30
- --xp-error-text: var(--theme-error-600);
31
- --xp-radius: var(--style-radius-s);
32
- --xp-radius-large: var(--style-radius-m);
33
- --xp-space-1: calc(var(--base) * 0.25);
34
- --xp-space-2: calc(var(--base) * 0.5);
35
- --xp-space-3: calc(var(--base) * 0.75);
36
- --xp-space-4: calc(var(--base) * 1);
37
- --xp-space-5: calc(var(--base) * 1.5);
38
- --xp-space-6: calc(var(--base) * 2);
78
+ --xp-success-surface: var(--xp-success-bg);
79
+ --xp-success-text: var(--xp-success);
80
+ --xp-success-text-strong: var(--xp-success);
81
+ --xp-warning-surface: var(--xp-warning-bg);
82
+ --xp-warning-text: var(--xp-warning);
83
+ --xp-warning-text-strong: var(--xp-warning);
84
+ --xp-error-surface: var(--xp-error-bg);
85
+ --xp-error-text: var(--xp-error);
86
+ --xp-radius: var(--xp-radius-control);
87
+ --xp-radius-large: var(--xp-radius-card);
39
88
  --xp-dash-card-gap: 12px;
40
- --xp-dash-card-gap-small: calc(var(--base) * 0.4);
41
- --xp-font-body: var(--font-body);
42
- --xp-font-size-small: calc(var(--base) * 0.65);
43
- --xp-font-size-body: calc(var(--base) * 0.75);
89
+ --xp-dash-card-gap-small: 8px;
90
+ --xp-font-body: var(--xp-font);
91
+ --xp-font-size-small: 13px;
92
+ --xp-font-size-body: 15px;
93
+ }
94
+ [data-theme="dark"] {
95
+ --xp-bg: var(--theme-elevation-0);
96
+ --xp-surface: var(--theme-elevation-50);
97
+ --xp-surface-2: var(--theme-elevation-100);
98
+ --xp-surface-3: var(--theme-elevation-150);
99
+ --xp-border: var(--theme-elevation-100);
100
+ --xp-border-strong: var(--theme-elevation-200);
101
+ --xp-text: var(--theme-elevation-800);
102
+ --xp-text-2: var(--theme-elevation-550);
103
+ --xp-text-3: var(--theme-elevation-350);
104
+ --xp-accent: var(--theme-elevation-800);
105
+ --xp-accent-hover: var(--theme-elevation-900);
106
+ --xp-accent-active: var(--theme-elevation-1000);
107
+ --xp-accent-subtle: var(--theme-elevation-200);
108
+ --xp-accent-fg: var(--theme-elevation-0);
109
+ --xp-focus: var(--theme-elevation-800);
110
+ --xp-series-muted: var(--theme-elevation-250);
111
+ --xp-success: #7fd49c;
112
+ --xp-success-bg: #142b1d;
113
+ --xp-success-border: #23492f;
114
+ --xp-warning: #e7bd5c;
115
+ --xp-warning-bg: #2b2312;
116
+ --xp-warning-border: #4d3d17;
117
+ --xp-error: #f09494;
118
+ --xp-error-bg: #2f1717;
119
+ --xp-error-border: #5a2626;
120
+ --xp-series-a: #3987e5;
121
+ --xp-series-b: #d95926;
122
+ --xp-series-c: #b48ade;
44
123
  }
@@ -1,9 +1,33 @@
1
+ /** Host accent rules (reference surfaces are defined by theme.css):
2
+ * (i) Foreground on accent, hover and active fills reaches 4.5:1 in both themes.
3
+ * (ii) Accent text moves toward the surface's opposite to reach 4.5:1; if the
4
+ * bounded search fails, use the neutral text token and underline it.
5
+ * (iii) Focus reaches 3:1 against the surface: darken on light, lighten on dark.
6
+ */
7
+ export { deriveAccent } from '../ui/accent.js';
1
8
  /** every Payload token reference lives in theme.css; porting to Payload 4 edits that file only */
2
9
  export declare const theme: {
3
10
  readonly color: {
4
11
  readonly bg: "var(--xp-bg)";
5
12
  readonly text: "var(--xp-text)";
6
13
  readonly surface: "var(--xp-surface)";
14
+ readonly surface2: "var(--xp-surface-2)";
15
+ readonly surface3: "var(--xp-surface-3)";
16
+ readonly text2: "var(--xp-text-2)";
17
+ readonly text3: "var(--xp-text-3)";
18
+ readonly accentHover: "var(--xp-accent-hover)";
19
+ readonly accentActive: "var(--xp-accent-active)";
20
+ readonly accentText: "var(--xp-accent-text)";
21
+ readonly accentSubtle: "var(--xp-accent-subtle)";
22
+ readonly accentFg: "var(--xp-accent-fg)";
23
+ readonly focus: "var(--xp-focus)";
24
+ readonly successBorder: "var(--xp-success-border)";
25
+ readonly warningBorder: "var(--xp-warning-border)";
26
+ readonly errorBg: "var(--xp-error-bg)";
27
+ readonly errorBorder: "var(--xp-error-border)";
28
+ readonly seriesA: "var(--xp-series-a)";
29
+ readonly seriesB: "var(--xp-series-b)";
30
+ readonly seriesMuted: "var(--xp-series-muted)";
7
31
  readonly surfaceRaised: "var(--xp-surface-raised)";
8
32
  readonly border: "var(--xp-border)";
9
33
  readonly borderStrong: "var(--xp-border-strong)";
@@ -30,7 +54,17 @@ export declare const theme: {
30
54
  readonly error: "var(--xp-error)";
31
55
  readonly errorText: "var(--xp-error-text)";
32
56
  };
57
+ readonly motion: "var(--xp-motion)";
58
+ readonly type: {
59
+ readonly display: "var(--xp-text-display)";
60
+ readonly title: "var(--xp-text-title)";
61
+ readonly body: "var(--xp-text-body)";
62
+ readonly small: "var(--xp-text-small)";
63
+ };
33
64
  readonly radius: {
65
+ readonly control: "var(--xp-radius-control)";
66
+ readonly card: "var(--xp-radius-card)";
67
+ readonly chip: "var(--xp-radius-chip)";
34
68
  readonly small: "var(--xp-radius)";
35
69
  readonly large: "var(--xp-radius-large)";
36
70
  };
@@ -41,8 +75,12 @@ export declare const theme: {
41
75
  readonly 4: "var(--xp-space-4)";
42
76
  readonly 5: "var(--xp-space-5)";
43
77
  readonly 6: "var(--xp-space-6)";
78
+ readonly 7: "var(--xp-space-7)";
79
+ readonly 8: "var(--xp-space-8)";
44
80
  };
45
81
  readonly font: {
82
+ readonly mono: "var(--xp-mono)";
83
+ readonly family: "var(--xp-font)";
46
84
  readonly body: "var(--xp-font-body)";
47
85
  readonly small: "var(--xp-font-size-small)";
48
86
  readonly size: "var(--xp-font-size-body)";
@@ -1,8 +1,31 @@
1
+ /** Host accent rules (reference surfaces are defined by theme.css):
2
+ * (i) Foreground on accent, hover and active fills reaches 4.5:1 in both themes.
3
+ * (ii) Accent text moves toward the surface's opposite to reach 4.5:1; if the
4
+ * bounded search fails, use the neutral text token and underline it.
5
+ * (iii) Focus reaches 3:1 against the surface: darken on light, lighten on dark.
6
+ */ export { deriveAccent } from '../ui/accent.js';
1
7
  /** every Payload token reference lives in theme.css; porting to Payload 4 edits that file only */ export const theme = {
2
8
  color: {
3
9
  bg: 'var(--xp-bg)',
4
10
  text: 'var(--xp-text)',
5
11
  surface: 'var(--xp-surface)',
12
+ surface2: 'var(--xp-surface-2)',
13
+ surface3: 'var(--xp-surface-3)',
14
+ text2: 'var(--xp-text-2)',
15
+ text3: 'var(--xp-text-3)',
16
+ accentHover: 'var(--xp-accent-hover)',
17
+ accentActive: 'var(--xp-accent-active)',
18
+ accentText: 'var(--xp-accent-text)',
19
+ accentSubtle: 'var(--xp-accent-subtle)',
20
+ accentFg: 'var(--xp-accent-fg)',
21
+ focus: 'var(--xp-focus)',
22
+ successBorder: 'var(--xp-success-border)',
23
+ warningBorder: 'var(--xp-warning-border)',
24
+ errorBg: 'var(--xp-error-bg)',
25
+ errorBorder: 'var(--xp-error-border)',
26
+ seriesA: 'var(--xp-series-a)',
27
+ seriesB: 'var(--xp-series-b)',
28
+ seriesMuted: 'var(--xp-series-muted)',
6
29
  surfaceRaised: 'var(--xp-surface-raised)',
7
30
  border: 'var(--xp-border)',
8
31
  borderStrong: 'var(--xp-border-strong)',
@@ -29,7 +52,17 @@
29
52
  error: 'var(--xp-error)',
30
53
  errorText: 'var(--xp-error-text)'
31
54
  },
55
+ motion: 'var(--xp-motion)',
56
+ type: {
57
+ display: 'var(--xp-text-display)',
58
+ title: 'var(--xp-text-title)',
59
+ body: 'var(--xp-text-body)',
60
+ small: 'var(--xp-text-small)'
61
+ },
32
62
  radius: {
63
+ control: 'var(--xp-radius-control)',
64
+ card: 'var(--xp-radius-card)',
65
+ chip: 'var(--xp-radius-chip)',
33
66
  small: 'var(--xp-radius)',
34
67
  large: 'var(--xp-radius-large)'
35
68
  },
@@ -39,9 +72,13 @@
39
72
  3: 'var(--xp-space-3)',
40
73
  4: 'var(--xp-space-4)',
41
74
  5: 'var(--xp-space-5)',
42
- 6: 'var(--xp-space-6)'
75
+ 6: 'var(--xp-space-6)',
76
+ 7: 'var(--xp-space-7)',
77
+ 8: 'var(--xp-space-8)'
43
78
  },
44
79
  font: {
80
+ mono: 'var(--xp-mono)',
81
+ family: 'var(--xp-font)',
45
82
  body: 'var(--xp-font-body)',
46
83
  small: 'var(--xp-font-size-small)',
47
84
  size: 'var(--xp-font-size-body)'
@@ -1,17 +1,32 @@
1
1
  export declare function useApi(): {
2
2
  start: (id: import("../types/contracts.js").DocId) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
3
- allocate: (id: import("../types/contracts.js").DocId, body: import("../types/endpoints.js").AllocateBody) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
4
- addMetric: (id: import("../types/contracts.js").DocId, body: import("../types/endpoints.js").AddMetricBody) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
3
+ allocate: (id: import("../types/contracts.js").DocId, body: import("../types/endpoints.js").AllocateBody, options?: {
4
+ notFound?: string;
5
+ codes?: Readonly<Record<string, string>>;
6
+ fallback?: string;
7
+ }) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
8
+ addMetric: (id: import("../types/contracts.js").DocId, body: import("../types/endpoints.js").AddMetricBody, options?: {
9
+ notFound?: string;
10
+ codes?: Readonly<Record<string, string>>;
11
+ fallback?: string;
12
+ }) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
5
13
  stop: (id: import("../types/contracts.js").DocId) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
6
14
  decide: (id: import("../types/contracts.js").DocId, body: import("../types/endpoints.js").DecideBody) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
7
15
  releaseHoldout: (id: import("../types/contracts.js").DocId) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
16
+ releasePages: (id: import("../types/contracts.js").DocId) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
8
17
  makeContent: (id: import("../types/contracts.js").DocId) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").MakeContentResult>>;
18
+ dismissContentEntry: (id: import("../types/contracts.js").DocId, body: import("../types/endpoints.js").DismissContentEntryBody) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").DismissContentEntryResult>>;
19
+ restoreContentEntry: (id: import("../types/contracts.js").DocId, body: import("../types/endpoints.js").RestoreContentEntryBody) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").RestoreContentEntryResult>>;
9
20
  archive: (id: import("../types/contracts.js").DocId, body: import("../types/endpoints.js").ArchiveBody) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").TransitionSuccess>>;
10
21
  preflight: (id: import("../types/contracts.js").DocId) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").PreflightResult>>;
11
22
  previewToken: (id: import("../types/contracts.js").DocId, arm: string) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").PreviewTokenResult>>;
12
23
  results: (id: import("../types/contracts.js").DocId, options?: {
13
24
  phase?: number;
14
25
  series?: boolean;
26
+ } & {
27
+ notFound?: string;
28
+ codes?: Readonly<Record<string, string>>;
29
+ fallback?: string;
15
30
  }) => Promise<import("./api.js").ApiResult<import("../types/endpoints.js").ResultsResponse>>;
16
31
  recompute: (id: import("../types/contracts.js").DocId) => Promise<import("./api.js").ApiResult<{
17
32
  snapshotId: string;
@@ -1,4 +1,5 @@
1
1
  'use client';
2
+ import { fetchAllDocs } from '../lib/fetchAllDocs.js';
2
3
  import { useConfig } from '@payloadcms/ui';
3
4
  import { useEffect, useState } from 'react';
4
5
  import { layerUsage } from './layerUsage.model.js';
@@ -13,33 +14,23 @@ export function useLayerExperiments(layerId) {
13
14
  if (id == null) return;
14
15
  const controller = new AbortController();
15
16
  async function load() {
16
- const docs = [];
17
- let page = 1;
18
- while(!controller.signal.aborted){
19
- const query = new URLSearchParams({
20
- depth: '0',
21
- limit: '100',
22
- page: String(page),
23
- 'where[layer][equals]': id,
24
- 'where[status][in]': 'running,decided'
25
- });
26
- const response = await fetch(`${api}/xp-experiments?${query}`, {
27
- credentials: 'include',
28
- signal: controller.signal
29
- });
30
- if (!response.ok) {
31
- if (!controller.signal.aborted) setState(null);
32
- return;
33
- }
34
- const data = await response.json();
35
- docs.push(...data.docs);
36
- if (!data.hasNextPage) break;
37
- page++;
17
+ const query = new URLSearchParams({
18
+ depth: '0',
19
+ 'where[layer][equals]': id,
20
+ 'where[status][in]': 'running,decided'
21
+ });
22
+ const response = await fetchAllDocs(`${api}/xp-experiments?${query}`, {
23
+ credentials: 'include',
24
+ signal: controller.signal
25
+ });
26
+ if (!response.ok) {
27
+ if (!controller.signal.aborted) setState(null);
28
+ return;
38
29
  }
39
30
  if (!controller.signal.aborted) setState({
40
31
  api,
41
32
  id: id,
42
- usage: layerUsage(docs)
33
+ usage: layerUsage(response.docs)
43
34
  });
44
35
  }
45
36
  void load().catch(()=>{
@@ -1,4 +1,5 @@
1
- import { jsx as _jsx } from "react/jsx-runtime";
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { accentStyles } from '../../ui/accent.js';
2
3
  import { formatAdminURL } from 'payload/shared';
3
4
  import { notFound, redirect } from 'next/navigation.js';
4
5
  import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
@@ -166,10 +167,19 @@ export async function ExperimentsRootView({ initPageResult, params, searchParams
166
167
  children: SURFACE_COPY.notInstalled
167
168
  });
168
169
  }
169
- return RenderServerComponent({
170
+ const css = accentStyles(options.theme?.accent);
171
+ const surface = RenderServerComponent({
170
172
  Component: XP_TESTS_SURFACE,
171
173
  Fallback: TestsSurfaceFallback,
172
174
  importMap: req.payload.importMap,
173
175
  clientProps
174
176
  });
177
+ return css ? /*#__PURE__*/ _jsxs(_Fragment, {
178
+ children: [
179
+ /*#__PURE__*/ _jsx("style", {
180
+ children: css
181
+ }),
182
+ surface
183
+ ]
184
+ }) : surface;
175
185
  }
@@ -0,0 +1,2 @@
1
+ import type { ServerProps } from 'payload';
2
+ export declare function TestsNavLinkServer({ payload, user, permissions }: Pick<ServerProps, 'payload' | 'user' | 'permissions'>): Promise<string | number | bigint | boolean | import("react").ReactElement<unknown, string | import("react").JSXElementConstructor<any>> | Iterable<import("react").ReactNode> | null | undefined>;
@@ -0,0 +1,43 @@
1
+ import { RenderServerComponent } from '@payloadcms/ui/elements/RenderServerComponent';
2
+ import { SURFACE_COPY } from '../copy/surface.js';
3
+ import { XP_TESTS_NAV_CLIENT } from '../paths.js';
4
+ export async function TestsNavLinkServer({ payload, user, permissions }) {
5
+ const testPermissions = permissions?.collections?.['xp-experiments'];
6
+ if (!user?.collection || testPermissions?.update !== true) return null;
7
+ const result = await payload.find({
8
+ collection: 'payload-preferences',
9
+ where: {
10
+ and: [
11
+ {
12
+ key: {
13
+ equals: 'nav'
14
+ }
15
+ },
16
+ {
17
+ 'user.relationTo': {
18
+ equals: user.collection
19
+ }
20
+ },
21
+ {
22
+ 'user.value': {
23
+ equals: user.id
24
+ }
25
+ }
26
+ ]
27
+ },
28
+ limit: 1,
29
+ pagination: false,
30
+ depth: 0,
31
+ user,
32
+ overrideAccess: false
33
+ });
34
+ const value = result.docs[0]?.value;
35
+ // Resolve the CSS-bearing client boundary through Payload's public import map.
36
+ return RenderServerComponent({
37
+ Component: XP_TESTS_NAV_CLIENT,
38
+ importMap: payload.importMap,
39
+ clientProps: {
40
+ isOpen: value?.groups?.[SURFACE_COPY.title]?.open ?? true
41
+ }
42
+ });
43
+ }
@@ -0,0 +1,6 @@
1
+ import type { ArmIssueCode } from '../types/endpoints.js';
2
+ export declare const ISSUE_COPY: Record<ArmIssueCode, string>;
3
+ export declare function issueMessage(issue: {
4
+ code: string;
5
+ message: string;
6
+ }, total: number): string;
@@ -0,0 +1,16 @@
1
+ export const ISSUE_COPY = {
2
+ 'weights-total': 'Weights must add up to 100%. They add up to {total}% now.',
3
+ 'control-count': 'Include exactly one Original.',
4
+ 'control-first': 'Put the Original first.',
5
+ 'holdout-last': 'Put the holdout last.',
6
+ 'holdout-count': 'Include only one holdout.',
7
+ 'variant-count': 'Include up to three variants.',
8
+ 'duplicate-key': 'Each group must have a different standard name.',
9
+ 'duplicate-slot': 'Each group must have a different content slot.',
10
+ 'slot-required': 'Choose the matching content slot for this group.',
11
+ 'invalid-key': 'Use the standard group names: Original, Variant A–C, Holdout.'
12
+ };
13
+ export function issueMessage(issue, total) {
14
+ const copy = Object.hasOwn(ISSUE_COPY, issue.code) ? ISSUE_COPY[issue.code] : issue.message;
15
+ return copy.replace('{total}', String(total));
16
+ }
@@ -0,0 +1,23 @@
1
+ import type { ArmIssue } from '../collections/experiments/armInvariants.js';
2
+ import type { Arm, ArmKey, ExperimentKind } from '../types/contracts.js';
3
+ export declare function defaultArms(kind?: ExperimentKind): Arm[];
4
+ /** Keep content slots in step with the experiment kind, including an unset kind. */
5
+ export declare function withSlotsFor(arms: Arm[], kind?: ExperimentKind): Arm[];
6
+ export declare function totalWeight(arms: Arm[]): number;
7
+ export declare function addVariant(arms: Arm[], kind?: ExperimentKind): Arm[];
8
+ export declare function removeArm(arms: Arm[], key: ArmKey): Arm[];
9
+ export declare function addHoldoutArm(arms: Arm[]): Arm[];
10
+ export declare function removeHoldout(arms: Arm[]): Arm[];
11
+ export declare function splitEvenly(arms: Arm[]): Arm[];
12
+ export declare function setWeight(arms: Arm[], key: ArmKey, weight: number): Arm[];
13
+ export declare function issuesByRow(arms: Arm[], kind?: ExperimentKind): {
14
+ rows: ArmIssue[][];
15
+ form: ArmIssue[];
16
+ };
17
+ export declare const ARM_FIELDS: readonly ["key", "label", "weight", "kind", "slot", "params", "pageTarget"];
18
+ /** Payload arrays store each row's values at separate field paths. */
19
+ export declare function readArms(fields: Record<string, {
20
+ value?: unknown;
21
+ }>, path?: string): Arm[];
22
+ /** Keep the edited share exact and distribute the remaining whole percentages proportionally. */
23
+ export declare function balanceWeight(arms: Arm[], key: ArmKey, weight: number): Arm[];