@mpgd/target-config 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,7 @@
1
1
  import type { TargetConfig, TargetRuntimeKind } from './runtime';
2
2
  export type TargetViewportOrientation = 'portrait' | 'landscape';
3
+ export type TargetViewportOrientationPolicyMode = 'responsive' | 'prefer-landscape' | 'prefer-portrait' | 'lock-landscape' | 'lock-portrait';
4
+ export type TargetViewportOrientationMismatchBehavior = 'continue' | 'letterbox' | 'show-rotate-prompt';
3
5
  export type TargetViewportSizeClass = 'compact' | 'medium' | 'expanded';
4
6
  export type TargetViewportShell = 'browser' | 'mobile-webview' | 'embedded-webview';
5
7
  export type TargetViewportMeasurementSource = 'container' | 'visual-viewport' | 'window' | 'unknown';
@@ -14,6 +16,7 @@ export interface TargetViewportInput {
14
16
  readonly height: number;
15
17
  readonly runtime?: TargetRuntimeKind;
16
18
  readonly source?: TargetViewportMeasurementSource;
19
+ readonly orientationPolicy?: TargetViewportOrientationPolicy;
17
20
  }
18
21
  export interface TargetViewportLayout {
19
22
  readonly width: number;
@@ -31,17 +34,36 @@ export interface TargetViewportRecommendation {
31
34
  readonly secondaryPanels: TargetViewportPanelPlacement;
32
35
  readonly safeAreaAware: boolean;
33
36
  }
37
+ export interface TargetViewportOrientationPolicy {
38
+ readonly mode: TargetViewportOrientationPolicyMode;
39
+ readonly mismatchBehavior?: TargetViewportOrientationMismatchBehavior;
40
+ }
41
+ export interface TargetViewportOrientationPlan {
42
+ readonly mode: TargetViewportOrientationPolicyMode;
43
+ readonly preferredOrientation?: TargetViewportOrientation;
44
+ readonly lockedOrientation?: TargetViewportOrientation;
45
+ readonly mismatchBehavior: TargetViewportOrientationMismatchBehavior;
46
+ readonly isMismatch: boolean;
47
+ readonly shouldLetterbox: boolean;
48
+ readonly shouldShowRotatePrompt: boolean;
49
+ }
34
50
  export interface TargetViewportPlan {
35
51
  readonly layout: TargetViewportLayout;
36
52
  readonly recommendation: TargetViewportRecommendation;
53
+ readonly orientation: TargetViewportOrientationPlan;
37
54
  }
38
55
  export declare const defaultTargetViewportBreakpoints: {
39
56
  readonly compactMaxWidth: 599;
40
57
  readonly expandedMinWidth: 900;
41
58
  };
59
+ export declare const defaultTargetViewportOrientationPolicy: {
60
+ readonly mode: 'responsive';
61
+ readonly mismatchBehavior: 'continue';
62
+ };
42
63
  export declare function targetViewportShellForRuntime(runtime: TargetRuntimeKind): TargetViewportShell;
43
64
  export declare function targetViewportShellForConfig(config: Pick<TargetConfig, 'runtime'>): TargetViewportShell;
44
65
  export declare function resolveTargetViewportLayout(input: TargetViewportInput, breakpoints?: TargetViewportBreakpoints): TargetViewportLayout;
45
66
  export declare function resolveTargetViewportSizeClass(width: number, breakpoints?: TargetViewportBreakpoints): TargetViewportSizeClass;
46
67
  export declare function resolveTargetViewportRecommendation(layout: TargetViewportLayout): TargetViewportRecommendation;
68
+ export declare function resolveTargetViewportOrientationPlan(layout: Pick<TargetViewportLayout, 'orientation'>, policy?: TargetViewportOrientationPolicy): TargetViewportOrientationPlan;
47
69
  export declare function resolveTargetViewportPlan(input: TargetViewportInput, breakpoints?: TargetViewportBreakpoints): TargetViewportPlan;
package/dist/viewport.js CHANGED
@@ -2,6 +2,37 @@ export const defaultTargetViewportBreakpoints = {
2
2
  compactMaxWidth: 599,
3
3
  expandedMinWidth: 900,
4
4
  };
5
+ export const defaultTargetViewportOrientationPolicy = {
6
+ mode: 'responsive',
7
+ mismatchBehavior: 'continue',
8
+ };
9
+ const targetViewportOrientationPolicyModeDescriptors = {
10
+ responsive: {
11
+ preferredOrientation: undefined,
12
+ lockedOrientation: undefined,
13
+ isLocked: false,
14
+ },
15
+ 'prefer-landscape': {
16
+ preferredOrientation: 'landscape',
17
+ lockedOrientation: undefined,
18
+ isLocked: false,
19
+ },
20
+ 'prefer-portrait': {
21
+ preferredOrientation: 'portrait',
22
+ lockedOrientation: undefined,
23
+ isLocked: false,
24
+ },
25
+ 'lock-landscape': {
26
+ preferredOrientation: 'landscape',
27
+ lockedOrientation: 'landscape',
28
+ isLocked: true,
29
+ },
30
+ 'lock-portrait': {
31
+ preferredOrientation: 'portrait',
32
+ lockedOrientation: 'portrait',
33
+ isLocked: true,
34
+ },
35
+ };
5
36
  export function targetViewportShellForRuntime(runtime) {
6
37
  switch (runtime) {
7
38
  case 'capacitor-android':
@@ -51,11 +82,29 @@ export function resolveTargetViewportRecommendation(layout) {
51
82
  safeAreaAware: layout.shell !== 'browser' || layout.sizeClass === 'compact' || browserSafeAreaRisk,
52
83
  };
53
84
  }
85
+ export function resolveTargetViewportOrientationPlan(layout, policy = defaultTargetViewportOrientationPolicy) {
86
+ const normalizedPolicy = normalizeTargetViewportOrientationPolicy(policy);
87
+ const descriptor = targetViewportOrientationPolicyModeDescriptors[normalizedPolicy.mode];
88
+ const preferredOrientation = descriptor.preferredOrientation;
89
+ const lockedOrientation = descriptor.lockedOrientation;
90
+ const isMismatch = preferredOrientation !== undefined && layout.orientation !== preferredOrientation;
91
+ const mismatchBehavior = normalizedPolicy.mismatchBehavior;
92
+ return {
93
+ mode: normalizedPolicy.mode,
94
+ ...(preferredOrientation === undefined ? {} : { preferredOrientation }),
95
+ ...(lockedOrientation === undefined ? {} : { lockedOrientation }),
96
+ mismatchBehavior,
97
+ isMismatch,
98
+ shouldLetterbox: isMismatch && mismatchBehavior === 'letterbox',
99
+ shouldShowRotatePrompt: isMismatch && mismatchBehavior === 'show-rotate-prompt',
100
+ };
101
+ }
54
102
  export function resolveTargetViewportPlan(input, breakpoints = defaultTargetViewportBreakpoints) {
55
103
  const layout = resolveTargetViewportLayout(input, breakpoints);
56
104
  return {
57
105
  layout,
58
106
  recommendation: resolveTargetViewportRecommendation(layout),
107
+ orientation: resolveTargetViewportOrientationPlan(layout, input.orientationPolicy),
59
108
  };
60
109
  }
61
110
  function classifyTargetViewportSize(width, breakpoints) {
@@ -76,6 +125,14 @@ function resolveTargetViewportPanelPlacement(layout) {
76
125
  }
77
126
  return 'side';
78
127
  }
128
+ function normalizeTargetViewportOrientationPolicy(policy) {
129
+ const descriptor = targetViewportOrientationPolicyModeDescriptors[policy.mode];
130
+ return {
131
+ mode: policy.mode,
132
+ mismatchBehavior: policy.mismatchBehavior ??
133
+ (descriptor.isLocked ? 'show-rotate-prompt' : 'continue'),
134
+ };
135
+ }
79
136
  function normalizeTargetViewportBreakpoints(breakpoints) {
80
137
  const compactMaxWidth = normalizeViewportDimension(breakpoints.compactMaxWidth, 'compactMaxWidth');
81
138
  const expandedMinWidth = normalizeViewportDimension(breakpoints.expandedMinWidth, 'expandedMinWidth');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mpgd/target-config",
3
- "version": "0.3.4",
3
+ "version": "0.4.0",
4
4
  "description": "Target-specific platform feature availability and effective config helpers for mpgd.",
5
5
  "license": "MIT",
6
6
  "repository": {