@plasius/player-system-interface 0.1.3 → 0.1.5
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/README.md +17 -0
- package/dist/index.cjs +74 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +46 -2
- package/dist/index.d.ts +46 -2
- package/dist/index.js +68 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -127,6 +127,23 @@ The inherited feature flag for this work is `isekai.player-system.interface.enab
|
|
|
127
127
|
- Party and Player System surfaces can coexist in one shell definition
|
|
128
128
|
- reduced-combat behavior is explicit per surface and bounded by the shell policy
|
|
129
129
|
|
|
130
|
+
## Shell State, 3D Panes, and Ambient Alerts
|
|
131
|
+
|
|
132
|
+
`createInterfaceShellState()` represents ambient, focused, and combat-safe
|
|
133
|
+
visibility without coupling the package to a renderer. Combat-safe state keeps
|
|
134
|
+
only retained surface kinds and never exposes suspended surfaces. Use
|
|
135
|
+
`applyInterfaceShellFocusShift()` for keyboard, direct-hotkey, restore, or
|
|
136
|
+
system focus changes; shifts to hidden surfaces are rejected.
|
|
137
|
+
|
|
138
|
+
`createThreeDPaneHostDefinition()` associates a pane with a shell surface,
|
|
139
|
+
world anchor, and supported host adapters. It describes the host boundary but
|
|
140
|
+
does not own rendering or scene orchestration.
|
|
141
|
+
|
|
142
|
+
`createLocalizedAmbientAlertDefinition()` stores an allowlisted locale-to-copy
|
|
143
|
+
map with an explicit live-region mode. Resolve the best available copy with
|
|
144
|
+
`resolveLocalizedAmbientAlertMessage()` and validate pane/alert composition with
|
|
145
|
+
`assessInterfaceShellDefinition()`.
|
|
146
|
+
|
|
130
147
|
## Governance
|
|
131
148
|
|
|
132
149
|
- ADRs: [docs/adrs](./docs/adrs)
|
package/dist/index.cjs
CHANGED
|
@@ -26,20 +26,25 @@ __export(index_exports, {
|
|
|
26
26
|
PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID: () => PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID,
|
|
27
27
|
PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID: () => PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID,
|
|
28
28
|
PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID: () => PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID,
|
|
29
|
+
applyInterfaceShellFocusShift: () => applyInterfaceShellFocusShift,
|
|
29
30
|
assessInterfaceShellDefinition: () => assessInterfaceShellDefinition,
|
|
30
31
|
assessPlayerSystemInterfaceComposition: () => assessPlayerSystemInterfaceComposition,
|
|
31
32
|
createFocusPaneShellDefinition: () => createFocusPaneShellDefinition,
|
|
32
33
|
createInterfaceShellDefinition: () => createInterfaceShellDefinition,
|
|
34
|
+
createInterfaceShellState: () => createInterfaceShellState,
|
|
33
35
|
createInterfaceShellSurfaceDefinition: () => createInterfaceShellSurfaceDefinition,
|
|
34
36
|
createLineOfSightTargetPopupDefinition: () => createLineOfSightTargetPopupDefinition,
|
|
37
|
+
createLocalizedAmbientAlertDefinition: () => createLocalizedAmbientAlertDefinition,
|
|
35
38
|
createPlayerSystemInterfaceContract: () => createPlayerSystemInterfaceContract,
|
|
36
39
|
createPlayerSystemInterfacePortabilityContract: () => createPlayerSystemInterfacePortabilityContract,
|
|
40
|
+
createThreeDPaneHostDefinition: () => createThreeDPaneHostDefinition,
|
|
37
41
|
createWorldSpacePanelDefinition: () => createWorldSpacePanelDefinition,
|
|
38
42
|
defaultPlayerSystemInterfaceContract: () => defaultPlayerSystemInterfaceContract,
|
|
39
43
|
defaultPlayerSystemInterfacePortabilityContract: () => defaultPlayerSystemInterfacePortabilityContract,
|
|
40
44
|
defaultReducedCombatOverlayPolicy: () => defaultReducedCombatOverlayPolicy,
|
|
41
45
|
isPlayerSystemInterfaceMode: () => isPlayerSystemInterfaceMode,
|
|
42
|
-
packageDescriptor: () => packageDescriptor
|
|
46
|
+
packageDescriptor: () => packageDescriptor,
|
|
47
|
+
resolveLocalizedAmbientAlertMessage: () => resolveLocalizedAmbientAlertMessage
|
|
43
48
|
});
|
|
44
49
|
module.exports = __toCommonJS(index_exports);
|
|
45
50
|
var PLAYER_SYSTEM_INTERFACE_PACKAGE = "@plasius/player-system-interface";
|
|
@@ -154,12 +159,26 @@ function createFocusPaneShellDefinition(input) {
|
|
|
154
159
|
function createLineOfSightTargetPopupDefinition(input) {
|
|
155
160
|
return Object.freeze({ ...input });
|
|
156
161
|
}
|
|
162
|
+
function createThreeDPaneHostDefinition(input) {
|
|
163
|
+
return Object.freeze({
|
|
164
|
+
...input,
|
|
165
|
+
supportedHosts: Object.freeze([...input.supportedHosts])
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
function createLocalizedAmbientAlertDefinition(input) {
|
|
169
|
+
return Object.freeze({
|
|
170
|
+
...input,
|
|
171
|
+
localizedMessages: Object.freeze({ ...input.localizedMessages })
|
|
172
|
+
});
|
|
173
|
+
}
|
|
157
174
|
function createInterfaceShellDefinition(input = {}) {
|
|
158
175
|
return Object.freeze({
|
|
159
176
|
featureFlagId: input.featureFlagId ?? PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,
|
|
160
177
|
surfaces: Object.freeze([...input.surfaces ?? []]),
|
|
161
178
|
focusPane: input.focusPane ? Object.freeze({ ...input.focusPane }) : void 0,
|
|
162
179
|
targetPopups: Object.freeze([...input.targetPopups ?? []]),
|
|
180
|
+
paneHosts: Object.freeze([...input.paneHosts ?? []]),
|
|
181
|
+
ambientAlerts: Object.freeze([...input.ambientAlerts ?? []]),
|
|
163
182
|
reducedCombat: Object.freeze({
|
|
164
183
|
...defaultReducedCombatOverlayPolicy,
|
|
165
184
|
...input.reducedCombat,
|
|
@@ -169,6 +188,41 @@ function createInterfaceShellDefinition(input = {}) {
|
|
|
169
188
|
})
|
|
170
189
|
});
|
|
171
190
|
}
|
|
191
|
+
function createInterfaceShellState(shell, input) {
|
|
192
|
+
const retainedSurfaceKinds = new Set(
|
|
193
|
+
shell.reducedCombat.retainedSurfaceKinds
|
|
194
|
+
);
|
|
195
|
+
const visibleSurfaceIds = shell.surfaces.filter(
|
|
196
|
+
(surface) => input.mode !== "combat-safe" || surface.combatBehavior !== "suspend" && retainedSurfaceKinds.has(surface.kind)
|
|
197
|
+
).map((surface) => surface.surfaceId);
|
|
198
|
+
if (input.focusedSurfaceId && !visibleSurfaceIds.includes(input.focusedSurfaceId)) {
|
|
199
|
+
throw new RangeError(
|
|
200
|
+
`Focused surface '${input.focusedSurfaceId}' is not visible in ${input.mode} mode`
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
return Object.freeze({
|
|
204
|
+
featureFlagId: shell.featureFlagId,
|
|
205
|
+
mode: input.mode,
|
|
206
|
+
focusedSurfaceId: input.mode === "focused" ? input.focusedSurfaceId : void 0,
|
|
207
|
+
visibleSurfaceIds: Object.freeze(visibleSurfaceIds)
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
function applyInterfaceShellFocusShift(state, focusShift) {
|
|
211
|
+
if (!state.visibleSurfaceIds.includes(focusShift.toSurfaceId)) {
|
|
212
|
+
throw new RangeError(
|
|
213
|
+
`Focused surface '${focusShift.toSurfaceId}' is not visible in ${state.mode} mode`
|
|
214
|
+
);
|
|
215
|
+
}
|
|
216
|
+
return Object.freeze({
|
|
217
|
+
...state,
|
|
218
|
+
mode: "focused",
|
|
219
|
+
focusedSurfaceId: focusShift.toSurfaceId,
|
|
220
|
+
focusShift: Object.freeze({ ...focusShift })
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
function resolveLocalizedAmbientAlertMessage(alert, locale, fallbackLocale = "en-GB") {
|
|
224
|
+
return alert.localizedMessages[locale] ?? alert.localizedMessages[fallbackLocale];
|
|
225
|
+
}
|
|
172
226
|
function assessPlayerSystemInterfaceComposition(sample, contract = defaultPlayerSystemInterfacePortabilityContract) {
|
|
173
227
|
const violations = [];
|
|
174
228
|
if (sample.panelCount > contract.compositionScale.maxWorldPanels) {
|
|
@@ -218,6 +272,19 @@ function assessInterfaceShellDefinition(shell) {
|
|
|
218
272
|
violations.push(`popup:${popup.popupId}`);
|
|
219
273
|
}
|
|
220
274
|
}
|
|
275
|
+
for (const paneHost of shell.paneHosts) {
|
|
276
|
+
const matchingSurface = shell.surfaces.find(
|
|
277
|
+
(surface) => surface.surfaceId === paneHost.surfaceId && surface.owner === paneHost.owner && surface.anchorId === paneHost.anchorId
|
|
278
|
+
);
|
|
279
|
+
if (!matchingSurface) {
|
|
280
|
+
violations.push(`paneHost:${paneHost.hostId}`);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
for (const alert of shell.ambientAlerts) {
|
|
284
|
+
if (Object.keys(alert.localizedMessages).length === 0) {
|
|
285
|
+
violations.push(`alert:${alert.alertId}`);
|
|
286
|
+
}
|
|
287
|
+
}
|
|
221
288
|
if (ownerSet.has("player-system") && ownerSet.has("party-system") && shell.reducedCombat.retainedSurfaceKinds.length === 0) {
|
|
222
289
|
violations.push("reducedCombat");
|
|
223
290
|
}
|
|
@@ -234,19 +301,24 @@ function assessInterfaceShellDefinition(shell) {
|
|
|
234
301
|
PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID,
|
|
235
302
|
PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID,
|
|
236
303
|
PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID,
|
|
304
|
+
applyInterfaceShellFocusShift,
|
|
237
305
|
assessInterfaceShellDefinition,
|
|
238
306
|
assessPlayerSystemInterfaceComposition,
|
|
239
307
|
createFocusPaneShellDefinition,
|
|
240
308
|
createInterfaceShellDefinition,
|
|
309
|
+
createInterfaceShellState,
|
|
241
310
|
createInterfaceShellSurfaceDefinition,
|
|
242
311
|
createLineOfSightTargetPopupDefinition,
|
|
312
|
+
createLocalizedAmbientAlertDefinition,
|
|
243
313
|
createPlayerSystemInterfaceContract,
|
|
244
314
|
createPlayerSystemInterfacePortabilityContract,
|
|
315
|
+
createThreeDPaneHostDefinition,
|
|
245
316
|
createWorldSpacePanelDefinition,
|
|
246
317
|
defaultPlayerSystemInterfaceContract,
|
|
247
318
|
defaultPlayerSystemInterfacePortabilityContract,
|
|
248
319
|
defaultReducedCombatOverlayPolicy,
|
|
249
320
|
isPlayerSystemInterfaceMode,
|
|
250
|
-
packageDescriptor
|
|
321
|
+
packageDescriptor,
|
|
322
|
+
resolveLocalizedAmbientAlertMessage
|
|
251
323
|
});
|
|
252
324
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface PackageDescriptor {\n readonly packageName: string;\n readonly featureFlagId: string;\n readonly envPrefix: string;\n readonly summary: string;\n}\n\nexport type OverlayKeyboardPath = \"sequential\" | \"direct-hotkey\" | \"read-only\";\n\nexport interface OverlayAccessibilityContract {\n readonly keyboardPath: OverlayKeyboardPath;\n readonly focusRestorationTarget: \"trigger\" | \"pane-heading\" | \"nearest-anchor\";\n readonly liveRegionMode: \"polite\" | \"assertive\" | \"off\";\n readonly requiresAccessibleName: boolean;\n}\n\nexport interface InterfaceFrameBudget {\n readonly targetFps: number;\n readonly maxFrameMs: number;\n readonly maxInteractivePanelsPerFrame: number;\n}\n\nexport type OverlayHostKind =\n | \"dom-overlay\"\n | \"native-overlay\"\n | \"headless-snapshot\";\n\nexport type OverlayAdapterCapability =\n | \"focus-restoration\"\n | \"live-region\"\n | \"anchor-registry\";\n\nexport interface OverlayHostAdapterContract {\n readonly supportedHosts: readonly OverlayHostKind[];\n readonly requiredCapabilities: readonly OverlayAdapterCapability[];\n readonly forbiddenAssumptions: readonly string[];\n}\n\nexport interface OverlayCompositionScaleContract {\n readonly maxWorldPanels: number;\n readonly maxFocusPanes: number;\n readonly maxAlertMarkers: number;\n readonly maxInteractivePanelsPerFrame: number;\n}\n\nexport interface PlayerSystemInterfaceContract {\n readonly featureFlagId: string;\n readonly accessibility: OverlayAccessibilityContract;\n readonly frameBudget: InterfaceFrameBudget;\n}\n\nexport interface PlayerSystemInterfacePortabilityContract {\n readonly featureFlagId: string;\n readonly hostAdapters: OverlayHostAdapterContract;\n readonly compositionScale: OverlayCompositionScaleContract;\n}\n\nexport interface PlayerSystemInterfaceContractInput {\n readonly featureFlagId?: string;\n readonly accessibility?: Partial<OverlayAccessibilityContract>;\n readonly frameBudget?: Partial<InterfaceFrameBudget>;\n}\n\nexport interface PlayerSystemInterfacePortabilityContractInput {\n readonly featureFlagId?: string;\n readonly hostAdapters?: Partial<OverlayHostAdapterContract>;\n readonly compositionScale?: Partial<OverlayCompositionScaleContract>;\n}\n\nexport type PlayerSystemInterfaceMode = \"ambient\" | \"focused\" | \"combat-safe\";\n\nexport type PlayerSystemPaneId =\n | \"identity\"\n | \"missions\"\n | \"guild-quests\"\n | \"logs\"\n | \"mcc\"\n | \"tutorial\"\n | \"points-store\";\n\nexport type InterfaceShellOwner = \"player-system\" | \"party-system\";\nexport type InterfaceShellSurfaceKind =\n | \"world-panel\"\n | \"focus-pane\"\n | \"target-popup\"\n | \"alert-marker\";\nexport type InterfaceCombatBehavior = \"persist\" | \"reduce\" | \"suspend\";\n\nexport interface InterfaceShellSurfaceDefinition {\n readonly surfaceId: string;\n readonly owner: InterfaceShellOwner;\n readonly kind: InterfaceShellSurfaceKind;\n readonly anchorId: string;\n readonly interactive: boolean;\n readonly priority: number;\n readonly combatBehavior: InterfaceCombatBehavior;\n}\n\nexport interface FocusPaneShellDefinition {\n readonly panelId: string;\n readonly owner: InterfaceShellOwner;\n readonly pane: PlayerSystemPaneId;\n readonly anchorId: string;\n readonly heading: string;\n readonly interactive: boolean;\n readonly combatBehavior: InterfaceCombatBehavior;\n}\n\nexport interface LineOfSightTargetPopupDefinition {\n readonly popupId: string;\n readonly owner: InterfaceShellOwner;\n readonly anchorId: string;\n readonly targetId: string;\n readonly summary: string;\n readonly requiresLineOfSight: boolean;\n readonly actionLabel?: string;\n}\n\nexport interface ReducedCombatOverlayPolicy {\n readonly featureFlagId: string;\n readonly mode: \"combat-safe\";\n readonly retainedSurfaceKinds: readonly InterfaceShellSurfaceKind[];\n readonly maxInteractiveSurfaces: number;\n}\n\nexport interface InterfaceShellDefinition {\n readonly featureFlagId: string;\n readonly surfaces: readonly InterfaceShellSurfaceDefinition[];\n readonly focusPane?: FocusPaneShellDefinition;\n readonly targetPopups: readonly LineOfSightTargetPopupDefinition[];\n readonly reducedCombat: ReducedCombatOverlayPolicy;\n}\n\nexport interface InterfaceShellDefinitionInput {\n readonly featureFlagId?: string;\n readonly surfaces?: readonly InterfaceShellSurfaceDefinition[];\n readonly focusPane?: FocusPaneShellDefinition;\n readonly targetPopups?: readonly LineOfSightTargetPopupDefinition[];\n readonly reducedCombat?: Partial<ReducedCombatOverlayPolicy>;\n}\n\nexport interface WorldSpacePanelDefinition {\n readonly panelId: string;\n readonly pane: PlayerSystemPaneId;\n readonly anchorId: string;\n readonly interactive: boolean;\n readonly accessibilityLabel?: string;\n readonly focusOrder?: number;\n}\n\nexport interface OverlayAlertMarker {\n readonly markerId: string;\n readonly severity: \"info\" | \"warning\" | \"danger\";\n readonly anchorId: string;\n}\n\nexport interface WorldSpaceCompositionSample {\n readonly panelCount: number;\n readonly focusPaneCount: number;\n readonly alertMarkerCount: number;\n readonly interactivePanelCount: number;\n}\n\nexport interface InterfaceContractAssessment {\n readonly accepted: boolean;\n readonly violations: readonly string[];\n}\n\nexport const PLAYER_SYSTEM_INTERFACE_PACKAGE = \"@plasius/player-system-interface\";\nexport const PLAYER_SYSTEM_INTERFACE_ENV_PREFIX = \"PLAYER_SYSTEM_INTERFACE\";\nexport const PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID =\n \"isekai.player-system.interface.enabled\";\nexport const PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\nexport const PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\nexport const PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\n\nexport const packageDescriptor: PackageDescriptor = Object.freeze({\n packageName: PLAYER_SYSTEM_INTERFACE_PACKAGE,\n featureFlagId: PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID,\n envPrefix: PLAYER_SYSTEM_INTERFACE_ENV_PREFIX,\n summary:\n \"World-space Player System overlays, focus panes, and target-surface contracts for Plasius game experiences.\",\n});\n\nexport const defaultPlayerSystemInterfaceContract: PlayerSystemInterfaceContract =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID,\n accessibility: Object.freeze({\n keyboardPath: \"sequential\",\n focusRestorationTarget: \"trigger\",\n liveRegionMode: \"polite\",\n requiresAccessibleName: true,\n }),\n frameBudget: Object.freeze({\n targetFps: 60,\n maxFrameMs: 16,\n maxInteractivePanelsPerFrame: 2,\n }),\n });\n\nexport const defaultPlayerSystemInterfacePortabilityContract: PlayerSystemInterfacePortabilityContract =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID,\n hostAdapters: Object.freeze({\n supportedHosts: Object.freeze([\n \"dom-overlay\",\n \"native-overlay\",\n \"headless-snapshot\",\n ] satisfies OverlayHostKind[]),\n requiredCapabilities: Object.freeze([\n \"focus-restoration\",\n \"live-region\",\n \"anchor-registry\",\n ] satisfies OverlayAdapterCapability[]),\n forbiddenAssumptions: Object.freeze([\n \"window-global\",\n \"single-pane-layout\",\n \"absolute-scene-coordinates\",\n ]),\n }),\n compositionScale: Object.freeze({\n maxWorldPanels: 6,\n maxFocusPanes: 3,\n maxAlertMarkers: 8,\n maxInteractivePanelsPerFrame: 2,\n }),\n });\n\nexport const defaultReducedCombatOverlayPolicy: ReducedCombatOverlayPolicy =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,\n mode: \"combat-safe\",\n retainedSurfaceKinds: Object.freeze([\n \"alert-marker\",\n \"target-popup\",\n \"focus-pane\",\n ] satisfies InterfaceShellSurfaceKind[]),\n maxInteractiveSurfaces: 1,\n });\n\nexport function isPlayerSystemInterfaceMode(\n value: string\n): value is PlayerSystemInterfaceMode {\n return value === \"ambient\" || value === \"focused\" || value === \"combat-safe\";\n}\n\nexport function createWorldSpacePanelDefinition(\n input: WorldSpacePanelDefinition\n): WorldSpacePanelDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createPlayerSystemInterfaceContract(\n input: PlayerSystemInterfaceContractInput = {}\n): PlayerSystemInterfaceContract {\n return Object.freeze({\n featureFlagId:\n input.featureFlagId ?? defaultPlayerSystemInterfaceContract.featureFlagId,\n accessibility: Object.freeze({\n ...defaultPlayerSystemInterfaceContract.accessibility,\n ...input.accessibility,\n }),\n frameBudget: Object.freeze({\n ...defaultPlayerSystemInterfaceContract.frameBudget,\n ...input.frameBudget,\n }),\n });\n}\n\nexport function createPlayerSystemInterfacePortabilityContract(\n input: PlayerSystemInterfacePortabilityContractInput = {}\n): PlayerSystemInterfacePortabilityContract {\n return Object.freeze({\n featureFlagId:\n input.featureFlagId ??\n defaultPlayerSystemInterfacePortabilityContract.featureFlagId,\n hostAdapters: Object.freeze({\n ...defaultPlayerSystemInterfacePortabilityContract.hostAdapters,\n ...input.hostAdapters,\n supportedHosts: Object.freeze([\n ...(input.hostAdapters?.supportedHosts ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .supportedHosts),\n ]),\n requiredCapabilities: Object.freeze([\n ...(input.hostAdapters?.requiredCapabilities ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .requiredCapabilities),\n ]),\n forbiddenAssumptions: Object.freeze([\n ...(input.hostAdapters?.forbiddenAssumptions ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .forbiddenAssumptions),\n ]),\n }),\n compositionScale: Object.freeze({\n ...defaultPlayerSystemInterfacePortabilityContract.compositionScale,\n ...input.compositionScale,\n }),\n });\n}\n\nexport function createInterfaceShellSurfaceDefinition(\n input: InterfaceShellSurfaceDefinition\n): InterfaceShellSurfaceDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createFocusPaneShellDefinition(\n input: FocusPaneShellDefinition\n): FocusPaneShellDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createLineOfSightTargetPopupDefinition(\n input: LineOfSightTargetPopupDefinition\n): LineOfSightTargetPopupDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createInterfaceShellDefinition(\n input: InterfaceShellDefinitionInput = {}\n): InterfaceShellDefinition {\n return Object.freeze({\n featureFlagId: input.featureFlagId ?? PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,\n surfaces: Object.freeze([...(input.surfaces ?? [])]),\n focusPane: input.focusPane ? Object.freeze({ ...input.focusPane }) : undefined,\n targetPopups: Object.freeze([...(input.targetPopups ?? [])]),\n reducedCombat: Object.freeze({\n ...defaultReducedCombatOverlayPolicy,\n ...input.reducedCombat,\n retainedSurfaceKinds: Object.freeze([\n ...(input.reducedCombat?.retainedSurfaceKinds ??\n defaultReducedCombatOverlayPolicy.retainedSurfaceKinds),\n ]),\n }),\n });\n}\n\nexport function assessPlayerSystemInterfaceComposition(\n sample: WorldSpaceCompositionSample,\n contract: PlayerSystemInterfacePortabilityContract = defaultPlayerSystemInterfacePortabilityContract\n): InterfaceContractAssessment {\n const violations: string[] = [];\n\n if (sample.panelCount > contract.compositionScale.maxWorldPanels) {\n violations.push(\"panelCount\");\n }\n\n if (sample.focusPaneCount > contract.compositionScale.maxFocusPanes) {\n violations.push(\"focusPaneCount\");\n }\n\n if (sample.alertMarkerCount > contract.compositionScale.maxAlertMarkers) {\n violations.push(\"alertMarkerCount\");\n }\n\n if (\n sample.interactivePanelCount >\n contract.compositionScale.maxInteractivePanelsPerFrame\n ) {\n violations.push(\"interactivePanelCount\");\n }\n\n return Object.freeze({\n accepted: violations.length === 0,\n violations: Object.freeze(violations),\n });\n}\n\nexport function assessInterfaceShellDefinition(\n shell: InterfaceShellDefinition\n): InterfaceContractAssessment {\n const violations: string[] = [];\n const ownerSet = new Set(shell.surfaces.map((surface) => surface.owner));\n const retainedSurfaceKinds = new Set(shell.reducedCombat.retainedSurfaceKinds);\n const interactiveSurfaceCount = shell.surfaces.filter(\n (surface) => surface.interactive && retainedSurfaceKinds.has(surface.kind)\n ).length;\n const focusPane = shell.focusPane;\n\n if (shell.surfaces.length === 0) {\n violations.push(\"surfaces\");\n }\n\n if (focusPane && !ownerSet.has(focusPane.owner)) {\n violations.push(\"focusPaneOwner\");\n }\n\n if (focusPane) {\n const matchingSurface = shell.surfaces.find(\n (surface) =>\n surface.kind === \"focus-pane\" &&\n surface.anchorId === focusPane.anchorId &&\n surface.owner === focusPane.owner\n );\n if (!matchingSurface) {\n violations.push(\"focusPaneSurface\");\n }\n }\n\n if (\n interactiveSurfaceCount > shell.reducedCombat.maxInteractiveSurfaces\n ) {\n violations.push(\"interactiveSurfaceCount\");\n }\n\n for (const popup of shell.targetPopups) {\n if (popup.requiresLineOfSight && popup.anchorId.length === 0) {\n violations.push(`popup:${popup.popupId}`);\n }\n }\n\n if (\n ownerSet.has(\"player-system\") &&\n ownerSet.has(\"party-system\") &&\n shell.reducedCombat.retainedSurfaceKinds.length === 0\n ) {\n violations.push(\"reducedCombat\");\n }\n\n return Object.freeze({\n accepted: violations.length === 0,\n violations: Object.freeze(violations),\n });\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAwKO,IAAM,kCAAkC;AACxC,IAAM,qCAAqC;AAC3C,IAAM,0CACX;AACK,IAAM,yCACX;AACK,IAAM,4CACX;AACK,IAAM,oDACX;AAEK,IAAM,oBAAuC,OAAO,OAAO;AAAA,EAChE,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,SACE;AACJ,CAAC;AAEM,IAAM,uCACX,OAAO,OAAO;AAAA,EACZ,eAAe;AAAA,EACf,eAAe,OAAO,OAAO;AAAA,IAC3B,cAAc;AAAA,IACd,wBAAwB;AAAA,IACxB,gBAAgB;AAAA,IAChB,wBAAwB;AAAA,EAC1B,CAAC;AAAA,EACD,aAAa,OAAO,OAAO;AAAA,IACzB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,8BAA8B;AAAA,EAChC,CAAC;AACH,CAAC;AAEI,IAAM,kDACX,OAAO,OAAO;AAAA,EACZ,eAAe;AAAA,EACf,cAAc,OAAO,OAAO;AAAA,IAC1B,gBAAgB,OAAO,OAAO;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAA6B;AAAA,IAC7B,sBAAsB,OAAO,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAsC;AAAA,IACtC,sBAAsB,OAAO,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAAA,EACD,kBAAkB,OAAO,OAAO;AAAA,IAC9B,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,8BAA8B;AAAA,EAChC,CAAC;AACH,CAAC;AAEI,IAAM,oCACX,OAAO,OAAO;AAAA,EACZ,eAAe;AAAA,EACf,MAAM;AAAA,EACN,sBAAsB,OAAO,OAAO;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAuC;AAAA,EACvC,wBAAwB;AAC1B,CAAC;AAEI,SAAS,4BACd,OACoC;AACpC,SAAO,UAAU,aAAa,UAAU,aAAa,UAAU;AACjE;AAEO,SAAS,gCACd,OAC2B;AAC3B,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC;AACnC;AAEO,SAAS,oCACd,QAA4C,CAAC,GACd;AAC/B,SAAO,OAAO,OAAO;AAAA,IACnB,eACE,MAAM,iBAAiB,qCAAqC;AAAA,IAC9D,eAAe,OAAO,OAAO;AAAA,MAC3B,GAAG,qCAAqC;AAAA,MACxC,GAAG,MAAM;AAAA,IACX,CAAC;AAAA,IACD,aAAa,OAAO,OAAO;AAAA,MACzB,GAAG,qCAAqC;AAAA,MACxC,GAAG,MAAM;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,+CACd,QAAuD,CAAC,GACd;AAC1C,SAAO,OAAO,OAAO;AAAA,IACnB,eACE,MAAM,iBACN,gDAAgD;AAAA,IAClD,cAAc,OAAO,OAAO;AAAA,MAC1B,GAAG,gDAAgD;AAAA,MACnD,GAAG,MAAM;AAAA,MACT,gBAAgB,OAAO,OAAO;AAAA,QAC5B,GAAI,MAAM,cAAc,kBACtB,gDAAgD,aAC7C;AAAA,MACP,CAAC;AAAA,MACD,sBAAsB,OAAO,OAAO;AAAA,QAClC,GAAI,MAAM,cAAc,wBACtB,gDAAgD,aAC7C;AAAA,MACP,CAAC;AAAA,MACD,sBAAsB,OAAO,OAAO;AAAA,QAClC,GAAI,MAAM,cAAc,wBACtB,gDAAgD,aAC7C;AAAA,MACP,CAAC;AAAA,IACH,CAAC;AAAA,IACD,kBAAkB,OAAO,OAAO;AAAA,MAC9B,GAAG,gDAAgD;AAAA,MACnD,GAAG,MAAM;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,sCACd,OACiC;AACjC,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC;AACnC;AAEO,SAAS,+BACd,OAC0B;AAC1B,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC;AACnC;AAEO,SAAS,uCACd,OACkC;AAClC,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC;AACnC;AAEO,SAAS,+BACd,QAAuC,CAAC,GACd;AAC1B,SAAO,OAAO,OAAO;AAAA,IACnB,eAAe,MAAM,iBAAiB;AAAA,IACtC,UAAU,OAAO,OAAO,CAAC,GAAI,MAAM,YAAY,CAAC,CAAE,CAAC;AAAA,IACnD,WAAW,MAAM,YAAY,OAAO,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI;AAAA,IACrE,cAAc,OAAO,OAAO,CAAC,GAAI,MAAM,gBAAgB,CAAC,CAAE,CAAC;AAAA,IAC3D,eAAe,OAAO,OAAO;AAAA,MAC3B,GAAG;AAAA,MACH,GAAG,MAAM;AAAA,MACT,sBAAsB,OAAO,OAAO;AAAA,QAClC,GAAI,MAAM,eAAe,wBACvB,kCAAkC;AAAA,MACtC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,uCACd,QACA,WAAqD,iDACxB;AAC7B,QAAM,aAAuB,CAAC;AAE9B,MAAI,OAAO,aAAa,SAAS,iBAAiB,gBAAgB;AAChE,eAAW,KAAK,YAAY;AAAA,EAC9B;AAEA,MAAI,OAAO,iBAAiB,SAAS,iBAAiB,eAAe;AACnE,eAAW,KAAK,gBAAgB;AAAA,EAClC;AAEA,MAAI,OAAO,mBAAmB,SAAS,iBAAiB,iBAAiB;AACvE,eAAW,KAAK,kBAAkB;AAAA,EACpC;AAEA,MACE,OAAO,wBACP,SAAS,iBAAiB,8BAC1B;AACA,eAAW,KAAK,uBAAuB;AAAA,EACzC;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,UAAU,WAAW,WAAW;AAAA,IAChC,YAAY,OAAO,OAAO,UAAU;AAAA,EACtC,CAAC;AACH;AAEO,SAAS,+BACd,OAC6B;AAC7B,QAAM,aAAuB,CAAC;AAC9B,QAAM,WAAW,IAAI,IAAI,MAAM,SAAS,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC;AACvE,QAAM,uBAAuB,IAAI,IAAI,MAAM,cAAc,oBAAoB;AAC7E,QAAM,0BAA0B,MAAM,SAAS;AAAA,IAC7C,CAAC,YAAY,QAAQ,eAAe,qBAAqB,IAAI,QAAQ,IAAI;AAAA,EAC3E,EAAE;AACF,QAAM,YAAY,MAAM;AAExB,MAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,eAAW,KAAK,UAAU;AAAA,EAC5B;AAEA,MAAI,aAAa,CAAC,SAAS,IAAI,UAAU,KAAK,GAAG;AAC/C,eAAW,KAAK,gBAAgB;AAAA,EAClC;AAEA,MAAI,WAAW;AACb,UAAM,kBAAkB,MAAM,SAAS;AAAA,MACrC,CAAC,YACC,QAAQ,SAAS,gBACjB,QAAQ,aAAa,UAAU,YAC/B,QAAQ,UAAU,UAAU;AAAA,IAChC;AACA,QAAI,CAAC,iBAAiB;AACpB,iBAAW,KAAK,kBAAkB;AAAA,IACpC;AAAA,EACF;AAEA,MACE,0BAA0B,MAAM,cAAc,wBAC9C;AACA,eAAW,KAAK,yBAAyB;AAAA,EAC3C;AAEA,aAAW,SAAS,MAAM,cAAc;AACtC,QAAI,MAAM,uBAAuB,MAAM,SAAS,WAAW,GAAG;AAC5D,iBAAW,KAAK,SAAS,MAAM,OAAO,EAAE;AAAA,IAC1C;AAAA,EACF;AAEA,MACE,SAAS,IAAI,eAAe,KAC5B,SAAS,IAAI,cAAc,KAC3B,MAAM,cAAc,qBAAqB,WAAW,GACpD;AACA,eAAW,KAAK,eAAe;AAAA,EACjC;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,UAAU,WAAW,WAAW;AAAA,IAChC,YAAY,OAAO,OAAO,UAAU;AAAA,EACtC,CAAC;AACH;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface PackageDescriptor {\n readonly packageName: string;\n readonly featureFlagId: string;\n readonly envPrefix: string;\n readonly summary: string;\n}\n\nexport type OverlayKeyboardPath = \"sequential\" | \"direct-hotkey\" | \"read-only\";\n\nexport interface OverlayAccessibilityContract {\n readonly keyboardPath: OverlayKeyboardPath;\n readonly focusRestorationTarget: \"trigger\" | \"pane-heading\" | \"nearest-anchor\";\n readonly liveRegionMode: \"polite\" | \"assertive\" | \"off\";\n readonly requiresAccessibleName: boolean;\n}\n\nexport interface InterfaceFrameBudget {\n readonly targetFps: number;\n readonly maxFrameMs: number;\n readonly maxInteractivePanelsPerFrame: number;\n}\n\nexport type OverlayHostKind =\n | \"dom-overlay\"\n | \"native-overlay\"\n | \"headless-snapshot\";\n\nexport type OverlayAdapterCapability =\n | \"focus-restoration\"\n | \"live-region\"\n | \"anchor-registry\";\n\nexport interface OverlayHostAdapterContract {\n readonly supportedHosts: readonly OverlayHostKind[];\n readonly requiredCapabilities: readonly OverlayAdapterCapability[];\n readonly forbiddenAssumptions: readonly string[];\n}\n\nexport interface OverlayCompositionScaleContract {\n readonly maxWorldPanels: number;\n readonly maxFocusPanes: number;\n readonly maxAlertMarkers: number;\n readonly maxInteractivePanelsPerFrame: number;\n}\n\nexport interface PlayerSystemInterfaceContract {\n readonly featureFlagId: string;\n readonly accessibility: OverlayAccessibilityContract;\n readonly frameBudget: InterfaceFrameBudget;\n}\n\nexport interface PlayerSystemInterfacePortabilityContract {\n readonly featureFlagId: string;\n readonly hostAdapters: OverlayHostAdapterContract;\n readonly compositionScale: OverlayCompositionScaleContract;\n}\n\nexport interface PlayerSystemInterfaceContractInput {\n readonly featureFlagId?: string;\n readonly accessibility?: Partial<OverlayAccessibilityContract>;\n readonly frameBudget?: Partial<InterfaceFrameBudget>;\n}\n\nexport interface PlayerSystemInterfacePortabilityContractInput {\n readonly featureFlagId?: string;\n readonly hostAdapters?: Partial<OverlayHostAdapterContract>;\n readonly compositionScale?: Partial<OverlayCompositionScaleContract>;\n}\n\nexport type PlayerSystemInterfaceMode = \"ambient\" | \"focused\" | \"combat-safe\";\n\nexport type PlayerSystemPaneId =\n | \"identity\"\n | \"missions\"\n | \"guild-quests\"\n | \"logs\"\n | \"mcc\"\n | \"tutorial\"\n | \"points-store\";\n\nexport type InterfaceShellOwner = \"player-system\" | \"party-system\";\nexport type InterfaceShellSurfaceKind =\n | \"world-panel\"\n | \"focus-pane\"\n | \"target-popup\"\n | \"alert-marker\";\nexport type InterfaceCombatBehavior = \"persist\" | \"reduce\" | \"suspend\";\n\nexport interface InterfaceShellSurfaceDefinition {\n readonly surfaceId: string;\n readonly owner: InterfaceShellOwner;\n readonly kind: InterfaceShellSurfaceKind;\n readonly anchorId: string;\n readonly interactive: boolean;\n readonly priority: number;\n readonly combatBehavior: InterfaceCombatBehavior;\n}\n\nexport interface FocusPaneShellDefinition {\n readonly panelId: string;\n readonly owner: InterfaceShellOwner;\n readonly pane: PlayerSystemPaneId;\n readonly anchorId: string;\n readonly heading: string;\n readonly interactive: boolean;\n readonly combatBehavior: InterfaceCombatBehavior;\n}\n\nexport interface LineOfSightTargetPopupDefinition {\n readonly popupId: string;\n readonly owner: InterfaceShellOwner;\n readonly anchorId: string;\n readonly targetId: string;\n readonly summary: string;\n readonly requiresLineOfSight: boolean;\n readonly actionLabel?: string;\n}\n\nexport interface ReducedCombatOverlayPolicy {\n readonly featureFlagId: string;\n readonly mode: \"combat-safe\";\n readonly retainedSurfaceKinds: readonly InterfaceShellSurfaceKind[];\n readonly maxInteractiveSurfaces: number;\n}\n\nexport interface InterfaceShellDefinition {\n readonly featureFlagId: string;\n readonly surfaces: readonly InterfaceShellSurfaceDefinition[];\n readonly focusPane?: FocusPaneShellDefinition;\n readonly targetPopups: readonly LineOfSightTargetPopupDefinition[];\n readonly paneHosts: readonly ThreeDPaneHostDefinition[];\n readonly ambientAlerts: readonly LocalizedAmbientAlertDefinition[];\n readonly reducedCombat: ReducedCombatOverlayPolicy;\n}\n\nexport interface InterfaceShellDefinitionInput {\n readonly featureFlagId?: string;\n readonly surfaces?: readonly InterfaceShellSurfaceDefinition[];\n readonly focusPane?: FocusPaneShellDefinition;\n readonly targetPopups?: readonly LineOfSightTargetPopupDefinition[];\n readonly paneHosts?: readonly ThreeDPaneHostDefinition[];\n readonly ambientAlerts?: readonly LocalizedAmbientAlertDefinition[];\n readonly reducedCombat?: Partial<ReducedCombatOverlayPolicy>;\n}\n\nexport type InterfaceFocusShiftReason =\n | \"keyboard\"\n | \"direct-hotkey\"\n | \"restore\"\n | \"system\";\n\nexport interface InterfaceFocusShift {\n readonly fromSurfaceId?: string;\n readonly toSurfaceId: string;\n readonly reason: InterfaceFocusShiftReason;\n}\n\nexport interface InterfaceShellStateDefinition {\n readonly featureFlagId: string;\n readonly mode: PlayerSystemInterfaceMode;\n readonly focusedSurfaceId?: string;\n readonly visibleSurfaceIds: readonly string[];\n readonly focusShift?: InterfaceFocusShift;\n}\n\nexport interface InterfaceShellStateInput {\n readonly mode: PlayerSystemInterfaceMode;\n readonly focusedSurfaceId?: string;\n}\n\nexport interface ThreeDPaneHostDefinition {\n readonly hostId: string;\n readonly owner: InterfaceShellOwner;\n readonly pane: PlayerSystemPaneId;\n readonly surfaceId: string;\n readonly anchorId: string;\n readonly supportedHosts: readonly OverlayHostKind[];\n}\n\nexport type AmbientAlertSeverity = \"info\" | \"warning\" | \"danger\";\n\nexport interface LocalizedAmbientAlertDefinition {\n readonly alertId: string;\n readonly owner: InterfaceShellOwner;\n readonly severity: AmbientAlertSeverity;\n readonly anchorId: string;\n readonly messageKey: string;\n readonly localizedMessages: Readonly<Record<string, string>>;\n readonly liveRegionMode: \"polite\" | \"assertive\";\n}\n\nexport interface WorldSpacePanelDefinition {\n readonly panelId: string;\n readonly pane: PlayerSystemPaneId;\n readonly anchorId: string;\n readonly interactive: boolean;\n readonly accessibilityLabel?: string;\n readonly focusOrder?: number;\n}\n\nexport interface OverlayAlertMarker {\n readonly markerId: string;\n readonly severity: AmbientAlertSeverity;\n readonly anchorId: string;\n}\n\nexport interface WorldSpaceCompositionSample {\n readonly panelCount: number;\n readonly focusPaneCount: number;\n readonly alertMarkerCount: number;\n readonly interactivePanelCount: number;\n}\n\nexport interface InterfaceContractAssessment {\n readonly accepted: boolean;\n readonly violations: readonly string[];\n}\n\nexport const PLAYER_SYSTEM_INTERFACE_PACKAGE = \"@plasius/player-system-interface\";\nexport const PLAYER_SYSTEM_INTERFACE_ENV_PREFIX = \"PLAYER_SYSTEM_INTERFACE\";\nexport const PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID =\n \"isekai.player-system.interface.enabled\";\nexport const PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\nexport const PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\nexport const PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\n\nexport const packageDescriptor: PackageDescriptor = Object.freeze({\n packageName: PLAYER_SYSTEM_INTERFACE_PACKAGE,\n featureFlagId: PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID,\n envPrefix: PLAYER_SYSTEM_INTERFACE_ENV_PREFIX,\n summary:\n \"World-space Player System overlays, focus panes, and target-surface contracts for Plasius game experiences.\",\n});\n\nexport const defaultPlayerSystemInterfaceContract: PlayerSystemInterfaceContract =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID,\n accessibility: Object.freeze({\n keyboardPath: \"sequential\",\n focusRestorationTarget: \"trigger\",\n liveRegionMode: \"polite\",\n requiresAccessibleName: true,\n }),\n frameBudget: Object.freeze({\n targetFps: 60,\n maxFrameMs: 16,\n maxInteractivePanelsPerFrame: 2,\n }),\n });\n\nexport const defaultPlayerSystemInterfacePortabilityContract: PlayerSystemInterfacePortabilityContract =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID,\n hostAdapters: Object.freeze({\n supportedHosts: Object.freeze([\n \"dom-overlay\",\n \"native-overlay\",\n \"headless-snapshot\",\n ] satisfies OverlayHostKind[]),\n requiredCapabilities: Object.freeze([\n \"focus-restoration\",\n \"live-region\",\n \"anchor-registry\",\n ] satisfies OverlayAdapterCapability[]),\n forbiddenAssumptions: Object.freeze([\n \"window-global\",\n \"single-pane-layout\",\n \"absolute-scene-coordinates\",\n ]),\n }),\n compositionScale: Object.freeze({\n maxWorldPanels: 6,\n maxFocusPanes: 3,\n maxAlertMarkers: 8,\n maxInteractivePanelsPerFrame: 2,\n }),\n });\n\nexport const defaultReducedCombatOverlayPolicy: ReducedCombatOverlayPolicy =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,\n mode: \"combat-safe\",\n retainedSurfaceKinds: Object.freeze([\n \"alert-marker\",\n \"target-popup\",\n \"focus-pane\",\n ] satisfies InterfaceShellSurfaceKind[]),\n maxInteractiveSurfaces: 1,\n });\n\nexport function isPlayerSystemInterfaceMode(\n value: string\n): value is PlayerSystemInterfaceMode {\n return value === \"ambient\" || value === \"focused\" || value === \"combat-safe\";\n}\n\nexport function createWorldSpacePanelDefinition(\n input: WorldSpacePanelDefinition\n): WorldSpacePanelDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createPlayerSystemInterfaceContract(\n input: PlayerSystemInterfaceContractInput = {}\n): PlayerSystemInterfaceContract {\n return Object.freeze({\n featureFlagId:\n input.featureFlagId ?? defaultPlayerSystemInterfaceContract.featureFlagId,\n accessibility: Object.freeze({\n ...defaultPlayerSystemInterfaceContract.accessibility,\n ...input.accessibility,\n }),\n frameBudget: Object.freeze({\n ...defaultPlayerSystemInterfaceContract.frameBudget,\n ...input.frameBudget,\n }),\n });\n}\n\nexport function createPlayerSystemInterfacePortabilityContract(\n input: PlayerSystemInterfacePortabilityContractInput = {}\n): PlayerSystemInterfacePortabilityContract {\n return Object.freeze({\n featureFlagId:\n input.featureFlagId ??\n defaultPlayerSystemInterfacePortabilityContract.featureFlagId,\n hostAdapters: Object.freeze({\n ...defaultPlayerSystemInterfacePortabilityContract.hostAdapters,\n ...input.hostAdapters,\n supportedHosts: Object.freeze([\n ...(input.hostAdapters?.supportedHosts ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .supportedHosts),\n ]),\n requiredCapabilities: Object.freeze([\n ...(input.hostAdapters?.requiredCapabilities ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .requiredCapabilities),\n ]),\n forbiddenAssumptions: Object.freeze([\n ...(input.hostAdapters?.forbiddenAssumptions ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .forbiddenAssumptions),\n ]),\n }),\n compositionScale: Object.freeze({\n ...defaultPlayerSystemInterfacePortabilityContract.compositionScale,\n ...input.compositionScale,\n }),\n });\n}\n\nexport function createInterfaceShellSurfaceDefinition(\n input: InterfaceShellSurfaceDefinition\n): InterfaceShellSurfaceDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createFocusPaneShellDefinition(\n input: FocusPaneShellDefinition\n): FocusPaneShellDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createLineOfSightTargetPopupDefinition(\n input: LineOfSightTargetPopupDefinition\n): LineOfSightTargetPopupDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createThreeDPaneHostDefinition(\n input: ThreeDPaneHostDefinition\n): ThreeDPaneHostDefinition {\n return Object.freeze({\n ...input,\n supportedHosts: Object.freeze([...input.supportedHosts]),\n });\n}\n\nexport function createLocalizedAmbientAlertDefinition(\n input: LocalizedAmbientAlertDefinition\n): LocalizedAmbientAlertDefinition {\n return Object.freeze({\n ...input,\n localizedMessages: Object.freeze({ ...input.localizedMessages }),\n });\n}\n\nexport function createInterfaceShellDefinition(\n input: InterfaceShellDefinitionInput = {}\n): InterfaceShellDefinition {\n return Object.freeze({\n featureFlagId: input.featureFlagId ?? PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,\n surfaces: Object.freeze([...(input.surfaces ?? [])]),\n focusPane: input.focusPane ? Object.freeze({ ...input.focusPane }) : undefined,\n targetPopups: Object.freeze([...(input.targetPopups ?? [])]),\n paneHosts: Object.freeze([...(input.paneHosts ?? [])]),\n ambientAlerts: Object.freeze([...(input.ambientAlerts ?? [])]),\n reducedCombat: Object.freeze({\n ...defaultReducedCombatOverlayPolicy,\n ...input.reducedCombat,\n retainedSurfaceKinds: Object.freeze([\n ...(input.reducedCombat?.retainedSurfaceKinds ??\n defaultReducedCombatOverlayPolicy.retainedSurfaceKinds),\n ]),\n }),\n });\n}\n\nexport function createInterfaceShellState(\n shell: InterfaceShellDefinition,\n input: InterfaceShellStateInput\n): InterfaceShellStateDefinition {\n const retainedSurfaceKinds = new Set(\n shell.reducedCombat.retainedSurfaceKinds\n );\n const visibleSurfaceIds = shell.surfaces\n .filter(\n (surface) =>\n input.mode !== \"combat-safe\" ||\n (surface.combatBehavior !== \"suspend\" &&\n retainedSurfaceKinds.has(surface.kind))\n )\n .map((surface) => surface.surfaceId);\n\n if (\n input.focusedSurfaceId &&\n !visibleSurfaceIds.includes(input.focusedSurfaceId)\n ) {\n throw new RangeError(\n `Focused surface '${input.focusedSurfaceId}' is not visible in ${input.mode} mode`\n );\n }\n\n return Object.freeze({\n featureFlagId: shell.featureFlagId,\n mode: input.mode,\n focusedSurfaceId:\n input.mode === \"focused\" ? input.focusedSurfaceId : undefined,\n visibleSurfaceIds: Object.freeze(visibleSurfaceIds),\n });\n}\n\nexport function applyInterfaceShellFocusShift(\n state: InterfaceShellStateDefinition,\n focusShift: InterfaceFocusShift\n): InterfaceShellStateDefinition {\n if (!state.visibleSurfaceIds.includes(focusShift.toSurfaceId)) {\n throw new RangeError(\n `Focused surface '${focusShift.toSurfaceId}' is not visible in ${state.mode} mode`\n );\n }\n\n return Object.freeze({\n ...state,\n mode: \"focused\",\n focusedSurfaceId: focusShift.toSurfaceId,\n focusShift: Object.freeze({ ...focusShift }),\n });\n}\n\nexport function resolveLocalizedAmbientAlertMessage(\n alert: LocalizedAmbientAlertDefinition,\n locale: string,\n fallbackLocale = \"en-GB\"\n): string | undefined {\n return alert.localizedMessages[locale] ?? alert.localizedMessages[fallbackLocale];\n}\n\nexport function assessPlayerSystemInterfaceComposition(\n sample: WorldSpaceCompositionSample,\n contract: PlayerSystemInterfacePortabilityContract = defaultPlayerSystemInterfacePortabilityContract\n): InterfaceContractAssessment {\n const violations: string[] = [];\n\n if (sample.panelCount > contract.compositionScale.maxWorldPanels) {\n violations.push(\"panelCount\");\n }\n\n if (sample.focusPaneCount > contract.compositionScale.maxFocusPanes) {\n violations.push(\"focusPaneCount\");\n }\n\n if (sample.alertMarkerCount > contract.compositionScale.maxAlertMarkers) {\n violations.push(\"alertMarkerCount\");\n }\n\n if (\n sample.interactivePanelCount >\n contract.compositionScale.maxInteractivePanelsPerFrame\n ) {\n violations.push(\"interactivePanelCount\");\n }\n\n return Object.freeze({\n accepted: violations.length === 0,\n violations: Object.freeze(violations),\n });\n}\n\nexport function assessInterfaceShellDefinition(\n shell: InterfaceShellDefinition\n): InterfaceContractAssessment {\n const violations: string[] = [];\n const ownerSet = new Set(shell.surfaces.map((surface) => surface.owner));\n const retainedSurfaceKinds = new Set(shell.reducedCombat.retainedSurfaceKinds);\n const interactiveSurfaceCount = shell.surfaces.filter(\n (surface) => surface.interactive && retainedSurfaceKinds.has(surface.kind)\n ).length;\n const focusPane = shell.focusPane;\n\n if (shell.surfaces.length === 0) {\n violations.push(\"surfaces\");\n }\n\n if (focusPane && !ownerSet.has(focusPane.owner)) {\n violations.push(\"focusPaneOwner\");\n }\n\n if (focusPane) {\n const matchingSurface = shell.surfaces.find(\n (surface) =>\n surface.kind === \"focus-pane\" &&\n surface.anchorId === focusPane.anchorId &&\n surface.owner === focusPane.owner\n );\n if (!matchingSurface) {\n violations.push(\"focusPaneSurface\");\n }\n }\n\n if (\n interactiveSurfaceCount > shell.reducedCombat.maxInteractiveSurfaces\n ) {\n violations.push(\"interactiveSurfaceCount\");\n }\n\n for (const popup of shell.targetPopups) {\n if (popup.requiresLineOfSight && popup.anchorId.length === 0) {\n violations.push(`popup:${popup.popupId}`);\n }\n }\n\n for (const paneHost of shell.paneHosts) {\n const matchingSurface = shell.surfaces.find(\n (surface) =>\n surface.surfaceId === paneHost.surfaceId &&\n surface.owner === paneHost.owner &&\n surface.anchorId === paneHost.anchorId\n );\n if (!matchingSurface) {\n violations.push(`paneHost:${paneHost.hostId}`);\n }\n }\n\n for (const alert of shell.ambientAlerts) {\n if (Object.keys(alert.localizedMessages).length === 0) {\n violations.push(`alert:${alert.alertId}`);\n }\n }\n\n if (\n ownerSet.has(\"player-system\") &&\n ownerSet.has(\"party-system\") &&\n shell.reducedCombat.retainedSurfaceKinds.length === 0\n ) {\n violations.push(\"reducedCombat\");\n }\n\n return Object.freeze({\n accepted: violations.length === 0,\n violations: Object.freeze(violations),\n });\n}\n"],"mappings":"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","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -92,6 +92,8 @@ interface InterfaceShellDefinition {
|
|
|
92
92
|
readonly surfaces: readonly InterfaceShellSurfaceDefinition[];
|
|
93
93
|
readonly focusPane?: FocusPaneShellDefinition;
|
|
94
94
|
readonly targetPopups: readonly LineOfSightTargetPopupDefinition[];
|
|
95
|
+
readonly paneHosts: readonly ThreeDPaneHostDefinition[];
|
|
96
|
+
readonly ambientAlerts: readonly LocalizedAmbientAlertDefinition[];
|
|
95
97
|
readonly reducedCombat: ReducedCombatOverlayPolicy;
|
|
96
98
|
}
|
|
97
99
|
interface InterfaceShellDefinitionInput {
|
|
@@ -99,8 +101,45 @@ interface InterfaceShellDefinitionInput {
|
|
|
99
101
|
readonly surfaces?: readonly InterfaceShellSurfaceDefinition[];
|
|
100
102
|
readonly focusPane?: FocusPaneShellDefinition;
|
|
101
103
|
readonly targetPopups?: readonly LineOfSightTargetPopupDefinition[];
|
|
104
|
+
readonly paneHosts?: readonly ThreeDPaneHostDefinition[];
|
|
105
|
+
readonly ambientAlerts?: readonly LocalizedAmbientAlertDefinition[];
|
|
102
106
|
readonly reducedCombat?: Partial<ReducedCombatOverlayPolicy>;
|
|
103
107
|
}
|
|
108
|
+
type InterfaceFocusShiftReason = "keyboard" | "direct-hotkey" | "restore" | "system";
|
|
109
|
+
interface InterfaceFocusShift {
|
|
110
|
+
readonly fromSurfaceId?: string;
|
|
111
|
+
readonly toSurfaceId: string;
|
|
112
|
+
readonly reason: InterfaceFocusShiftReason;
|
|
113
|
+
}
|
|
114
|
+
interface InterfaceShellStateDefinition {
|
|
115
|
+
readonly featureFlagId: string;
|
|
116
|
+
readonly mode: PlayerSystemInterfaceMode;
|
|
117
|
+
readonly focusedSurfaceId?: string;
|
|
118
|
+
readonly visibleSurfaceIds: readonly string[];
|
|
119
|
+
readonly focusShift?: InterfaceFocusShift;
|
|
120
|
+
}
|
|
121
|
+
interface InterfaceShellStateInput {
|
|
122
|
+
readonly mode: PlayerSystemInterfaceMode;
|
|
123
|
+
readonly focusedSurfaceId?: string;
|
|
124
|
+
}
|
|
125
|
+
interface ThreeDPaneHostDefinition {
|
|
126
|
+
readonly hostId: string;
|
|
127
|
+
readonly owner: InterfaceShellOwner;
|
|
128
|
+
readonly pane: PlayerSystemPaneId;
|
|
129
|
+
readonly surfaceId: string;
|
|
130
|
+
readonly anchorId: string;
|
|
131
|
+
readonly supportedHosts: readonly OverlayHostKind[];
|
|
132
|
+
}
|
|
133
|
+
type AmbientAlertSeverity = "info" | "warning" | "danger";
|
|
134
|
+
interface LocalizedAmbientAlertDefinition {
|
|
135
|
+
readonly alertId: string;
|
|
136
|
+
readonly owner: InterfaceShellOwner;
|
|
137
|
+
readonly severity: AmbientAlertSeverity;
|
|
138
|
+
readonly anchorId: string;
|
|
139
|
+
readonly messageKey: string;
|
|
140
|
+
readonly localizedMessages: Readonly<Record<string, string>>;
|
|
141
|
+
readonly liveRegionMode: "polite" | "assertive";
|
|
142
|
+
}
|
|
104
143
|
interface WorldSpacePanelDefinition {
|
|
105
144
|
readonly panelId: string;
|
|
106
145
|
readonly pane: PlayerSystemPaneId;
|
|
@@ -111,7 +150,7 @@ interface WorldSpacePanelDefinition {
|
|
|
111
150
|
}
|
|
112
151
|
interface OverlayAlertMarker {
|
|
113
152
|
readonly markerId: string;
|
|
114
|
-
readonly severity:
|
|
153
|
+
readonly severity: AmbientAlertSeverity;
|
|
115
154
|
readonly anchorId: string;
|
|
116
155
|
}
|
|
117
156
|
interface WorldSpaceCompositionSample {
|
|
@@ -141,8 +180,13 @@ declare function createPlayerSystemInterfacePortabilityContract(input?: PlayerSy
|
|
|
141
180
|
declare function createInterfaceShellSurfaceDefinition(input: InterfaceShellSurfaceDefinition): InterfaceShellSurfaceDefinition;
|
|
142
181
|
declare function createFocusPaneShellDefinition(input: FocusPaneShellDefinition): FocusPaneShellDefinition;
|
|
143
182
|
declare function createLineOfSightTargetPopupDefinition(input: LineOfSightTargetPopupDefinition): LineOfSightTargetPopupDefinition;
|
|
183
|
+
declare function createThreeDPaneHostDefinition(input: ThreeDPaneHostDefinition): ThreeDPaneHostDefinition;
|
|
184
|
+
declare function createLocalizedAmbientAlertDefinition(input: LocalizedAmbientAlertDefinition): LocalizedAmbientAlertDefinition;
|
|
144
185
|
declare function createInterfaceShellDefinition(input?: InterfaceShellDefinitionInput): InterfaceShellDefinition;
|
|
186
|
+
declare function createInterfaceShellState(shell: InterfaceShellDefinition, input: InterfaceShellStateInput): InterfaceShellStateDefinition;
|
|
187
|
+
declare function applyInterfaceShellFocusShift(state: InterfaceShellStateDefinition, focusShift: InterfaceFocusShift): InterfaceShellStateDefinition;
|
|
188
|
+
declare function resolveLocalizedAmbientAlertMessage(alert: LocalizedAmbientAlertDefinition, locale: string, fallbackLocale?: string): string | undefined;
|
|
145
189
|
declare function assessPlayerSystemInterfaceComposition(sample: WorldSpaceCompositionSample, contract?: PlayerSystemInterfacePortabilityContract): InterfaceContractAssessment;
|
|
146
190
|
declare function assessInterfaceShellDefinition(shell: InterfaceShellDefinition): InterfaceContractAssessment;
|
|
147
191
|
|
|
148
|
-
export { type FocusPaneShellDefinition, type InterfaceCombatBehavior, type InterfaceContractAssessment, type InterfaceFrameBudget, type InterfaceShellDefinition, type InterfaceShellDefinitionInput, type InterfaceShellOwner, type InterfaceShellSurfaceDefinition, type InterfaceShellSurfaceKind, type LineOfSightTargetPopupDefinition, type OverlayAccessibilityContract, type OverlayAdapterCapability, type OverlayAlertMarker, type OverlayCompositionScaleContract, type OverlayHostAdapterContract, type OverlayHostKind, type OverlayKeyboardPath, PLAYER_SYSTEM_INTERFACE_ENV_PREFIX, PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID, PLAYER_SYSTEM_INTERFACE_PACKAGE, PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID, PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID, PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID, type PackageDescriptor, type PlayerSystemInterfaceContract, type PlayerSystemInterfaceContractInput, type PlayerSystemInterfaceMode, type PlayerSystemInterfacePortabilityContract, type PlayerSystemInterfacePortabilityContractInput, type PlayerSystemPaneId, type ReducedCombatOverlayPolicy, type WorldSpaceCompositionSample, type WorldSpacePanelDefinition, assessInterfaceShellDefinition, assessPlayerSystemInterfaceComposition, createFocusPaneShellDefinition, createInterfaceShellDefinition, createInterfaceShellSurfaceDefinition, createLineOfSightTargetPopupDefinition, createPlayerSystemInterfaceContract, createPlayerSystemInterfacePortabilityContract, createWorldSpacePanelDefinition, defaultPlayerSystemInterfaceContract, defaultPlayerSystemInterfacePortabilityContract, defaultReducedCombatOverlayPolicy, isPlayerSystemInterfaceMode, packageDescriptor };
|
|
192
|
+
export { type AmbientAlertSeverity, type FocusPaneShellDefinition, type InterfaceCombatBehavior, type InterfaceContractAssessment, type InterfaceFocusShift, type InterfaceFocusShiftReason, type InterfaceFrameBudget, type InterfaceShellDefinition, type InterfaceShellDefinitionInput, type InterfaceShellOwner, type InterfaceShellStateDefinition, type InterfaceShellStateInput, type InterfaceShellSurfaceDefinition, type InterfaceShellSurfaceKind, type LineOfSightTargetPopupDefinition, type LocalizedAmbientAlertDefinition, type OverlayAccessibilityContract, type OverlayAdapterCapability, type OverlayAlertMarker, type OverlayCompositionScaleContract, type OverlayHostAdapterContract, type OverlayHostKind, type OverlayKeyboardPath, PLAYER_SYSTEM_INTERFACE_ENV_PREFIX, PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID, PLAYER_SYSTEM_INTERFACE_PACKAGE, PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID, PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID, PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID, type PackageDescriptor, type PlayerSystemInterfaceContract, type PlayerSystemInterfaceContractInput, type PlayerSystemInterfaceMode, type PlayerSystemInterfacePortabilityContract, type PlayerSystemInterfacePortabilityContractInput, type PlayerSystemPaneId, type ReducedCombatOverlayPolicy, type ThreeDPaneHostDefinition, type WorldSpaceCompositionSample, type WorldSpacePanelDefinition, applyInterfaceShellFocusShift, assessInterfaceShellDefinition, assessPlayerSystemInterfaceComposition, createFocusPaneShellDefinition, createInterfaceShellDefinition, createInterfaceShellState, createInterfaceShellSurfaceDefinition, createLineOfSightTargetPopupDefinition, createLocalizedAmbientAlertDefinition, createPlayerSystemInterfaceContract, createPlayerSystemInterfacePortabilityContract, createThreeDPaneHostDefinition, createWorldSpacePanelDefinition, defaultPlayerSystemInterfaceContract, defaultPlayerSystemInterfacePortabilityContract, defaultReducedCombatOverlayPolicy, isPlayerSystemInterfaceMode, packageDescriptor, resolveLocalizedAmbientAlertMessage };
|
package/dist/index.d.ts
CHANGED
|
@@ -92,6 +92,8 @@ interface InterfaceShellDefinition {
|
|
|
92
92
|
readonly surfaces: readonly InterfaceShellSurfaceDefinition[];
|
|
93
93
|
readonly focusPane?: FocusPaneShellDefinition;
|
|
94
94
|
readonly targetPopups: readonly LineOfSightTargetPopupDefinition[];
|
|
95
|
+
readonly paneHosts: readonly ThreeDPaneHostDefinition[];
|
|
96
|
+
readonly ambientAlerts: readonly LocalizedAmbientAlertDefinition[];
|
|
95
97
|
readonly reducedCombat: ReducedCombatOverlayPolicy;
|
|
96
98
|
}
|
|
97
99
|
interface InterfaceShellDefinitionInput {
|
|
@@ -99,8 +101,45 @@ interface InterfaceShellDefinitionInput {
|
|
|
99
101
|
readonly surfaces?: readonly InterfaceShellSurfaceDefinition[];
|
|
100
102
|
readonly focusPane?: FocusPaneShellDefinition;
|
|
101
103
|
readonly targetPopups?: readonly LineOfSightTargetPopupDefinition[];
|
|
104
|
+
readonly paneHosts?: readonly ThreeDPaneHostDefinition[];
|
|
105
|
+
readonly ambientAlerts?: readonly LocalizedAmbientAlertDefinition[];
|
|
102
106
|
readonly reducedCombat?: Partial<ReducedCombatOverlayPolicy>;
|
|
103
107
|
}
|
|
108
|
+
type InterfaceFocusShiftReason = "keyboard" | "direct-hotkey" | "restore" | "system";
|
|
109
|
+
interface InterfaceFocusShift {
|
|
110
|
+
readonly fromSurfaceId?: string;
|
|
111
|
+
readonly toSurfaceId: string;
|
|
112
|
+
readonly reason: InterfaceFocusShiftReason;
|
|
113
|
+
}
|
|
114
|
+
interface InterfaceShellStateDefinition {
|
|
115
|
+
readonly featureFlagId: string;
|
|
116
|
+
readonly mode: PlayerSystemInterfaceMode;
|
|
117
|
+
readonly focusedSurfaceId?: string;
|
|
118
|
+
readonly visibleSurfaceIds: readonly string[];
|
|
119
|
+
readonly focusShift?: InterfaceFocusShift;
|
|
120
|
+
}
|
|
121
|
+
interface InterfaceShellStateInput {
|
|
122
|
+
readonly mode: PlayerSystemInterfaceMode;
|
|
123
|
+
readonly focusedSurfaceId?: string;
|
|
124
|
+
}
|
|
125
|
+
interface ThreeDPaneHostDefinition {
|
|
126
|
+
readonly hostId: string;
|
|
127
|
+
readonly owner: InterfaceShellOwner;
|
|
128
|
+
readonly pane: PlayerSystemPaneId;
|
|
129
|
+
readonly surfaceId: string;
|
|
130
|
+
readonly anchorId: string;
|
|
131
|
+
readonly supportedHosts: readonly OverlayHostKind[];
|
|
132
|
+
}
|
|
133
|
+
type AmbientAlertSeverity = "info" | "warning" | "danger";
|
|
134
|
+
interface LocalizedAmbientAlertDefinition {
|
|
135
|
+
readonly alertId: string;
|
|
136
|
+
readonly owner: InterfaceShellOwner;
|
|
137
|
+
readonly severity: AmbientAlertSeverity;
|
|
138
|
+
readonly anchorId: string;
|
|
139
|
+
readonly messageKey: string;
|
|
140
|
+
readonly localizedMessages: Readonly<Record<string, string>>;
|
|
141
|
+
readonly liveRegionMode: "polite" | "assertive";
|
|
142
|
+
}
|
|
104
143
|
interface WorldSpacePanelDefinition {
|
|
105
144
|
readonly panelId: string;
|
|
106
145
|
readonly pane: PlayerSystemPaneId;
|
|
@@ -111,7 +150,7 @@ interface WorldSpacePanelDefinition {
|
|
|
111
150
|
}
|
|
112
151
|
interface OverlayAlertMarker {
|
|
113
152
|
readonly markerId: string;
|
|
114
|
-
readonly severity:
|
|
153
|
+
readonly severity: AmbientAlertSeverity;
|
|
115
154
|
readonly anchorId: string;
|
|
116
155
|
}
|
|
117
156
|
interface WorldSpaceCompositionSample {
|
|
@@ -141,8 +180,13 @@ declare function createPlayerSystemInterfacePortabilityContract(input?: PlayerSy
|
|
|
141
180
|
declare function createInterfaceShellSurfaceDefinition(input: InterfaceShellSurfaceDefinition): InterfaceShellSurfaceDefinition;
|
|
142
181
|
declare function createFocusPaneShellDefinition(input: FocusPaneShellDefinition): FocusPaneShellDefinition;
|
|
143
182
|
declare function createLineOfSightTargetPopupDefinition(input: LineOfSightTargetPopupDefinition): LineOfSightTargetPopupDefinition;
|
|
183
|
+
declare function createThreeDPaneHostDefinition(input: ThreeDPaneHostDefinition): ThreeDPaneHostDefinition;
|
|
184
|
+
declare function createLocalizedAmbientAlertDefinition(input: LocalizedAmbientAlertDefinition): LocalizedAmbientAlertDefinition;
|
|
144
185
|
declare function createInterfaceShellDefinition(input?: InterfaceShellDefinitionInput): InterfaceShellDefinition;
|
|
186
|
+
declare function createInterfaceShellState(shell: InterfaceShellDefinition, input: InterfaceShellStateInput): InterfaceShellStateDefinition;
|
|
187
|
+
declare function applyInterfaceShellFocusShift(state: InterfaceShellStateDefinition, focusShift: InterfaceFocusShift): InterfaceShellStateDefinition;
|
|
188
|
+
declare function resolveLocalizedAmbientAlertMessage(alert: LocalizedAmbientAlertDefinition, locale: string, fallbackLocale?: string): string | undefined;
|
|
145
189
|
declare function assessPlayerSystemInterfaceComposition(sample: WorldSpaceCompositionSample, contract?: PlayerSystemInterfacePortabilityContract): InterfaceContractAssessment;
|
|
146
190
|
declare function assessInterfaceShellDefinition(shell: InterfaceShellDefinition): InterfaceContractAssessment;
|
|
147
191
|
|
|
148
|
-
export { type FocusPaneShellDefinition, type InterfaceCombatBehavior, type InterfaceContractAssessment, type InterfaceFrameBudget, type InterfaceShellDefinition, type InterfaceShellDefinitionInput, type InterfaceShellOwner, type InterfaceShellSurfaceDefinition, type InterfaceShellSurfaceKind, type LineOfSightTargetPopupDefinition, type OverlayAccessibilityContract, type OverlayAdapterCapability, type OverlayAlertMarker, type OverlayCompositionScaleContract, type OverlayHostAdapterContract, type OverlayHostKind, type OverlayKeyboardPath, PLAYER_SYSTEM_INTERFACE_ENV_PREFIX, PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID, PLAYER_SYSTEM_INTERFACE_PACKAGE, PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID, PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID, PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID, type PackageDescriptor, type PlayerSystemInterfaceContract, type PlayerSystemInterfaceContractInput, type PlayerSystemInterfaceMode, type PlayerSystemInterfacePortabilityContract, type PlayerSystemInterfacePortabilityContractInput, type PlayerSystemPaneId, type ReducedCombatOverlayPolicy, type WorldSpaceCompositionSample, type WorldSpacePanelDefinition, assessInterfaceShellDefinition, assessPlayerSystemInterfaceComposition, createFocusPaneShellDefinition, createInterfaceShellDefinition, createInterfaceShellSurfaceDefinition, createLineOfSightTargetPopupDefinition, createPlayerSystemInterfaceContract, createPlayerSystemInterfacePortabilityContract, createWorldSpacePanelDefinition, defaultPlayerSystemInterfaceContract, defaultPlayerSystemInterfacePortabilityContract, defaultReducedCombatOverlayPolicy, isPlayerSystemInterfaceMode, packageDescriptor };
|
|
192
|
+
export { type AmbientAlertSeverity, type FocusPaneShellDefinition, type InterfaceCombatBehavior, type InterfaceContractAssessment, type InterfaceFocusShift, type InterfaceFocusShiftReason, type InterfaceFrameBudget, type InterfaceShellDefinition, type InterfaceShellDefinitionInput, type InterfaceShellOwner, type InterfaceShellStateDefinition, type InterfaceShellStateInput, type InterfaceShellSurfaceDefinition, type InterfaceShellSurfaceKind, type LineOfSightTargetPopupDefinition, type LocalizedAmbientAlertDefinition, type OverlayAccessibilityContract, type OverlayAdapterCapability, type OverlayAlertMarker, type OverlayCompositionScaleContract, type OverlayHostAdapterContract, type OverlayHostKind, type OverlayKeyboardPath, PLAYER_SYSTEM_INTERFACE_ENV_PREFIX, PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID, PLAYER_SYSTEM_INTERFACE_PACKAGE, PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID, PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID, PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID, type PackageDescriptor, type PlayerSystemInterfaceContract, type PlayerSystemInterfaceContractInput, type PlayerSystemInterfaceMode, type PlayerSystemInterfacePortabilityContract, type PlayerSystemInterfacePortabilityContractInput, type PlayerSystemPaneId, type ReducedCombatOverlayPolicy, type ThreeDPaneHostDefinition, type WorldSpaceCompositionSample, type WorldSpacePanelDefinition, applyInterfaceShellFocusShift, assessInterfaceShellDefinition, assessPlayerSystemInterfaceComposition, createFocusPaneShellDefinition, createInterfaceShellDefinition, createInterfaceShellState, createInterfaceShellSurfaceDefinition, createLineOfSightTargetPopupDefinition, createLocalizedAmbientAlertDefinition, createPlayerSystemInterfaceContract, createPlayerSystemInterfacePortabilityContract, createThreeDPaneHostDefinition, createWorldSpacePanelDefinition, defaultPlayerSystemInterfaceContract, defaultPlayerSystemInterfacePortabilityContract, defaultReducedCombatOverlayPolicy, isPlayerSystemInterfaceMode, packageDescriptor, resolveLocalizedAmbientAlertMessage };
|
package/dist/index.js
CHANGED
|
@@ -111,12 +111,26 @@ function createFocusPaneShellDefinition(input) {
|
|
|
111
111
|
function createLineOfSightTargetPopupDefinition(input) {
|
|
112
112
|
return Object.freeze({ ...input });
|
|
113
113
|
}
|
|
114
|
+
function createThreeDPaneHostDefinition(input) {
|
|
115
|
+
return Object.freeze({
|
|
116
|
+
...input,
|
|
117
|
+
supportedHosts: Object.freeze([...input.supportedHosts])
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
function createLocalizedAmbientAlertDefinition(input) {
|
|
121
|
+
return Object.freeze({
|
|
122
|
+
...input,
|
|
123
|
+
localizedMessages: Object.freeze({ ...input.localizedMessages })
|
|
124
|
+
});
|
|
125
|
+
}
|
|
114
126
|
function createInterfaceShellDefinition(input = {}) {
|
|
115
127
|
return Object.freeze({
|
|
116
128
|
featureFlagId: input.featureFlagId ?? PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,
|
|
117
129
|
surfaces: Object.freeze([...input.surfaces ?? []]),
|
|
118
130
|
focusPane: input.focusPane ? Object.freeze({ ...input.focusPane }) : void 0,
|
|
119
131
|
targetPopups: Object.freeze([...input.targetPopups ?? []]),
|
|
132
|
+
paneHosts: Object.freeze([...input.paneHosts ?? []]),
|
|
133
|
+
ambientAlerts: Object.freeze([...input.ambientAlerts ?? []]),
|
|
120
134
|
reducedCombat: Object.freeze({
|
|
121
135
|
...defaultReducedCombatOverlayPolicy,
|
|
122
136
|
...input.reducedCombat,
|
|
@@ -126,6 +140,41 @@ function createInterfaceShellDefinition(input = {}) {
|
|
|
126
140
|
})
|
|
127
141
|
});
|
|
128
142
|
}
|
|
143
|
+
function createInterfaceShellState(shell, input) {
|
|
144
|
+
const retainedSurfaceKinds = new Set(
|
|
145
|
+
shell.reducedCombat.retainedSurfaceKinds
|
|
146
|
+
);
|
|
147
|
+
const visibleSurfaceIds = shell.surfaces.filter(
|
|
148
|
+
(surface) => input.mode !== "combat-safe" || surface.combatBehavior !== "suspend" && retainedSurfaceKinds.has(surface.kind)
|
|
149
|
+
).map((surface) => surface.surfaceId);
|
|
150
|
+
if (input.focusedSurfaceId && !visibleSurfaceIds.includes(input.focusedSurfaceId)) {
|
|
151
|
+
throw new RangeError(
|
|
152
|
+
`Focused surface '${input.focusedSurfaceId}' is not visible in ${input.mode} mode`
|
|
153
|
+
);
|
|
154
|
+
}
|
|
155
|
+
return Object.freeze({
|
|
156
|
+
featureFlagId: shell.featureFlagId,
|
|
157
|
+
mode: input.mode,
|
|
158
|
+
focusedSurfaceId: input.mode === "focused" ? input.focusedSurfaceId : void 0,
|
|
159
|
+
visibleSurfaceIds: Object.freeze(visibleSurfaceIds)
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
function applyInterfaceShellFocusShift(state, focusShift) {
|
|
163
|
+
if (!state.visibleSurfaceIds.includes(focusShift.toSurfaceId)) {
|
|
164
|
+
throw new RangeError(
|
|
165
|
+
`Focused surface '${focusShift.toSurfaceId}' is not visible in ${state.mode} mode`
|
|
166
|
+
);
|
|
167
|
+
}
|
|
168
|
+
return Object.freeze({
|
|
169
|
+
...state,
|
|
170
|
+
mode: "focused",
|
|
171
|
+
focusedSurfaceId: focusShift.toSurfaceId,
|
|
172
|
+
focusShift: Object.freeze({ ...focusShift })
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
function resolveLocalizedAmbientAlertMessage(alert, locale, fallbackLocale = "en-GB") {
|
|
176
|
+
return alert.localizedMessages[locale] ?? alert.localizedMessages[fallbackLocale];
|
|
177
|
+
}
|
|
129
178
|
function assessPlayerSystemInterfaceComposition(sample, contract = defaultPlayerSystemInterfacePortabilityContract) {
|
|
130
179
|
const violations = [];
|
|
131
180
|
if (sample.panelCount > contract.compositionScale.maxWorldPanels) {
|
|
@@ -175,6 +224,19 @@ function assessInterfaceShellDefinition(shell) {
|
|
|
175
224
|
violations.push(`popup:${popup.popupId}`);
|
|
176
225
|
}
|
|
177
226
|
}
|
|
227
|
+
for (const paneHost of shell.paneHosts) {
|
|
228
|
+
const matchingSurface = shell.surfaces.find(
|
|
229
|
+
(surface) => surface.surfaceId === paneHost.surfaceId && surface.owner === paneHost.owner && surface.anchorId === paneHost.anchorId
|
|
230
|
+
);
|
|
231
|
+
if (!matchingSurface) {
|
|
232
|
+
violations.push(`paneHost:${paneHost.hostId}`);
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
for (const alert of shell.ambientAlerts) {
|
|
236
|
+
if (Object.keys(alert.localizedMessages).length === 0) {
|
|
237
|
+
violations.push(`alert:${alert.alertId}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
178
240
|
if (ownerSet.has("player-system") && ownerSet.has("party-system") && shell.reducedCombat.retainedSurfaceKinds.length === 0) {
|
|
179
241
|
violations.push("reducedCombat");
|
|
180
242
|
}
|
|
@@ -190,19 +252,24 @@ export {
|
|
|
190
252
|
PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID,
|
|
191
253
|
PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID,
|
|
192
254
|
PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID,
|
|
255
|
+
applyInterfaceShellFocusShift,
|
|
193
256
|
assessInterfaceShellDefinition,
|
|
194
257
|
assessPlayerSystemInterfaceComposition,
|
|
195
258
|
createFocusPaneShellDefinition,
|
|
196
259
|
createInterfaceShellDefinition,
|
|
260
|
+
createInterfaceShellState,
|
|
197
261
|
createInterfaceShellSurfaceDefinition,
|
|
198
262
|
createLineOfSightTargetPopupDefinition,
|
|
263
|
+
createLocalizedAmbientAlertDefinition,
|
|
199
264
|
createPlayerSystemInterfaceContract,
|
|
200
265
|
createPlayerSystemInterfacePortabilityContract,
|
|
266
|
+
createThreeDPaneHostDefinition,
|
|
201
267
|
createWorldSpacePanelDefinition,
|
|
202
268
|
defaultPlayerSystemInterfaceContract,
|
|
203
269
|
defaultPlayerSystemInterfacePortabilityContract,
|
|
204
270
|
defaultReducedCombatOverlayPolicy,
|
|
205
271
|
isPlayerSystemInterfaceMode,
|
|
206
|
-
packageDescriptor
|
|
272
|
+
packageDescriptor,
|
|
273
|
+
resolveLocalizedAmbientAlertMessage
|
|
207
274
|
};
|
|
208
275
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface PackageDescriptor {\n readonly packageName: string;\n readonly featureFlagId: string;\n readonly envPrefix: string;\n readonly summary: string;\n}\n\nexport type OverlayKeyboardPath = \"sequential\" | \"direct-hotkey\" | \"read-only\";\n\nexport interface OverlayAccessibilityContract {\n readonly keyboardPath: OverlayKeyboardPath;\n readonly focusRestorationTarget: \"trigger\" | \"pane-heading\" | \"nearest-anchor\";\n readonly liveRegionMode: \"polite\" | \"assertive\" | \"off\";\n readonly requiresAccessibleName: boolean;\n}\n\nexport interface InterfaceFrameBudget {\n readonly targetFps: number;\n readonly maxFrameMs: number;\n readonly maxInteractivePanelsPerFrame: number;\n}\n\nexport type OverlayHostKind =\n | \"dom-overlay\"\n | \"native-overlay\"\n | \"headless-snapshot\";\n\nexport type OverlayAdapterCapability =\n | \"focus-restoration\"\n | \"live-region\"\n | \"anchor-registry\";\n\nexport interface OverlayHostAdapterContract {\n readonly supportedHosts: readonly OverlayHostKind[];\n readonly requiredCapabilities: readonly OverlayAdapterCapability[];\n readonly forbiddenAssumptions: readonly string[];\n}\n\nexport interface OverlayCompositionScaleContract {\n readonly maxWorldPanels: number;\n readonly maxFocusPanes: number;\n readonly maxAlertMarkers: number;\n readonly maxInteractivePanelsPerFrame: number;\n}\n\nexport interface PlayerSystemInterfaceContract {\n readonly featureFlagId: string;\n readonly accessibility: OverlayAccessibilityContract;\n readonly frameBudget: InterfaceFrameBudget;\n}\n\nexport interface PlayerSystemInterfacePortabilityContract {\n readonly featureFlagId: string;\n readonly hostAdapters: OverlayHostAdapterContract;\n readonly compositionScale: OverlayCompositionScaleContract;\n}\n\nexport interface PlayerSystemInterfaceContractInput {\n readonly featureFlagId?: string;\n readonly accessibility?: Partial<OverlayAccessibilityContract>;\n readonly frameBudget?: Partial<InterfaceFrameBudget>;\n}\n\nexport interface PlayerSystemInterfacePortabilityContractInput {\n readonly featureFlagId?: string;\n readonly hostAdapters?: Partial<OverlayHostAdapterContract>;\n readonly compositionScale?: Partial<OverlayCompositionScaleContract>;\n}\n\nexport type PlayerSystemInterfaceMode = \"ambient\" | \"focused\" | \"combat-safe\";\n\nexport type PlayerSystemPaneId =\n | \"identity\"\n | \"missions\"\n | \"guild-quests\"\n | \"logs\"\n | \"mcc\"\n | \"tutorial\"\n | \"points-store\";\n\nexport type InterfaceShellOwner = \"player-system\" | \"party-system\";\nexport type InterfaceShellSurfaceKind =\n | \"world-panel\"\n | \"focus-pane\"\n | \"target-popup\"\n | \"alert-marker\";\nexport type InterfaceCombatBehavior = \"persist\" | \"reduce\" | \"suspend\";\n\nexport interface InterfaceShellSurfaceDefinition {\n readonly surfaceId: string;\n readonly owner: InterfaceShellOwner;\n readonly kind: InterfaceShellSurfaceKind;\n readonly anchorId: string;\n readonly interactive: boolean;\n readonly priority: number;\n readonly combatBehavior: InterfaceCombatBehavior;\n}\n\nexport interface FocusPaneShellDefinition {\n readonly panelId: string;\n readonly owner: InterfaceShellOwner;\n readonly pane: PlayerSystemPaneId;\n readonly anchorId: string;\n readonly heading: string;\n readonly interactive: boolean;\n readonly combatBehavior: InterfaceCombatBehavior;\n}\n\nexport interface LineOfSightTargetPopupDefinition {\n readonly popupId: string;\n readonly owner: InterfaceShellOwner;\n readonly anchorId: string;\n readonly targetId: string;\n readonly summary: string;\n readonly requiresLineOfSight: boolean;\n readonly actionLabel?: string;\n}\n\nexport interface ReducedCombatOverlayPolicy {\n readonly featureFlagId: string;\n readonly mode: \"combat-safe\";\n readonly retainedSurfaceKinds: readonly InterfaceShellSurfaceKind[];\n readonly maxInteractiveSurfaces: number;\n}\n\nexport interface InterfaceShellDefinition {\n readonly featureFlagId: string;\n readonly surfaces: readonly InterfaceShellSurfaceDefinition[];\n readonly focusPane?: FocusPaneShellDefinition;\n readonly targetPopups: readonly LineOfSightTargetPopupDefinition[];\n readonly reducedCombat: ReducedCombatOverlayPolicy;\n}\n\nexport interface InterfaceShellDefinitionInput {\n readonly featureFlagId?: string;\n readonly surfaces?: readonly InterfaceShellSurfaceDefinition[];\n readonly focusPane?: FocusPaneShellDefinition;\n readonly targetPopups?: readonly LineOfSightTargetPopupDefinition[];\n readonly reducedCombat?: Partial<ReducedCombatOverlayPolicy>;\n}\n\nexport interface WorldSpacePanelDefinition {\n readonly panelId: string;\n readonly pane: PlayerSystemPaneId;\n readonly anchorId: string;\n readonly interactive: boolean;\n readonly accessibilityLabel?: string;\n readonly focusOrder?: number;\n}\n\nexport interface OverlayAlertMarker {\n readonly markerId: string;\n readonly severity: \"info\" | \"warning\" | \"danger\";\n readonly anchorId: string;\n}\n\nexport interface WorldSpaceCompositionSample {\n readonly panelCount: number;\n readonly focusPaneCount: number;\n readonly alertMarkerCount: number;\n readonly interactivePanelCount: number;\n}\n\nexport interface InterfaceContractAssessment {\n readonly accepted: boolean;\n readonly violations: readonly string[];\n}\n\nexport const PLAYER_SYSTEM_INTERFACE_PACKAGE = \"@plasius/player-system-interface\";\nexport const PLAYER_SYSTEM_INTERFACE_ENV_PREFIX = \"PLAYER_SYSTEM_INTERFACE\";\nexport const PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID =\n \"isekai.player-system.interface.enabled\";\nexport const PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\nexport const PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\nexport const PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\n\nexport const packageDescriptor: PackageDescriptor = Object.freeze({\n packageName: PLAYER_SYSTEM_INTERFACE_PACKAGE,\n featureFlagId: PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID,\n envPrefix: PLAYER_SYSTEM_INTERFACE_ENV_PREFIX,\n summary:\n \"World-space Player System overlays, focus panes, and target-surface contracts for Plasius game experiences.\",\n});\n\nexport const defaultPlayerSystemInterfaceContract: PlayerSystemInterfaceContract =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID,\n accessibility: Object.freeze({\n keyboardPath: \"sequential\",\n focusRestorationTarget: \"trigger\",\n liveRegionMode: \"polite\",\n requiresAccessibleName: true,\n }),\n frameBudget: Object.freeze({\n targetFps: 60,\n maxFrameMs: 16,\n maxInteractivePanelsPerFrame: 2,\n }),\n });\n\nexport const defaultPlayerSystemInterfacePortabilityContract: PlayerSystemInterfacePortabilityContract =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID,\n hostAdapters: Object.freeze({\n supportedHosts: Object.freeze([\n \"dom-overlay\",\n \"native-overlay\",\n \"headless-snapshot\",\n ] satisfies OverlayHostKind[]),\n requiredCapabilities: Object.freeze([\n \"focus-restoration\",\n \"live-region\",\n \"anchor-registry\",\n ] satisfies OverlayAdapterCapability[]),\n forbiddenAssumptions: Object.freeze([\n \"window-global\",\n \"single-pane-layout\",\n \"absolute-scene-coordinates\",\n ]),\n }),\n compositionScale: Object.freeze({\n maxWorldPanels: 6,\n maxFocusPanes: 3,\n maxAlertMarkers: 8,\n maxInteractivePanelsPerFrame: 2,\n }),\n });\n\nexport const defaultReducedCombatOverlayPolicy: ReducedCombatOverlayPolicy =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,\n mode: \"combat-safe\",\n retainedSurfaceKinds: Object.freeze([\n \"alert-marker\",\n \"target-popup\",\n \"focus-pane\",\n ] satisfies InterfaceShellSurfaceKind[]),\n maxInteractiveSurfaces: 1,\n });\n\nexport function isPlayerSystemInterfaceMode(\n value: string\n): value is PlayerSystemInterfaceMode {\n return value === \"ambient\" || value === \"focused\" || value === \"combat-safe\";\n}\n\nexport function createWorldSpacePanelDefinition(\n input: WorldSpacePanelDefinition\n): WorldSpacePanelDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createPlayerSystemInterfaceContract(\n input: PlayerSystemInterfaceContractInput = {}\n): PlayerSystemInterfaceContract {\n return Object.freeze({\n featureFlagId:\n input.featureFlagId ?? defaultPlayerSystemInterfaceContract.featureFlagId,\n accessibility: Object.freeze({\n ...defaultPlayerSystemInterfaceContract.accessibility,\n ...input.accessibility,\n }),\n frameBudget: Object.freeze({\n ...defaultPlayerSystemInterfaceContract.frameBudget,\n ...input.frameBudget,\n }),\n });\n}\n\nexport function createPlayerSystemInterfacePortabilityContract(\n input: PlayerSystemInterfacePortabilityContractInput = {}\n): PlayerSystemInterfacePortabilityContract {\n return Object.freeze({\n featureFlagId:\n input.featureFlagId ??\n defaultPlayerSystemInterfacePortabilityContract.featureFlagId,\n hostAdapters: Object.freeze({\n ...defaultPlayerSystemInterfacePortabilityContract.hostAdapters,\n ...input.hostAdapters,\n supportedHosts: Object.freeze([\n ...(input.hostAdapters?.supportedHosts ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .supportedHosts),\n ]),\n requiredCapabilities: Object.freeze([\n ...(input.hostAdapters?.requiredCapabilities ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .requiredCapabilities),\n ]),\n forbiddenAssumptions: Object.freeze([\n ...(input.hostAdapters?.forbiddenAssumptions ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .forbiddenAssumptions),\n ]),\n }),\n compositionScale: Object.freeze({\n ...defaultPlayerSystemInterfacePortabilityContract.compositionScale,\n ...input.compositionScale,\n }),\n });\n}\n\nexport function createInterfaceShellSurfaceDefinition(\n input: InterfaceShellSurfaceDefinition\n): InterfaceShellSurfaceDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createFocusPaneShellDefinition(\n input: FocusPaneShellDefinition\n): FocusPaneShellDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createLineOfSightTargetPopupDefinition(\n input: LineOfSightTargetPopupDefinition\n): LineOfSightTargetPopupDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createInterfaceShellDefinition(\n input: InterfaceShellDefinitionInput = {}\n): InterfaceShellDefinition {\n return Object.freeze({\n featureFlagId: input.featureFlagId ?? PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,\n surfaces: Object.freeze([...(input.surfaces ?? [])]),\n focusPane: input.focusPane ? Object.freeze({ ...input.focusPane }) : undefined,\n targetPopups: Object.freeze([...(input.targetPopups ?? [])]),\n reducedCombat: Object.freeze({\n ...defaultReducedCombatOverlayPolicy,\n ...input.reducedCombat,\n retainedSurfaceKinds: Object.freeze([\n ...(input.reducedCombat?.retainedSurfaceKinds ??\n defaultReducedCombatOverlayPolicy.retainedSurfaceKinds),\n ]),\n }),\n });\n}\n\nexport function assessPlayerSystemInterfaceComposition(\n sample: WorldSpaceCompositionSample,\n contract: PlayerSystemInterfacePortabilityContract = defaultPlayerSystemInterfacePortabilityContract\n): InterfaceContractAssessment {\n const violations: string[] = [];\n\n if (sample.panelCount > contract.compositionScale.maxWorldPanels) {\n violations.push(\"panelCount\");\n }\n\n if (sample.focusPaneCount > contract.compositionScale.maxFocusPanes) {\n violations.push(\"focusPaneCount\");\n }\n\n if (sample.alertMarkerCount > contract.compositionScale.maxAlertMarkers) {\n violations.push(\"alertMarkerCount\");\n }\n\n if (\n sample.interactivePanelCount >\n contract.compositionScale.maxInteractivePanelsPerFrame\n ) {\n violations.push(\"interactivePanelCount\");\n }\n\n return Object.freeze({\n accepted: violations.length === 0,\n violations: Object.freeze(violations),\n });\n}\n\nexport function assessInterfaceShellDefinition(\n shell: InterfaceShellDefinition\n): InterfaceContractAssessment {\n const violations: string[] = [];\n const ownerSet = new Set(shell.surfaces.map((surface) => surface.owner));\n const retainedSurfaceKinds = new Set(shell.reducedCombat.retainedSurfaceKinds);\n const interactiveSurfaceCount = shell.surfaces.filter(\n (surface) => surface.interactive && retainedSurfaceKinds.has(surface.kind)\n ).length;\n const focusPane = shell.focusPane;\n\n if (shell.surfaces.length === 0) {\n violations.push(\"surfaces\");\n }\n\n if (focusPane && !ownerSet.has(focusPane.owner)) {\n violations.push(\"focusPaneOwner\");\n }\n\n if (focusPane) {\n const matchingSurface = shell.surfaces.find(\n (surface) =>\n surface.kind === \"focus-pane\" &&\n surface.anchorId === focusPane.anchorId &&\n surface.owner === focusPane.owner\n );\n if (!matchingSurface) {\n violations.push(\"focusPaneSurface\");\n }\n }\n\n if (\n interactiveSurfaceCount > shell.reducedCombat.maxInteractiveSurfaces\n ) {\n violations.push(\"interactiveSurfaceCount\");\n }\n\n for (const popup of shell.targetPopups) {\n if (popup.requiresLineOfSight && popup.anchorId.length === 0) {\n violations.push(`popup:${popup.popupId}`);\n }\n }\n\n if (\n ownerSet.has(\"player-system\") &&\n ownerSet.has(\"party-system\") &&\n shell.reducedCombat.retainedSurfaceKinds.length === 0\n ) {\n violations.push(\"reducedCombat\");\n }\n\n return Object.freeze({\n accepted: violations.length === 0,\n violations: Object.freeze(violations),\n });\n}\n"],"mappings":";AAwKO,IAAM,kCAAkC;AACxC,IAAM,qCAAqC;AAC3C,IAAM,0CACX;AACK,IAAM,yCACX;AACK,IAAM,4CACX;AACK,IAAM,oDACX;AAEK,IAAM,oBAAuC,OAAO,OAAO;AAAA,EAChE,aAAa;AAAA,EACb,eAAe;AAAA,EACf,WAAW;AAAA,EACX,SACE;AACJ,CAAC;AAEM,IAAM,uCACX,OAAO,OAAO;AAAA,EACZ,eAAe;AAAA,EACf,eAAe,OAAO,OAAO;AAAA,IAC3B,cAAc;AAAA,IACd,wBAAwB;AAAA,IACxB,gBAAgB;AAAA,IAChB,wBAAwB;AAAA,EAC1B,CAAC;AAAA,EACD,aAAa,OAAO,OAAO;AAAA,IACzB,WAAW;AAAA,IACX,YAAY;AAAA,IACZ,8BAA8B;AAAA,EAChC,CAAC;AACH,CAAC;AAEI,IAAM,kDACX,OAAO,OAAO;AAAA,EACZ,eAAe;AAAA,EACf,cAAc,OAAO,OAAO;AAAA,IAC1B,gBAAgB,OAAO,OAAO;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAA6B;AAAA,IAC7B,sBAAsB,OAAO,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAsC;AAAA,IACtC,sBAAsB,OAAO,OAAO;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,CAAC;AAAA,EACD,kBAAkB,OAAO,OAAO;AAAA,IAC9B,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,iBAAiB;AAAA,IACjB,8BAA8B;AAAA,EAChC,CAAC;AACH,CAAC;AAEI,IAAM,oCACX,OAAO,OAAO;AAAA,EACZ,eAAe;AAAA,EACf,MAAM;AAAA,EACN,sBAAsB,OAAO,OAAO;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAuC;AAAA,EACvC,wBAAwB;AAC1B,CAAC;AAEI,SAAS,4BACd,OACoC;AACpC,SAAO,UAAU,aAAa,UAAU,aAAa,UAAU;AACjE;AAEO,SAAS,gCACd,OAC2B;AAC3B,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC;AACnC;AAEO,SAAS,oCACd,QAA4C,CAAC,GACd;AAC/B,SAAO,OAAO,OAAO;AAAA,IACnB,eACE,MAAM,iBAAiB,qCAAqC;AAAA,IAC9D,eAAe,OAAO,OAAO;AAAA,MAC3B,GAAG,qCAAqC;AAAA,MACxC,GAAG,MAAM;AAAA,IACX,CAAC;AAAA,IACD,aAAa,OAAO,OAAO;AAAA,MACzB,GAAG,qCAAqC;AAAA,MACxC,GAAG,MAAM;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,+CACd,QAAuD,CAAC,GACd;AAC1C,SAAO,OAAO,OAAO;AAAA,IACnB,eACE,MAAM,iBACN,gDAAgD;AAAA,IAClD,cAAc,OAAO,OAAO;AAAA,MAC1B,GAAG,gDAAgD;AAAA,MACnD,GAAG,MAAM;AAAA,MACT,gBAAgB,OAAO,OAAO;AAAA,QAC5B,GAAI,MAAM,cAAc,kBACtB,gDAAgD,aAC7C;AAAA,MACP,CAAC;AAAA,MACD,sBAAsB,OAAO,OAAO;AAAA,QAClC,GAAI,MAAM,cAAc,wBACtB,gDAAgD,aAC7C;AAAA,MACP,CAAC;AAAA,MACD,sBAAsB,OAAO,OAAO;AAAA,QAClC,GAAI,MAAM,cAAc,wBACtB,gDAAgD,aAC7C;AAAA,MACP,CAAC;AAAA,IACH,CAAC;AAAA,IACD,kBAAkB,OAAO,OAAO;AAAA,MAC9B,GAAG,gDAAgD;AAAA,MACnD,GAAG,MAAM;AAAA,IACX,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,sCACd,OACiC;AACjC,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC;AACnC;AAEO,SAAS,+BACd,OAC0B;AAC1B,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC;AACnC;AAEO,SAAS,uCACd,OACkC;AAClC,SAAO,OAAO,OAAO,EAAE,GAAG,MAAM,CAAC;AACnC;AAEO,SAAS,+BACd,QAAuC,CAAC,GACd;AAC1B,SAAO,OAAO,OAAO;AAAA,IACnB,eAAe,MAAM,iBAAiB;AAAA,IACtC,UAAU,OAAO,OAAO,CAAC,GAAI,MAAM,YAAY,CAAC,CAAE,CAAC;AAAA,IACnD,WAAW,MAAM,YAAY,OAAO,OAAO,EAAE,GAAG,MAAM,UAAU,CAAC,IAAI;AAAA,IACrE,cAAc,OAAO,OAAO,CAAC,GAAI,MAAM,gBAAgB,CAAC,CAAE,CAAC;AAAA,IAC3D,eAAe,OAAO,OAAO;AAAA,MAC3B,GAAG;AAAA,MACH,GAAG,MAAM;AAAA,MACT,sBAAsB,OAAO,OAAO;AAAA,QAClC,GAAI,MAAM,eAAe,wBACvB,kCAAkC;AAAA,MACtC,CAAC;AAAA,IACH,CAAC;AAAA,EACH,CAAC;AACH;AAEO,SAAS,uCACd,QACA,WAAqD,iDACxB;AAC7B,QAAM,aAAuB,CAAC;AAE9B,MAAI,OAAO,aAAa,SAAS,iBAAiB,gBAAgB;AAChE,eAAW,KAAK,YAAY;AAAA,EAC9B;AAEA,MAAI,OAAO,iBAAiB,SAAS,iBAAiB,eAAe;AACnE,eAAW,KAAK,gBAAgB;AAAA,EAClC;AAEA,MAAI,OAAO,mBAAmB,SAAS,iBAAiB,iBAAiB;AACvE,eAAW,KAAK,kBAAkB;AAAA,EACpC;AAEA,MACE,OAAO,wBACP,SAAS,iBAAiB,8BAC1B;AACA,eAAW,KAAK,uBAAuB;AAAA,EACzC;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,UAAU,WAAW,WAAW;AAAA,IAChC,YAAY,OAAO,OAAO,UAAU;AAAA,EACtC,CAAC;AACH;AAEO,SAAS,+BACd,OAC6B;AAC7B,QAAM,aAAuB,CAAC;AAC9B,QAAM,WAAW,IAAI,IAAI,MAAM,SAAS,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC;AACvE,QAAM,uBAAuB,IAAI,IAAI,MAAM,cAAc,oBAAoB;AAC7E,QAAM,0BAA0B,MAAM,SAAS;AAAA,IAC7C,CAAC,YAAY,QAAQ,eAAe,qBAAqB,IAAI,QAAQ,IAAI;AAAA,EAC3E,EAAE;AACF,QAAM,YAAY,MAAM;AAExB,MAAI,MAAM,SAAS,WAAW,GAAG;AAC/B,eAAW,KAAK,UAAU;AAAA,EAC5B;AAEA,MAAI,aAAa,CAAC,SAAS,IAAI,UAAU,KAAK,GAAG;AAC/C,eAAW,KAAK,gBAAgB;AAAA,EAClC;AAEA,MAAI,WAAW;AACb,UAAM,kBAAkB,MAAM,SAAS;AAAA,MACrC,CAAC,YACC,QAAQ,SAAS,gBACjB,QAAQ,aAAa,UAAU,YAC/B,QAAQ,UAAU,UAAU;AAAA,IAChC;AACA,QAAI,CAAC,iBAAiB;AACpB,iBAAW,KAAK,kBAAkB;AAAA,IACpC;AAAA,EACF;AAEA,MACE,0BAA0B,MAAM,cAAc,wBAC9C;AACA,eAAW,KAAK,yBAAyB;AAAA,EAC3C;AAEA,aAAW,SAAS,MAAM,cAAc;AACtC,QAAI,MAAM,uBAAuB,MAAM,SAAS,WAAW,GAAG;AAC5D,iBAAW,KAAK,SAAS,MAAM,OAAO,EAAE;AAAA,IAC1C;AAAA,EACF;AAEA,MACE,SAAS,IAAI,eAAe,KAC5B,SAAS,IAAI,cAAc,KAC3B,MAAM,cAAc,qBAAqB,WAAW,GACpD;AACA,eAAW,KAAK,eAAe;AAAA,EACjC;AAEA,SAAO,OAAO,OAAO;AAAA,IACnB,UAAU,WAAW,WAAW;AAAA,IAChC,YAAY,OAAO,OAAO,UAAU;AAAA,EACtC,CAAC;AACH;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["export interface PackageDescriptor {\n readonly packageName: string;\n readonly featureFlagId: string;\n readonly envPrefix: string;\n readonly summary: string;\n}\n\nexport type OverlayKeyboardPath = \"sequential\" | \"direct-hotkey\" | \"read-only\";\n\nexport interface OverlayAccessibilityContract {\n readonly keyboardPath: OverlayKeyboardPath;\n readonly focusRestorationTarget: \"trigger\" | \"pane-heading\" | \"nearest-anchor\";\n readonly liveRegionMode: \"polite\" | \"assertive\" | \"off\";\n readonly requiresAccessibleName: boolean;\n}\n\nexport interface InterfaceFrameBudget {\n readonly targetFps: number;\n readonly maxFrameMs: number;\n readonly maxInteractivePanelsPerFrame: number;\n}\n\nexport type OverlayHostKind =\n | \"dom-overlay\"\n | \"native-overlay\"\n | \"headless-snapshot\";\n\nexport type OverlayAdapterCapability =\n | \"focus-restoration\"\n | \"live-region\"\n | \"anchor-registry\";\n\nexport interface OverlayHostAdapterContract {\n readonly supportedHosts: readonly OverlayHostKind[];\n readonly requiredCapabilities: readonly OverlayAdapterCapability[];\n readonly forbiddenAssumptions: readonly string[];\n}\n\nexport interface OverlayCompositionScaleContract {\n readonly maxWorldPanels: number;\n readonly maxFocusPanes: number;\n readonly maxAlertMarkers: number;\n readonly maxInteractivePanelsPerFrame: number;\n}\n\nexport interface PlayerSystemInterfaceContract {\n readonly featureFlagId: string;\n readonly accessibility: OverlayAccessibilityContract;\n readonly frameBudget: InterfaceFrameBudget;\n}\n\nexport interface PlayerSystemInterfacePortabilityContract {\n readonly featureFlagId: string;\n readonly hostAdapters: OverlayHostAdapterContract;\n readonly compositionScale: OverlayCompositionScaleContract;\n}\n\nexport interface PlayerSystemInterfaceContractInput {\n readonly featureFlagId?: string;\n readonly accessibility?: Partial<OverlayAccessibilityContract>;\n readonly frameBudget?: Partial<InterfaceFrameBudget>;\n}\n\nexport interface PlayerSystemInterfacePortabilityContractInput {\n readonly featureFlagId?: string;\n readonly hostAdapters?: Partial<OverlayHostAdapterContract>;\n readonly compositionScale?: Partial<OverlayCompositionScaleContract>;\n}\n\nexport type PlayerSystemInterfaceMode = \"ambient\" | \"focused\" | \"combat-safe\";\n\nexport type PlayerSystemPaneId =\n | \"identity\"\n | \"missions\"\n | \"guild-quests\"\n | \"logs\"\n | \"mcc\"\n | \"tutorial\"\n | \"points-store\";\n\nexport type InterfaceShellOwner = \"player-system\" | \"party-system\";\nexport type InterfaceShellSurfaceKind =\n | \"world-panel\"\n | \"focus-pane\"\n | \"target-popup\"\n | \"alert-marker\";\nexport type InterfaceCombatBehavior = \"persist\" | \"reduce\" | \"suspend\";\n\nexport interface InterfaceShellSurfaceDefinition {\n readonly surfaceId: string;\n readonly owner: InterfaceShellOwner;\n readonly kind: InterfaceShellSurfaceKind;\n readonly anchorId: string;\n readonly interactive: boolean;\n readonly priority: number;\n readonly combatBehavior: InterfaceCombatBehavior;\n}\n\nexport interface FocusPaneShellDefinition {\n readonly panelId: string;\n readonly owner: InterfaceShellOwner;\n readonly pane: PlayerSystemPaneId;\n readonly anchorId: string;\n readonly heading: string;\n readonly interactive: boolean;\n readonly combatBehavior: InterfaceCombatBehavior;\n}\n\nexport interface LineOfSightTargetPopupDefinition {\n readonly popupId: string;\n readonly owner: InterfaceShellOwner;\n readonly anchorId: string;\n readonly targetId: string;\n readonly summary: string;\n readonly requiresLineOfSight: boolean;\n readonly actionLabel?: string;\n}\n\nexport interface ReducedCombatOverlayPolicy {\n readonly featureFlagId: string;\n readonly mode: \"combat-safe\";\n readonly retainedSurfaceKinds: readonly InterfaceShellSurfaceKind[];\n readonly maxInteractiveSurfaces: number;\n}\n\nexport interface InterfaceShellDefinition {\n readonly featureFlagId: string;\n readonly surfaces: readonly InterfaceShellSurfaceDefinition[];\n readonly focusPane?: FocusPaneShellDefinition;\n readonly targetPopups: readonly LineOfSightTargetPopupDefinition[];\n readonly paneHosts: readonly ThreeDPaneHostDefinition[];\n readonly ambientAlerts: readonly LocalizedAmbientAlertDefinition[];\n readonly reducedCombat: ReducedCombatOverlayPolicy;\n}\n\nexport interface InterfaceShellDefinitionInput {\n readonly featureFlagId?: string;\n readonly surfaces?: readonly InterfaceShellSurfaceDefinition[];\n readonly focusPane?: FocusPaneShellDefinition;\n readonly targetPopups?: readonly LineOfSightTargetPopupDefinition[];\n readonly paneHosts?: readonly ThreeDPaneHostDefinition[];\n readonly ambientAlerts?: readonly LocalizedAmbientAlertDefinition[];\n readonly reducedCombat?: Partial<ReducedCombatOverlayPolicy>;\n}\n\nexport type InterfaceFocusShiftReason =\n | \"keyboard\"\n | \"direct-hotkey\"\n | \"restore\"\n | \"system\";\n\nexport interface InterfaceFocusShift {\n readonly fromSurfaceId?: string;\n readonly toSurfaceId: string;\n readonly reason: InterfaceFocusShiftReason;\n}\n\nexport interface InterfaceShellStateDefinition {\n readonly featureFlagId: string;\n readonly mode: PlayerSystemInterfaceMode;\n readonly focusedSurfaceId?: string;\n readonly visibleSurfaceIds: readonly string[];\n readonly focusShift?: InterfaceFocusShift;\n}\n\nexport interface InterfaceShellStateInput {\n readonly mode: PlayerSystemInterfaceMode;\n readonly focusedSurfaceId?: string;\n}\n\nexport interface ThreeDPaneHostDefinition {\n readonly hostId: string;\n readonly owner: InterfaceShellOwner;\n readonly pane: PlayerSystemPaneId;\n readonly surfaceId: string;\n readonly anchorId: string;\n readonly supportedHosts: readonly OverlayHostKind[];\n}\n\nexport type AmbientAlertSeverity = \"info\" | \"warning\" | \"danger\";\n\nexport interface LocalizedAmbientAlertDefinition {\n readonly alertId: string;\n readonly owner: InterfaceShellOwner;\n readonly severity: AmbientAlertSeverity;\n readonly anchorId: string;\n readonly messageKey: string;\n readonly localizedMessages: Readonly<Record<string, string>>;\n readonly liveRegionMode: \"polite\" | \"assertive\";\n}\n\nexport interface WorldSpacePanelDefinition {\n readonly panelId: string;\n readonly pane: PlayerSystemPaneId;\n readonly anchorId: string;\n readonly interactive: boolean;\n readonly accessibilityLabel?: string;\n readonly focusOrder?: number;\n}\n\nexport interface OverlayAlertMarker {\n readonly markerId: string;\n readonly severity: AmbientAlertSeverity;\n readonly anchorId: string;\n}\n\nexport interface WorldSpaceCompositionSample {\n readonly panelCount: number;\n readonly focusPaneCount: number;\n readonly alertMarkerCount: number;\n readonly interactivePanelCount: number;\n}\n\nexport interface InterfaceContractAssessment {\n readonly accepted: boolean;\n readonly violations: readonly string[];\n}\n\nexport const PLAYER_SYSTEM_INTERFACE_PACKAGE = \"@plasius/player-system-interface\";\nexport const PLAYER_SYSTEM_INTERFACE_ENV_PREFIX = \"PLAYER_SYSTEM_INTERFACE\";\nexport const PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID =\n \"isekai.player-system.interface.enabled\";\nexport const PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\nexport const PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\nexport const PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID =\n PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID;\n\nexport const packageDescriptor: PackageDescriptor = Object.freeze({\n packageName: PLAYER_SYSTEM_INTERFACE_PACKAGE,\n featureFlagId: PLAYER_SYSTEM_PACKAGES_FEATURE_FLAG_ID,\n envPrefix: PLAYER_SYSTEM_INTERFACE_ENV_PREFIX,\n summary:\n \"World-space Player System overlays, focus panes, and target-surface contracts for Plasius game experiences.\",\n});\n\nexport const defaultPlayerSystemInterfaceContract: PlayerSystemInterfaceContract =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_RUNTIME_NFR_FEATURE_FLAG_ID,\n accessibility: Object.freeze({\n keyboardPath: \"sequential\",\n focusRestorationTarget: \"trigger\",\n liveRegionMode: \"polite\",\n requiresAccessibleName: true,\n }),\n frameBudget: Object.freeze({\n targetFps: 60,\n maxFrameMs: 16,\n maxInteractivePanelsPerFrame: 2,\n }),\n });\n\nexport const defaultPlayerSystemInterfacePortabilityContract: PlayerSystemInterfacePortabilityContract =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_RUNTIME_PORTABILITY_FEATURE_FLAG_ID,\n hostAdapters: Object.freeze({\n supportedHosts: Object.freeze([\n \"dom-overlay\",\n \"native-overlay\",\n \"headless-snapshot\",\n ] satisfies OverlayHostKind[]),\n requiredCapabilities: Object.freeze([\n \"focus-restoration\",\n \"live-region\",\n \"anchor-registry\",\n ] satisfies OverlayAdapterCapability[]),\n forbiddenAssumptions: Object.freeze([\n \"window-global\",\n \"single-pane-layout\",\n \"absolute-scene-coordinates\",\n ]),\n }),\n compositionScale: Object.freeze({\n maxWorldPanels: 6,\n maxFocusPanes: 3,\n maxAlertMarkers: 8,\n maxInteractivePanelsPerFrame: 2,\n }),\n });\n\nexport const defaultReducedCombatOverlayPolicy: ReducedCombatOverlayPolicy =\n Object.freeze({\n featureFlagId: PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,\n mode: \"combat-safe\",\n retainedSurfaceKinds: Object.freeze([\n \"alert-marker\",\n \"target-popup\",\n \"focus-pane\",\n ] satisfies InterfaceShellSurfaceKind[]),\n maxInteractiveSurfaces: 1,\n });\n\nexport function isPlayerSystemInterfaceMode(\n value: string\n): value is PlayerSystemInterfaceMode {\n return value === \"ambient\" || value === \"focused\" || value === \"combat-safe\";\n}\n\nexport function createWorldSpacePanelDefinition(\n input: WorldSpacePanelDefinition\n): WorldSpacePanelDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createPlayerSystemInterfaceContract(\n input: PlayerSystemInterfaceContractInput = {}\n): PlayerSystemInterfaceContract {\n return Object.freeze({\n featureFlagId:\n input.featureFlagId ?? defaultPlayerSystemInterfaceContract.featureFlagId,\n accessibility: Object.freeze({\n ...defaultPlayerSystemInterfaceContract.accessibility,\n ...input.accessibility,\n }),\n frameBudget: Object.freeze({\n ...defaultPlayerSystemInterfaceContract.frameBudget,\n ...input.frameBudget,\n }),\n });\n}\n\nexport function createPlayerSystemInterfacePortabilityContract(\n input: PlayerSystemInterfacePortabilityContractInput = {}\n): PlayerSystemInterfacePortabilityContract {\n return Object.freeze({\n featureFlagId:\n input.featureFlagId ??\n defaultPlayerSystemInterfacePortabilityContract.featureFlagId,\n hostAdapters: Object.freeze({\n ...defaultPlayerSystemInterfacePortabilityContract.hostAdapters,\n ...input.hostAdapters,\n supportedHosts: Object.freeze([\n ...(input.hostAdapters?.supportedHosts ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .supportedHosts),\n ]),\n requiredCapabilities: Object.freeze([\n ...(input.hostAdapters?.requiredCapabilities ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .requiredCapabilities),\n ]),\n forbiddenAssumptions: Object.freeze([\n ...(input.hostAdapters?.forbiddenAssumptions ??\n defaultPlayerSystemInterfacePortabilityContract.hostAdapters\n .forbiddenAssumptions),\n ]),\n }),\n compositionScale: Object.freeze({\n ...defaultPlayerSystemInterfacePortabilityContract.compositionScale,\n ...input.compositionScale,\n }),\n });\n}\n\nexport function createInterfaceShellSurfaceDefinition(\n input: InterfaceShellSurfaceDefinition\n): InterfaceShellSurfaceDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createFocusPaneShellDefinition(\n input: FocusPaneShellDefinition\n): FocusPaneShellDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createLineOfSightTargetPopupDefinition(\n input: LineOfSightTargetPopupDefinition\n): LineOfSightTargetPopupDefinition {\n return Object.freeze({ ...input });\n}\n\nexport function createThreeDPaneHostDefinition(\n input: ThreeDPaneHostDefinition\n): ThreeDPaneHostDefinition {\n return Object.freeze({\n ...input,\n supportedHosts: Object.freeze([...input.supportedHosts]),\n });\n}\n\nexport function createLocalizedAmbientAlertDefinition(\n input: LocalizedAmbientAlertDefinition\n): LocalizedAmbientAlertDefinition {\n return Object.freeze({\n ...input,\n localizedMessages: Object.freeze({ ...input.localizedMessages }),\n });\n}\n\nexport function createInterfaceShellDefinition(\n input: InterfaceShellDefinitionInput = {}\n): InterfaceShellDefinition {\n return Object.freeze({\n featureFlagId: input.featureFlagId ?? PLAYER_SYSTEM_INTERFACE_FEATURE_FLAG_ID,\n surfaces: Object.freeze([...(input.surfaces ?? [])]),\n focusPane: input.focusPane ? Object.freeze({ ...input.focusPane }) : undefined,\n targetPopups: Object.freeze([...(input.targetPopups ?? [])]),\n paneHosts: Object.freeze([...(input.paneHosts ?? [])]),\n ambientAlerts: Object.freeze([...(input.ambientAlerts ?? [])]),\n reducedCombat: Object.freeze({\n ...defaultReducedCombatOverlayPolicy,\n ...input.reducedCombat,\n retainedSurfaceKinds: Object.freeze([\n ...(input.reducedCombat?.retainedSurfaceKinds ??\n defaultReducedCombatOverlayPolicy.retainedSurfaceKinds),\n ]),\n }),\n });\n}\n\nexport function createInterfaceShellState(\n shell: InterfaceShellDefinition,\n input: InterfaceShellStateInput\n): InterfaceShellStateDefinition {\n const retainedSurfaceKinds = new Set(\n shell.reducedCombat.retainedSurfaceKinds\n );\n const visibleSurfaceIds = shell.surfaces\n .filter(\n (surface) =>\n input.mode !== \"combat-safe\" ||\n (surface.combatBehavior !== \"suspend\" &&\n retainedSurfaceKinds.has(surface.kind))\n )\n .map((surface) => surface.surfaceId);\n\n if (\n input.focusedSurfaceId &&\n !visibleSurfaceIds.includes(input.focusedSurfaceId)\n ) {\n throw new RangeError(\n `Focused surface '${input.focusedSurfaceId}' is not visible in ${input.mode} mode`\n );\n }\n\n return Object.freeze({\n featureFlagId: shell.featureFlagId,\n mode: input.mode,\n focusedSurfaceId:\n input.mode === \"focused\" ? input.focusedSurfaceId : undefined,\n visibleSurfaceIds: Object.freeze(visibleSurfaceIds),\n });\n}\n\nexport function applyInterfaceShellFocusShift(\n state: InterfaceShellStateDefinition,\n focusShift: InterfaceFocusShift\n): InterfaceShellStateDefinition {\n if (!state.visibleSurfaceIds.includes(focusShift.toSurfaceId)) {\n throw new RangeError(\n `Focused surface '${focusShift.toSurfaceId}' is not visible in ${state.mode} mode`\n );\n }\n\n return Object.freeze({\n ...state,\n mode: \"focused\",\n focusedSurfaceId: focusShift.toSurfaceId,\n focusShift: Object.freeze({ ...focusShift }),\n });\n}\n\nexport function resolveLocalizedAmbientAlertMessage(\n alert: LocalizedAmbientAlertDefinition,\n locale: string,\n fallbackLocale = \"en-GB\"\n): string | undefined {\n return alert.localizedMessages[locale] ?? alert.localizedMessages[fallbackLocale];\n}\n\nexport function assessPlayerSystemInterfaceComposition(\n sample: WorldSpaceCompositionSample,\n contract: PlayerSystemInterfacePortabilityContract = defaultPlayerSystemInterfacePortabilityContract\n): InterfaceContractAssessment {\n const violations: string[] = [];\n\n if (sample.panelCount > contract.compositionScale.maxWorldPanels) {\n violations.push(\"panelCount\");\n }\n\n if (sample.focusPaneCount > contract.compositionScale.maxFocusPanes) {\n violations.push(\"focusPaneCount\");\n }\n\n if (sample.alertMarkerCount > contract.compositionScale.maxAlertMarkers) {\n violations.push(\"alertMarkerCount\");\n }\n\n if (\n sample.interactivePanelCount >\n contract.compositionScale.maxInteractivePanelsPerFrame\n ) {\n violations.push(\"interactivePanelCount\");\n }\n\n return Object.freeze({\n accepted: violations.length === 0,\n violations: Object.freeze(violations),\n });\n}\n\nexport function assessInterfaceShellDefinition(\n shell: InterfaceShellDefinition\n): InterfaceContractAssessment {\n const violations: string[] = [];\n const ownerSet = new Set(shell.surfaces.map((surface) => surface.owner));\n const retainedSurfaceKinds = new Set(shell.reducedCombat.retainedSurfaceKinds);\n const interactiveSurfaceCount = shell.surfaces.filter(\n (surface) => surface.interactive && retainedSurfaceKinds.has(surface.kind)\n ).length;\n const focusPane = shell.focusPane;\n\n if (shell.surfaces.length === 0) {\n violations.push(\"surfaces\");\n }\n\n if (focusPane && !ownerSet.has(focusPane.owner)) {\n violations.push(\"focusPaneOwner\");\n }\n\n if (focusPane) {\n const matchingSurface = shell.surfaces.find(\n (surface) =>\n surface.kind === \"focus-pane\" &&\n surface.anchorId === focusPane.anchorId &&\n surface.owner === focusPane.owner\n );\n if (!matchingSurface) {\n violations.push(\"focusPaneSurface\");\n }\n }\n\n if (\n interactiveSurfaceCount > shell.reducedCombat.maxInteractiveSurfaces\n ) {\n violations.push(\"interactiveSurfaceCount\");\n }\n\n for (const popup of shell.targetPopups) {\n if (popup.requiresLineOfSight && popup.anchorId.length === 0) {\n violations.push(`popup:${popup.popupId}`);\n }\n }\n\n for (const paneHost of shell.paneHosts) {\n const matchingSurface = shell.surfaces.find(\n (surface) =>\n surface.surfaceId === paneHost.surfaceId &&\n surface.owner === paneHost.owner &&\n surface.anchorId === paneHost.anchorId\n );\n if (!matchingSurface) {\n violations.push(`paneHost:${paneHost.hostId}`);\n }\n }\n\n for (const alert of shell.ambientAlerts) {\n if (Object.keys(alert.localizedMessages).length === 0) {\n violations.push(`alert:${alert.alertId}`);\n }\n }\n\n if (\n ownerSet.has(\"player-system\") &&\n ownerSet.has(\"party-system\") &&\n shell.reducedCombat.retainedSurfaceKinds.length === 0\n ) {\n violations.push(\"reducedCombat\");\n }\n\n return Object.freeze({\n accepted: violations.length === 0,\n violations: Object.freeze(violations),\n });\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED