@rydr/game-sdk 8.1.0 → 8.3.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 (74) hide show
  1. package/dist/client/PlatformClient.d.ts.map +1 -1
  2. package/dist/client/PlatformClient.js +3 -5
  3. package/dist/client/PlatformClient.js.map +1 -1
  4. package/dist/protocol/buttons.d.ts +17 -0
  5. package/dist/protocol/buttons.d.ts.map +1 -1
  6. package/dist/protocol/buttons.js +24 -0
  7. package/dist/protocol/buttons.js.map +1 -1
  8. package/dist/protocol/version.d.ts +1 -1
  9. package/dist/protocol/version.js +1 -1
  10. package/dist/ui/README.md +63 -5
  11. package/dist/ui/action-marker.d.ts +187 -0
  12. package/dist/ui/action-marker.d.ts.map +1 -0
  13. package/dist/ui/action-marker.js +726 -0
  14. package/dist/ui/action-marker.js.map +1 -0
  15. package/dist/ui/controller/combo-demo.d.ts +13 -4
  16. package/dist/ui/controller/combo-demo.d.ts.map +1 -1
  17. package/dist/ui/controller/combo-demo.js +55 -21
  18. package/dist/ui/controller/combo-demo.js.map +1 -1
  19. package/dist/ui/controller/control-spotlight.d.ts +188 -0
  20. package/dist/ui/controller/control-spotlight.d.ts.map +1 -0
  21. package/dist/ui/controller/control-spotlight.js +563 -0
  22. package/dist/ui/controller/control-spotlight.js.map +1 -0
  23. package/dist/ui/controller/control-trainer.d.ts.map +1 -1
  24. package/dist/ui/controller/control-trainer.js +6 -22
  25. package/dist/ui/controller/control-trainer.js.map +1 -1
  26. package/dist/ui/controller/controller-map.d.ts +20 -0
  27. package/dist/ui/controller/controller-map.d.ts.map +1 -1
  28. package/dist/ui/controller/controller-map.js +115 -56
  29. package/dist/ui/controller/controller-map.js.map +1 -1
  30. package/dist/ui/controller/controller-pad.d.ts +9 -3
  31. package/dist/ui/controller/controller-pad.d.ts.map +1 -1
  32. package/dist/ui/controller/controller-pad.js +7 -7
  33. package/dist/ui/controller/controller-pad.js.map +1 -1
  34. package/dist/ui/controller/index.d.ts +2 -0
  35. package/dist/ui/controller/index.d.ts.map +1 -1
  36. package/dist/ui/controller/index.js +2 -0
  37. package/dist/ui/controller/index.js.map +1 -1
  38. package/dist/ui/controller/input-chip.js +3 -3
  39. package/dist/ui/controller/input-chip.js.map +1 -1
  40. package/dist/ui/controller/live-presses.d.ts +68 -0
  41. package/dist/ui/controller/live-presses.d.ts.map +1 -0
  42. package/dist/ui/controller/live-presses.js +71 -0
  43. package/dist/ui/controller/live-presses.js.map +1 -0
  44. package/dist/ui/controller/pad-svg.d.ts +37 -3
  45. package/dist/ui/controller/pad-svg.d.ts.map +1 -1
  46. package/dist/ui/controller/pad-svg.js +45 -5
  47. package/dist/ui/controller/pad-svg.js.map +1 -1
  48. package/dist/ui/controller/parts-map.d.ts +51 -3
  49. package/dist/ui/controller/parts-map.d.ts.map +1 -1
  50. package/dist/ui/controller/parts-map.js +76 -4
  51. package/dist/ui/controller/parts-map.js.map +1 -1
  52. package/dist/ui/controller/styles.d.ts.map +1 -1
  53. package/dist/ui/controller/styles.js +147 -9
  54. package/dist/ui/controller/styles.js.map +1 -1
  55. package/dist/ui/index.d.ts +1 -0
  56. package/dist/ui/index.d.ts.map +1 -1
  57. package/dist/ui/index.js +1 -0
  58. package/dist/ui/index.js.map +1 -1
  59. package/dist/ui/keycap.d.ts +7 -1
  60. package/dist/ui/keycap.d.ts.map +1 -1
  61. package/dist/ui/keycap.js.map +1 -1
  62. package/dist/ui/option-menu.d.ts +3 -2
  63. package/dist/ui/option-menu.d.ts.map +1 -1
  64. package/dist/ui/option-menu.js +5 -0
  65. package/dist/ui/option-menu.js.map +1 -1
  66. package/dist/ui/showcase/gallery.d.ts +12 -3
  67. package/dist/ui/showcase/gallery.d.ts.map +1 -1
  68. package/dist/ui/showcase/gallery.js +16 -7
  69. package/dist/ui/showcase/gallery.js.map +1 -1
  70. package/dist/ui/showcase/index.d.ts +4 -3
  71. package/dist/ui/showcase/index.d.ts.map +1 -1
  72. package/dist/ui/showcase/index.js +223 -13
  73. package/dist/ui/showcase/index.js.map +1 -1
  74. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"option-menu.js","sourceRoot":"","sources":["../../src/ui/option-menu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmDG;AAGH,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAAE,gBAAgB,EAAgC,MAAM,uBAAuB,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,kBAAkB,GAKnB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAexC;;;;;GAKG;AACH,SAAS,eAAe,CAAC,IAAuB;IAC9C,IAAI,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,OAA2E,CAAC;IAC/F,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,iBAAiB,CAAC;AACjE,CAAC;AAiFD,uEAAuE;AACvE,MAAM,UAAU,GAA0B,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAC1E,sGAAsG;AACtG,MAAM,kBAAkB,GAAG,IAAI,CAAC;AAEhC;;;;;;GAMG;AACH,SAAS,cAAc,CAAC,MAAkB,EAAE,KAAmB,EAAE,QAAkB;IACjF,oGAAoG;IACpG,sGAAsG;IACtG,sGAAsG;IACtG,qFAAqF;IACrF,MAAM,IAAI,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAe,EAAE,KAAK,EAAE,kBAAkB,EAAE,CAAC;IACtG,IAAI,eAAe,CAAC,MAAM,CAAC;QAAE,OAAO,YAAY,CAAC,MAAuB,EAAE,IAAI,CAAC,CAAC;IAChF,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,gBAAgB,CAAC,MAAmB,EAAE,IAAI,CAAC,CAAC;IACpF,OAAO,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED,2EAA2E;AAC3E,MAAM,OAAO,GAAG,GAAG,CAAC;AACpB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,gFAAgF;AAChF,MAAM,SAAS,GAAG,GAAG,CAAC;AAEtB,IAAI,iBAAiB,GAAG,KAAK,CAAC;AAE9B,SAAS,eAAe;IACtB,IAAI,iBAAiB,IAAI,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAC,EAAE,CAAC;QACpE,iBAAiB,GAAG,IAAI,CAAC;QACzB,OAAO;IACT,CAAC;IACD,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,CAAC,EAAE,GAAG,iBAAiB,CAAC;IAC7B,KAAK,CAAC,WAAW,GAAG,GAAG,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,iBAAiB,GAAG,IAAI,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,IAAiB,EAAE,IAAuB;IACxE,SAAS,EAAE,CAAC,CAAC,qCAAqC;IAClD,eAAe,EAAE,CAAC;IAElB,MAAM,EACJ,OAAO,EACP,UAAU,GAAG,SAAS,EACtB,WAAW,GAAG,QAAQ,EACtB,YAAY,GAAG,IAAI,EACnB,GAAG,GACJ,GAAG,IAAI,CAAC;IACT,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvC,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,UAAU,GAAyC,IAAI,CAAC;IAC5D,IAAI,YAAY,GAAwB,IAAI,CAAC;IAC7C,IAAI,GAAG,GAAsB,IAAI,CAAC;IAClC,0EAA0E;IAC1E,IAAI,IAAI,GAAkB,EAAE,CAAC;IAC7B,mEAAmE;IACnE,IAAI,QAAQ,GAAqB,EAAE,CAAC;IACpC,sEAAsE;IACtE,IAAI,OAAO,GAAa,EAAE,CAAC;IAE3B,kGAAkG;IAClG,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC3C,IAAI,CAAC,SAAS,GAAG,aAAa,CAAC;IAC/B,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IACnB,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,oBAAoB,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;IACvE,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,KAAK,CAAC,SAAS,GAAG,mBAAmB,CAAC;IACtC,MAAM,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,CAAC,SAAS,GAAG,mBAAmB,CAAC;IACxC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;IACjC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC7C,MAAM,CAAC,SAAS,GAAG,kBAAkB,CAAC;IACtC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACxB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAEvB,mFAAmF;IACnF,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;QACnC,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI;YAAE,KAAK,EAAE,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,kGAAkG;IAClG,kGAAkG;IAClG,mGAAmG;IACnG,2EAA2E;IAC3E,MAAM,YAAY,GAAG,IAAI,GAAG,EAAuD,CAAC;IACpF,MAAM,SAAS,GAAiB;QAC9B,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE;YACf,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACrB,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,CAAC;KACF,CAAC;IAEF;;;;;;OAMG;IACH,MAAM,UAAU,GAAG,YAAY,CAAC,cAAc,EAAE;QAC9C,OAAO,EAAE,MAAM;QACf,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,SAAS;QAChB,QAAQ;KACT,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE/C,kGAAkG;IAClG,SAAS,SAAS;QAChB,KAAK,MAAM,GAAG,IAAI,OAAO;YAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QACzC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;QACxB,QAAQ,GAAG,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAE,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,GAAG,KAAK,CAAC,CAAC;QACxF,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC7C,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC;YACpB,GAAG,CAAC,SAAS,GAAG,iBAAiB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACnE,IAAI,IAAI,CAAC,QAAQ;gBAAE,GAAG,CAAC,QAAQ,GAAG,IAAI,CAAC;YACvC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAE/D,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,SAAS,GAAG,kBAAkB,CAAC;YACpC,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC7C,KAAK,CAAC,SAAS,GAAG,mBAAmB,CAAC;YACtC,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC;YAC/B,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC5C,IAAI,CAAC,SAAS,GAAG,kBAAkB,CAAC;gBACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC;gBAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YAEtB,8FAA8F;YAC9F,6FAA6F;YAC7F,iGAAiG;YACjG,+FAA+F;YAC/F,8FAA8F;YAC9F,wEAAwE;YACxE,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,MAAM,QAAQ,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAChD,QAAQ,CAAC,SAAS,GAAG,sBAAsB,CAAC;gBAC5C,MAAM,GAAG,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;gBAC3C,GAAG,CAAC,SAAS,GAAG,0BAA0B,CAAC;gBAC3C,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC;gBAC7B,MAAM,GAAG,GAAG,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAClB,IAAI,IAAI,CAAC,QAAQ;oBAAE,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBACzC,QAAQ,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7B,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;YAED,MAAM,KAAK,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC7C,KAAK,CAAC,SAAS,GAAG,mBAAmB,CAAC;YACtC,+FAA+F;YAC/F,uEAAuE;YACvE,MAAM,IAAI,GAAG,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YAC5C,IAAI,CAAC,SAAS,GAAG,qBAAqB,CAAC;YACvC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;YACxB,GAAG,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAEvB,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YACxB,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;;;OAKG;IACH,SAAS,cAAc;QACrB,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,GAAG,CAAC,CAAC;QACnC,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,GAAG,GAAG,CAAC,YAAY,GAAG,CAAC,CAAC;YAChD,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,oGAAoG;IACpG,SAAS,QAAQ;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,MAAM,IAAI,GAAG,GAAG,EAAE,aAAa,CAAC,sBAAsB,CAAC,CAAC;QACxD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,UAAU,CAAC,EAAE,CAAC,UAAU,KAAK,IAAI;YAAE,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,kGAAkG;IAClG;;;OAGG;IACH,SAAS,MAAM,CAAC,CAAS;QACvB,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QACnC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC;QACpD,GAAG,EAAE,CAAC,aAAa,CAAC,CAAC;QACrB,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,QAAQ,EAAE,CAAC;YAChB,OAAO;QACT,CAAC;QACD,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,QAAQ,EAAE,CAAC;IAClB,CAAC;IAED,kGAAkG;IAClG,mEAAmE;IACnE,SAAS,YAAY,CAAC,IAAgB;QACpC,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,IAAI,KAAK,UAAU;gBAAE,OAAO,KAAK,CAAC;YACtC,OAAO,QAAQ,EAAE,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,KAAK,UAAU,EAAE,CAAC;YACxB,KAAK,EAAE,CAAC;YACR,OAAO,IAAI,CAAC;QACd,CAAC;QACD,kGAAkG;QAClG,mDAAmD;QACnD,MAAM,aAAa,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,IAAI,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,aAAa,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,CAAC,aAAa,CAAC,CAAC;YACtB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,qDAAqD;QACxE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gGAAgG;IAChG,SAAS,MAAM,CAAC,CAAyC;QACvD,KAAK,MAAM,EAAE,IAAI,YAAY;YAAE,EAAE,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IAED,qGAAqG;IACrG,qGAAqG;IACrG,gFAAgF;IAChF,MAAM,UAAU,GAAG,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE;QACzC,IAAI,YAAY;YAAE,OAAO,CAAC,kCAAkC;QAC5D,MAAM,CAAC,CAAC,CAAC,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,kGAAkG;IAClG,SAAS,QAAQ;QACf,IAAI,IAAI;YAAE,OAAO,IAAI,CAAC;QACtB,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;YAAE,OAAO,KAAK,CAAC;QAClD,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;YACxB,YAAY,CAAC,UAAU,CAAC,CAAC;YACzB,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;QACZ,OAAO,GAAG,KAAK,CAAC;QAChB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,SAAS,EAAE,CAAC;QACZ,cAAc,EAAE,CAAC;QAEjB,IAAI,YAAY,IAAI,OAAO,EAAE,SAAS;YAAE,YAAY,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QACjF,+FAA+F;QAC/F,kEAAkE;QAElE,4FAA4F;QAC5F,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;QAEf,GAAG,GAAG,gBAAgB,CAAC;YACrB,IAAI,EAAE,MAAM;YACZ,QAAQ,EAAE,kCAAkC;YAC5C,IAAI,EAAE,KAAK,EAAE,2BAA2B;YACxC,IAAI,EAAE,IAAI,EAAE,8DAA8D;YAC1E,OAAO,EAAE,IAAI,EAAE,6CAA6C;YAC5D,GAAG;YACH,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAC5C,MAAM,EAAE,KAAK;YACb,aAAa,EAAE,GAAG,EAAE,CAAC,QAAQ,EAAE;SAChC,CAAC,CAAC;QACH,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,oCAAoC;QACtD,QAAQ,EAAE,CAAC;QACX,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;QAChB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS,KAAK;QACZ,IAAI,CAAC,IAAI,IAAI,CAAC,OAAO;YAAE,OAAO;QAC9B,IAAI,UAAU,KAAK,IAAI;YAAE,OAAO,CAAC,kBAAkB;QACnD,IAAI,GAAG,KAAK,CAAC;QACb,OAAO,GAAG,IAAI,CAAC;QACf,+FAA+F;QAC/F,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAE9B,YAAY,EAAE,EAAE,CAAC;QACjB,YAAY,GAAG,IAAI,CAAC;QACpB,GAAG,EAAE,OAAO,EAAE,CAAC;QACf,GAAG,GAAG,IAAI,CAAC;QACX,kFAAkF;QAClF,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC;QACvB,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC;QAClB,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;QAEjB,UAAU,GAAG,UAAU,CAAC,GAAG,EAAE;YAC3B,UAAU,GAAG,IAAI,CAAC;YAClB,OAAO,GAAG,KAAK,CAAC;YAChB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YACjC,MAAM,CAAC,WAAW,GAAG,EAAE,CAAC;YACxB,KAAK,MAAM,GAAG,IAAI,OAAO;gBAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YACzC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,EAAE,CAAC;QACZ,CAAC,EAAE,OAAO,GAAG,IAAI,CAAC,MAAM,GAAG,UAAU,GAAG,GAAG,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,IAAI;QACJ,IAAI,EAAE,QAAQ;QACd,KAAK;QACL,MAAM,EAAE,GAAG,EAAE;YACX,IAAI,IAAI,EAAE,CAAC;gBACT,KAAK,EAAE,CAAC;gBACR,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,QAAQ,EAAE,CAAC;QACpB,CAAC;QACD,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI;QAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE;YACjB,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC;YAClB,IAAI,IAAI,EAAE,CAAC;gBACT,SAAS,EAAE,CAAC;gBACZ,cAAc,EAAE,CAAC;gBACjB,GAAG,EAAE,UAAU,EAAE,CAAC;gBAClB,GAAG,EAAE,UAAU,EAAE,CAAC;gBAClB,QAAQ,EAAE,CAAC;YACb,CAAC;QACH,CAAC;QACD,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;YAClB,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;QAC9B,CAAC;QACD,YAAY;QACZ,OAAO,EAAE,GAAG,EAAE;YACZ,UAAU,EAAE,EAAE,CAAC;YACf,YAAY,EAAE,EAAE,CAAC;YACjB,YAAY,GAAG,IAAI,CAAC;YACpB,8FAA8F;YAC9F,yDAAyD;YACzD,IAAI,GAAG,KAAK,CAAC;YACb,IAAI,UAAU,KAAK,IAAI;gBAAE,YAAY,CAAC,UAAU,CAAC,CAAC;YAClD,GAAG,EAAE,OAAO,EAAE,CAAC;YACf,GAAG,GAAG,IAAI,CAAC;YACX,KAAK,MAAM,GAAG,IAAI,OAAO;gBAAE,GAAG,CAAC,OAAO,EAAE,CAAC;YACzC,OAAO,GAAG,EAAE,CAAC;YACb,UAAU,CAAC,OAAO,EAAE,CAAC;YACrB,YAAY,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;sEAwE0D,OAAO;iDAC5B,UAAU;4EACiB,OAAO;0EACT,OAAO;gDACjC,UAAU;gFACsB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA4BtF,CAAC"}
1
+ {"version":3,"file":"option-menu.js","sourceRoot":"","sources":["../../src/ui/option-menu.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,8 @@
4
4
  * live demos (cooldown rings, the typewriter dialogue). Self-contained: it injects its own `gw-*`
5
5
  * chrome CSS. Not exported from the package — internal to the showcase entry.
6
6
  */
7
- import type { AxisName, ButtonName, ButtonEdge, GlyphSet } from "../../protocol/index.js";
7
+ import type { AxisName, ButtonEdge, GlyphSet } from "../../protocol/index.js";
8
+ import type { ControlName } from "../controller/tokens.js";
8
9
  /**
9
10
  * The thin slice of a `PlatformSession` the showcase consumes — so a host can pass its real session
10
11
  * (live watts + real button reflection) and a `PlatformSession` satisfies this structurally, while a
@@ -15,8 +16,16 @@ import type { AxisName, ButtonName, ButtonEdge, GlyphSet } from "../../protocol/
15
16
  * `hardware.subscribe` + `glyphSet` are what let the pad re-letter itself when a controller is swapped.
16
17
  */
17
18
  export interface ShowcaseSession {
19
+ /**
20
+ * Typed on {@link ControlName} — `ButtonName` PLUS the shell-owned controls (`LB`/`RB`), exactly like
21
+ * `PadInputSource`. A `PlatformSession` only ever emits the `ButtonName` subset and still satisfies
22
+ * this; a SHELL host, which is the only thing that can see the resistance shoulders at all (they're
23
+ * consumed by its own rider knobs, never forwarded to a guest), can merge them in — and the catalog's
24
+ * pads light them, since a live input monitor showing nothing for a press the rider just made is a
25
+ * lie about the hardware.
26
+ */
18
27
  onButton(cb: (e: {
19
- name: ButtonName;
28
+ name: ControlName;
20
29
  edge: ButtonEdge;
21
30
  }) => void): () => void;
22
31
  hardware: {
@@ -34,7 +43,7 @@ export interface ShowcaseSession {
34
43
  };
35
44
  /** Analog stick positions, −1..1 (right = +1, up = +1). */
36
45
  axis?(name: AxisName): number;
37
- buttonsDown?(): ButtonName[];
46
+ buttonsDown?(): ControlName[];
38
47
  }
39
48
  /** Append a classed element (optionally with innerHTML) to `parent` and return it. */
40
49
  export declare function el(parent: HTMLElement, tag: string, className: string, html?: string): HTMLElement;
@@ -1 +1 @@
1
- {"version":3,"file":"gallery.d.ts","sourceRoot":"","sources":["../../../src/ui/showcase/gallery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAE1F;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC9E,QAAQ,EAAE;QACR,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;SAAE,CAAC;QAChD,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;SAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;KACxF,CAAC;IACF,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,2DAA2D;IAC3D,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,IAAI,UAAU,EAAE,CAAC;CAC9B;AAED,sFAAsF;AACtF,wBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAMlG;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,CAAC,EAAE,wBAAwB,CAAA;CAAE,CAYzH;AAED,MAAM,WAAW,cAAc;IAC7B,sGAAsG;IACtG,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,oFAAoF;AACpF,qBAAa,OAAO;IAClB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,IAAI,CAAK;gBAEL,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE;IAuB3G,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW;IAIhD,GAAG,CAAC,IAAI,GAAE,cAAmB,GAAG,IAAI;IAYpC,OAAO,IAAI,IAAI;CAKhB"}
1
+ {"version":3,"file":"gallery.d.ts","sourceRoot":"","sources":["../../../src/ui/showcase/gallery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC9B;;;;;;;OAOG;IACH,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,UAAU,CAAA;KAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;IAC/E,QAAQ,EAAE;QACR,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;SAAE,CAAC;QAChD,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;SAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC;KACxF,CAAC;IACF,QAAQ,EAAE;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1B,2DAA2D;IAC3D,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,IAAI,WAAW,EAAE,CAAC;CAC/B;AAED,sFAAsF;AACtF,wBAAgB,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,WAAW,CAMlG;AAED,wDAAwD;AACxD,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,iBAAiB,CAAC;IAAC,CAAC,EAAE,wBAAwB,CAAA;CAAE,CAYzH;AAED,MAAM,WAAW,cAAc;IAC7B,sGAAsG;IACtG,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,6FAA6F;IAC7F,QAAQ,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC;AAED,oFAAoF;AACpF,qBAAa,OAAO;IAClB,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAC3B,OAAO,CAAC,KAAK,CAAmB;IAChC,OAAO,CAAC,MAAM,CAAc;IAC5B,OAAO,CAAC,GAAG,CAAK;IAChB,OAAO,CAAC,IAAI,CAAK;gBAEL,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAA;KAAE;IAwB3G,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,WAAW;IAIhD,GAAG,CAAC,IAAI,GAAE,cAAmB,GAAG,IAAI;IAYpC,OAAO,IAAI,IAAI;CAKhB"}
@@ -41,11 +41,11 @@ export class Gallery {
41
41
  host.appendChild(this.style);
42
42
  this.list = document.createElement("div");
43
43
  this.list.className = "gw-list";
44
- // The chrome text (title, captions, section labels, watts readout) all inherit this colour; the
45
- // component cards/keycaps carry their own. `dark` (default) = light text for a dark game screen;
46
- // `light` = dark text for a host on a light background. The keycaps/cards are unchanged either way.
47
- if ((opts.theme ?? "dark") === "light")
48
- this.list.style.color = "#0e1726";
44
+ // The chrome text (title, captions, section labels, watts readout) is ALWAYS light see BASE_CSS.
45
+ // `theme` is kept as an accepted-but-ignored option so existing hosts still compile; it used to flip
46
+ // the ink to #0e1726, which turned the catalog dark-on-dark on every host that actually renders it
47
+ // (all of them: the components the catalog shows are dark-surface art).
48
+ void opts.theme;
49
49
  host.appendChild(this.list);
50
50
  el(this.list, "div", "gw-head", `<div><div class="gw-title">${opts.title}</div><div class="gw-sub">${opts.sub}</div></div>` +
51
51
  `<div class="gw-power"><b>—</b> W</div>`);
@@ -72,10 +72,19 @@ export class Gallery {
72
72
  this.style.remove();
73
73
  }
74
74
  }
75
- /** Shared chrome styles (`gw-` prefix). */
75
+ /**
76
+ * Shared chrome styles (`gw-` prefix).
77
+ *
78
+ * The ink is a hard `#eef4ff`, not an inherit: the catalog's own subject matter — keycaps, dark-glass
79
+ * cards, the controller pad — is dark-surface art, so the catalog is only ever read on a dark surface.
80
+ * A host's own text colour must not leak in and take the captions with it. And since the light ink only
81
+ * holds on a dark ground, the list PAINTS its own: it is already a fixed, full-viewport overlay, so it
82
+ * owns every pixel behind the chrome rather than trusting whatever the host put there.
83
+ */
76
84
  const BASE_CSS = `
77
85
  .gw-list { position: fixed; inset: 0; overflow-y: auto; overflow-x: hidden; z-index: 1;
78
- padding: clamp(1rem, 4vw, 3rem) clamp(1rem, 4vw, 3rem) 4rem; color: #eef4ff;
86
+ padding: clamp(1rem, 4vw, 3rem) clamp(1rem, 4vw, 3rem) 4rem;
87
+ color: #eef4ff; background: #0b0f17;
79
88
  font-family: system-ui, sans-serif;
80
89
  display: flex; flex-direction: column; gap: 1rem; }
81
90
  .gw-head { display: flex; align-items: baseline; justify-content: space-between; gap: 1rem; flex-wrap: wrap; }
@@ -1 +1 @@
1
- {"version":3,"file":"gallery.js","sourceRoot":"","sources":["../../../src/ui/showcase/gallery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gallery.js","sourceRoot":"","sources":["../../../src/ui/showcase/gallery.ts"],"names":[],"mappings":"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"}
@@ -21,9 +21,10 @@ export interface UiShowcaseOptions {
21
21
  */
22
22
  session?: ShowcaseSession;
23
23
  /**
24
- * Catalog chrome text colour for the host's background: `"dark"` (default) = light text for a dark
25
- * surface; `"light"` = dark text for a light surface. Only the chrome (titles, captions, section
26
- * labels, watts readout) flips the keycaps and dark-glass cards are unchanged on either.
24
+ * @deprecated Accepted and IGNORED the catalog chrome is always light text. Everything it shows
25
+ * (keycaps, dark-glass cards, the controller pad) is dark-surface art, so the catalog is only ever
26
+ * read on a dark surface; `"light"` produced dark-on-dark chrome instead. Kept so existing hosts
27
+ * compile; drop it from your call.
27
28
  */
28
29
  theme?: "dark" | "light";
29
30
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/showcase/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA2CH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE7E,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AA6DpD,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,iBAAsB,GAAG,UAAU,CAunB3F"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/ui/showcase/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAkDH,OAAO,EAA2B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAE7E,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAkFpD,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B;;;;;OAKG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,mGAAmG;AACnG,wBAAgB,eAAe,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,GAAE,iBAAsB,GAAG,UAAU,CA+xB3F"}
@@ -12,7 +12,7 @@
12
12
  * components never pulls the catalog into its bundle. Pass a real `session` for live watts + real
13
13
  * button reflection; omit it and the catalog renders static.
14
14
  */
15
- import { createKeycap, createDpadKeycap, mountCard, mountActionCard, mountActionDiamond, mountDialogueCard, mountChoiceCard, mountLabeledDiamond, mountSoloLabeledDiamond, mountRarityCard, mountOptionMenu, createPowerRace, mountControllerPad, mountControllerMap, mountComboDemo, mountControlTrainer, createInputChip, RARITY, } from "../index.js";
15
+ import { createKeycap, createDpadKeycap, mountCard, mountActionCard, mountActionDiamond, mountDialogueCard, mountChoiceCard, mountLabeledDiamond, mountSoloLabeledDiamond, mountRarityCard, mountOptionMenu, createPowerRace, createActionMarker, MARKER_COLORS, mountControllerPad, mountControllerMap, mountComboDemo, mountControlTrainer, mountControlSpotlight, createInputChip, RARITY, } from "../index.js";
16
16
  import { Gallery, el, makeCanvas } from "./gallery.js";
17
17
  const FACES = ["DIAMOND_DOWN", "DIAMOND_LEFT", "DIAMOND_UP", "DIAMOND_RIGHT"];
18
18
  const DIRS = ["UP", "RIGHT", "DOWN", "LEFT"];
@@ -42,9 +42,9 @@ const CHOICE_OPTIONS = ["The northern grass", "The river crossing", "The old min
42
42
  * layout, which is what has to keep working across four very different control arrangements.
43
43
  */
44
44
  const CONTROL_SCHEME = [
45
- { label: "Se déplacer", combo: ["LSTICK"], hint: "Stick gauche" },
45
+ { label: "Se déplacer", combo: ["LSTICK"] },
46
46
  { label: "Freiner", combo: ["LT"] },
47
- { label: "Dash", combo: ["LSTICK_PRESS", "LT"], hint: "Clic stick + gâchette" },
47
+ { label: "Dash", combo: ["LSTICK_PRESS", "LT"] },
48
48
  { label: "Viser", combo: ["RSTICK"] },
49
49
  { label: "Sauter", combo: ["DIAMOND_DOWN"] },
50
50
  { label: "Tir chargé", combo: ["RT", "DIAMOND_DOWN"], hint: "Maintenir" },
@@ -66,6 +66,25 @@ const PAD_FAMILIES = [
66
66
  { caption: "Switch Pro", glyphSet: "nintendo" },
67
67
  { caption: "Zwift Play / Ride", glyphSet: "zwift" },
68
68
  ];
69
+ /**
70
+ * The idle-pip legibility candidates — see the two "Idle pips" sections. Each entry is just a class the
71
+ * catalog puts on a wrapper; the actual tone/edge lives in BS_CSS under the same class, so choosing a
72
+ * winner means moving ONE block into `ui/styles.ts` (and `INACTIVE` in `keycap.ts` for the tone).
73
+ */
74
+ const IDLE_DARK = [
75
+ { cls: "d-rim", name: "D1 · Hairline rim", how: "same #3a424e face, 1.5px inner white rim" },
76
+ { cls: "d-lift", name: "D2 · One step up", how: "#59626f — no edge, just a lighter steel" },
77
+ { cls: "d-halo", name: "D3 · Outer halo", how: "darker #2f353e + a 1.5px ring OUTSIDE the pip" },
78
+ { cls: "d-well", name: "D4 · Recessed well", how: "#262b33 + a bright top lip: reads as a hole" },
79
+ { cls: "d-edge", name: "D5 · Bottom edge", how: "#3a424e + a lit lower lip + faint outer ring" },
80
+ ];
81
+ const IDLE_LIGHT = [
82
+ { cls: "l-ghost", name: "L1 · Ghost steel", how: "#7c8798 — mid-light, still clearly \u201coff\u201d" },
83
+ { cls: "l-frost", name: "L2 · Frost", how: "#aab4c2 — light enough to read across a room" },
84
+ { cls: "l-outline", name: "L3 · Outline only", how: "empty core, 2px white ring: a slot, not a key" },
85
+ { cls: "l-chalk", name: "L4 · Chalk", how: "#d5dbe4 flat, no inner shadow, held at 85%" },
86
+ { cls: "l-pearl", name: "L5 · Pearl + halo", how: "#b9c3d1 with a white halo: pops on any card" },
87
+ ];
69
88
  /** Mount the full UI catalog into `host`. Returns a handle whose `dispose()` tears it all down. */
70
89
  export function mountUiShowcase(host, opts = {}) {
71
90
  const session = opts.session;
@@ -93,9 +112,14 @@ export function mountUiShowcase(host, opts = {}) {
93
112
  const stickChips = [];
94
113
  let map;
95
114
  let demo;
115
+ let spotTour;
116
+ let spotStill;
96
117
  let demoIndex = 0;
97
118
  let demoHold = 0;
98
119
  let demoAdvance;
120
+ /** The action markers, and the anchor walk that drives them — see the marker section. */
121
+ let markers = [];
122
+ let markerFrame;
99
123
  let trainer;
100
124
  /**
101
125
  * A SHELL-side input stand-in, for the guided-lesson section.
@@ -132,6 +156,27 @@ export function mountUiShowcase(host, opts = {}) {
132
156
  },
133
157
  hardware: session?.hardware,
134
158
  };
159
+ /**
160
+ * The shell stand-in and the rider's own session as ONE source.
161
+ *
162
+ * `ShowcaseSession` speaks `ControlName`, so a real shell host reports the shoulders itself and needs no
163
+ * help here — but the catalog also runs on a dev page whose session is a game-side double, and a section
164
+ * that TEACHES a shell control has to be drivable there too. Merging is what makes both true at once:
165
+ * the stand-in supplies `LB`/`RB`, the session supplies everything else, and neither section ends up with
166
+ * a drawing that ignores half of what the rider presses.
167
+ */
168
+ const shellAndGame = {
169
+ onButton: (cb) => {
170
+ const offShell = shellStandIn.onButton(cb);
171
+ const offGame = session?.onButton(cb);
172
+ return () => {
173
+ offShell();
174
+ offGame?.();
175
+ };
176
+ },
177
+ axis: session?.axis?.bind(session),
178
+ hardware: session?.hardware,
179
+ };
135
180
  const launchRace = (o) => {
136
181
  race?.dispose();
137
182
  raceHideT = 0;
@@ -153,6 +198,17 @@ export function mountUiShowcase(host, opts = {}) {
153
198
  el(c, "div", "bs-cap", caption);
154
199
  return stage;
155
200
  };
201
+ // One idle-pip candidate: the same mono diamond (with a coloured one beside it, since the idle tone has
202
+ // to survive both) under the variant's class, captioned with what it actually does.
203
+ const idleCell = (grid, v) => {
204
+ const c = el(grid, "div", "bs-cell");
205
+ const stage = el(c, "div", "bs-stage");
206
+ const row = el(stage, "div", `bs-idle ${v.cls}`);
207
+ row.appendChild(createKeycap("DIAMOND_DOWN", { variant: "full", animate: false }).el);
208
+ row.appendChild(createKeycap("DIAMOND_RIGHT", { variant: "full", colored: true, animate: false }).el);
209
+ el(c, "div", "bs-cap", v.name);
210
+ el(c, "div", "bs-cap sub", v.how);
211
+ };
156
212
  // a generic "icon + name" node — the consumer's OWN content fitted inside a card's fixed slot
157
213
  const iconLabel = (name, color) => {
158
214
  const { canvas, c } = makeCanvas(20, 20);
@@ -212,6 +268,23 @@ export function mountUiShowcase(host, opts = {}) {
212
268
  cooldowns.push({ kc: cd, total: 6 });
213
269
  cell(grid, "Cooldown (on the key)", cd.el);
214
270
  }
271
+ // --- idle-pip legibility studies ---------------------------------------
272
+ // The full diamond's three IDLE siblings are #3a424e, which on a dark card is very nearly the card:
273
+ // the active key reads, the other three barely do, so the diamond stops teaching "there are four of
274
+ // these". Ten candidates, in two families — pick one and it becomes the component's own tone (the
275
+ // overrides live in BS_CSS and are catalog-only until then).
276
+ g.section("Idle pips — DARK candidates (still dark, but legible)", "The three idle siblings keep a dark face; the contrast comes from an EDGE (a rim, a top highlight, a halo) or a small step up in tone — never from turning them light. Compare against \u201cA/B/Y/Z diamond\u201d above, which is today\u2019s #3a424e.");
277
+ {
278
+ const grid = el(g.list, "div", "bs-grid");
279
+ for (const v of IDLE_DARK)
280
+ idleCell(grid, v);
281
+ }
282
+ g.section("Idle pips — LIGHT candidates (light pips on the dark surface)", "The other direction: the idle siblings go light, so the whole cluster sits ON the dark card as one bright object with the white active key as its loud member. Reads at distance; costs some of the \u201cthese three are off\u201d quietness.");
283
+ {
284
+ const grid = el(g.list, "div", "bs-grid");
285
+ for (const v of IDLE_LIGHT)
286
+ idleCell(grid, v);
287
+ }
215
288
  // --- Directional buttons -----------------------------------------------
216
289
  g.section("Directional buttons", "The same state machine as the face buttons (solo/full, pulse, pressed, cooldown). A white chevron on a steel pip, not the bright key hues.");
217
290
  {
@@ -392,12 +465,16 @@ export function mountUiShowcase(host, opts = {}) {
392
465
  // --- live input monitor (dev) -----------------------------------------
393
466
  g.section("Input monitor (dev)", "Every canonical button the session is delivering, live — the whole vocabulary in one readout. " +
394
467
  "Keyboard: arrows = the D-pad / left stick, ZQSD = the face diamond, a/e = LT/RT, o = OPTIONS, " +
395
- "numpad 8·4·5·6 = the RIGHT stick (RUP/RLEFT/RDOWN/RRIGHT), numpad 1 / 3 = LSTICK_PRESS / RSTICK_PRESS.");
468
+ "numpad 8·4·5·6 = the RIGHT stick (RUP/RLEFT/RDOWN/RRIGHT), numpad 1 / 3 = LSTICK_PRESS / RSTICK_PRESS. " +
469
+ "A shell host also feeds the shell-owned shoulders LB/RB (the rider's resistance − / +, which no game " +
470
+ "ever receives); they appear here too.");
396
471
  {
397
472
  const cellWrap = el(g.list, "div", "bs-cell");
398
473
  const readout = el(cellWrap, "div", "bs-cap");
399
474
  readout.style.fontFamily = "ui-monospace, SFMono-Regular, Menlo, monospace";
400
475
  // Insertion-ordered, so the readout reads as "the order you pressed them".
476
+ // `ControlName`, not `ButtonName`: a shell host also feeds the resistance shoulders (`LB`/`RB`), and
477
+ // this readout's whole job is "what is the session delivering right now".
401
478
  const held = new Set();
402
479
  const render = () => {
403
480
  readout.textContent = held.size ? [...held].join(" · ") : "— nothing held —";
@@ -466,7 +543,7 @@ export function mountUiShowcase(host, opts = {}) {
466
543
  ], "Georgia, 'Times New Roman', serif"));
467
544
  }
468
545
  // --- the live controller drawing --------------------------------------
469
- g.section("Controller (live)", "The rider's controller, reflecting real input: buttons light while held, and the stick caps follow the real axes (arrows = left stick, numpad 8/4/5/6 = right). One renderer, one geometry table per shape — a canonical name maps to a POSITION, so `DIAMOND_DOWN` lights the bottom button on every pad while only the printed letter changes. Note the Zwift pod: it genuinely has no sticks and no triggers, so they aren't drawn.");
546
+ g.section("Controller (live)", "The rider's controller, reflecting real input: buttons light while held, and the stick caps follow the real axes (arrows = left stick, numpad 8/4/5/6 = right). One renderer, one geometry table per shape — a canonical name maps to a POSITION, so `DIAMOND_DOWN` lights the bottom button on every pad while only the printed letter changes. Note the Zwift pod: it genuinely has no sticks and no triggers, so they aren't drawn. The only parts drawn faint are View and Guide — the shell's own menu and guide, genuinely not a game's business. The upper L1/R1 bumpers are shell-owned too (they're the rider's resistance − / +) but are drawn at full strength: the rider can always reach for them, so dimming them read as disabled. They LIGHT here as well (`allowShellOwned`) — this catalog is a dev readout of the real input, so a shoulder the rider just pressed must show, even though a game would never see it. Whether they light depends on the host feeding them: a game session can't, the shell can.");
470
547
  {
471
548
  const grid = el(g.list, "div", "bs-grid");
472
549
  const padCell = (caption, node) => {
@@ -477,15 +554,15 @@ export function mountUiShowcase(host, opts = {}) {
477
554
  // First: no explicit glyphSet, so this one FOLLOWS the rider's actual controller and re-letters
478
555
  // itself if they swap pads mid-view.
479
556
  const liveHost = document.createElement("div");
480
- pads.push(mountControllerPad(liveHost, { press, size: "md" }));
557
+ pads.push(mountControllerPad(liveHost, { press, size: "md", allowShellOwned: true }));
481
558
  padCell("Your controller (follows the session)", liveHost);
482
559
  for (const fam of PAD_FAMILIES) {
483
560
  const hostEl = document.createElement("div");
484
- pads.push(mountControllerPad(hostEl, { press, glyphSet: fam.glyphSet, size: "md" }));
561
+ pads.push(mountControllerPad(hostEl, { press, glyphSet: fam.glyphSet, size: "md", allowShellOwned: true }));
485
562
  padCell(fam.caption, hostEl);
486
563
  }
487
564
  const joyHost = document.createElement("div");
488
- pads.push(mountControllerPad(joyHost, { press, brand: "joycon", glyphSet: "nintendo", size: "md" }));
565
+ pads.push(mountControllerPad(joyHost, { press, brand: "joycon", glyphSet: "nintendo", size: "md", allowShellOwned: true }));
489
566
  padCell("Joy-Con pair (brand: \"joycon\")", joyHost);
490
567
  }
491
568
  // --- joystick pictograms: three conventions, side by side --------------
@@ -518,7 +595,7 @@ export function mountUiShowcase(host, opts = {}) {
518
595
  }
519
596
  }
520
597
  // --- STATIC VIEW: the controller map ----------------------------------
521
- g.section("Control map (static)", "A game passes a declarative action list; the SDK owns the rest. Each callout is joined by a line to the button it belongs to and for a combination, the line points at the first NON-GENERIC control, so “Dash” (stick click + trigger) points at the trigger, not at the stick every other action also uses. Sides and column order are derived from where each button physically sits, never hardcoded. Resize the window: the lines re-route. It does NOT react to presses — a reference diagram stays legible by not moving, and a thumb resting on a stick would light half the drawing. Pass `live: true` if you want it to respond (the section above already does).");
598
+ g.section("Control map (static)", "A game passes a declarative action list; the SDK owns the rest. **A callout is the action's name and nothing else** — the line is what says which button, one line per control in the combination, so “Dash” draws to the stick click AND the trigger. Printing the lettering in the card too would be the same fact twice; the keycap chips come back only where a line can't be drawn (a Zwift pod has no sticks — swap to it below). Column and order still come from the first NON-GENERIC control, so “Dash” files under the trigger rather than the stick every other action also uses, and sides are derived from where each button physically sits, never hardcoded. Resize the window: the lines re-route. It does NOT react to presses — a reference diagram stays legible by not moving, and a thumb resting on a stick would light half the drawing. Pass `live: true` if you want it to respond (the section above already does).");
522
599
  {
523
600
  const stage = el(g.list, "div", "bs-map");
524
601
  map = mountControllerMap(stage, { press, actions: CONTROL_SCHEME, title: "Commandes" });
@@ -538,10 +615,10 @@ export function mountUiShowcase(host, opts = {}) {
538
615
  swap("Zwift", "zwift");
539
616
  }
540
617
  // --- DYNAMIC VIEW: the combo demo -------------------------------------
541
- g.section("Combo demo (dynamic)", "The same drawing, driven by a timeline derived from the combination instead of by real input. Controls engage 200 ms apart so it reads as “held together”, a directionless stick sweeps its circle, and a `sequence` action steps through its chips in order. Self-driving; it pauses with the tab and renders a still frame under `prefers-reduced-motion`.");
618
+ g.section("Combo demo (dynamic)", "The same drawing, driven by a timeline derived from the combination instead of by real input. Controls engage 200 ms apart so it reads as “held together”, a directionless stick sweeps its circle, and a `sequence` action steps through its chips in order. Self-driving; it pauses with the tab and renders a still frame under `prefers-reduced-motion`. `watch` is on: press anything and it paints GREEN over the animation — the demo stays blue underneath, so the two never read as the same thing. Green is you.");
542
619
  {
543
620
  const stage = el(g.list, "div", "bs-demo");
544
- demo = mountComboDemo(stage, { press, action: DEMO_PLAYLIST[0], size: "md" });
621
+ demo = mountComboDemo(stage, { press: shellAndGame, watch: true, action: DEMO_PLAYLIST[0], size: "md" });
545
622
  const row = el(g.list, "div", "bs-btnrow");
546
623
  DEMO_PLAYLIST.forEach((a, i) => {
547
624
  const b = el(row, "button", "bs-btn", a.label + (a.sequence ? " (séquence)" : ""));
@@ -560,8 +637,54 @@ export function mountUiShowcase(host, opts = {}) {
560
637
  demo?.setAction(DEMO_PLAYLIST[demoIndex]);
561
638
  };
562
639
  }
640
+ // --- SPOTLIGHT: captioned on the button ------------------------------
641
+ g.section("Control spotlight (captioned on the button)", "The caption sits ON the control instead of in a list beside it — the case that named it being the trainer resistance, which cannot be written in text at all (the same button reads L1 on a DualSense, LB on an Xbox pad, a bare L on a Switch). Each step lights for its own holdMs, then a DARK gap, then the next: the gap is load-bearing, because two lit controls back to back read as one picture flickering rather than as two statements. Caption side is derived from where the control sits — top half gets it above, bottom half below — so the bubble always leaves the drawing instead of covering its middle. Both tours WATCH you, on the shell stand-in merged with your own session so every press lands: latch the buttons (or hold W / X) for the shell-owned shoulders, press anything else for the rest, and what you hold paints GREEN and stands the tour down — it restarts a beat after you let go. Green is not confined to the controls being taught: whatever you hold turns green, because a drawing that ignores a press looks like a fault. Blue is the demo, green is you.");
642
+ {
643
+ const stage = el(g.list, "div", "bs-demo");
644
+ const status = el(g.list, "div", "bs-cap", "");
645
+ const GEAR_TOUR = [
646
+ { label: "Descendre de vitesse", combo: ["LB"] },
647
+ { label: "Monter de vitesse", combo: ["RB"] },
648
+ ];
649
+ // Uneven dwells + a stick, to show the timeline is per-step rather than one uniform beat.
650
+ const GAME_TOUR = [
651
+ { label: "Se déplacer", combo: ["LSTICK"], holdMs: 2600 },
652
+ { label: "Freiner", combo: ["LT"], holdMs: 1400 },
653
+ { label: "Sauter", combo: ["DIAMOND_DOWN"], holdMs: 1400, gapMs: 1400 },
654
+ ];
655
+ const mountTour = (steps) => {
656
+ spotTour?.dispose();
657
+ spotTour = mountControlSpotlight(stage, {
658
+ press: shellAndGame,
659
+ watch: true,
660
+ glow: false,
661
+ steps,
662
+ onStepShown: (st) => { status.textContent = `▸ ${st.label}`; },
663
+ onPerformed: (st) => { status.textContent = `✓ ${st.label} — that one was yours`; },
664
+ });
665
+ };
666
+ mountTour(GEAR_TOUR);
667
+ const row = el(g.list, "div", "bs-btnrow");
668
+ const b1 = el(row, "button", "bs-btn", "Gear tour");
669
+ b1.addEventListener("click", () => mountTour(GEAR_TOUR));
670
+ const b2 = el(row, "button", "bs-btn", "Game tour (uneven dwells)");
671
+ b2.addEventListener("click", () => mountTour(GAME_TOUR));
672
+ }
673
+ // --- SPOTLIGHT: no clock at all --------------------------------------
674
+ g.section("Control spotlight — still (no timeline)", "The same component with mode: \"still\" — no clock, one control lit and captioned, and it STAYS that way for as long as it's on screen. That's the whole of what a HUD hint or a pre-race legend needs, and it needs no timeline to say it. Note the stick is STILL SWEEPING: \"still\" freezes the timeline, not the artwork — a bare LSTICK means *any* direction, and a cap parked at one arbitrary angle would read as \"push it that way\" instead. The caption meanwhile does not move at all: it is anchored to the stick's resting centre (the well), projected from the layout geometry rather than measured off the cap, so it aims at the joystick while the cap travels underneath it. Turn OS reduced-motion on and this is also exactly what the animated section above becomes — hence one code path, not two — with the sweep held on a fixed frame. `watch` is on here, so PRESS SOMETHING: whatever you hold paints GREEN on the drawing — the arrow keys, the face diamond, a trigger — whether or not this one-step lesson names it, which is how a rider finds out which button is which while the hint just sits there. The blue stick is the lesson; green is you.");
675
+ {
676
+ const stage = el(g.list, "div", "bs-demo");
677
+ spotStill = mountControlSpotlight(stage, {
678
+ press,
679
+ watch: true,
680
+ mode: "still",
681
+ glow: false,
682
+ size: "md",
683
+ steps: [{ label: "Se déplacer", combo: ["LSTICK"] }],
684
+ });
685
+ }
563
686
  // --- GUIDED LESSON: the interactive trainer ---------------------------
564
- g.section("Guided lesson (interactive)", "One concept, two linked halves, ONE shared controller underneath — the case that named it being the trainer resistance. Each step walks three states: whitish + pulsing = “do this”, accent + pulse stops = “you're doing it”, green + ✓ = done. The prompt ALTERNATES between the two halves and builds each combination up one control at a time — the stick click lights first and STAYS lit while the shoulder joins it, then the other half takes its turn, and it loops. Completion needs a RELEASE after the combination is satisfied, so even a single control reads white → blue → green rather than jumping to green. Finish both and `onComplete` fires (a host would close its modal). NOTE: the shoulders are shell-owned and never reach a game — this section drives them with a stand-in, so latch the buttons below (or hold C + W / X).");
687
+ g.section("Guided lesson (interactive)", "One concept, two linked halves, ONE shared controller underneath — the case that named it being the trainer resistance. Each step walks three states: whitish + pulsing = “do this”, accent + pulse stops = “you're doing it”, green + ✓ = done. The prompt ALTERNATES between the two halves and builds each combination up one control at a time — the stick click lights first and STAYS lit while the shoulder joins it, then the other half takes its turn, and it loops. Completion needs a RELEASE after the combination is satisfied, so even a single control reads white → blue → green rather than jumping to green. Finish both and `onComplete` fires (a host would close its modal). NOTE: the shoulders are shell-owned and never reach a game — this section drives them with a stand-in merged with your own session, so latch the buttons below (or hold C + W / X) for the lesson, while any other button you press still shows on the pad (in the accent: here green is reserved for “that step is finished”).");
565
688
  {
566
689
  const stage = el(g.list, "div", "bs-demo");
567
690
  const status = el(g.list, "div", "bs-cap", "");
@@ -571,7 +694,9 @@ export function mountUiShowcase(host, opts = {}) {
571
694
  status.textContent = "Latch the buttons below (or hold C + W / X) to perform each combination.";
572
695
  trainer = mountControlTrainer(stage, {
573
696
  title: "Changer la résistance",
574
- press: shellStandIn,
697
+ // The stand-in merged with the session: the lesson is about the shell-owned shoulders (only the
698
+ // stand-in can report those), but its pad still has to reflect every OTHER press the rider makes.
699
+ press: shellAndGame,
575
700
  steps: [
576
701
  { label: "Réduire la résistance", combo: ["LSTICK_PRESS", "LB"], hint: "Clic stick gauche + épaule gauche" },
577
702
  { label: "Augmenter la résistance", combo: ["LSTICK_PRESS", "RB"], hint: "Clic stick gauche + épaule droite" },
@@ -608,6 +733,41 @@ export function mountUiShowcase(host, opts = {}) {
608
733
  });
609
734
  mountTrainer();
610
735
  }
736
+ // --- ACTION MARKER: a card pinned to a point in the world -------------
737
+ g.section("Action marker (anchored to a world point)", "“There is something to do THERE”: a card pinned to a point the game projects to screen, the keycap joining it once the rider is close enough to act, and a caret clamping it to the border while the point is off screen. Two independent axes — TONE is motion (`hint` still · `action` breathing · `urgent` hammering) and COLOUR is subject (`danger`/`red`, `success`/`green`, `accent`/`cyan`, …), so “danger, calmly” and “the good thing, NOW” are both sayable. The left marker's anchor orbits out of the stage and back: watch it clamp, sprout the caret, then GLIDE to its point rather than jumping. The middle one is in reach (`setNear`) — the whole arrival is one interpolated number, so the card eases out of its pulse instead of snapping. Repaint them below.");
738
+ {
739
+ const stage = el(g.list, "div", "bs-marker");
740
+ const orbit = createActionMarker(stage, {
741
+ label: "REVIVE",
742
+ tone: "action",
743
+ color: "danger",
744
+ button: "DIAMOND_DOWN",
745
+ });
746
+ const near = createActionMarker(stage, { label: "PRENDRE", tone: "action", color: "success", button: "DIAMOND_DOWN" });
747
+ const hint = createActionMarker(stage, { label: "Coffre", tone: "hint", color: "accentLight" });
748
+ markers = [orbit, near, hint];
749
+ near.setNear(true);
750
+ // The anchor the game would hand `place` every frame. An ellipse wider than the stage on purpose:
751
+ // half the loop is spent off screen, which is the state the caret exists for.
752
+ markerFrame = (t) => {
753
+ const w = stage.clientWidth;
754
+ const h = stage.clientHeight;
755
+ orbit.place(w / 2 + Math.cos(t * 0.6) * w * 0.75, h / 2 + Math.sin(t * 0.6) * h * 0.62);
756
+ near.place(w * 0.5, h * 0.5);
757
+ hint.place(w * 0.82, h * 0.28);
758
+ };
759
+ const row = el(g.list, "div", "bs-btnrow");
760
+ for (const { color, role, use } of MARKER_COLORS) {
761
+ const b = el(row, "button", "bs-btn", `${color} · ${role}`);
762
+ b.title = use;
763
+ b.addEventListener("click", () => markers.forEach((m) => m.setColor(color)));
764
+ }
765
+ const tones = el(g.list, "div", "bs-btnrow");
766
+ for (const tone of ["hint", "action", "urgent"]) {
767
+ const b = el(tones, "button", "bs-btn", tone);
768
+ b.addEventListener("click", () => markers.forEach((m) => m.setTone(tone)));
769
+ }
770
+ }
611
771
  g.run({
612
772
  session,
613
773
  perFrame: (dt) => {
@@ -636,6 +796,8 @@ export function mountUiShowcase(host, opts = {}) {
636
796
  if (!dialogue.advance())
637
797
  dialogue.open("Master Orsane", DLG_LINES);
638
798
  }
799
+ // The markers are placed every frame, exactly as a game does it from `worldToScreen`.
800
+ markerFrame?.(clock);
639
801
  // Walk the combo-demo playlist so an unattended catalog shows every timeline shape, not one.
640
802
  demoHold += dt;
641
803
  if (demoHold >= DEMO_STEP) {
@@ -649,6 +811,9 @@ export function mountUiShowcase(host, opts = {}) {
649
811
  offButton?.();
650
812
  offRarity?.();
651
813
  offMonitor?.();
814
+ for (const marker of markers)
815
+ marker.dispose();
816
+ markers = [];
652
817
  choice?.dispose();
653
818
  dialogue?.dispose();
654
819
  race?.dispose();
@@ -657,6 +822,8 @@ export function mountUiShowcase(host, opts = {}) {
657
822
  c.dispose();
658
823
  for (const p of pads)
659
824
  p.dispose();
825
+ spotTour?.dispose();
826
+ spotStill?.dispose();
660
827
  for (const c of stickChips)
661
828
  c.dispose();
662
829
  map?.dispose();
@@ -698,8 +865,51 @@ const BS_CSS = `
698
865
  /* 2x, so the shape is judgeable while the real 38px chip sits beside it for the honest size */
699
866
  .bs-sticks-zoom { transform: scale(2); transform-origin: center; width: 38px; height: 38px;
700
867
  display: flex; align-items: center; justify-content: center; margin: 0 12px; }
868
+ /* ── idle-pip legibility candidates (the two "Idle pips" sections) ─────────────
869
+ Every rule here targets ONLY the three idle siblings of a full diamond; the active key is untouched.
870
+ "!important" is required and not laziness: makePip writes the idle tone as an INLINE "--c" on the pip,
871
+ which a stylesheet cannot outrank. When one of these wins, it moves into ui/styles.ts (and its tone
872
+ into INACTIVE in keycap.ts) and the !important goes away with it. */
873
+ .bs-idle { display: flex; align-items: flex-end; gap: 1.4rem; }
874
+ /* D1 — the face stays exactly as today; a rim draws the circle instead. */
875
+ .bs-idle.d-rim .rydr-ui-pip:not(.active) {
876
+ box-shadow: inset 0 0 0 1.5px rgba(255,255,255,0.5), inset 0 1px 2px rgba(0,0,0,0.5) !important; }
877
+ /* D2 — no edge at all, only tone: the cheapest fix, and the one that changes the look least. */
878
+ .bs-idle.d-lift .rydr-ui-pip:not(.active) { --c: #59626f !important; }
879
+ /* D3 — the ring sits OUTSIDE, so the pip itself can go darker than today and still be found. */
880
+ .bs-idle.d-halo .rydr-ui-pip:not(.active) {
881
+ --c: #2f353e !important;
882
+ box-shadow: 0 0 0 1.5px rgba(255,255,255,0.34), inset 0 1px 2px rgba(0,0,0,0.55) !important; }
883
+ /* D4 — a bright top lip on a near-black face: the sibling reads as an empty socket, not a dim button. */
884
+ .bs-idle.d-well .rydr-ui-pip:not(.active) {
885
+ --c: #262b33 !important;
886
+ box-shadow: inset 0 1.5px 0 rgba(255,255,255,0.55), inset 0 -1px 2px rgba(0,0,0,0.6) !important; }
887
+ /* D5 — lit from below instead, which keeps the pressed-in feel while outlining the shape. */
888
+ .bs-idle.d-edge .rydr-ui-pip:not(.active) {
889
+ box-shadow: inset 0 -1.5px 0 rgba(255,255,255,0.42), 0 0 0 1px rgba(255,255,255,0.2),
890
+ inset 0 1px 2px rgba(0,0,0,0.5) !important; }
891
+ /* L1–L5 — the light family. The active key is already white in mono, so these trade "three dark
892
+ siblings" for "one cluster", and the active pip has to carry the difference by size + lift alone. */
893
+ .bs-idle.l-ghost .rydr-ui-pip:not(.active) { --c: #7c8798 !important; }
894
+ .bs-idle.l-frost .rydr-ui-pip:not(.active) { --c: #aab4c2 !important; }
895
+ .bs-idle.l-outline .rydr-ui-pip:not(.active) {
896
+ background: rgba(255,255,255,0.06) !important;
897
+ box-shadow: inset 0 0 0 2px rgba(255,255,255,0.72) !important; }
898
+ .bs-idle.l-chalk .rydr-ui-pip:not(.active) {
899
+ --c: #d5dbe4 !important; opacity: 0.85;
900
+ background: #d5dbe4 !important; box-shadow: 0 1px 0 rgba(0,0,0,0.35) !important; }
901
+ .bs-idle.l-pearl .rydr-ui-pip:not(.active) {
902
+ --c: #b9c3d1 !important;
903
+ box-shadow: 0 0 0 1.5px rgba(255,255,255,0.28), 0 0 8px rgba(255,255,255,0.18),
904
+ inset 0 1px 2px rgba(0,0,0,0.35) !important; }
905
+ .bs-cap.sub { font-weight: 600; opacity: 0.5; margin-top: -0.5rem; }
701
906
  /* the map and the demo get full-width stages: the map needs room for two callout columns beside the
702
907
  pad, and both are the components' own layout — the catalog only provides the space. */
908
+ /* the marker stage: a positioned, clipping box standing in for a game's own play area — a marker is
909
+ absolutely placed inside its host and clamps to the host's box, so the host has to BE the view. */
910
+ .bs-marker { position: relative; overflow: hidden; width: 100%; height: 340px; box-sizing: border-box;
911
+ background: radial-gradient(120% 120% at 50% 0%, rgba(120,160,230,0.14), rgba(255,255,255,0.03));
912
+ border: 1px solid rgba(255,255,255,0.1); border-radius: 16px; }
703
913
  .bs-map, .bs-demo { width: 100%; display: flex; justify-content: center;
704
914
  background: rgba(255,255,255,0.03); border: 1px solid rgba(255,255,255,0.1);
705
915
  border-radius: 16px; padding: 1.5rem 1rem; box-sizing: border-box; }