@mpgd/target-config 0.3.3 → 0.3.4
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/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/viewport.d.ts +47 -0
- package/dist/viewport.js +99 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -2,5 +2,6 @@ import type { EffectiveTargetConfigMatrix } from './effective';
|
|
|
2
2
|
import type { TargetConfigMatrix } from './runtime';
|
|
3
3
|
export * from './effective';
|
|
4
4
|
export * from './runtime';
|
|
5
|
+
export * from './viewport';
|
|
5
6
|
export declare const assertEffectiveTargetConfigMatrix: (input: unknown) => EffectiveTargetConfigMatrix;
|
|
6
7
|
export declare const assertTargetConfigMatrix: (input: unknown) => TargetConfigMatrix;
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ const __typia_transform__accessExpressionAsString = _b._accessExpressionAsString
|
|
|
4
4
|
import typia from 'typia';
|
|
5
5
|
export * from './effective';
|
|
6
6
|
export * from './runtime';
|
|
7
|
+
export * from './viewport';
|
|
7
8
|
export const assertEffectiveTargetConfigMatrix = (() => {
|
|
8
9
|
const _ip0 = input => "string" === typeof input["version"];
|
|
9
10
|
const _ip1 = input => "boolean" === typeof input["iap"];
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { TargetConfig, TargetRuntimeKind } from './runtime';
|
|
2
|
+
export type TargetViewportOrientation = 'portrait' | 'landscape';
|
|
3
|
+
export type TargetViewportSizeClass = 'compact' | 'medium' | 'expanded';
|
|
4
|
+
export type TargetViewportShell = 'browser' | 'mobile-webview' | 'embedded-webview';
|
|
5
|
+
export type TargetViewportMeasurementSource = 'container' | 'visual-viewport' | 'window' | 'unknown';
|
|
6
|
+
export type TargetViewportControlPlacement = 'bottom' | 'side';
|
|
7
|
+
export type TargetViewportPanelPlacement = 'below' | 'side' | 'drawer';
|
|
8
|
+
export interface TargetViewportBreakpoints {
|
|
9
|
+
readonly compactMaxWidth: number;
|
|
10
|
+
readonly expandedMinWidth: number;
|
|
11
|
+
}
|
|
12
|
+
export interface TargetViewportInput {
|
|
13
|
+
readonly width: number;
|
|
14
|
+
readonly height: number;
|
|
15
|
+
readonly runtime?: TargetRuntimeKind;
|
|
16
|
+
readonly source?: TargetViewportMeasurementSource;
|
|
17
|
+
}
|
|
18
|
+
export interface TargetViewportLayout {
|
|
19
|
+
readonly width: number;
|
|
20
|
+
readonly height: number;
|
|
21
|
+
readonly shortSide: number;
|
|
22
|
+
readonly longSide: number;
|
|
23
|
+
readonly aspectRatio: number;
|
|
24
|
+
readonly orientation: TargetViewportOrientation;
|
|
25
|
+
readonly sizeClass: TargetViewportSizeClass;
|
|
26
|
+
readonly shell: TargetViewportShell;
|
|
27
|
+
readonly source: TargetViewportMeasurementSource;
|
|
28
|
+
}
|
|
29
|
+
export interface TargetViewportRecommendation {
|
|
30
|
+
readonly primaryControls: TargetViewportControlPlacement;
|
|
31
|
+
readonly secondaryPanels: TargetViewportPanelPlacement;
|
|
32
|
+
readonly safeAreaAware: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface TargetViewportPlan {
|
|
35
|
+
readonly layout: TargetViewportLayout;
|
|
36
|
+
readonly recommendation: TargetViewportRecommendation;
|
|
37
|
+
}
|
|
38
|
+
export declare const defaultTargetViewportBreakpoints: {
|
|
39
|
+
readonly compactMaxWidth: 599;
|
|
40
|
+
readonly expandedMinWidth: 900;
|
|
41
|
+
};
|
|
42
|
+
export declare function targetViewportShellForRuntime(runtime: TargetRuntimeKind): TargetViewportShell;
|
|
43
|
+
export declare function targetViewportShellForConfig(config: Pick<TargetConfig, 'runtime'>): TargetViewportShell;
|
|
44
|
+
export declare function resolveTargetViewportLayout(input: TargetViewportInput, breakpoints?: TargetViewportBreakpoints): TargetViewportLayout;
|
|
45
|
+
export declare function resolveTargetViewportSizeClass(width: number, breakpoints?: TargetViewportBreakpoints): TargetViewportSizeClass;
|
|
46
|
+
export declare function resolveTargetViewportRecommendation(layout: TargetViewportLayout): TargetViewportRecommendation;
|
|
47
|
+
export declare function resolveTargetViewportPlan(input: TargetViewportInput, breakpoints?: TargetViewportBreakpoints): TargetViewportPlan;
|
package/dist/viewport.js
ADDED
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
export const defaultTargetViewportBreakpoints = {
|
|
2
|
+
compactMaxWidth: 599,
|
|
3
|
+
expandedMinWidth: 900,
|
|
4
|
+
};
|
|
5
|
+
export function targetViewportShellForRuntime(runtime) {
|
|
6
|
+
switch (runtime) {
|
|
7
|
+
case 'capacitor-android':
|
|
8
|
+
case 'capacitor-ios':
|
|
9
|
+
case 'apps-in-toss':
|
|
10
|
+
return 'mobile-webview';
|
|
11
|
+
case 'devvit-web':
|
|
12
|
+
return 'embedded-webview';
|
|
13
|
+
case 'web-preview':
|
|
14
|
+
case 'microsoft-store-pwa':
|
|
15
|
+
return 'browser';
|
|
16
|
+
}
|
|
17
|
+
const exhaustive = runtime;
|
|
18
|
+
return exhaustive;
|
|
19
|
+
}
|
|
20
|
+
export function targetViewportShellForConfig(config) {
|
|
21
|
+
return targetViewportShellForRuntime(config.runtime);
|
|
22
|
+
}
|
|
23
|
+
export function resolveTargetViewportLayout(input, breakpoints = defaultTargetViewportBreakpoints) {
|
|
24
|
+
const normalizedBreakpoints = normalizeTargetViewportBreakpoints(breakpoints);
|
|
25
|
+
const width = normalizeViewportDimension(input.width, 'width');
|
|
26
|
+
const height = normalizeViewportDimension(input.height, 'height');
|
|
27
|
+
const aspectRatio = width / height;
|
|
28
|
+
return {
|
|
29
|
+
width,
|
|
30
|
+
height,
|
|
31
|
+
shortSide: Math.min(width, height),
|
|
32
|
+
longSide: Math.max(width, height),
|
|
33
|
+
aspectRatio,
|
|
34
|
+
orientation: width >= height ? 'landscape' : 'portrait',
|
|
35
|
+
sizeClass: classifyTargetViewportSize(width, normalizedBreakpoints),
|
|
36
|
+
shell: input.runtime === undefined ? 'browser' : targetViewportShellForRuntime(input.runtime),
|
|
37
|
+
source: input.source ?? 'unknown',
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
export function resolveTargetViewportSizeClass(width, breakpoints = defaultTargetViewportBreakpoints) {
|
|
41
|
+
return classifyTargetViewportSize(normalizeViewportDimension(width, 'width'), normalizeTargetViewportBreakpoints(breakpoints));
|
|
42
|
+
}
|
|
43
|
+
export function resolveTargetViewportRecommendation(layout) {
|
|
44
|
+
const narrowOrPortrait = layout.sizeClass === 'compact' || layout.orientation === 'portrait';
|
|
45
|
+
const browserSafeAreaRisk = layout.shell === 'browser' &&
|
|
46
|
+
layout.orientation === 'landscape' &&
|
|
47
|
+
layout.shortSide <= defaultTargetViewportBreakpoints.compactMaxWidth;
|
|
48
|
+
return {
|
|
49
|
+
primaryControls: narrowOrPortrait ? 'bottom' : 'side',
|
|
50
|
+
secondaryPanels: resolveTargetViewportPanelPlacement(layout),
|
|
51
|
+
safeAreaAware: layout.shell !== 'browser' || layout.sizeClass === 'compact' || browserSafeAreaRisk,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
export function resolveTargetViewportPlan(input, breakpoints = defaultTargetViewportBreakpoints) {
|
|
55
|
+
const layout = resolveTargetViewportLayout(input, breakpoints);
|
|
56
|
+
return {
|
|
57
|
+
layout,
|
|
58
|
+
recommendation: resolveTargetViewportRecommendation(layout),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
function classifyTargetViewportSize(width, breakpoints) {
|
|
62
|
+
if (width <= breakpoints.compactMaxWidth) {
|
|
63
|
+
return 'compact';
|
|
64
|
+
}
|
|
65
|
+
if (width < breakpoints.expandedMinWidth) {
|
|
66
|
+
return 'medium';
|
|
67
|
+
}
|
|
68
|
+
return 'expanded';
|
|
69
|
+
}
|
|
70
|
+
function resolveTargetViewportPanelPlacement(layout) {
|
|
71
|
+
if (layout.sizeClass === 'compact') {
|
|
72
|
+
return 'drawer';
|
|
73
|
+
}
|
|
74
|
+
if (layout.orientation === 'portrait') {
|
|
75
|
+
return 'below';
|
|
76
|
+
}
|
|
77
|
+
return 'side';
|
|
78
|
+
}
|
|
79
|
+
function normalizeTargetViewportBreakpoints(breakpoints) {
|
|
80
|
+
const compactMaxWidth = normalizeViewportDimension(breakpoints.compactMaxWidth, 'compactMaxWidth');
|
|
81
|
+
const expandedMinWidth = normalizeViewportDimension(breakpoints.expandedMinWidth, 'expandedMinWidth');
|
|
82
|
+
if (compactMaxWidth + 1 >= expandedMinWidth) {
|
|
83
|
+
throw new Error('compactMaxWidth must leave at least one integer width below expandedMinWidth for medium viewports.');
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
compactMaxWidth,
|
|
87
|
+
expandedMinWidth,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function normalizeViewportDimension(value, name) {
|
|
91
|
+
if (!Number.isFinite(value) || value <= 0) {
|
|
92
|
+
throw new Error(`Viewport ${name} must be a positive finite number.`);
|
|
93
|
+
}
|
|
94
|
+
const rounded = Math.round(value);
|
|
95
|
+
if (rounded <= 0) {
|
|
96
|
+
throw new Error(`Viewport ${name} must round to at least 1.`);
|
|
97
|
+
}
|
|
98
|
+
return rounded;
|
|
99
|
+
}
|