@flyingrobots/bijou-tui 2.1.0 → 3.0.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 +64 -21
- package/dist/animate.d.ts +0 -2
- package/dist/animate.d.ts.map +1 -1
- package/dist/animate.js +17 -26
- package/dist/animate.js.map +1 -1
- package/dist/app-frame-actions.d.ts.map +1 -1
- package/dist/app-frame-actions.js +2 -2
- package/dist/app-frame-actions.js.map +1 -1
- package/dist/app-frame-render.d.ts +2 -0
- package/dist/app-frame-render.d.ts.map +1 -1
- package/dist/app-frame-render.js +49 -7
- package/dist/app-frame-render.js.map +1 -1
- package/dist/app-frame-types.js +4 -4
- package/dist/app-frame-types.js.map +1 -1
- package/dist/app-frame.d.ts +3 -1
- package/dist/app-frame.d.ts.map +1 -1
- package/dist/app-frame.js +61 -13
- package/dist/app-frame.js.map +1 -1
- package/dist/canvas.d.ts +37 -25
- package/dist/canvas.d.ts.map +1 -1
- package/dist/canvas.js +116 -30
- package/dist/canvas.js.map +1 -1
- package/dist/commands.js +2 -2
- package/dist/commands.js.map +1 -1
- package/dist/css/install.d.ts +4 -0
- package/dist/css/install.d.ts.map +1 -0
- package/dist/css/install.js +24 -0
- package/dist/css/install.js.map +1 -0
- package/dist/css/parser.d.ts +14 -0
- package/dist/css/parser.d.ts.map +1 -0
- package/dist/css/parser.js +92 -0
- package/dist/css/parser.js.map +1 -0
- package/dist/css/resolver.d.ts +36 -0
- package/dist/css/resolver.d.ts.map +1 -0
- package/dist/css/resolver.js +130 -0
- package/dist/css/resolver.js.map +1 -0
- package/dist/css/text-style.d.ts +17 -0
- package/dist/css/text-style.d.ts.map +1 -0
- package/dist/css/text-style.js +59 -0
- package/dist/css/text-style.js.map +1 -0
- package/dist/css/types.d.ts +27 -0
- package/dist/css/types.d.ts.map +1 -0
- package/dist/css/types.js +5 -0
- package/dist/css/types.js.map +1 -0
- package/dist/driver.d.ts +10 -2
- package/dist/driver.d.ts.map +1 -1
- package/dist/driver.js +25 -2
- package/dist/driver.js.map +1 -1
- package/dist/eventbus.d.ts +37 -3
- package/dist/eventbus.d.ts.map +1 -1
- package/dist/eventbus.js +91 -4
- package/dist/eventbus.js.map +1 -1
- package/dist/focus-area.d.ts +4 -0
- package/dist/focus-area.d.ts.map +1 -1
- package/dist/focus-area.js +11 -1
- package/dist/focus-area.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/layout-v3.d.ts +10 -0
- package/dist/layout-v3.d.ts.map +1 -0
- package/dist/layout-v3.js +35 -0
- package/dist/layout-v3.js.map +1 -0
- package/dist/motion/motion.d.ts +14 -0
- package/dist/motion/motion.d.ts.map +1 -0
- package/dist/motion/motion.js +31 -0
- package/dist/motion/motion.js.map +1 -0
- package/dist/motion/reconciler.d.ts +15 -0
- package/dist/motion/reconciler.d.ts.map +1 -0
- package/dist/motion/reconciler.js +109 -0
- package/dist/motion/reconciler.js.map +1 -0
- package/dist/motion/types.d.ts +52 -0
- package/dist/motion/types.d.ts.map +1 -0
- package/dist/motion/types.js +2 -0
- package/dist/motion/types.js.map +1 -0
- package/dist/pipeline/middleware/css.d.ts +20 -0
- package/dist/pipeline/middleware/css.d.ts.map +1 -0
- package/dist/pipeline/middleware/css.js +41 -0
- package/dist/pipeline/middleware/css.js.map +1 -0
- package/dist/pipeline/middleware/grayscale.d.ts +9 -0
- package/dist/pipeline/middleware/grayscale.d.ts.map +1 -0
- package/dist/pipeline/middleware/grayscale.js +39 -0
- package/dist/pipeline/middleware/grayscale.js.map +1 -0
- package/dist/pipeline/middleware/motion.d.ts +6 -0
- package/dist/pipeline/middleware/motion.d.ts.map +1 -0
- package/dist/pipeline/middleware/motion.js +19 -0
- package/dist/pipeline/middleware/motion.js.map +1 -0
- package/dist/pipeline/middleware/paint.d.ts +6 -0
- package/dist/pipeline/middleware/paint.d.ts.map +1 -0
- package/dist/pipeline/middleware/paint.js +21 -0
- package/dist/pipeline/middleware/paint.js.map +1 -0
- package/dist/pipeline/pipeline.d.ts +56 -0
- package/dist/pipeline/pipeline.d.ts.map +1 -0
- package/dist/pipeline/pipeline.js +45 -0
- package/dist/pipeline/pipeline.js.map +1 -0
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +153 -8
- package/dist/runtime.js.map +1 -1
- package/dist/screen.d.ts +12 -1
- package/dist/screen.d.ts.map +1 -1
- package/dist/screen.js +14 -1
- package/dist/screen.js.map +1 -1
- package/dist/subapp/mount.d.ts +67 -0
- package/dist/subapp/mount.d.ts.map +1 -0
- package/dist/subapp/mount.js +60 -0
- package/dist/subapp/mount.js.map +1 -0
- package/dist/types.d.ts +45 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -1
- package/dist/view-output.d.ts +15 -0
- package/dist/view-output.d.ts.map +1 -0
- package/dist/view-output.js +53 -0
- package/dist/view-output.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A lightweight, zero-dependency CSS parser for Bijou TUI.
|
|
3
|
+
*
|
|
4
|
+
* Supports a subset of CSS:
|
|
5
|
+
* - Simple selectors: .class, #id, Type
|
|
6
|
+
* - Multiple selectors: .a, .b { ... }
|
|
7
|
+
* - Declarations: property: value;
|
|
8
|
+
* - !important
|
|
9
|
+
* - Basic media queries: @media (width < 80) { ... }
|
|
10
|
+
* - Comments: /* ... * /
|
|
11
|
+
*/
|
|
12
|
+
export function parseBCSS(css) {
|
|
13
|
+
const sheet = { rules: [], mediaQueries: [] };
|
|
14
|
+
// 1. Strip comments
|
|
15
|
+
const cleanCss = css.replace(/\/\*[\s\S]*?\*\//g, '');
|
|
16
|
+
// 2. Tokenize into blocks (rules or media queries)
|
|
17
|
+
// This is a naive split that looks for { } pairs
|
|
18
|
+
let pos = 0;
|
|
19
|
+
while (pos < cleanCss.length) {
|
|
20
|
+
const nextBrace = cleanCss.indexOf('{', pos);
|
|
21
|
+
if (nextBrace === -1)
|
|
22
|
+
break;
|
|
23
|
+
const head = cleanCss.substring(pos, nextBrace).trim();
|
|
24
|
+
// Find matching closing brace
|
|
25
|
+
let depth = 1;
|
|
26
|
+
let end = nextBrace + 1;
|
|
27
|
+
while (depth > 0 && end < cleanCss.length) {
|
|
28
|
+
if (cleanCss[end] === '{')
|
|
29
|
+
depth++;
|
|
30
|
+
else if (cleanCss[end] === '}')
|
|
31
|
+
depth--;
|
|
32
|
+
end++;
|
|
33
|
+
}
|
|
34
|
+
const body = cleanCss.substring(nextBrace + 1, end - 1).trim();
|
|
35
|
+
if (head.startsWith('@media')) {
|
|
36
|
+
const condition = head.replace('@media', '').trim();
|
|
37
|
+
sheet.mediaQueries.push({
|
|
38
|
+
condition,
|
|
39
|
+
rules: parseRules(body),
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
sheet.rules.push(...parseRules(head + ' { ' + body + ' }'));
|
|
44
|
+
}
|
|
45
|
+
pos = end;
|
|
46
|
+
}
|
|
47
|
+
return sheet;
|
|
48
|
+
}
|
|
49
|
+
function parseRules(css) {
|
|
50
|
+
const rules = [];
|
|
51
|
+
// Look for selector { decls }
|
|
52
|
+
const regex = /([^{]+)\{([^}]+)\}/g;
|
|
53
|
+
let match;
|
|
54
|
+
while ((match = regex.exec(css)) !== null) {
|
|
55
|
+
const rawSelectors = match[1].split(',').map(s => s.trim()).filter(Boolean);
|
|
56
|
+
const rawDecls = match[2].split(';').map(d => d.trim()).filter(Boolean);
|
|
57
|
+
const selectors = rawSelectors.map(parseSelector);
|
|
58
|
+
const declarations = rawDecls.map(parseDeclaration);
|
|
59
|
+
rules.push({ selectors, declarations });
|
|
60
|
+
}
|
|
61
|
+
return rules;
|
|
62
|
+
}
|
|
63
|
+
function parseSelector(raw) {
|
|
64
|
+
const selector = { classes: [], raw };
|
|
65
|
+
// Naive parser for .class, #id, Type
|
|
66
|
+
// Note: Doesn't handle combined selectors like "Type.class" perfectly yet,
|
|
67
|
+
// but enough for basic TUI usage.
|
|
68
|
+
const tokens = raw.split(/(?=[.#])/);
|
|
69
|
+
for (const token of tokens) {
|
|
70
|
+
if (token.startsWith('.')) {
|
|
71
|
+
selector.classes.push(token.substring(1));
|
|
72
|
+
}
|
|
73
|
+
else if (token.startsWith('#')) {
|
|
74
|
+
selector.id = token.substring(1);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
selector.type = token.trim();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
return selector;
|
|
81
|
+
}
|
|
82
|
+
function parseDeclaration(raw) {
|
|
83
|
+
const parts = raw.split(':');
|
|
84
|
+
const property = parts[0].trim().toLowerCase();
|
|
85
|
+
let value = parts.slice(1).join(':').trim();
|
|
86
|
+
const important = value.endsWith('!important');
|
|
87
|
+
if (important) {
|
|
88
|
+
value = value.replace('!important', '').trim();
|
|
89
|
+
}
|
|
90
|
+
return { property, value, important };
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/css/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type { BCSSSheet } from './types.js';
|
|
2
|
+
import type { TokenGraph, ThemeMode } from '@flyingrobots/bijou';
|
|
3
|
+
/**
|
|
4
|
+
* Metadata for a component used to match CSS selectors.
|
|
5
|
+
*/
|
|
6
|
+
export interface ComponentIdentity {
|
|
7
|
+
type?: string;
|
|
8
|
+
id?: string;
|
|
9
|
+
classes?: string[];
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Resolved styles for a component.
|
|
13
|
+
*/
|
|
14
|
+
export type ResolvedStyles = Record<string, string>;
|
|
15
|
+
/**
|
|
16
|
+
* Resolves the final styles for a component based on a CSS sheet and terminal dimensions.
|
|
17
|
+
*
|
|
18
|
+
* @param identity - The component's identity (type, id, classes).
|
|
19
|
+
* @param sheet - The parsed BCSS sheet.
|
|
20
|
+
* @param terminal - Current terminal dimensions for media query matching.
|
|
21
|
+
* @param graph - The TokenGraph for resolving var() references.
|
|
22
|
+
* @param mode - The theme mode (light/dark).
|
|
23
|
+
* @returns A record of computed style properties.
|
|
24
|
+
*/
|
|
25
|
+
export declare function resolveStyles(identity: ComponentIdentity, sheet: BCSSSheet, terminal: {
|
|
26
|
+
width: number;
|
|
27
|
+
height: number;
|
|
28
|
+
}, graph?: TokenGraph, mode?: ThemeMode): ResolvedStyles;
|
|
29
|
+
/**
|
|
30
|
+
* Evaluate a basic media query condition like "(width < 80)" or "(height >= 24)".
|
|
31
|
+
*/
|
|
32
|
+
export declare function matchesMediaQuery(condition: string, terminal: {
|
|
33
|
+
width: number;
|
|
34
|
+
height: number;
|
|
35
|
+
}): boolean;
|
|
36
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/css/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAA0B,MAAM,YAAY,CAAC;AACpE,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEjE;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC3C,KAAK,CAAC,EAAE,UAAU,EAClB,IAAI,GAAE,SAAkB,GACvB,cAAc,CA0ChB;AAoED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAmBzG"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the final styles for a component based on a CSS sheet and terminal dimensions.
|
|
3
|
+
*
|
|
4
|
+
* @param identity - The component's identity (type, id, classes).
|
|
5
|
+
* @param sheet - The parsed BCSS sheet.
|
|
6
|
+
* @param terminal - Current terminal dimensions for media query matching.
|
|
7
|
+
* @param graph - The TokenGraph for resolving var() references.
|
|
8
|
+
* @param mode - The theme mode (light/dark).
|
|
9
|
+
* @returns A record of computed style properties.
|
|
10
|
+
*/
|
|
11
|
+
export function resolveStyles(identity, sheet, terminal, graph, mode = 'dark') {
|
|
12
|
+
const matchedRules = [];
|
|
13
|
+
// 1. Collect rules from main sheet
|
|
14
|
+
for (const rule of sheet.rules) {
|
|
15
|
+
const specificity = getMatchSpecificity(identity, rule.selectors);
|
|
16
|
+
if (specificity > 0) {
|
|
17
|
+
matchedRules.push({ rule, specificity });
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// 2. Collect rules from active media queries
|
|
21
|
+
for (const mq of sheet.mediaQueries) {
|
|
22
|
+
if (matchesMediaQuery(mq.condition, terminal)) {
|
|
23
|
+
for (const rule of mq.rules) {
|
|
24
|
+
const specificity = getMatchSpecificity(identity, rule.selectors);
|
|
25
|
+
if (specificity > 0) {
|
|
26
|
+
// Media query rules have slightly higher base priority in CSS
|
|
27
|
+
matchedRules.push({ rule, specificity: specificity + 0.1 });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// 3. Sort by specificity (and then order of appearance)
|
|
33
|
+
matchedRules.sort((a, b) => a.specificity - b.specificity);
|
|
34
|
+
// 4. Merge declarations into final object
|
|
35
|
+
const finalStyles = {};
|
|
36
|
+
for (const { rule } of matchedRules) {
|
|
37
|
+
for (const decl of rule.declarations) {
|
|
38
|
+
// !important handling
|
|
39
|
+
if (decl.important || !isImportant(finalStyles, decl.property)) {
|
|
40
|
+
finalStyles[decl.property] = resolveValue(decl.value, graph, mode);
|
|
41
|
+
if (decl.important) {
|
|
42
|
+
finalStyles[`__important_${decl.property}`] = 'true';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return finalStyles;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Resolve a CSS value, handling var(token.path) references via the TokenGraph.
|
|
51
|
+
*/
|
|
52
|
+
function resolveValue(value, graph, mode = 'dark') {
|
|
53
|
+
if (!graph)
|
|
54
|
+
return value;
|
|
55
|
+
// Simple regex for var(path.to.token)
|
|
56
|
+
const varRegex = /var\(([^)]+)\)/g;
|
|
57
|
+
return value.replace(varRegex, (_, path) => {
|
|
58
|
+
try {
|
|
59
|
+
// Try to get as full token first, then fallback to color
|
|
60
|
+
const resolved = graph.get(path.trim(), mode);
|
|
61
|
+
return resolved.hex;
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
return 'inherit'; // Fallback for unresolved vars
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
function isImportant(styles, property) {
|
|
69
|
+
return styles[`__important_${property}`] === 'true';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Calculate match specificity for a component identity against a set of selectors.
|
|
73
|
+
* Returns 0 if no match, otherwise a positive number representing specificity.
|
|
74
|
+
*/
|
|
75
|
+
function getMatchSpecificity(identity, selectors) {
|
|
76
|
+
let maxSpecificity = 0;
|
|
77
|
+
for (const selector of selectors) {
|
|
78
|
+
let match = true;
|
|
79
|
+
let specificity = 0;
|
|
80
|
+
// Type match
|
|
81
|
+
if (selector.type && selector.type !== '*') {
|
|
82
|
+
if (identity.type !== selector.type)
|
|
83
|
+
match = false;
|
|
84
|
+
specificity += 1;
|
|
85
|
+
}
|
|
86
|
+
// ID match
|
|
87
|
+
if (selector.id) {
|
|
88
|
+
if (identity.id !== selector.id)
|
|
89
|
+
match = false;
|
|
90
|
+
specificity += 100;
|
|
91
|
+
}
|
|
92
|
+
// Class match (all classes in selector must be present on component)
|
|
93
|
+
if (selector.classes.length > 0) {
|
|
94
|
+
for (const cls of selector.classes) {
|
|
95
|
+
if (!identity.classes?.includes(cls)) {
|
|
96
|
+
match = false;
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
specificity += selector.classes.length * 10;
|
|
101
|
+
}
|
|
102
|
+
if (match) {
|
|
103
|
+
maxSpecificity = Math.max(maxSpecificity, specificity);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return maxSpecificity;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Evaluate a basic media query condition like "(width < 80)" or "(height >= 24)".
|
|
110
|
+
*/
|
|
111
|
+
export function matchesMediaQuery(condition, terminal) {
|
|
112
|
+
// Simple regex for (property op value)
|
|
113
|
+
const regex = /\((width|height)\s*(<|>|<=|>=|==|!=)\s*(\d+)\)/;
|
|
114
|
+
const match = condition.match(regex);
|
|
115
|
+
if (!match)
|
|
116
|
+
return false;
|
|
117
|
+
const property = match[1] === 'width' ? terminal.width : terminal.height;
|
|
118
|
+
const op = match[2];
|
|
119
|
+
const value = parseInt(match[3], 10);
|
|
120
|
+
switch (op) {
|
|
121
|
+
case '<': return property < value;
|
|
122
|
+
case '>': return property > value;
|
|
123
|
+
case '<=': return property <= value;
|
|
124
|
+
case '>=': return property >= value;
|
|
125
|
+
case '==': return property === value;
|
|
126
|
+
case '!=': return property !== value;
|
|
127
|
+
default: return false;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/css/resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { BijouContext } from '@flyingrobots/bijou';
|
|
2
|
+
export interface StyledTextToken {
|
|
3
|
+
hex?: string;
|
|
4
|
+
bg?: string;
|
|
5
|
+
modifiers?: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface BCSSIdentity {
|
|
8
|
+
type: string;
|
|
9
|
+
id?: string;
|
|
10
|
+
classes?: string[];
|
|
11
|
+
}
|
|
12
|
+
type BCSSStyles = Record<string, string>;
|
|
13
|
+
export declare function mergeBCSSModifiers(base: readonly string[] | undefined, styles: BCSSStyles): string[] | undefined;
|
|
14
|
+
export declare function resolveBCSSTextToken(ctx: BijouContext, identity: BCSSIdentity, base?: StyledTextToken): StyledTextToken;
|
|
15
|
+
export declare function styleTextWithBCSS(text: string, ctx: BijouContext | undefined, identity: BCSSIdentity, base?: StyledTextToken): string;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=text-style.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-style.d.ts","sourceRoot":"","sources":["../../src/css/text-style.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,eAAe;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEzC,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,EACnC,MAAM,EAAE,UAAU,GACjB,MAAM,EAAE,GAAG,SAAS,CAoCtB;AAED,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,YAAY,EACjB,QAAQ,EAAE,YAAY,EACtB,IAAI,GAAE,eAAoB,GACzB,eAAe,CAOjB;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,YAAY,GAAG,SAAS,EAC7B,QAAQ,EAAE,YAAY,EACtB,IAAI,GAAE,eAAoB,GACzB,MAAM,CAcR"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
export function mergeBCSSModifiers(base, styles) {
|
|
2
|
+
const modifiers = new Set(base ?? []);
|
|
3
|
+
const fontWeight = styles['font-weight']?.trim().toLowerCase();
|
|
4
|
+
if (fontWeight === 'bold' || fontWeight === '700' || fontWeight === '800' || fontWeight === '900') {
|
|
5
|
+
modifiers.add('bold');
|
|
6
|
+
}
|
|
7
|
+
else if (fontWeight === 'normal' || fontWeight === '400') {
|
|
8
|
+
modifiers.delete('bold');
|
|
9
|
+
}
|
|
10
|
+
const fontStyle = styles['font-style']?.trim().toLowerCase();
|
|
11
|
+
if (fontStyle === 'italic') {
|
|
12
|
+
modifiers.add('italic');
|
|
13
|
+
}
|
|
14
|
+
else if (fontStyle === 'normal') {
|
|
15
|
+
modifiers.delete('italic');
|
|
16
|
+
}
|
|
17
|
+
const decoration = styles['text-decoration']?.trim().toLowerCase();
|
|
18
|
+
if (decoration === 'none') {
|
|
19
|
+
modifiers.delete('underline');
|
|
20
|
+
modifiers.delete('curly-underline');
|
|
21
|
+
modifiers.delete('dotted-underline');
|
|
22
|
+
modifiers.delete('dashed-underline');
|
|
23
|
+
modifiers.delete('strikethrough');
|
|
24
|
+
modifiers.delete('strike');
|
|
25
|
+
}
|
|
26
|
+
else if (decoration) {
|
|
27
|
+
if (decoration.includes('underline')) {
|
|
28
|
+
modifiers.add('underline');
|
|
29
|
+
}
|
|
30
|
+
if (decoration.includes('line-through')) {
|
|
31
|
+
modifiers.add('strikethrough');
|
|
32
|
+
modifiers.delete('strike');
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return modifiers.size > 0 ? Array.from(modifiers) : undefined;
|
|
36
|
+
}
|
|
37
|
+
export function resolveBCSSTextToken(ctx, identity, base = {}) {
|
|
38
|
+
const styles = ctx.resolveBCSS(identity);
|
|
39
|
+
return {
|
|
40
|
+
hex: styles['color'] ?? base.hex,
|
|
41
|
+
bg: styles['background'] ?? base.bg,
|
|
42
|
+
modifiers: mergeBCSSModifiers(base.modifiers, styles),
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function styleTextWithBCSS(text, ctx, identity, base = {}) {
|
|
46
|
+
if (!ctx)
|
|
47
|
+
return text;
|
|
48
|
+
const styles = ctx.resolveBCSS(identity);
|
|
49
|
+
const token = {
|
|
50
|
+
hex: styles['color'] ?? base.hex,
|
|
51
|
+
bg: styles['background'] ?? base.bg,
|
|
52
|
+
modifiers: mergeBCSSModifiers(base.modifiers, styles),
|
|
53
|
+
};
|
|
54
|
+
if (token.hex == null && token.bg == null && (token.modifiers == null || token.modifiers.length === 0)) {
|
|
55
|
+
return text;
|
|
56
|
+
}
|
|
57
|
+
return ctx.style.styled(token, text);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=text-style.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-style.js","sourceRoot":"","sources":["../../src/css/text-style.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AST types for Bijou CSS (BCSS).
|
|
3
|
+
*/
|
|
4
|
+
export interface BCSSDeclaration {
|
|
5
|
+
property: string;
|
|
6
|
+
value: string;
|
|
7
|
+
important: boolean;
|
|
8
|
+
}
|
|
9
|
+
export interface BCSSSelector {
|
|
10
|
+
type?: string;
|
|
11
|
+
id?: string;
|
|
12
|
+
classes: string[];
|
|
13
|
+
raw: string;
|
|
14
|
+
}
|
|
15
|
+
export interface BCSSRule {
|
|
16
|
+
selectors: BCSSSelector[];
|
|
17
|
+
declarations: BCSSDeclaration[];
|
|
18
|
+
}
|
|
19
|
+
export interface BCSSMediaQuery {
|
|
20
|
+
condition: string;
|
|
21
|
+
rules: BCSSRule[];
|
|
22
|
+
}
|
|
23
|
+
export interface BCSSSheet {
|
|
24
|
+
rules: BCSSRule[];
|
|
25
|
+
mediaQueries: BCSSMediaQuery[];
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/css/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,QAAQ;IACvB,SAAS,EAAE,YAAY,EAAE,CAAC;IAC1B,YAAY,EAAE,eAAe,EAAE,CAAC;CACjC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,QAAQ,EAAE,CAAC;CACnB;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,YAAY,EAAE,cAAc,EAAE,CAAC;CAChC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/css/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
package/dist/driver.d.ts
CHANGED
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
18
|
import type { App, RunOptions } from './types.js';
|
|
19
|
+
import { type Surface } from '@flyingrobots/bijou';
|
|
19
20
|
/** A single step in a scripted interaction sequence. */
|
|
20
21
|
export type ScriptStep<M = never> = {
|
|
21
22
|
/** Key to send (raw terminal key string, e.g., 'a', '\x1b[A', '\x03'). */
|
|
@@ -30,6 +31,13 @@ export type ScriptStep<M = never> = {
|
|
|
30
31
|
};
|
|
31
32
|
/** Milliseconds to wait before sending this step. Default: 0. */
|
|
32
33
|
delay?: number;
|
|
34
|
+
} | {
|
|
35
|
+
/** Pulse event to emit. */
|
|
36
|
+
pulse: {
|
|
37
|
+
dt: number;
|
|
38
|
+
};
|
|
39
|
+
/** Milliseconds to wait before sending this step. Default: 0. */
|
|
40
|
+
delay?: number;
|
|
33
41
|
} | {
|
|
34
42
|
/** Custom message to emit directly onto the bus. */
|
|
35
43
|
msg: M;
|
|
@@ -39,7 +47,7 @@ export type ScriptStep<M = never> = {
|
|
|
39
47
|
/** Options for {@link runScript}, extending the base {@link RunOptions}. */
|
|
40
48
|
export interface RunScriptOptions extends RunOptions {
|
|
41
49
|
/** Capture each rendered frame. */
|
|
42
|
-
onFrame?: (frame:
|
|
50
|
+
onFrame?: (frame: Surface, index: number) => void;
|
|
43
51
|
}
|
|
44
52
|
/**
|
|
45
53
|
* Result returned by {@link runScript} after all steps have been processed.
|
|
@@ -50,7 +58,7 @@ export interface RunScriptResult<Model> {
|
|
|
50
58
|
/** Final model state after all steps. */
|
|
51
59
|
model: Model;
|
|
52
60
|
/** All rendered frames in order. */
|
|
53
|
-
frames:
|
|
61
|
+
frames: Surface[];
|
|
54
62
|
/** Total elapsed time in milliseconds. */
|
|
55
63
|
elapsed: number;
|
|
56
64
|
}
|
package/dist/driver.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"driver.d.ts","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAa,MAAM,YAAY,CAAC;AAI7D,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAQnD,wDAAwD;AACxD,MAAM,MAAM,UAAU,CAAC,CAAC,GAAG,KAAK,IAC5B;IACA,0EAA0E;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACC;IACA,4BAA4B;IAC5B,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACC;IACA,2BAA2B;IAC3B,KAAK,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACtB,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACC;IACA,oDAAoD;IACpD,GAAG,EAAE,CAAC,CAAC;IACP,iEAAiE;IACjE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEJ,4EAA4E;AAC5E,MAAM,WAAW,gBAAiB,SAAQ,UAAU;IAClD,mCAAmC;IACnC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD;AAED;;;;GAIG;AACH,MAAM,WAAW,eAAe,CAAC,KAAK;IACpC,yCAAyC;IACzC,KAAK,EAAE,KAAK,CAAC;IACb,oCAAoC;IACpC,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,CAAC,EACtC,GAAG,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,EAClB,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,EACtB,OAAO,CAAC,EAAE,gBAAgB,GACzB,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CA2GjC"}
|
package/dist/driver.js
CHANGED
|
@@ -15,8 +15,11 @@
|
|
|
15
15
|
* console.log(result.frames); // all rendered frames
|
|
16
16
|
* ```
|
|
17
17
|
*/
|
|
18
|
+
import { isResizeMsg } from './types.js';
|
|
18
19
|
import { createEventBus } from './eventbus.js';
|
|
19
20
|
import { parseKey } from './keys.js';
|
|
21
|
+
import { installBCSSResolver } from './css/install.js';
|
|
22
|
+
import { normalizeViewOutput } from './view-output.js';
|
|
20
23
|
// ---------------------------------------------------------------------------
|
|
21
24
|
// Implementation
|
|
22
25
|
// ---------------------------------------------------------------------------
|
|
@@ -48,9 +51,19 @@ export async function runScript(app, steps, options) {
|
|
|
48
51
|
const start = Date.now();
|
|
49
52
|
const frames = [];
|
|
50
53
|
const bus = createEventBus();
|
|
54
|
+
const ctx = options?.ctx;
|
|
55
|
+
if (ctx != null) {
|
|
56
|
+
installBCSSResolver(ctx, options?.css);
|
|
57
|
+
}
|
|
51
58
|
const [initModel, initCmds] = app.init();
|
|
52
59
|
let model = initModel;
|
|
53
60
|
let running = true;
|
|
61
|
+
let currentSize = {
|
|
62
|
+
width: Math.max(0, Math.floor(ctx?.runtime.columns || 80)),
|
|
63
|
+
height: Math.max(0, Math.floor(ctx?.runtime.rows || 24)),
|
|
64
|
+
};
|
|
65
|
+
// Start heartbeat for animations
|
|
66
|
+
bus.startPulse();
|
|
54
67
|
/** Stop the scripted driver event loop. */
|
|
55
68
|
function shutdown() {
|
|
56
69
|
running = false;
|
|
@@ -61,7 +74,13 @@ export async function runScript(app, steps, options) {
|
|
|
61
74
|
return;
|
|
62
75
|
const [newModel, cmds] = app.update(msg, model);
|
|
63
76
|
model = newModel;
|
|
64
|
-
|
|
77
|
+
if (isResizeMsg(msg)) {
|
|
78
|
+
currentSize = {
|
|
79
|
+
width: Math.max(0, msg.columns),
|
|
80
|
+
height: Math.max(0, msg.rows),
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
const frame = normalizeViewOutput(app.view(model), currentSize).surface;
|
|
65
84
|
frames.push(frame);
|
|
66
85
|
options?.onFrame?.(frame, frames.length - 1);
|
|
67
86
|
for (const cmd of cmds) {
|
|
@@ -70,7 +89,7 @@ export async function runScript(app, steps, options) {
|
|
|
70
89
|
});
|
|
71
90
|
try {
|
|
72
91
|
// Capture initial frame
|
|
73
|
-
const initFrame = app.view(model);
|
|
92
|
+
const initFrame = normalizeViewOutput(app.view(model), currentSize).surface;
|
|
74
93
|
frames.push(initFrame);
|
|
75
94
|
options?.onFrame?.(initFrame, 0);
|
|
76
95
|
// Run init commands
|
|
@@ -92,6 +111,9 @@ export async function runScript(app, steps, options) {
|
|
|
92
111
|
const keyMsg = parseKey(step.key);
|
|
93
112
|
bus.emit(keyMsg);
|
|
94
113
|
}
|
|
114
|
+
else if ('pulse' in step) {
|
|
115
|
+
bus.emit({ type: 'pulse', dt: step.pulse.dt });
|
|
116
|
+
}
|
|
95
117
|
else if ('resize' in step) {
|
|
96
118
|
const resizeMsg = {
|
|
97
119
|
type: 'resize',
|
|
@@ -114,6 +136,7 @@ export async function runScript(app, steps, options) {
|
|
|
114
136
|
await new Promise((r) => queueMicrotask(r));
|
|
115
137
|
}
|
|
116
138
|
finally {
|
|
139
|
+
bus.stopPulse();
|
|
117
140
|
bus.dispose();
|
|
118
141
|
}
|
|
119
142
|
return {
|
package/dist/driver.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAGH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"driver.js","sourceRoot":"","sources":["../src/driver.ts"],"names":[],"mappings":"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"}
|
package/dist/eventbus.d.ts
CHANGED
|
@@ -25,14 +25,23 @@
|
|
|
25
25
|
* ```
|
|
26
26
|
*/
|
|
27
27
|
import type { IOPort } from '@flyingrobots/bijou';
|
|
28
|
-
import type { Cmd, KeyMsg, MouseMsg, ResizeMsg } from './types.js';
|
|
28
|
+
import type { Cmd, KeyMsg, MouseMsg, PulseMsg, ResizeMsg } from './types.js';
|
|
29
29
|
/**
|
|
30
30
|
* Union of all message types the bus can carry — built-in key, resize,
|
|
31
|
-
* mouse messages plus any app-defined custom message type.
|
|
31
|
+
* mouse, and pulse messages plus any app-defined custom message type.
|
|
32
32
|
*
|
|
33
33
|
* @template M - Application-defined custom message type.
|
|
34
34
|
*/
|
|
35
|
-
export type BusMsg<M> = KeyMsg | ResizeMsg | MouseMsg | M;
|
|
35
|
+
export type BusMsg<M> = KeyMsg | ResizeMsg | MouseMsg | PulseMsg | M;
|
|
36
|
+
/**
|
|
37
|
+
* Middleware function for intercepting and modifying messages.
|
|
38
|
+
*
|
|
39
|
+
* Call `next(msg)` to continue the message chain. Omitting the call
|
|
40
|
+
* halts message propagation.
|
|
41
|
+
*
|
|
42
|
+
* @template M - Application-defined custom message type.
|
|
43
|
+
*/
|
|
44
|
+
export type Middleware<M> = (msg: BusMsg<M>, next: (msg: BusMsg<M>) => void) => void;
|
|
36
45
|
/**
|
|
37
46
|
* Centralized event bus that unifies all input sources into a single
|
|
38
47
|
* typed event stream for TEA applications.
|
|
@@ -87,6 +96,31 @@ export interface EventBus<M> {
|
|
|
87
96
|
* @returns A disposable that removes this quit handler.
|
|
88
97
|
*/
|
|
89
98
|
onQuit(handler: () => void): Disposable;
|
|
99
|
+
/**
|
|
100
|
+
* Start the system animation heartbeat at the specified frequency.
|
|
101
|
+
* Emits `PulseMsg` to all subscribers.
|
|
102
|
+
*
|
|
103
|
+
* @param fps - Frames per second. Default: 60.
|
|
104
|
+
*/
|
|
105
|
+
startPulse(fps?: number): void;
|
|
106
|
+
/** Stop the system animation heartbeat. */
|
|
107
|
+
stopPulse(): void;
|
|
108
|
+
/**
|
|
109
|
+
* Register a listener for the system heartbeat pulse.
|
|
110
|
+
*
|
|
111
|
+
* @param handler - Callback invoked every pulse with the time delta.
|
|
112
|
+
* @returns A disposable that removes this pulse listener.
|
|
113
|
+
*/
|
|
114
|
+
onPulse(handler: (dt: number) => void): Disposable;
|
|
115
|
+
/**
|
|
116
|
+
* Register a middleware function to intercept or modify messages.
|
|
117
|
+
*
|
|
118
|
+
* Middleware are executed in the order they are registered.
|
|
119
|
+
*
|
|
120
|
+
* @param middleware - The middleware function.
|
|
121
|
+
* @returns A disposable that removes this middleware.
|
|
122
|
+
*/
|
|
123
|
+
use(middleware: Middleware<M>): Disposable;
|
|
90
124
|
/** Disconnect all sources and remove all subscribers. */
|
|
91
125
|
dispose(): void;
|
|
92
126
|
}
|
package/dist/eventbus.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventbus.d.ts","sourceRoot":"","sources":["../src/eventbus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"eventbus.d.ts","sourceRoot":"","sources":["../src/eventbus.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAQ7E;;;;;GAKG;AACH,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,CAAC,CAAC;AAErE;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,KAAK,IAAI,CAAC;AAErF;;;;;GAKG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC;IACzB;;;;;;OAMG;IACH,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,UAAU,CAAC;IAElD;;;;OAIG;IACH,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE3B;;;;;;;;OAQG;IACH,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,UAAU,CAAC;IAEjE;;;;;;;;;;OAUG;IACH,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;IAE1B;;;;;;;OAOG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,UAAU,CAAC;IAExC;;;;;OAKG;IACH,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE/B,2CAA2C;IAC3C,SAAS,IAAI,IAAI,CAAC;IAElB;;;;;OAKG;IACH,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,GAAG,UAAU,CAAC;IAEnD;;;;;;;OAOG;IACH,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC;IAE3C,yDAAyD;IACzD,OAAO,IAAI,IAAI,CAAC;CACjB;AAED,qDAAqD;AACrD,MAAM,WAAW,qBAAqB;IACpC,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;IAC7C,gFAAgF;IAChF,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACrD;AAED,4DAA4D;AAC5D,UAAU,UAAU;IAClB,0DAA0D;IAC1D,OAAO,IAAI,IAAI,CAAC;CACjB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,UAAU,CAAC,EAAE,qBAAqB,GAAG,QAAQ,CAAC,CAAC,CAAC,CA2NjF"}
|