@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.
- package/CHANGELOG.md +12 -0
- package/dist/assets/{AddonAssetIcon-DIfNr6QF.js → AddonAssetIcon-VXnpNoSj.js} +1 -1
- package/dist/assets/{Addons-D8e5UEhk.js → Addons-DlINdzv0.js} +1 -1
- package/dist/assets/{AdminPage-DPm4iuSn.js → AdminPage-B9JLs4rT.js} +1 -1
- package/dist/assets/{AdminSectionedPage-B1FFlzAp.js → AdminSectionedPage-EY_w3HY7.js} +1 -1
- package/dist/assets/{AiProfiles-_jjOpe29.js → AiProfiles-fuyzr8D4.js} +1 -1
- package/dist/assets/{BrokerEditorDialog-CMa1f8kC.js → BrokerEditorDialog-DoEQXizE.js} +1 -1
- package/dist/assets/Build-CvZFLBc9.js +40 -0
- package/dist/assets/{Calendars-BncAsHLV.js → Calendars-ClQsQ24o.js} +1 -1
- package/dist/assets/{Cluster-BtPubX4s.js → Cluster-D31IV0wr.js} +1 -1
- package/dist/assets/{ComposedDeviceEditDialog-BHCTUKU-.js → ComposedDeviceEditDialog-Chymp38w.js} +1 -1
- package/dist/assets/CompositionBlockEditor-CpPHLcVD.js +2 -0
- package/dist/assets/{CompositionEditorPage-D4Sj47wU.js → CompositionEditorPage-NlrSqavW.js} +1 -1
- package/dist/assets/{Data-DGUMhXre.js → Data-BBsE7UVR.js} +1 -1
- package/dist/assets/{DeviceDetail-CwB8tpfD.js → DeviceDetail-zZcKfcTs.js} +2 -2
- package/dist/assets/{DeviceDoActionFields-B08_5fN_.js → DeviceDoActionFields-CSKUhZmq.js} +1 -1
- package/dist/assets/{Devices-B-o-SYft.js → Devices-DtEGEpYK.js} +1 -1
- package/dist/assets/{EmbedPlayerPage-BCAMYXmH.js → EmbedPlayerPage-Er_9ZZbp.js} +1 -1
- package/dist/assets/{History-CkZOzm2S.js → History-DEuMaAFu.js} +1 -1
- package/dist/assets/{Identity-D-mKJp3i.js → Identity-Bo-ulITU.js} +1 -1
- package/dist/assets/{IntegrationDetail-Ba7jt4aH.js → IntegrationDetail-IopkO40B.js} +1 -1
- package/dist/assets/{IntegrationHub-D3NNWcI3.js → IntegrationHub-CaKFrwmD.js} +1 -1
- package/dist/assets/{Integrations-DzVbMY51.js → Integrations-B0XFfGvM.js} +1 -1
- package/dist/assets/{Integrations-DfCvoh1h.js → Integrations-DrmJI4oI.js} +1 -1
- package/dist/assets/{Library-CIdnKcUl.js → Library-CWzUsm1c.js} +1 -1
- package/dist/assets/{Locations-BMUiqhX7.js → Locations-CUYgtHWg.js} +2 -2
- package/dist/assets/{Logs-Cr5Ev4Yn.js → Logs-CkwhOBrz.js} +1 -1
- package/dist/assets/{MaskShapeCanvas-Bv7J_UVF.js → MaskShapeCanvas-B_J8Nub8.js} +1 -1
- package/dist/assets/{MotionZonesSettings-BZxXQ1bq.js → MotionZonesSettings-DSDOgPiK.js} +1 -1
- package/dist/assets/{MyAccess-egWpZOj7.js → MyAccess-kZWZLQ6w.js} +1 -1
- package/dist/assets/{Network-DQwRnVG_.js → Network-CsAvssW1.js} +1 -1
- package/dist/assets/{NodeAddonsSettingsPanel-B9vvxBEQ.js → NodeAddonsSettingsPanel-CNSfsu26.js} +1 -1
- package/dist/assets/Notifications-eEXyaFax.js +1 -0
- package/dist/assets/Pipeline-CL-VwLPy.js +1 -0
- package/dist/assets/{PrivacyMaskSettings-Bic1_gT9.js → PrivacyMaskSettings-Zr9fXd19.js} +1 -1
- package/dist/assets/{Recordings-CNhL7oIf.js → Recordings-BrITac0q.js} +1 -1
- package/dist/assets/RemoteGrid-BGbiDThN.js +1 -0
- package/dist/assets/{ScanNetworkModal-B6vWwCe8.js → ScanNetworkModal-BO8EFEZ1.js} +1 -1
- package/dist/assets/{SceneMonitorEditor-Bd7aOOIg.js → SceneMonitorEditor-CvqEBzUw.js} +1 -1
- package/dist/assets/{SessionsList--VxRl_LS.js → SessionsList-BkbXjQt1.js} +1 -1
- package/dist/assets/{Showroom-UkIbrPnX.js → Showroom-ClQBf_59.js} +1 -1
- package/dist/assets/{System-QDZtQXm_.js → System-d-rVWfA6.js} +1 -1
- package/dist/assets/Templates-BY9R_5lz.js +1 -0
- package/dist/assets/{Terminal-5v2dzxpg.js → Terminal-dvCiPiu7.js} +1 -1
- package/dist/assets/{Viewer-B92j2D9F.js → Viewer-D04RI6WE.js} +1 -1
- 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
- package/dist/assets/{addon-icons-context-CDyNgrka.js → addon-icons-context-BsBIxYDH.js} +1 -1
- package/dist/assets/{archive-BKuD6-O9.js → archive-Do2e48DU.js} +1 -1
- package/dist/assets/{assignment-candidates-CvlbrbgK.js → assignment-candidates-8RM__6oC.js} +1 -1
- package/dist/assets/{authed-media-DxWmG5JA.js → authed-media-BYa-9dIZ.js} +1 -1
- package/dist/assets/{bell-off-7L6K5pJk.js → bell-off-RPYQoGP1.js} +1 -1
- package/dist/assets/{board-model-CZOb3LmO.js → board-model-C9BgTio0.js} +1 -1
- package/dist/assets/{boxes-BYgmIZEw.js → boxes-BEverhi4.js} +1 -1
- package/dist/assets/circle-slash-Bb_aa_QL.js +1 -0
- package/dist/assets/client-D-g0nOrC.js +674 -0
- package/dist/assets/{cloud-upload-C40Dp7qu.js → cloud-upload-nVfWiPdO.js} +1 -1
- package/dist/assets/crop-DVR1vsA9.js +1 -0
- package/dist/assets/{device-integration-icon-CLK4k1ae.js → device-integration-icon-C2pH_5Gl.js} +1 -1
- package/dist/assets/device-picker-model-DBfk1Co5.js +1 -0
- package/dist/assets/{dist-CJ9iy42m.js → dist-BVH-vBQM.js} +1 -1
- package/dist/assets/dist-ByEQfnSV.js +674 -0
- package/dist/assets/{file-up-DhY5nof7.js → file-up-CUjXrmMK.js} +1 -1
- package/dist/assets/{format-CvKyF2QM.js → format-BccZ2tds.js} +1 -1
- package/dist/assets/{hard-drive-download-gFidUJGC.js → hard-drive-download-DiXdli_I.js} +1 -1
- package/dist/assets/{hostInit-CDWllEW4.js → hostInit-Bta217FF.js} +1 -1
- package/dist/assets/{i18n-C1QctlOB.js → i18n-COiZcYwm.js} +1 -1
- package/dist/assets/{icons-DrXFX-WI.js → icons-CDeaov6N.js} +1 -1
- package/dist/assets/{index-C0TfYmoA.css → index-DnHMM2c9.css} +1 -1
- package/dist/assets/{index-D3Yx0Smp.js → index-Dqmlzvdc.js} +3 -3
- package/dist/assets/{key-CKmpBvKe.js → key-C0PivC5X.js} +1 -1
- package/dist/assets/{key-round-DMWVlifP.js → key-round-Cu5Tucyk.js} +1 -1
- package/dist/assets/{layers-Bo1tC_4O.js → layers-Cd1UYZNk.js} +1 -1
- package/dist/assets/{linked-devices-model-D9TIS2pY.js → linked-devices-model-CFrDp7fw.js} +1 -1
- package/dist/assets/{list-ordered-BAebxGoz.js → list-ordered-Bkr6PCeB.js} +1 -1
- package/dist/assets/{location-owned-usage-B3nr7gWQ.js → location-owned-usage-E6eX4phu.js} +1 -1
- package/dist/assets/{log-in-CUgGOn9k.js → log-in-DV8GfIgr.js} +1 -1
- package/dist/assets/{memory-stick-CsWM7ppk.js → memory-stick-C6TRN6ht.js} +1 -1
- package/dist/assets/{message-square-plus-C-LDprie.js → message-square-plus-DTJ5QsLH.js} +1 -1
- package/dist/assets/{mf-entry-bootstrap-0-e1103afa.js → mf-entry-bootstrap-0-c0dc6497.js} +2 -2
- package/dist/assets/{mic-off-BmNdC4XW.js → mic-off-gUMH3Z4J.js} +1 -1
- package/dist/assets/{monitor-off-DhTBAYUp.js → monitor-off-C4w1KSTZ.js} +1 -1
- package/dist/assets/{monitor-smartphone-6kCGO3r1.js → monitor-smartphone-CpCqKvAV.js} +1 -1
- package/dist/assets/mount-DBfk1Co5.js +1 -0
- package/dist/assets/{player-overlays-C_WpL6a6.js → player-overlays-CZbAbeZY.js} +1 -1
- package/dist/assets/{recycle-Di1EQ0Qy.js → recycle-BaznD-UX.js} +1 -1
- package/dist/assets/remoteEntry-8jIMK97P.js +1 -0
- package/dist/assets/{ruler-cSAzAdF0.js → ruler-BSo-rKM0.js} +1 -1
- package/dist/assets/{scan-eye-6vO-dwZC.js → scan-eye-DN1vlvLP.js} +1 -1
- package/dist/assets/{scissors-MIPuZwTY.js → scissors-CC58_qMU.js} +1 -1
- package/dist/assets/{search-x-Jgy5Olce.js → search-x-tQuhnR8q.js} +1 -1
- package/dist/assets/{send-CnArxdfm.js → send-CAZEgHzo.js} +1 -1
- package/dist/assets/{settings-2-Cc7_8hT4.js → settings-2-BuBH9G2o.js} +1 -1
- package/dist/assets/{shapes-B6yDXStU.js → shapes-D2hlOKTD.js} +1 -1
- package/dist/assets/{sigma-q5eaqxJ5.js → sigma-Ceyn_S95.js} +1 -1
- package/dist/assets/{speaker-CbeO5md6.js → speaker-BRYEJSzP.js} +1 -1
- package/dist/assets/src-iRjUEwun.js +67 -0
- package/dist/assets/{step-inspector-model-Dm1vwliM.js → step-inspector-model-BfR3NdqL.js} +1 -1
- package/dist/assets/{table-2-Dl4UBoV9.js → table-2-CuSc759e.js} +1 -1
- package/dist/assets/{timer-reset-Bp1VJ4jU.js → timer-reset-Bvn2aK40.js} +1 -1
- package/dist/assets/{unlink-DoHrrlyB.js → unlink-BU_py8I2.js} +1 -1
- package/dist/assets/{usb-uGk5FuUX.js → usb-TZrC9eYC.js} +1 -1
- package/dist/assets/{use-device-bound-caps-Di0CbhM4.js → use-device-bound-caps-CYR80PtH.js} +1 -1
- package/dist/assets/{use-scenes-feed-hWCFwCtN.js → use-scenes-feed-Ddftx740.js} +1 -1
- package/dist/assets/{use-stationary-objects-DJ9JfRWk.js → use-stationary-objects-CJ3xxs43.js} +1 -1
- package/dist/assets/useEventInvalidation-DBfk1Co5.js +1 -0
- package/dist/assets/{useNodeUrlSelection-CW3xhZq4.js → useNodeUrlSelection-DNEz-JoD.js} +1 -1
- package/dist/assets/user-round-jCdxL4f8.js +1 -0
- package/dist/assets/{user-x-KqDnAcpq.js → user-x-CYHlbR6F.js} +1 -1
- package/dist/assets/{variable-vSgKlDpd.js → variable-BNQlwoos.js} +1 -1
- package/dist/assets/{video-DgFhEP51.js → video-CrmOxhYy.js} +1 -1
- 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
- package/dist/index.html +10 -10
- package/dist/server/addon.js +286 -4
- package/package.json +2 -1
- package/dist/assets/Build-SkecHiHh.js +0 -40
- package/dist/assets/CompositionBlockEditor-ImrFV2Gk.js +0 -2
- package/dist/assets/Notifications-B7GkPWCE.js +0 -1
- package/dist/assets/Pipeline-L7YohUe9.js +0 -1
- package/dist/assets/RemoteGrid-Ttvy6q8V.js +0 -1
- package/dist/assets/Templates-C43xppeu.js +0 -1
- package/dist/assets/circle-slash-DSfcxndq.js +0 -1
- package/dist/assets/client-Clemlz5W.js +0 -674
- package/dist/assets/crop-CnSchINM.js +0 -1
- package/dist/assets/device-picker-model-ojy8FewR.js +0 -1
- package/dist/assets/dist-B-uSoSKi.js +0 -674
- package/dist/assets/mount-ojy8FewR.js +0 -1
- package/dist/assets/remoteEntry-B3Z2iNH7.js +0 -1
- package/dist/assets/src-BuD4BDe3.js +0 -67
- package/dist/assets/useEventInvalidation-ojy8FewR.js +0 -1
- package/dist/assets/user-round-BdixCoAv.js +0 -1
package/dist/server/addon.js
CHANGED
|
@@ -5456,7 +5456,7 @@ var ZodIssueCode = {
|
|
|
5456
5456
|
var ZodFirstPartyTypeKind;
|
|
5457
5457
|
ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {});
|
|
5458
5458
|
//#endregion
|
|
5459
|
-
//#region ../types/dist/sleep-
|
|
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.
|
|
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.
|
|
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",
|