@camstack/addon-admin-ui 1.2.521 → 1.2.523

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 (130) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/assets/{AddonAssetIcon-DIfNr6QF.js → AddonAssetIcon-VXnpNoSj.js} +1 -1
  3. package/dist/assets/{Addons-D8e5UEhk.js → Addons-DlINdzv0.js} +1 -1
  4. package/dist/assets/{AdminPage-DPm4iuSn.js → AdminPage-B9JLs4rT.js} +1 -1
  5. package/dist/assets/{AdminSectionedPage-B1FFlzAp.js → AdminSectionedPage-EY_w3HY7.js} +1 -1
  6. package/dist/assets/{AiProfiles-_jjOpe29.js → AiProfiles-fuyzr8D4.js} +1 -1
  7. package/dist/assets/{BrokerEditorDialog-CMa1f8kC.js → BrokerEditorDialog-DoEQXizE.js} +1 -1
  8. package/dist/assets/Build-CvZFLBc9.js +40 -0
  9. package/dist/assets/{Calendars-BncAsHLV.js → Calendars-ClQsQ24o.js} +1 -1
  10. package/dist/assets/{Cluster-BtPubX4s.js → Cluster-D31IV0wr.js} +1 -1
  11. package/dist/assets/{ComposedDeviceEditDialog-BHCTUKU-.js → ComposedDeviceEditDialog-Chymp38w.js} +1 -1
  12. package/dist/assets/CompositionBlockEditor-CpPHLcVD.js +2 -0
  13. package/dist/assets/{CompositionEditorPage-D4Sj47wU.js → CompositionEditorPage-NlrSqavW.js} +1 -1
  14. package/dist/assets/{Data-DGUMhXre.js → Data-BBsE7UVR.js} +1 -1
  15. package/dist/assets/{DeviceDetail-CwB8tpfD.js → DeviceDetail-zZcKfcTs.js} +2 -2
  16. package/dist/assets/{DeviceDoActionFields-B08_5fN_.js → DeviceDoActionFields-CSKUhZmq.js} +1 -1
  17. package/dist/assets/{Devices-B-o-SYft.js → Devices-DtEGEpYK.js} +1 -1
  18. package/dist/assets/{EmbedPlayerPage-BCAMYXmH.js → EmbedPlayerPage-Er_9ZZbp.js} +1 -1
  19. package/dist/assets/{History-CkZOzm2S.js → History-DEuMaAFu.js} +1 -1
  20. package/dist/assets/{Identity-D-mKJp3i.js → Identity-Bo-ulITU.js} +1 -1
  21. package/dist/assets/{IntegrationDetail-Ba7jt4aH.js → IntegrationDetail-IopkO40B.js} +1 -1
  22. package/dist/assets/{IntegrationHub-D3NNWcI3.js → IntegrationHub-CaKFrwmD.js} +1 -1
  23. package/dist/assets/{Integrations-DzVbMY51.js → Integrations-B0XFfGvM.js} +1 -1
  24. package/dist/assets/{Integrations-DfCvoh1h.js → Integrations-DrmJI4oI.js} +1 -1
  25. package/dist/assets/{Library-CIdnKcUl.js → Library-CWzUsm1c.js} +1 -1
  26. package/dist/assets/{Locations-BMUiqhX7.js → Locations-CUYgtHWg.js} +2 -2
  27. package/dist/assets/{Logs-Cr5Ev4Yn.js → Logs-CkwhOBrz.js} +1 -1
  28. package/dist/assets/{MaskShapeCanvas-Bv7J_UVF.js → MaskShapeCanvas-B_J8Nub8.js} +1 -1
  29. package/dist/assets/{MotionZonesSettings-BZxXQ1bq.js → MotionZonesSettings-DSDOgPiK.js} +1 -1
  30. package/dist/assets/{MyAccess-egWpZOj7.js → MyAccess-kZWZLQ6w.js} +1 -1
  31. package/dist/assets/{Network-DQwRnVG_.js → Network-CsAvssW1.js} +1 -1
  32. package/dist/assets/{NodeAddonsSettingsPanel-B9vvxBEQ.js → NodeAddonsSettingsPanel-CNSfsu26.js} +1 -1
  33. package/dist/assets/Notifications-eEXyaFax.js +1 -0
  34. package/dist/assets/Pipeline-CL-VwLPy.js +1 -0
  35. package/dist/assets/{PrivacyMaskSettings-Bic1_gT9.js → PrivacyMaskSettings-Zr9fXd19.js} +1 -1
  36. package/dist/assets/{Recordings-CNhL7oIf.js → Recordings-BrITac0q.js} +1 -1
  37. package/dist/assets/RemoteGrid-BGbiDThN.js +1 -0
  38. package/dist/assets/{ScanNetworkModal-B6vWwCe8.js → ScanNetworkModal-BO8EFEZ1.js} +1 -1
  39. package/dist/assets/{SceneMonitorEditor-Bd7aOOIg.js → SceneMonitorEditor-CvqEBzUw.js} +1 -1
  40. package/dist/assets/{SessionsList--VxRl_LS.js → SessionsList-BkbXjQt1.js} +1 -1
  41. package/dist/assets/{Showroom-UkIbrPnX.js → Showroom-ClQBf_59.js} +1 -1
  42. package/dist/assets/{System-QDZtQXm_.js → System-d-rVWfA6.js} +1 -1
  43. package/dist/assets/Templates-BY9R_5lz.js +1 -0
  44. package/dist/assets/{Terminal-5v2dzxpg.js → Terminal-dvCiPiu7.js} +1 -1
  45. package/dist/assets/{Viewer-B92j2D9F.js → Viewer-D04RI6WE.js} +1 -1
  46. package/dist/assets/{_virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-DugEb7xj.js → _virtual_mf-localSharedImportMap___mfe_internal__admin_ui_host-CO8DU_dY.js} +1 -1
  47. package/dist/assets/{addon-icons-context-CDyNgrka.js → addon-icons-context-BsBIxYDH.js} +1 -1
  48. package/dist/assets/{archive-BKuD6-O9.js → archive-Do2e48DU.js} +1 -1
  49. package/dist/assets/{assignment-candidates-CvlbrbgK.js → assignment-candidates-8RM__6oC.js} +1 -1
  50. package/dist/assets/{authed-media-DxWmG5JA.js → authed-media-BYa-9dIZ.js} +1 -1
  51. package/dist/assets/{bell-off-7L6K5pJk.js → bell-off-RPYQoGP1.js} +1 -1
  52. package/dist/assets/{board-model-CZOb3LmO.js → board-model-C9BgTio0.js} +1 -1
  53. package/dist/assets/{boxes-BYgmIZEw.js → boxes-BEverhi4.js} +1 -1
  54. package/dist/assets/circle-slash-Bb_aa_QL.js +1 -0
  55. package/dist/assets/client-D-g0nOrC.js +674 -0
  56. package/dist/assets/{cloud-upload-C40Dp7qu.js → cloud-upload-nVfWiPdO.js} +1 -1
  57. package/dist/assets/crop-DVR1vsA9.js +1 -0
  58. package/dist/assets/{device-integration-icon-CLK4k1ae.js → device-integration-icon-C2pH_5Gl.js} +1 -1
  59. package/dist/assets/device-picker-model-DBfk1Co5.js +1 -0
  60. package/dist/assets/{dist-CJ9iy42m.js → dist-BVH-vBQM.js} +1 -1
  61. package/dist/assets/dist-ByEQfnSV.js +674 -0
  62. package/dist/assets/{file-up-DhY5nof7.js → file-up-CUjXrmMK.js} +1 -1
  63. package/dist/assets/{format-CvKyF2QM.js → format-BccZ2tds.js} +1 -1
  64. package/dist/assets/{hard-drive-download-gFidUJGC.js → hard-drive-download-DiXdli_I.js} +1 -1
  65. package/dist/assets/{hostInit-CDWllEW4.js → hostInit-Bta217FF.js} +1 -1
  66. package/dist/assets/{i18n-C1QctlOB.js → i18n-COiZcYwm.js} +1 -1
  67. package/dist/assets/{icons-DrXFX-WI.js → icons-CDeaov6N.js} +1 -1
  68. package/dist/assets/{index-C0TfYmoA.css → index-DnHMM2c9.css} +1 -1
  69. package/dist/assets/{index-D3Yx0Smp.js → index-Dqmlzvdc.js} +3 -3
  70. package/dist/assets/{key-CKmpBvKe.js → key-C0PivC5X.js} +1 -1
  71. package/dist/assets/{key-round-DMWVlifP.js → key-round-Cu5Tucyk.js} +1 -1
  72. package/dist/assets/{layers-Bo1tC_4O.js → layers-Cd1UYZNk.js} +1 -1
  73. package/dist/assets/{linked-devices-model-D9TIS2pY.js → linked-devices-model-CFrDp7fw.js} +1 -1
  74. package/dist/assets/{list-ordered-BAebxGoz.js → list-ordered-Bkr6PCeB.js} +1 -1
  75. package/dist/assets/{location-owned-usage-B3nr7gWQ.js → location-owned-usage-E6eX4phu.js} +1 -1
  76. package/dist/assets/{log-in-CUgGOn9k.js → log-in-DV8GfIgr.js} +1 -1
  77. package/dist/assets/{memory-stick-CsWM7ppk.js → memory-stick-C6TRN6ht.js} +1 -1
  78. package/dist/assets/{message-square-plus-C-LDprie.js → message-square-plus-DTJ5QsLH.js} +1 -1
  79. package/dist/assets/{mf-entry-bootstrap-0-e1103afa.js → mf-entry-bootstrap-0-c0dc6497.js} +2 -2
  80. package/dist/assets/{mic-off-BmNdC4XW.js → mic-off-gUMH3Z4J.js} +1 -1
  81. package/dist/assets/{monitor-off-DhTBAYUp.js → monitor-off-C4w1KSTZ.js} +1 -1
  82. package/dist/assets/{monitor-smartphone-6kCGO3r1.js → monitor-smartphone-CpCqKvAV.js} +1 -1
  83. package/dist/assets/mount-DBfk1Co5.js +1 -0
  84. package/dist/assets/{player-overlays-C_WpL6a6.js → player-overlays-CZbAbeZY.js} +1 -1
  85. package/dist/assets/{recycle-Di1EQ0Qy.js → recycle-BaznD-UX.js} +1 -1
  86. package/dist/assets/remoteEntry-8jIMK97P.js +1 -0
  87. package/dist/assets/{ruler-cSAzAdF0.js → ruler-BSo-rKM0.js} +1 -1
  88. package/dist/assets/{scan-eye-6vO-dwZC.js → scan-eye-DN1vlvLP.js} +1 -1
  89. package/dist/assets/{scissors-MIPuZwTY.js → scissors-CC58_qMU.js} +1 -1
  90. package/dist/assets/{search-x-Jgy5Olce.js → search-x-tQuhnR8q.js} +1 -1
  91. package/dist/assets/{send-CnArxdfm.js → send-CAZEgHzo.js} +1 -1
  92. package/dist/assets/{settings-2-Cc7_8hT4.js → settings-2-BuBH9G2o.js} +1 -1
  93. package/dist/assets/{shapes-B6yDXStU.js → shapes-D2hlOKTD.js} +1 -1
  94. package/dist/assets/{sigma-q5eaqxJ5.js → sigma-Ceyn_S95.js} +1 -1
  95. package/dist/assets/{speaker-CbeO5md6.js → speaker-BRYEJSzP.js} +1 -1
  96. package/dist/assets/src-iRjUEwun.js +67 -0
  97. package/dist/assets/{step-inspector-model-Dm1vwliM.js → step-inspector-model-BfR3NdqL.js} +1 -1
  98. package/dist/assets/{table-2-Dl4UBoV9.js → table-2-CuSc759e.js} +1 -1
  99. package/dist/assets/{timer-reset-Bp1VJ4jU.js → timer-reset-Bvn2aK40.js} +1 -1
  100. package/dist/assets/{unlink-DoHrrlyB.js → unlink-BU_py8I2.js} +1 -1
  101. package/dist/assets/{usb-uGk5FuUX.js → usb-TZrC9eYC.js} +1 -1
  102. package/dist/assets/{use-device-bound-caps-Di0CbhM4.js → use-device-bound-caps-CYR80PtH.js} +1 -1
  103. package/dist/assets/{use-scenes-feed-hWCFwCtN.js → use-scenes-feed-Ddftx740.js} +1 -1
  104. package/dist/assets/{use-stationary-objects-DJ9JfRWk.js → use-stationary-objects-CJ3xxs43.js} +1 -1
  105. package/dist/assets/useEventInvalidation-DBfk1Co5.js +1 -0
  106. package/dist/assets/{useNodeUrlSelection-CW3xhZq4.js → useNodeUrlSelection-DNEz-JoD.js} +1 -1
  107. package/dist/assets/user-round-jCdxL4f8.js +1 -0
  108. package/dist/assets/{user-x-KqDnAcpq.js → user-x-CYHlbR6F.js} +1 -1
  109. package/dist/assets/{variable-vSgKlDpd.js → variable-BNQlwoos.js} +1 -1
  110. package/dist/assets/{video-DgFhEP51.js → video-CrmOxhYy.js} +1 -1
  111. package/dist/assets/{virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-CmMSAYDD.js → virtual_mf-REMOTE_ENTRY_ID___mfe_internal__admin_ui_host__remoteEntry-_hash_-Bucq-FfY.js} +2 -2
  112. package/dist/index.html +10 -10
  113. package/dist/server/addon.js +286 -4
  114. package/package.json +2 -1
  115. package/dist/assets/Build-SkecHiHh.js +0 -40
  116. package/dist/assets/CompositionBlockEditor-ImrFV2Gk.js +0 -2
  117. package/dist/assets/Notifications-B7GkPWCE.js +0 -1
  118. package/dist/assets/Pipeline-L7YohUe9.js +0 -1
  119. package/dist/assets/RemoteGrid-Ttvy6q8V.js +0 -1
  120. package/dist/assets/Templates-C43xppeu.js +0 -1
  121. package/dist/assets/circle-slash-DSfcxndq.js +0 -1
  122. package/dist/assets/client-Clemlz5W.js +0 -674
  123. package/dist/assets/crop-CnSchINM.js +0 -1
  124. package/dist/assets/device-picker-model-ojy8FewR.js +0 -1
  125. package/dist/assets/dist-B-uSoSKi.js +0 -674
  126. package/dist/assets/mount-ojy8FewR.js +0 -1
  127. package/dist/assets/remoteEntry-B3Z2iNH7.js +0 -1
  128. package/dist/assets/src-BuD4BDe3.js +0 -67
  129. package/dist/assets/useEventInvalidation-ojy8FewR.js +0 -1
  130. package/dist/assets/user-round-BdixCoAv.js +0 -1
@@ -5456,7 +5456,7 @@ var ZodIssueCode = {
5456
5456
  var ZodFirstPartyTypeKind;
5457
5457
  ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
5458
5458
  //#endregion
5459
- //#region ../types/dist/sleep-6eG9C8Xl.mjs
5459
+ //#region ../types/dist/sleep-63gM_1JR.mjs
5460
5460
  /**
5461
5461
  * The audio chunk plane's byte format, and the ONE expansion from a coded
5462
5462
  * window to float samples (D455).
@@ -8737,6 +8737,7 @@ var CAP_NAMES = Object.freeze([
8737
8737
  "recording-signal",
8738
8738
  "records",
8739
8739
  "remote",
8740
+ "remote-layout-components",
8740
8741
  "running-state",
8741
8742
  "scene-monitor",
8742
8743
  "script-runner",
@@ -58169,6 +58170,30 @@ object({
58169
58170
  at: number()
58170
58171
  }).nullable()
58171
58172
  });
58173
+ var RemoteButtonShapeSchema = _enum([
58174
+ "rect",
58175
+ "rounded",
58176
+ "round",
58177
+ "pill"
58178
+ ]);
58179
+ var RemoteButtonToneSchema = _enum([
58180
+ "neutral",
58181
+ "accent",
58182
+ "danger",
58183
+ "red",
58184
+ "green",
58185
+ "yellow",
58186
+ "blue"
58187
+ ]);
58188
+ var RemoteGroupFrameSchema = _enum([
58189
+ "none",
58190
+ "panel",
58191
+ "divider",
58192
+ "dpad",
58193
+ "rocker-v",
58194
+ "rocker-h",
58195
+ "keypad"
58196
+ ]);
58172
58197
  var RemoteLayoutButtonSchema = object({
58173
58198
  id: string().min(1).max(40),
58174
58199
  /** 0-based grid position. */
@@ -58178,12 +58203,94 @@ var RemoteLayoutButtonSchema = object({
58178
58203
  colSpan: number().int().min(1).max(24),
58179
58204
  icon: string().min(1).max(60).optional(),
58180
58205
  label: string().min(1).max(40).optional(),
58181
- role: RemoteRoleSchema
58206
+ role: RemoteRoleSchema,
58207
+ /** Absent = the plain rendering every layout had before shapes existed. */
58208
+ shape: RemoteButtonShapeSchema.optional(),
58209
+ tone: RemoteButtonToneSchema.optional(),
58210
+ /** The group this button belongs to; it must lie inside that group's rectangle. */
58211
+ groupId: string().min(1).max(40).optional()
58212
+ });
58213
+ /**
58214
+ * A rectangle of the grid that moves as ONE thing and is drawn with a frame: a
58215
+ * titled panel, a section divider, a D-pad ring. `componentId` names the palette
58216
+ * entry it came from (informational: the layout is self-contained).
58217
+ */
58218
+ var RemoteLayoutGroupSchema = object({
58219
+ id: string().min(1).max(40),
58220
+ componentId: string().min(1).max(80),
58221
+ frame: RemoteGroupFrameSchema,
58222
+ row: number().int().min(0).max(24),
58223
+ col: number().int().min(0).max(24),
58224
+ rowSpan: number().int().min(1).max(24),
58225
+ colSpan: number().int().min(1).max(24),
58226
+ title: string().min(1).max(40).optional()
58182
58227
  });
58228
+ function rectsOverlap(a, b) {
58229
+ return a.row < b.row + b.rowSpan && b.row < a.row + a.rowSpan && a.col < b.col + b.colSpan && b.col < a.col + a.colSpan;
58230
+ }
58231
+ function rectContains(outer, inner) {
58232
+ return inner.row >= outer.row && inner.col >= outer.col && inner.row + inner.rowSpan <= outer.row + outer.rowSpan && inner.col + inner.colSpan <= outer.col + outer.colSpan;
58233
+ }
58234
+ /**
58235
+ * The group rules of a layout: inside the grid, no two groups overlap, a
58236
+ * member lies inside its group, a divider holds nothing, and a button that is
58237
+ * not a member never sits inside someone else's rectangle (a group moves as
58238
+ * one thing, so a stray key under it would be left behind).
58239
+ */
58240
+ function refineGroups(grid, ctx) {
58241
+ const groups = grid.groups ?? [];
58242
+ const byId = /* @__PURE__ */ new Map();
58243
+ const fail = (message, path) => {
58244
+ ctx.addIssue({
58245
+ code: "custom",
58246
+ message,
58247
+ path
58248
+ });
58249
+ };
58250
+ groups.forEach((group, index) => {
58251
+ if (byId.has(group.id)) fail(`group id "${group.id}" is used twice`, [
58252
+ "groups",
58253
+ index,
58254
+ "id"
58255
+ ]);
58256
+ byId.set(group.id, group);
58257
+ if (group.row + group.rowSpan > grid.rows || group.col + group.colSpan > grid.columns) fail(`group "${group.id}" leaves the grid`, ["groups", index]);
58258
+ for (let other = 0; other < index; other += 1) {
58259
+ const earlier = groups[other];
58260
+ if (earlier !== void 0 && rectsOverlap(earlier, group)) {
58261
+ fail(`groups "${earlier.id}" and "${group.id}" overlap`, ["groups", index]);
58262
+ return;
58263
+ }
58264
+ }
58265
+ });
58266
+ grid.buttons.forEach((button, index) => {
58267
+ if (button.groupId !== void 0) {
58268
+ const group = byId.get(button.groupId);
58269
+ if (group === void 0) {
58270
+ fail(`button "${button.id}" names the unknown group "${button.groupId}"`, [
58271
+ "buttons",
58272
+ index,
58273
+ "groupId"
58274
+ ]);
58275
+ return;
58276
+ }
58277
+ if (group.frame === "divider") fail(`a divider group ("${group.id}") holds no buttons`, [
58278
+ "buttons",
58279
+ index,
58280
+ "groupId"
58281
+ ]);
58282
+ if (!rectContains(group, button)) fail(`button "${button.id}" lies outside its group "${group.id}"`, ["buttons", index]);
58283
+ return;
58284
+ }
58285
+ const foreign = groups.find((group) => rectsOverlap(group, button));
58286
+ if (foreign !== void 0) fail(`button "${button.id}" lies inside group "${foreign.id}" but is not a member`, ["buttons", index]);
58287
+ });
58288
+ }
58183
58289
  object({
58184
58290
  columns: number().int().min(1).max(24),
58185
58291
  rows: number().int().min(1).max(24),
58186
- buttons: array(RemoteLayoutButtonSchema).max(200)
58292
+ buttons: array(RemoteLayoutButtonSchema).max(200),
58293
+ groups: array(RemoteLayoutGroupSchema).max(50).optional()
58187
58294
  }).superRefine((grid, ctx) => {
58188
58295
  const ids = /* @__PURE__ */ new Set();
58189
58296
  const taken = /* @__PURE__ */ new Map();
@@ -58220,6 +58327,7 @@ object({
58220
58327
  taken.set(cell, button.id);
58221
58328
  }
58222
58329
  });
58330
+ refineGroups(grid, ctx);
58223
58331
  });
58224
58332
  var RemoteBoundCommandSchema = object({
58225
58333
  role: RemoteRoleSchema,
@@ -58351,6 +58459,91 @@ method(object({ kind: TemplateKindSchema.optional() }), array(TemplateRecordSche
58351
58459
  kind: "mutation",
58352
58460
  auth: "admin"
58353
58461
  });
58462
+ var RemoteComponentCategorySchema = _enum([
58463
+ "power",
58464
+ "navigation",
58465
+ "volume",
58466
+ "numbers",
58467
+ "media",
58468
+ "colour",
58469
+ "apps",
58470
+ "layout"
58471
+ ]);
58472
+ /** `<namespace>:<name>`, both lowercase slugs — `core:dpad`, `<addonId>:<name>`. */
58473
+ var COMPONENT_ID_RE = /^[a-z0-9][a-z0-9_.-]*:[a-z0-9][a-z0-9_-]*$/;
58474
+ var RemoteComponentButtonSchema = object({
58475
+ /** Joined to the instance id when the component is inserted. */
58476
+ idSuffix: string().regex(/^[a-z0-9][a-z0-9_-]{0,19}$/, { message: "a short lowercase slug" }),
58477
+ row: number().int().min(0).max(24),
58478
+ col: number().int().min(0).max(24),
58479
+ rowSpan: number().int().min(1).max(24),
58480
+ colSpan: number().int().min(1).max(24),
58481
+ role: RemoteRoleSchema,
58482
+ icon: string().min(1).max(60).optional(),
58483
+ label: string().min(1).max(40).optional(),
58484
+ shape: RemoteButtonShapeSchema.optional(),
58485
+ tone: RemoteButtonToneSchema.optional()
58486
+ });
58487
+ var RemoteLayoutComponentSchema = object({
58488
+ id: string().max(80).regex(COMPONENT_ID_RE, { message: "<namespace>:<name>, lowercase" }),
58489
+ name: string().min(1).max(60),
58490
+ nameI18n: object({
58491
+ en: string().min(1).max(60),
58492
+ it: string().min(1).max(60)
58493
+ }).optional(),
58494
+ /** A display icon key, resolved by the UI like a button icon. */
58495
+ icon: string().min(1).max(60),
58496
+ category: RemoteComponentCategorySchema,
58497
+ size: object({
58498
+ rows: number().int().min(1).max(24),
58499
+ cols: number().int().min(1).max(24)
58500
+ }),
58501
+ /** The frame drawn around the whole component, or null for loose buttons. */
58502
+ group: object({
58503
+ frame: RemoteGroupFrameSchema,
58504
+ title: string().min(1).max(40).optional()
58505
+ }).nullable(),
58506
+ buttons: array(RemoteComponentButtonSchema).max(40)
58507
+ }).superRefine((component, ctx) => {
58508
+ const suffixes = /* @__PURE__ */ new Set();
58509
+ component.buttons.forEach((button, index) => {
58510
+ if (suffixes.has(button.idSuffix)) ctx.addIssue({
58511
+ code: "custom",
58512
+ message: `button "${button.idSuffix}" is listed twice`,
58513
+ path: [
58514
+ "buttons",
58515
+ index,
58516
+ "idSuffix"
58517
+ ]
58518
+ });
58519
+ suffixes.add(button.idSuffix);
58520
+ if (button.row + button.rowSpan > component.size.rows || button.col + button.colSpan > component.size.cols) {
58521
+ ctx.addIssue({
58522
+ code: "custom",
58523
+ message: `button "${button.idSuffix}" leaves the component`,
58524
+ path: ["buttons", index]
58525
+ });
58526
+ return;
58527
+ }
58528
+ for (let other = 0; other < index; other += 1) {
58529
+ const earlier = component.buttons[other];
58530
+ if (earlier !== void 0 && rectsOverlap(earlier, button)) {
58531
+ ctx.addIssue({
58532
+ code: "custom",
58533
+ message: `buttons "${earlier.idSuffix}" and "${button.idSuffix}" overlap`,
58534
+ path: ["buttons", index]
58535
+ });
58536
+ return;
58537
+ }
58538
+ }
58539
+ });
58540
+ if (component.group?.frame === "divider" && component.buttons.length > 0) ctx.addIssue({
58541
+ code: "custom",
58542
+ message: "a divider component holds no buttons",
58543
+ path: ["buttons"]
58544
+ });
58545
+ });
58546
+ method(object({}), array(RemoteLayoutComponentSchema), { auth: "protected" });
58354
58547
  DeviceType.Button, method(object({ deviceId: number().int().nonnegative() }), _void(), {
58355
58548
  kind: "mutation",
58356
58549
  auth: "protected"
@@ -67286,6 +67479,87 @@ method(object({}), array(TrainingBaseModelSchema).readonly(), { auth: "admin" })
67286
67479
  kind: "mutation",
67287
67480
  auth: "admin"
67288
67481
  });
67482
+ var btn = (idSuffix, row, col, init) => ({
67483
+ idSuffix,
67484
+ row,
67485
+ col,
67486
+ rowSpan: 1,
67487
+ colSpan: 1,
67488
+ ...init
67489
+ });
67490
+ function rocker(id, name, it, frame, title, buttons, size) {
67491
+ return {
67492
+ id,
67493
+ name,
67494
+ nameI18n: {
67495
+ en: name,
67496
+ it
67497
+ },
67498
+ icon: frame === "rocker-v" ? "chevrons-up-down" : "chevrons-left-right",
67499
+ category: id.includes("channel") || id.includes("volume") ? "volume" : "navigation",
67500
+ size,
67501
+ group: title === null ? { frame } : {
67502
+ frame,
67503
+ title
67504
+ },
67505
+ buttons
67506
+ };
67507
+ }
67508
+ btn("power", 0, 0, {
67509
+ role: "power",
67510
+ shape: "round",
67511
+ tone: "danger"
67512
+ }), btn("up", 0, 1, { role: "up" }), btn("left", 1, 0, { role: "left" }), btn("ok", 1, 1, {
67513
+ role: "ok",
67514
+ shape: "round",
67515
+ tone: "accent"
67516
+ }), btn("right", 1, 2, { role: "right" }), btn("down", 2, 1, { role: "down" }), rocker("core:rocker-volume-v", "Volume rocker", "Bilanciere volume", "rocker-v", "VOL", [btn("up", 0, 0, {
67517
+ role: "volume_up",
67518
+ shape: "pill"
67519
+ }), btn("down", 1, 0, {
67520
+ role: "volume_down",
67521
+ shape: "pill"
67522
+ })], {
67523
+ rows: 2,
67524
+ cols: 1
67525
+ }), rocker("core:rocker-channel-v", "Channel rocker", "Bilanciere canali", "rocker-v", "CH", [btn("up", 0, 0, {
67526
+ role: "channel_up",
67527
+ shape: "pill"
67528
+ }), btn("down", 1, 0, {
67529
+ role: "channel_down",
67530
+ shape: "pill"
67531
+ })], {
67532
+ rows: 2,
67533
+ cols: 1
67534
+ }), rocker("core:rocker-h", "Minus / plus rocker", "Bilanciere meno / più", "rocker-h", null, [btn("minus", 0, 0, {
67535
+ role: "custom:minus",
67536
+ label: "−",
67537
+ shape: "pill"
67538
+ }), btn("plus", 0, 1, {
67539
+ role: "custom:plus",
67540
+ label: "+",
67541
+ shape: "pill"
67542
+ })], {
67543
+ rows: 1,
67544
+ cols: 2
67545
+ }), [...Array.from({ length: 9 }, (_, i) => btn(`d${i + 1}`, Math.floor(i / 3), i % 3, { role: `digit_${i + 1}` })), btn("d0", 3, 1, { role: "digit_0" })], btn("red", 0, 0, {
67546
+ role: "custom:color_red",
67547
+ tone: "red"
67548
+ }), btn("green", 0, 1, {
67549
+ role: "custom:color_green",
67550
+ tone: "green"
67551
+ }), btn("yellow", 0, 2, {
67552
+ role: "custom:color_yellow",
67553
+ tone: "yellow"
67554
+ }), btn("blue", 0, 3, {
67555
+ role: "custom:color_blue",
67556
+ tone: "blue"
67557
+ }), btn("rewind", 0, 0, { role: "rewind" }), btn("play", 0, 1, { role: "play" }), btn("pause", 0, 2, { role: "pause" }), btn("forward", 0, 3, { role: "fast_forward" }), btn("stop", 0, 4, { role: "stop" }), [
67558
+ 1,
67559
+ 2,
67560
+ 3,
67561
+ 4
67562
+ ].map((n) => btn(`app${n}`, 0, n - 1, { role: `custom:app_slot_${n}` })), btn("back", 0, 0, { role: "back" }), btn("home", 0, 1, { role: "home" }), btn("menu", 0, 2, { role: "menu" });
67289
67563
  discriminatedUnion("kind", [object({
67290
67564
  kind: literal("raw"),
67291
67565
  timings: array(number().int()),
@@ -75150,6 +75424,13 @@ Object.freeze({
75150
75424
  access: "create",
75151
75425
  role: "admin"
75152
75426
  },
75427
+ "remoteLayoutComponents.listComponents": {
75428
+ capName: "remote-layout-components",
75429
+ capScope: "system",
75430
+ addonId: null,
75431
+ access: "view",
75432
+ role: "admin"
75433
+ },
75153
75434
  "runningState.getStatus": {
75154
75435
  capName: "running-state",
75155
75436
  capScope: "device",
@@ -81326,6 +81607,7 @@ var SYSTEM_CAP_VOCABULARY = {
81326
81607
  "recording-export": system("recording exports — requested from the timeline, not an automation step"),
81327
81608
  records: system(INTERNAL),
81328
81609
  remote: system("the per-device remote setup — authored in the Customize remote editor, sent through the remote UI"),
81610
+ "remote-layout-components": system("the palette of the remote template editor — read-only data, never actuated"),
81329
81611
  "server-management": system(CLUSTER),
81330
81612
  "settings-store": system(INTERNAL),
81331
81613
  "smtp-provider": system(INTERNAL),
@@ -85655,7 +85937,7 @@ var AdminUIAddon = class extends BaseAddon {
85655
85937
  capability: adminUiCapability,
85656
85938
  provider: {
85657
85939
  getStaticDir: async () => ({ staticDir: resolveAdminUiDistDir() }),
85658
- getVersion: async () => ({ version: "1.2.521" })
85940
+ getVersion: async () => ({ version: "1.2.523" })
85659
85941
  }
85660
85942
  }];
85661
85943
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@camstack/addon-admin-ui",
3
- "version": "1.2.521",
3
+ "version": "1.2.523",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Admin UI — Vite frontend build and server-side addon",
@@ -97,6 +97,7 @@
97
97
  "react-i18next": "^17.0.8",
98
98
  "react-konva": "^19.2.3",
99
99
  "react-router-dom": "^7.13.0",
100
+ "simple-icons": "16.36.0",
100
101
  "tailwind-merge": "^3.3.0",
101
102
  "tailwindcss": "^4.2.0",
102
103
  "tsup": "^8.0.0",