@tekton-ui/core 0.2.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.
- package/README.md +758 -0
- package/dist/blueprint.d.ts +44 -0
- package/dist/blueprint.d.ts.map +1 -0
- package/dist/blueprint.js +163 -0
- package/dist/blueprint.js.map +1 -0
- package/dist/component-schemas.d.ts +78 -0
- package/dist/component-schemas.d.ts.map +1 -0
- package/dist/component-schemas.js +1037 -0
- package/dist/component-schemas.js.map +1 -0
- package/dist/css-generator.d.ts +42 -0
- package/dist/css-generator.d.ts.map +1 -0
- package/dist/css-generator.js +339 -0
- package/dist/css-generator.js.map +1 -0
- package/dist/icon-library.d.ts +109 -0
- package/dist/icon-library.d.ts.map +1 -0
- package/dist/icon-library.js +204 -0
- package/dist/icon-library.js.map +1 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +51 -0
- package/dist/index.js.map +1 -0
- package/dist/layout-css-generator.d.ts +158 -0
- package/dist/layout-css-generator.d.ts.map +1 -0
- package/dist/layout-css-generator.js +901 -0
- package/dist/layout-css-generator.js.map +1 -0
- package/dist/layout-resolver.d.ts +92 -0
- package/dist/layout-resolver.d.ts.map +1 -0
- package/dist/layout-resolver.js +275 -0
- package/dist/layout-resolver.js.map +1 -0
- package/dist/layout-tokens/index.d.ts +16 -0
- package/dist/layout-tokens/index.d.ts.map +1 -0
- package/dist/layout-tokens/index.js +16 -0
- package/dist/layout-tokens/index.js.map +1 -0
- package/dist/layout-tokens/keyboard.d.ts +254 -0
- package/dist/layout-tokens/keyboard.d.ts.map +1 -0
- package/dist/layout-tokens/keyboard.js +407 -0
- package/dist/layout-tokens/keyboard.js.map +1 -0
- package/dist/layout-tokens/mobile-shells.d.ts +78 -0
- package/dist/layout-tokens/mobile-shells.d.ts.map +1 -0
- package/dist/layout-tokens/mobile-shells.js +635 -0
- package/dist/layout-tokens/mobile-shells.js.map +1 -0
- package/dist/layout-tokens/pages.d.ts +100 -0
- package/dist/layout-tokens/pages.d.ts.map +1 -0
- package/dist/layout-tokens/pages.js +576 -0
- package/dist/layout-tokens/pages.js.map +1 -0
- package/dist/layout-tokens/responsive.d.ts +109 -0
- package/dist/layout-tokens/responsive.d.ts.map +1 -0
- package/dist/layout-tokens/responsive.js +167 -0
- package/dist/layout-tokens/responsive.js.map +1 -0
- package/dist/layout-tokens/safe-area.d.ts +156 -0
- package/dist/layout-tokens/safe-area.d.ts.map +1 -0
- package/dist/layout-tokens/safe-area.js +316 -0
- package/dist/layout-tokens/safe-area.js.map +1 -0
- package/dist/layout-tokens/sections-advanced.d.ts +277 -0
- package/dist/layout-tokens/sections-advanced.d.ts.map +1 -0
- package/dist/layout-tokens/sections-advanced.js +593 -0
- package/dist/layout-tokens/sections-advanced.js.map +1 -0
- package/dist/layout-tokens/sections.d.ts +137 -0
- package/dist/layout-tokens/sections.d.ts.map +1 -0
- package/dist/layout-tokens/sections.js +694 -0
- package/dist/layout-tokens/sections.js.map +1 -0
- package/dist/layout-tokens/shells.d.ts +77 -0
- package/dist/layout-tokens/shells.d.ts.map +1 -0
- package/dist/layout-tokens/shells.js +408 -0
- package/dist/layout-tokens/shells.js.map +1 -0
- package/dist/layout-tokens/touch-target.d.ts +119 -0
- package/dist/layout-tokens/touch-target.d.ts.map +1 -0
- package/dist/layout-tokens/touch-target.js +156 -0
- package/dist/layout-tokens/touch-target.js.map +1 -0
- package/dist/layout-tokens/types.d.ts +632 -0
- package/dist/layout-tokens/types.d.ts.map +1 -0
- package/dist/layout-tokens/types.js +49 -0
- package/dist/layout-tokens/types.js.map +1 -0
- package/dist/layout-validation.d.ts +1547 -0
- package/dist/layout-validation.d.ts.map +1 -0
- package/dist/layout-validation.js +628 -0
- package/dist/layout-validation.js.map +1 -0
- package/dist/render.d.ts +23 -0
- package/dist/render.d.ts.map +1 -0
- package/dist/render.js +244 -0
- package/dist/render.js.map +1 -0
- package/dist/schema-validation.d.ts +208 -0
- package/dist/schema-validation.d.ts.map +1 -0
- package/dist/schema-validation.js +205 -0
- package/dist/schema-validation.js.map +1 -0
- package/dist/screen-generation/generators/css-in-js-generator.d.ts +82 -0
- package/dist/screen-generation/generators/css-in-js-generator.d.ts.map +1 -0
- package/dist/screen-generation/generators/css-in-js-generator.js +335 -0
- package/dist/screen-generation/generators/css-in-js-generator.js.map +1 -0
- package/dist/screen-generation/generators/index.d.ts +13 -0
- package/dist/screen-generation/generators/index.d.ts.map +1 -0
- package/dist/screen-generation/generators/index.js +32 -0
- package/dist/screen-generation/generators/index.js.map +1 -0
- package/dist/screen-generation/generators/react-generator.d.ts +100 -0
- package/dist/screen-generation/generators/react-generator.d.ts.map +1 -0
- package/dist/screen-generation/generators/react-generator.js +379 -0
- package/dist/screen-generation/generators/react-generator.js.map +1 -0
- package/dist/screen-generation/generators/tailwind-generator.d.ts +105 -0
- package/dist/screen-generation/generators/tailwind-generator.d.ts.map +1 -0
- package/dist/screen-generation/generators/tailwind-generator.js +355 -0
- package/dist/screen-generation/generators/tailwind-generator.js.map +1 -0
- package/dist/screen-generation/generators/types.d.ts +136 -0
- package/dist/screen-generation/generators/types.d.ts.map +1 -0
- package/dist/screen-generation/generators/types.js +18 -0
- package/dist/screen-generation/generators/types.js.map +1 -0
- package/dist/screen-generation/generators/utils.d.ts +187 -0
- package/dist/screen-generation/generators/utils.d.ts.map +1 -0
- package/dist/screen-generation/generators/utils.js +312 -0
- package/dist/screen-generation/generators/utils.js.map +1 -0
- package/dist/screen-generation/index.d.ts +14 -0
- package/dist/screen-generation/index.d.ts.map +1 -0
- package/dist/screen-generation/index.js +33 -0
- package/dist/screen-generation/index.js.map +1 -0
- package/dist/screen-generation/resolver/component-resolver.d.ts +157 -0
- package/dist/screen-generation/resolver/component-resolver.d.ts.map +1 -0
- package/dist/screen-generation/resolver/component-resolver.js +295 -0
- package/dist/screen-generation/resolver/component-resolver.js.map +1 -0
- package/dist/screen-generation/resolver/index.d.ts +10 -0
- package/dist/screen-generation/resolver/index.d.ts.map +1 -0
- package/dist/screen-generation/resolver/index.js +46 -0
- package/dist/screen-generation/resolver/index.js.map +1 -0
- package/dist/screen-generation/resolver/layout-resolver.d.ts +155 -0
- package/dist/screen-generation/resolver/layout-resolver.d.ts.map +1 -0
- package/dist/screen-generation/resolver/layout-resolver.js +193 -0
- package/dist/screen-generation/resolver/layout-resolver.js.map +1 -0
- package/dist/screen-generation/resolver/screen-resolver.d.ts +174 -0
- package/dist/screen-generation/resolver/screen-resolver.d.ts.map +1 -0
- package/dist/screen-generation/resolver/screen-resolver.js +373 -0
- package/dist/screen-generation/resolver/screen-resolver.js.map +1 -0
- package/dist/screen-generation/resolver/token-resolver.d.ts +170 -0
- package/dist/screen-generation/resolver/token-resolver.d.ts.map +1 -0
- package/dist/screen-generation/resolver/token-resolver.js +260 -0
- package/dist/screen-generation/resolver/token-resolver.js.map +1 -0
- package/dist/screen-generation/types.d.ts +116 -0
- package/dist/screen-generation/types.d.ts.map +1 -0
- package/dist/screen-generation/types.js +33 -0
- package/dist/screen-generation/types.js.map +1 -0
- package/dist/screen-generation/validators.d.ts +286 -0
- package/dist/screen-generation/validators.d.ts.map +1 -0
- package/dist/screen-generation/validators.js +323 -0
- package/dist/screen-generation/validators.js.map +1 -0
- package/dist/screen-templates/__tests__/registry.test.d.ts +6 -0
- package/dist/screen-templates/__tests__/registry.test.d.ts.map +1 -0
- package/dist/screen-templates/__tests__/registry.test.js +247 -0
- package/dist/screen-templates/__tests__/registry.test.js.map +1 -0
- package/dist/screen-templates/__tests__/templates.test.d.ts +6 -0
- package/dist/screen-templates/__tests__/templates.test.d.ts.map +1 -0
- package/dist/screen-templates/__tests__/templates.test.js +179 -0
- package/dist/screen-templates/__tests__/templates.test.js.map +1 -0
- package/dist/screen-templates/index.d.ts +39 -0
- package/dist/screen-templates/index.d.ts.map +1 -0
- package/dist/screen-templates/index.js +79 -0
- package/dist/screen-templates/index.js.map +1 -0
- package/dist/screen-templates/registry.d.ts +177 -0
- package/dist/screen-templates/registry.d.ts.map +1 -0
- package/dist/screen-templates/registry.js +274 -0
- package/dist/screen-templates/registry.js.map +1 -0
- package/dist/screen-templates/templates/account/index.d.ts +6 -0
- package/dist/screen-templates/templates/account/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/account/index.js +6 -0
- package/dist/screen-templates/templates/account/index.js.map +1 -0
- package/dist/screen-templates/templates/account/profile.d.ts +23 -0
- package/dist/screen-templates/templates/account/profile.d.ts.map +1 -0
- package/dist/screen-templates/templates/account/profile.js +249 -0
- package/dist/screen-templates/templates/account/profile.js.map +1 -0
- package/dist/screen-templates/templates/auth/forgot-password.d.ts +23 -0
- package/dist/screen-templates/templates/auth/forgot-password.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/forgot-password.js +203 -0
- package/dist/screen-templates/templates/auth/forgot-password.js.map +1 -0
- package/dist/screen-templates/templates/auth/index.d.ts +9 -0
- package/dist/screen-templates/templates/auth/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/index.js +9 -0
- package/dist/screen-templates/templates/auth/index.js.map +1 -0
- package/dist/screen-templates/templates/auth/login.d.ts +24 -0
- package/dist/screen-templates/templates/auth/login.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/login.js +254 -0
- package/dist/screen-templates/templates/auth/login.js.map +1 -0
- package/dist/screen-templates/templates/auth/signup.d.ts +24 -0
- package/dist/screen-templates/templates/auth/signup.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/signup.js +315 -0
- package/dist/screen-templates/templates/auth/signup.js.map +1 -0
- package/dist/screen-templates/templates/auth/verification.d.ts +23 -0
- package/dist/screen-templates/templates/auth/verification.d.ts.map +1 -0
- package/dist/screen-templates/templates/auth/verification.js +239 -0
- package/dist/screen-templates/templates/auth/verification.js.map +1 -0
- package/dist/screen-templates/templates/feedback/confirmation.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/confirmation.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/confirmation.js +107 -0
- package/dist/screen-templates/templates/feedback/confirmation.js.map +1 -0
- package/dist/screen-templates/templates/feedback/empty.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/empty.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/empty.js +90 -0
- package/dist/screen-templates/templates/feedback/empty.js.map +1 -0
- package/dist/screen-templates/templates/feedback/error.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/error.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/error.js +99 -0
- package/dist/screen-templates/templates/feedback/error.js.map +1 -0
- package/dist/screen-templates/templates/feedback/index.d.ts +10 -0
- package/dist/screen-templates/templates/feedback/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/index.js +10 -0
- package/dist/screen-templates/templates/feedback/index.js.map +1 -0
- package/dist/screen-templates/templates/feedback/loading.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/loading.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/loading.js +77 -0
- package/dist/screen-templates/templates/feedback/loading.js.map +1 -0
- package/dist/screen-templates/templates/feedback/success.d.ts +9 -0
- package/dist/screen-templates/templates/feedback/success.d.ts.map +1 -0
- package/dist/screen-templates/templates/feedback/success.js +99 -0
- package/dist/screen-templates/templates/feedback/success.js.map +1 -0
- package/dist/screen-templates/templates/home/index.d.ts +6 -0
- package/dist/screen-templates/templates/home/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/home/index.js +6 -0
- package/dist/screen-templates/templates/home/index.js.map +1 -0
- package/dist/screen-templates/templates/home/landing.d.ts +24 -0
- package/dist/screen-templates/templates/home/landing.d.ts.map +1 -0
- package/dist/screen-templates/templates/home/landing.js +197 -0
- package/dist/screen-templates/templates/home/landing.js.map +1 -0
- package/dist/screen-templates/templates/settings/index.d.ts +6 -0
- package/dist/screen-templates/templates/settings/index.d.ts.map +1 -0
- package/dist/screen-templates/templates/settings/index.js +6 -0
- package/dist/screen-templates/templates/settings/index.js.map +1 -0
- package/dist/screen-templates/templates/settings/preferences.d.ts +24 -0
- package/dist/screen-templates/templates/settings/preferences.d.ts.map +1 -0
- package/dist/screen-templates/templates/settings/preferences.js +265 -0
- package/dist/screen-templates/templates/settings/preferences.js.map +1 -0
- package/dist/screen-templates/types.d.ts +229 -0
- package/dist/screen-templates/types.d.ts.map +1 -0
- package/dist/screen-templates/types.js +7 -0
- package/dist/screen-templates/types.js.map +1 -0
- package/dist/theme-v2.d.ts +228 -0
- package/dist/theme-v2.d.ts.map +1 -0
- package/dist/theme-v2.js +158 -0
- package/dist/theme-v2.js.map +1 -0
- package/dist/theme.d.ts +60 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +76 -0
- package/dist/theme.js.map +1 -0
- package/dist/token-resolver.d.ts +69 -0
- package/dist/token-resolver.d.ts.map +1 -0
- package/dist/token-resolver.js +122 -0
- package/dist/token-resolver.js.map +1 -0
- package/dist/token-validation.d.ts +432 -0
- package/dist/token-validation.d.ts.map +1 -0
- package/dist/token-validation.js +140 -0
- package/dist/token-validation.js.map +1 -0
- package/dist/tokens.d.ts +158 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +10 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +77 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tekton-ui/core - SafeArea Utilities
|
|
3
|
+
* SafeArea calculation and application utilities for mobile platforms
|
|
4
|
+
* [SPEC-LAYOUT-004] [MILESTONE-3]
|
|
5
|
+
*/
|
|
6
|
+
import { SAFE_AREA_DEFAULTS } from './types.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Device Detection
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Detect device type for SafeArea defaults
|
|
12
|
+
*
|
|
13
|
+
* Uses screen dimensions and platform APIs to determine device classification.
|
|
14
|
+
* Detection strategy:
|
|
15
|
+
* - iOS: Checks screen dimensions and model via window.navigator
|
|
16
|
+
* - Android: Checks navigation mode via WindowInsets API
|
|
17
|
+
* - Web: Returns 'unknown'
|
|
18
|
+
*
|
|
19
|
+
* @returns DeviceType enum value
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const device = detectDeviceType();
|
|
24
|
+
* if (device === 'ios-dynamic-island') {
|
|
25
|
+
* console.log('Using 59pt top safe area');
|
|
26
|
+
* }
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export function detectDeviceType() {
|
|
30
|
+
// Web environment - no safe area needed
|
|
31
|
+
if (typeof window === 'undefined') {
|
|
32
|
+
return 'unknown';
|
|
33
|
+
}
|
|
34
|
+
// Check platform
|
|
35
|
+
const platform = getPlatform();
|
|
36
|
+
if (platform === 'ios') {
|
|
37
|
+
return detectiOSDeviceType();
|
|
38
|
+
}
|
|
39
|
+
else if (platform === 'android') {
|
|
40
|
+
return detectAndroidDeviceType();
|
|
41
|
+
}
|
|
42
|
+
// Default to unknown for web and other platforms
|
|
43
|
+
return 'unknown';
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Get current platform
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
function getPlatform() {
|
|
50
|
+
if (typeof navigator === 'undefined') {
|
|
51
|
+
return 'web';
|
|
52
|
+
}
|
|
53
|
+
const userAgent = navigator.userAgent || navigator.vendor;
|
|
54
|
+
if (/iPad|iPhone|iPod/.test(userAgent)) {
|
|
55
|
+
return 'ios';
|
|
56
|
+
}
|
|
57
|
+
else if (/android/i.test(userAgent)) {
|
|
58
|
+
return 'android';
|
|
59
|
+
}
|
|
60
|
+
return 'web';
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Detect iOS device type based on screen dimensions
|
|
64
|
+
* @internal
|
|
65
|
+
*/
|
|
66
|
+
function detectiOSDeviceType() {
|
|
67
|
+
if (typeof window === 'undefined') {
|
|
68
|
+
return 'ios-standard';
|
|
69
|
+
}
|
|
70
|
+
const width = window.screen.width;
|
|
71
|
+
const height = window.screen.height;
|
|
72
|
+
// iPhone 14 Pro / 15 Pro / 16 Pro dimensions (Dynamic Island)
|
|
73
|
+
// 393×852 @3x = 1179×2556
|
|
74
|
+
const dynamicIslandModels = [
|
|
75
|
+
{ width: 393, height: 852 }, // iPhone 14 Pro, 15 Pro
|
|
76
|
+
{ width: 430, height: 932 }, // iPhone 14 Pro Max, 15 Pro Max, 16 Pro Max
|
|
77
|
+
];
|
|
78
|
+
for (const model of dynamicIslandModels) {
|
|
79
|
+
if ((width === model.width && height === model.height) ||
|
|
80
|
+
(width === model.height && height === model.width)) {
|
|
81
|
+
return 'ios-dynamic-island';
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// iPhone with notch (X, XS, XR, 11, 12, 13 series)
|
|
85
|
+
// 375×812, 390×844, 414×896, 428×926
|
|
86
|
+
const notchModels = [
|
|
87
|
+
{ width: 375, height: 812 }, // iPhone X, XS, 11 Pro, 12 mini, 13 mini
|
|
88
|
+
{ width: 390, height: 844 }, // iPhone 12, 12 Pro, 13, 13 Pro, 14
|
|
89
|
+
{ width: 414, height: 896 }, // iPhone XR, 11, 11 Pro Max, XS Max
|
|
90
|
+
{ width: 428, height: 926 }, // iPhone 12 Pro Max, 13 Pro Max, 14 Plus
|
|
91
|
+
];
|
|
92
|
+
for (const model of notchModels) {
|
|
93
|
+
if ((width === model.width && height === model.height) ||
|
|
94
|
+
(width === model.height && height === model.width)) {
|
|
95
|
+
return 'ios-notch';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Standard iOS devices (SE, 8, 7, 6s) - no notch or Dynamic Island
|
|
99
|
+
return 'ios-standard';
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Detect Android device navigation type
|
|
103
|
+
* @internal
|
|
104
|
+
*/
|
|
105
|
+
function detectAndroidDeviceType() {
|
|
106
|
+
// In React Native, this would check WindowInsets
|
|
107
|
+
// For web, we default to gesture navigation (more common on modern devices)
|
|
108
|
+
if (typeof window === 'undefined') {
|
|
109
|
+
return 'android-gesture';
|
|
110
|
+
}
|
|
111
|
+
// Check if running in React Native environment
|
|
112
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
113
|
+
const isReactNative = typeof window.ReactNativeWebView !== 'undefined';
|
|
114
|
+
if (isReactNative) {
|
|
115
|
+
// In React Native, we could check navigation bar height from WindowInsets
|
|
116
|
+
// For now, default to gesture navigation (24dp)
|
|
117
|
+
return 'android-gesture';
|
|
118
|
+
}
|
|
119
|
+
// Web Android defaults to gesture navigation
|
|
120
|
+
return 'android-gesture';
|
|
121
|
+
}
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// Safe Area Calculation
|
|
124
|
+
// ============================================================================
|
|
125
|
+
/**
|
|
126
|
+
* Get safe area top inset based on device type
|
|
127
|
+
*
|
|
128
|
+
* @returns Top inset in points
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```typescript
|
|
132
|
+
* const topInset = getSafeAreaTop();
|
|
133
|
+
* // Returns 59 on iPhone 14 Pro (Dynamic Island)
|
|
134
|
+
* // Returns 44 on iPhone 13 (Notch)
|
|
135
|
+
* // Returns 20 on iPhone SE (Standard)
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export function getSafeAreaTop() {
|
|
139
|
+
const device = detectDeviceType();
|
|
140
|
+
switch (device) {
|
|
141
|
+
case 'ios-dynamic-island':
|
|
142
|
+
return SAFE_AREA_DEFAULTS.DYNAMIC_ISLAND;
|
|
143
|
+
case 'ios-notch':
|
|
144
|
+
return SAFE_AREA_DEFAULTS.NOTCH;
|
|
145
|
+
case 'ios-standard':
|
|
146
|
+
return SAFE_AREA_DEFAULTS.STATUS_BAR;
|
|
147
|
+
default:
|
|
148
|
+
return 0;
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get safe area bottom inset based on device type
|
|
153
|
+
*
|
|
154
|
+
* @returns Bottom inset in points
|
|
155
|
+
*
|
|
156
|
+
* @example
|
|
157
|
+
* ```typescript
|
|
158
|
+
* const bottomInset = getSafeAreaBottom();
|
|
159
|
+
* // Returns 34 on iPhone with Face ID (home indicator)
|
|
160
|
+
* // Returns 24 on Android with gesture navigation
|
|
161
|
+
* // Returns 48 on Android with 3-button navigation
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
export function getSafeAreaBottom() {
|
|
165
|
+
const device = detectDeviceType();
|
|
166
|
+
switch (device) {
|
|
167
|
+
case 'ios-dynamic-island':
|
|
168
|
+
case 'ios-notch':
|
|
169
|
+
return SAFE_AREA_DEFAULTS.HOME_INDICATOR;
|
|
170
|
+
case 'android-gesture':
|
|
171
|
+
return 24; // Android gesture navigation bar
|
|
172
|
+
case 'android-button':
|
|
173
|
+
return 48; // Android 3-button navigation
|
|
174
|
+
default:
|
|
175
|
+
return 0;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Get safe area insets for the current device
|
|
180
|
+
*
|
|
181
|
+
* Detection strategy:
|
|
182
|
+
* 1. In browser/web context: Returns zero insets
|
|
183
|
+
* 2. In React Native with react-native-safe-area-context: Uses library
|
|
184
|
+
* 3. Fallback: Uses detectDeviceType() and applies defaults
|
|
185
|
+
*
|
|
186
|
+
* @returns SafeAreaInsets object with top, bottom, left, right values in points
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```typescript
|
|
190
|
+
* const insets = getSafeAreaInsets();
|
|
191
|
+
* console.log(insets.top); // 44 on iPhone 14, 59 on iPhone 14 Pro
|
|
192
|
+
* console.log(insets.bottom); // 34 on Face ID iPhones, 24 on Android gesture
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export function getSafeAreaInsets() {
|
|
196
|
+
// Web environment - no safe area
|
|
197
|
+
if (typeof window === 'undefined') {
|
|
198
|
+
return { top: 0, bottom: 0, left: 0, right: 0 };
|
|
199
|
+
}
|
|
200
|
+
// Check if running in React Native with safe area context
|
|
201
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
202
|
+
const global = window;
|
|
203
|
+
if (global.ReactNativeWebView && global.__SAFE_AREA_INSETS__) {
|
|
204
|
+
// Use provided safe area insets from React Native
|
|
205
|
+
return global.__SAFE_AREA_INSETS__;
|
|
206
|
+
}
|
|
207
|
+
// Fallback to device type detection
|
|
208
|
+
const top = getSafeAreaTop();
|
|
209
|
+
const bottom = getSafeAreaBottom();
|
|
210
|
+
return {
|
|
211
|
+
top,
|
|
212
|
+
bottom,
|
|
213
|
+
left: 0, // Horizontal insets typically handled in landscape
|
|
214
|
+
right: 0,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
// ============================================================================
|
|
218
|
+
// Safe Area Application
|
|
219
|
+
// ============================================================================
|
|
220
|
+
/**
|
|
221
|
+
* Apply safe area configuration to a layout
|
|
222
|
+
*
|
|
223
|
+
* Modifies layout padding based on safe area configuration and edges.
|
|
224
|
+
* Respects the edges configuration to determine which sides receive safe area padding.
|
|
225
|
+
*
|
|
226
|
+
* @param layout - Layout object to modify (must have padding property)
|
|
227
|
+
* @param config - SafeArea configuration from ShellToken
|
|
228
|
+
* @returns Modified layout with safe area applied
|
|
229
|
+
*
|
|
230
|
+
* @example
|
|
231
|
+
* ```typescript
|
|
232
|
+
* const layout = { padding: { top: 0, bottom: 0, left: 0, right: 0 } };
|
|
233
|
+
* const safeLayout = applySafeAreaToLayout(layout, shellConfig.safeArea);
|
|
234
|
+
* // Result: { padding: { top: 44, bottom: 34, left: 0, right: 0 } }
|
|
235
|
+
* ```
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
* ```typescript
|
|
239
|
+
* // Only apply safe area to top edge
|
|
240
|
+
* const config = {
|
|
241
|
+
* edges: { top: true, bottom: false, horizontal: false },
|
|
242
|
+
* // ... other config
|
|
243
|
+
* };
|
|
244
|
+
* const layout = applySafeAreaToLayout(baseLayout, config);
|
|
245
|
+
* // Result: Only top padding is modified
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
export function applySafeAreaToLayout(layout, config) {
|
|
249
|
+
// Get current safe area insets
|
|
250
|
+
const insets = getSafeAreaInsets();
|
|
251
|
+
// Initialize padding if not present
|
|
252
|
+
if (!layout.padding) {
|
|
253
|
+
layout.padding = { top: 0, bottom: 0, left: 0, right: 0 };
|
|
254
|
+
}
|
|
255
|
+
// Ensure all padding properties exist
|
|
256
|
+
const padding = layout.padding;
|
|
257
|
+
if (padding.top === undefined) {
|
|
258
|
+
padding.top = 0;
|
|
259
|
+
}
|
|
260
|
+
if (padding.bottom === undefined) {
|
|
261
|
+
padding.bottom = 0;
|
|
262
|
+
}
|
|
263
|
+
if (padding.left === undefined) {
|
|
264
|
+
padding.left = 0;
|
|
265
|
+
}
|
|
266
|
+
if (padding.right === undefined) {
|
|
267
|
+
padding.right = 0;
|
|
268
|
+
}
|
|
269
|
+
// Apply safe area based on edges configuration
|
|
270
|
+
if (config.edges.top) {
|
|
271
|
+
padding.top += insets.top;
|
|
272
|
+
}
|
|
273
|
+
if (config.edges.bottom) {
|
|
274
|
+
padding.bottom += insets.bottom;
|
|
275
|
+
}
|
|
276
|
+
if (config.edges.horizontal) {
|
|
277
|
+
padding.left += insets.left;
|
|
278
|
+
padding.right += insets.right;
|
|
279
|
+
}
|
|
280
|
+
return layout;
|
|
281
|
+
}
|
|
282
|
+
// ============================================================================
|
|
283
|
+
// React Native Hook (Placeholder)
|
|
284
|
+
// ============================================================================
|
|
285
|
+
/**
|
|
286
|
+
* React Native hook to get safe area insets
|
|
287
|
+
*
|
|
288
|
+
* This is a placeholder implementation that wraps getSafeAreaInsets().
|
|
289
|
+
* In a real React Native environment, this should use the
|
|
290
|
+
* react-native-safe-area-context library's useSafeAreaInsets() hook.
|
|
291
|
+
*
|
|
292
|
+
* @returns SafeAreaInsets from react-native-safe-area-context or fallback
|
|
293
|
+
*
|
|
294
|
+
* @example
|
|
295
|
+
* ```typescript
|
|
296
|
+
* function MyComponent() {
|
|
297
|
+
* const insets = useSafeArea();
|
|
298
|
+
* return <View style={{ paddingTop: insets.top }} />;
|
|
299
|
+
* }
|
|
300
|
+
* ```
|
|
301
|
+
*
|
|
302
|
+
* @see https://github.com/th3rdwave/react-native-safe-area-context
|
|
303
|
+
*
|
|
304
|
+
* @remarks
|
|
305
|
+
* For production use, replace this with:
|
|
306
|
+
* ```typescript
|
|
307
|
+
* import { useSafeAreaInsets } from 'react-native-safe-area-context';
|
|
308
|
+
* export const useSafeArea = useSafeAreaInsets;
|
|
309
|
+
* ```
|
|
310
|
+
*/
|
|
311
|
+
export function useSafeArea() {
|
|
312
|
+
// Placeholder implementation - returns static insets
|
|
313
|
+
// In a real React environment, this would use React hooks
|
|
314
|
+
return getSafeAreaInsets();
|
|
315
|
+
}
|
|
316
|
+
//# sourceMappingURL=safe-area.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe-area.js","sourceRoot":"","sources":["../../src/layout-tokens/safe-area.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @tekton-ui/core - Advanced Section Pattern Token Definitions
|
|
3
|
+
* HIGH Priority Advanced Layout Patterns for SPEC-LAYOUT-005
|
|
4
|
+
*
|
|
5
|
+
* Implements 4 advanced section patterns:
|
|
6
|
+
* 1. section.masonry - Pinterest-style waterfall grid
|
|
7
|
+
* 2. section.sticky-header - Header that sticks to viewport top
|
|
8
|
+
* 3. section.sticky-footer - Footer that sticks to viewport bottom
|
|
9
|
+
* 4. section.collapsible-sidebar - Sidebar with expand/collapse toggle
|
|
10
|
+
*
|
|
11
|
+
* [SPEC-LAYOUT-005] [PHASE-1]
|
|
12
|
+
*/
|
|
13
|
+
import type { AdvancedSectionPatternToken, MasonrySectionCSS, StickySectionCSS, CollapsibleSectionCSS, SectionPatternToken } from './types.js';
|
|
14
|
+
/**
|
|
15
|
+
* Pinterest-style waterfall grid layout using CSS columns
|
|
16
|
+
*
|
|
17
|
+
* Uses CSS multi-column layout for broad browser support (IE10+).
|
|
18
|
+
* Items flow vertically within columns, creating the classic masonry effect.
|
|
19
|
+
*
|
|
20
|
+
* Responsive behavior:
|
|
21
|
+
* - default (mobile): 2 columns
|
|
22
|
+
* - sm: 2 columns
|
|
23
|
+
* - md: 3 columns
|
|
24
|
+
* - lg: 4 columns
|
|
25
|
+
* - xl: 5 columns
|
|
26
|
+
* - 2xl: 6 columns
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```tsx
|
|
30
|
+
* // React usage
|
|
31
|
+
* <div style={{ ...getMasonryStyles(breakpoint) }}>
|
|
32
|
+
* {items.map(item => (
|
|
33
|
+
* <div key={item.id} style={{ breakInside: 'avoid' }}>
|
|
34
|
+
* {item.content}
|
|
35
|
+
* </div>
|
|
36
|
+
* ))}
|
|
37
|
+
* </div>
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
export declare const SECTION_MASONRY: AdvancedSectionPatternToken;
|
|
41
|
+
/**
|
|
42
|
+
* Header that sticks to the viewport top during scroll
|
|
43
|
+
*
|
|
44
|
+
* Uses CSS `position: sticky` for native scroll-aware behavior.
|
|
45
|
+
* Includes shadow and z-index for proper layering when stuck.
|
|
46
|
+
*
|
|
47
|
+
* Features:
|
|
48
|
+
* - Sticks to top of viewport (top: 0)
|
|
49
|
+
* - High z-index (100) to stay above content
|
|
50
|
+
* - Optional shadow when stuck for visual separation
|
|
51
|
+
* - Full-width with transparent background option
|
|
52
|
+
*
|
|
53
|
+
* Responsive behavior:
|
|
54
|
+
* - Consistent sticky behavior across all breakpoints
|
|
55
|
+
* - Padding adjusts for different screen sizes
|
|
56
|
+
*
|
|
57
|
+
* @example
|
|
58
|
+
* ```tsx
|
|
59
|
+
* // React usage with intersection observer for stuck state
|
|
60
|
+
* const [isStuck, setIsStuck] = useState(false);
|
|
61
|
+
*
|
|
62
|
+
* <header style={{
|
|
63
|
+
* position: 'sticky',
|
|
64
|
+
* top: 0,
|
|
65
|
+
* zIndex: 100,
|
|
66
|
+
* boxShadow: isStuck ? 'var(--shadow-md)' : 'none'
|
|
67
|
+
* }}>
|
|
68
|
+
* {children}
|
|
69
|
+
* </header>
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export declare const SECTION_STICKY_HEADER: AdvancedSectionPatternToken;
|
|
73
|
+
/**
|
|
74
|
+
* Footer that sticks to the viewport bottom during scroll
|
|
75
|
+
*
|
|
76
|
+
* Uses CSS `position: sticky` with `bottom: 0` for bottom-stuck behavior.
|
|
77
|
+
* Ideal for action bars, navigation bars, or persistent CTAs.
|
|
78
|
+
*
|
|
79
|
+
* Features:
|
|
80
|
+
* - Sticks to bottom of viewport (bottom: 0)
|
|
81
|
+
* - High z-index (100) to stay above content
|
|
82
|
+
* - Top shadow for visual separation from content
|
|
83
|
+
* - Safe area padding support for mobile devices
|
|
84
|
+
*
|
|
85
|
+
* Responsive behavior:
|
|
86
|
+
* - Consistent sticky behavior across all breakpoints
|
|
87
|
+
* - Padding adjusts for different screen sizes
|
|
88
|
+
* - Mobile: considers safe area for home indicator
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```tsx
|
|
92
|
+
* // React usage for action bar
|
|
93
|
+
* <footer style={{
|
|
94
|
+
* position: 'sticky',
|
|
95
|
+
* bottom: 0,
|
|
96
|
+
* zIndex: 100,
|
|
97
|
+
* paddingBottom: 'env(safe-area-inset-bottom)'
|
|
98
|
+
* }}>
|
|
99
|
+
* <Button>Save</Button>
|
|
100
|
+
* <Button>Cancel</Button>
|
|
101
|
+
* </footer>
|
|
102
|
+
* ```
|
|
103
|
+
*/
|
|
104
|
+
export declare const SECTION_STICKY_FOOTER: AdvancedSectionPatternToken;
|
|
105
|
+
/**
|
|
106
|
+
* Sidebar with expand/collapse toggle capability
|
|
107
|
+
*
|
|
108
|
+
* Provides a collapsible navigation sidebar with smooth CSS transitions.
|
|
109
|
+
* Supports both icon-only collapsed state and full-width expanded state.
|
|
110
|
+
*
|
|
111
|
+
* Features:
|
|
112
|
+
* - Expanded width: 256px (atomic.spacing.64)
|
|
113
|
+
* - Collapsed width: 64px (atomic.spacing.16)
|
|
114
|
+
* - Smooth 200ms transition animation
|
|
115
|
+
* - Icon-only mode when collapsed
|
|
116
|
+
* - Full content when expanded
|
|
117
|
+
*
|
|
118
|
+
* Responsive behavior:
|
|
119
|
+
* - default/sm: Hidden by default (overlay mode recommended)
|
|
120
|
+
* - md: Collapsed by default
|
|
121
|
+
* - lg+: Expanded by default
|
|
122
|
+
*
|
|
123
|
+
* @example
|
|
124
|
+
* ```tsx
|
|
125
|
+
* // React usage with state management
|
|
126
|
+
* const [isCollapsed, setIsCollapsed] = useState(false);
|
|
127
|
+
*
|
|
128
|
+
* <aside style={{
|
|
129
|
+
* width: isCollapsed ? '64px' : '256px',
|
|
130
|
+
* transition: 'width 200ms ease-in-out',
|
|
131
|
+
* overflow: 'hidden'
|
|
132
|
+
* }}>
|
|
133
|
+
* <button onClick={() => setIsCollapsed(!isCollapsed)}>
|
|
134
|
+
* {isCollapsed ? <ChevronRight /> : <ChevronLeft />}
|
|
135
|
+
* </button>
|
|
136
|
+
* <nav>
|
|
137
|
+
* {menuItems.map(item => (
|
|
138
|
+
* <MenuItem
|
|
139
|
+
* key={item.id}
|
|
140
|
+
* icon={item.icon}
|
|
141
|
+
* label={isCollapsed ? '' : item.label}
|
|
142
|
+
* />
|
|
143
|
+
* ))}
|
|
144
|
+
* </nav>
|
|
145
|
+
* </aside>
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export declare const SECTION_COLLAPSIBLE_SIDEBAR: AdvancedSectionPatternToken;
|
|
149
|
+
/**
|
|
150
|
+
* Get an advanced section pattern token by its ID
|
|
151
|
+
*
|
|
152
|
+
* @param patternId - Advanced section pattern token ID (e.g., "section.masonry")
|
|
153
|
+
* @returns AdvancedSectionPatternToken if found, undefined otherwise
|
|
154
|
+
*
|
|
155
|
+
* @example
|
|
156
|
+
* ```typescript
|
|
157
|
+
* const masonry = getAdvancedSectionPatternToken('section.masonry');
|
|
158
|
+
* if (masonry) {
|
|
159
|
+
* console.log(masonry.description);
|
|
160
|
+
* // "Pinterest-style waterfall grid using CSS columns for broad browser support"
|
|
161
|
+
* }
|
|
162
|
+
* ```
|
|
163
|
+
*/
|
|
164
|
+
export declare function getAdvancedSectionPatternToken(patternId: string): AdvancedSectionPatternToken | undefined;
|
|
165
|
+
/**
|
|
166
|
+
* Get all available advanced section pattern tokens
|
|
167
|
+
*
|
|
168
|
+
* @returns Array of all AdvancedSectionPatternTokens
|
|
169
|
+
*
|
|
170
|
+
* @example
|
|
171
|
+
* ```typescript
|
|
172
|
+
* const allAdvanced = getAllAdvancedSectionPatternTokens();
|
|
173
|
+
* console.log(`Available advanced sections: ${allAdvanced.length}`);
|
|
174
|
+
* // "Available advanced sections: 4"
|
|
175
|
+
*
|
|
176
|
+
* allAdvanced.forEach(token => {
|
|
177
|
+
* console.log(`${token.id}: ${token.type}`);
|
|
178
|
+
* });
|
|
179
|
+
* ```
|
|
180
|
+
*/
|
|
181
|
+
export declare function getAllAdvancedSectionPatternTokens(): AdvancedSectionPatternToken[];
|
|
182
|
+
/**
|
|
183
|
+
* Get advanced section pattern tokens filtered by type
|
|
184
|
+
*
|
|
185
|
+
* @param type - Section type ('masonry', 'sticky', or 'collapsible')
|
|
186
|
+
* @returns Array of AdvancedSectionPatternTokens with the specified type
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```typescript
|
|
190
|
+
* const stickyTokens = getAdvancedSectionsByType('sticky');
|
|
191
|
+
* console.log(`Sticky sections: ${stickyTokens.length}`);
|
|
192
|
+
* // "Sticky sections: 2" (header and footer)
|
|
193
|
+
* ```
|
|
194
|
+
*/
|
|
195
|
+
export declare function getAdvancedSectionsByType(type: 'masonry' | 'sticky' | 'collapsible'): AdvancedSectionPatternToken[];
|
|
196
|
+
/**
|
|
197
|
+
* Get CSS properties for an advanced section pattern at a specific breakpoint
|
|
198
|
+
*
|
|
199
|
+
* @param patternId - Advanced section pattern token ID
|
|
200
|
+
* @param breakpoint - Breakpoint key ('default', 'sm', 'md', 'lg', 'xl', '2xl')
|
|
201
|
+
* @returns CSS properties for the specified breakpoint, or undefined if not found
|
|
202
|
+
*
|
|
203
|
+
* @example
|
|
204
|
+
* ```typescript
|
|
205
|
+
* const masonryMd = getAdvancedSectionCSS('section.masonry', 'md');
|
|
206
|
+
* if (masonryMd) {
|
|
207
|
+
* console.log(`Columns at md: ${masonryMd.columnCount}`);
|
|
208
|
+
* // "Columns at md: 3"
|
|
209
|
+
* }
|
|
210
|
+
* ```
|
|
211
|
+
*/
|
|
212
|
+
export declare function getAdvancedSectionCSS(patternId: string, breakpoint?: 'default' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'): (MasonrySectionCSS | StickySectionCSS | CollapsibleSectionCSS) | undefined;
|
|
213
|
+
/**
|
|
214
|
+
* Get state-specific CSS for collapsible or sticky patterns
|
|
215
|
+
*
|
|
216
|
+
* @param patternId - Advanced section pattern token ID
|
|
217
|
+
* @param state - State name ('default', 'collapsed', 'stuck')
|
|
218
|
+
* @returns CSS properties for the specified state, or undefined if not found
|
|
219
|
+
*
|
|
220
|
+
* @example
|
|
221
|
+
* ```typescript
|
|
222
|
+
* const collapsedCSS = getAdvancedSectionStateCSS('section.collapsible-sidebar', 'collapsed');
|
|
223
|
+
* if (collapsedCSS) {
|
|
224
|
+
* console.log(`Collapsed width: ${collapsedCSS.width}`);
|
|
225
|
+
* // "Collapsed width: atomic.spacing.16"
|
|
226
|
+
* }
|
|
227
|
+
*
|
|
228
|
+
* const stuckCSS = getAdvancedSectionStateCSS('section.sticky-header', 'stuck');
|
|
229
|
+
* if (stuckCSS) {
|
|
230
|
+
* console.log(`Shadow when stuck: ${stuckCSS.boxShadow}`);
|
|
231
|
+
* // "Shadow when stuck: atomic.shadow.md"
|
|
232
|
+
* }
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
export declare function getAdvancedSectionStateCSS(patternId: string, state: 'default' | 'collapsed' | 'stuck'): Partial<MasonrySectionCSS | StickySectionCSS | CollapsibleSectionCSS> | undefined;
|
|
236
|
+
/**
|
|
237
|
+
* Check if a pattern ID is an advanced section pattern
|
|
238
|
+
*
|
|
239
|
+
* @param patternId - Pattern ID to check
|
|
240
|
+
* @returns true if the pattern is an advanced section pattern
|
|
241
|
+
*
|
|
242
|
+
* @example
|
|
243
|
+
* ```typescript
|
|
244
|
+
* isAdvancedSectionPattern('section.masonry'); // true
|
|
245
|
+
* isAdvancedSectionPattern('section.grid-3'); // false
|
|
246
|
+
* ```
|
|
247
|
+
*/
|
|
248
|
+
export declare function isAdvancedSectionPattern(patternId: string): boolean;
|
|
249
|
+
/**
|
|
250
|
+
* Get all advanced section pattern IDs
|
|
251
|
+
*
|
|
252
|
+
* @returns Array of all advanced section pattern IDs
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* const ids = getAdvancedSectionPatternIds();
|
|
257
|
+
* // ['section.masonry', 'section.sticky-header', 'section.sticky-footer', 'section.collapsible-sidebar']
|
|
258
|
+
* ```
|
|
259
|
+
*/
|
|
260
|
+
export declare function getAdvancedSectionPatternIds(): string[];
|
|
261
|
+
/**
|
|
262
|
+
* Combine base section patterns with advanced section patterns
|
|
263
|
+
* Useful for getting a complete list of all available section patterns
|
|
264
|
+
*
|
|
265
|
+
* @param baseSections - Array of base SectionPatternTokens from sections.ts
|
|
266
|
+
* @returns Combined array of all section pattern tokens
|
|
267
|
+
*
|
|
268
|
+
* @example
|
|
269
|
+
* ```typescript
|
|
270
|
+
* import { getAllSectionPatternTokens } from './sections.js';
|
|
271
|
+
*
|
|
272
|
+
* const allSections = combineWithBaseSections(getAllSectionPatternTokens());
|
|
273
|
+
* console.log(`Total sections: ${allSections.length}`);
|
|
274
|
+
* ```
|
|
275
|
+
*/
|
|
276
|
+
export declare function combineWithBaseSections(baseSections: SectionPatternToken[]): (SectionPatternToken | AdvancedSectionPatternToken)[];
|
|
277
|
+
//# sourceMappingURL=sections-advanced.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sections-advanced.d.ts","sourceRoot":"","sources":["../../src/layout-tokens/sections-advanced.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EACV,2BAA2B,EAC3B,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAOpB;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,eAAe,EAAE,2BAgD7B,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,qBAAqB,EAAE,2BA+DnC,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,eAAO,MAAM,qBAAqB,EAAE,2BAqEnC,CAAC;AAMF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AACH,eAAO,MAAM,2BAA2B,EAAE,2BAyEzC,CAAC;AAqBF;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,8BAA8B,CAC5C,SAAS,EAAE,MAAM,GAChB,2BAA2B,GAAG,SAAS,CAEzC;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kCAAkC,IAAI,2BAA2B,EAAE,CAElF;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,SAAS,GAAG,QAAQ,GAAG,aAAa,GACzC,2BAA2B,EAAE,CAE/B;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,MAAM,EACjB,UAAU,GAAE,SAAS,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAiB,GACpE,CAAC,iBAAiB,GAAG,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,SAAS,CAsB5E;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,0BAA0B,CACxC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,SAAS,GAAG,WAAW,GAAG,OAAO,GACvC,OAAO,CAAC,iBAAiB,GAAG,gBAAgB,GAAG,qBAAqB,CAAC,GAAG,SAAS,CAOnF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,wBAAwB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAEnE;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,4BAA4B,IAAI,MAAM,EAAE,CAEvD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,uBAAuB,CACrC,YAAY,EAAE,mBAAmB,EAAE,GAClC,CAAC,mBAAmB,GAAG,2BAA2B,CAAC,EAAE,CAEvD"}
|