@dongmingzhixiu/vuexir-compiler 0.4.10 → 0.5.1
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/codegen/swiftui.js +22 -0
- package/dist/ir/schema.d.ts +2 -0
- package/dist/ir/schema.js +1 -1
- package/dist/transform/css.js +8 -0
- package/dist/transform/vue2ir.js +9 -0
- package/package.json +1 -1
package/dist/codegen/swiftui.js
CHANGED
|
@@ -703,6 +703,28 @@ function emitNodeInner(node, ctx) {
|
|
|
703
703
|
.join('\n');
|
|
704
704
|
}
|
|
705
705
|
case 'group': {
|
|
706
|
+
// R136:CSS grid(grid-template-columns: repeat(N,1fr))→ LazyVGrid
|
|
707
|
+
if (props.gridColumns !== undefined && (node.children?.length ?? 0) > 0) {
|
|
708
|
+
const cols = props.gridColumns;
|
|
709
|
+
const inner = (node.children ?? [])
|
|
710
|
+
.map((c, i) => emitNode(c, {
|
|
711
|
+
parentAxis: 'column',
|
|
712
|
+
level: L + 2,
|
|
713
|
+
definiteHeight: false,
|
|
714
|
+
warnings: ctx.warnings,
|
|
715
|
+
runtime: ctx.runtime,
|
|
716
|
+
path: `${ctx.path}[${i}]`,
|
|
717
|
+
inheritGap: undefined,
|
|
718
|
+
loop: ctx.loop,
|
|
719
|
+
dataProps: ctx.dataProps,
|
|
720
|
+
}))
|
|
721
|
+
.join('\n');
|
|
722
|
+
return [
|
|
723
|
+
pad(`LazyVGrid(columns: Array(repeating: GridItem(.flexible(), spacing: ${props.gap ?? 0}), count: ${cols}), spacing: ${props.gap ?? 0}) {`),
|
|
724
|
+
inner,
|
|
725
|
+
pad('}'),
|
|
726
|
+
].join('\n');
|
|
727
|
+
}
|
|
706
728
|
const dir = props.flexDirection ?? 'column';
|
|
707
729
|
const isRow = dir === 'row';
|
|
708
730
|
const children = node.children ?? [];
|
package/dist/ir/schema.d.ts
CHANGED
|
@@ -140,6 +140,8 @@ export interface IrProps {
|
|
|
140
140
|
absTop?: number;
|
|
141
141
|
absLeft?: number;
|
|
142
142
|
absRight?: number;
|
|
143
|
+
/** R136:CSS grid 的列数(grid-template-columns: repeat(N, 1fr)) */
|
|
144
|
+
gridColumns?: number;
|
|
143
145
|
absBottom?: number;
|
|
144
146
|
/** M5 变换:scale / rotate(deg) / translate(x,y) → scaleEffect / rotationEffect / offset */
|
|
145
147
|
transform?: {
|
package/dist/ir/schema.js
CHANGED
|
@@ -115,7 +115,7 @@ const PROPS_VALIDATORS = {
|
|
|
115
115
|
/** 各节点允许的 props 键(P0 最小集,防 Taro 化:未知 prop 即报错) */
|
|
116
116
|
const NODE_ALLOWED_PROPS = {
|
|
117
117
|
root: ['width', 'height', 'background'],
|
|
118
|
-
group: ['width', 'height', 'padding', 'gap', 'flex', 'flexDirection', 'justifyContent', 'alignItems', 'background', 'radius', 'borderWidth', 'borderColor', 'marginTopAuto', 'marginTop', 'marginLeftAuto', 'marginBottom', 'marginRight', 'marginLeft', 'borderSides', 'clip', 'onClick', 'onSet', 'position', 'absTop', 'absLeft', 'absRight', 'absBottom', 'transform', 'show', 'opacity'],
|
|
118
|
+
group: ['width', 'height', 'padding', 'gap', 'flex', 'flexDirection', 'justifyContent', 'alignItems', 'background', 'radius', 'borderWidth', 'borderColor', 'marginTopAuto', 'marginTop', 'marginLeftAuto', 'marginBottom', 'marginRight', 'marginLeft', 'borderSides', 'clip', 'onClick', 'onSet', 'position', 'absTop', 'absLeft', 'absRight', 'absBottom', 'transform', 'show', 'opacity', 'gridColumns'],
|
|
119
119
|
text: ['width', 'text', 'ref', 'bind', 'bindExpr', 'dynField', 'bindParts', 'fontSize', 'fontWeight', 'textAlign', 'lineHeight', 'color', 'padding', 'colorActive', 'marginLeftAuto', 'marginTop', 'colorDynamic', 'fontSizeDynamic', 'position', 'absTop', 'absLeft', 'absRight', 'absBottom', 'transform', 'show', 'flex', 'opacity', 'onClick', 'onSet', 'fieldOf'],
|
|
120
120
|
image: ['width', 'height', 'src', 'objectFit', 'radius', 'borderSides', 'borderWidth', 'borderColor', 'clip', 'flex', 'marginTop', 'marginBottom', 'marginRight', 'marginLeft', 'position', 'absTop', 'absLeft', 'absRight', 'absBottom', 'transform', 'show', 'opacity'],
|
|
121
121
|
button: ['width', 'height', 'label', 'bind', 'background', 'radius', 'borderWidth', 'borderColor', 'fontSize', 'fontWeight', 'color', 'flex', 'padding', 'marginTopAuto', 'marginTop', 'marginBottom', 'marginRight', 'marginLeft', 'borderSides', 'clip', 'onClick', 'onSet', 'colorDynamic', 'fontSizeDynamic', 'position', 'absTop', 'absLeft', 'absRight', 'absBottom', 'transform', 'show', 'pressBg', 'opacity'],
|
package/dist/transform/css.js
CHANGED
|
@@ -49,6 +49,14 @@ function mapDecl(prop, value, warnings) {
|
|
|
49
49
|
function mapDeclInner(prop, value, warnings) {
|
|
50
50
|
const v = value.trim();
|
|
51
51
|
switch (prop) {
|
|
52
|
+
case 'grid-template-columns': {
|
|
53
|
+
// R136:CSS grid 的最小支持——`repeat(N, 1fr)` / `1fr 1fr 1fr` → 列数
|
|
54
|
+
const rep = String(v).match(/repeat\(\s*(\d+)\s*,/);
|
|
55
|
+
if (rep)
|
|
56
|
+
return [['gridColumns', Number(rep[1])]];
|
|
57
|
+
const cols = String(v).trim().split(/\s+/).filter((x) => x.endsWith('fr')).length;
|
|
58
|
+
return cols > 1 ? [['gridColumns', cols]] : null;
|
|
59
|
+
}
|
|
52
60
|
case 'display':
|
|
53
61
|
// display:flex → 容器语义;display:block/none 不映射(flex 为默认容器)
|
|
54
62
|
// R135:CSS 的 display:flex 默认 main axis 是 row(此前默认 column →
|
package/dist/transform/vue2ir.js
CHANGED
|
@@ -2172,6 +2172,15 @@ function walkElement(node, classProps, comboRules, scopedRules, pseudoRules, war
|
|
|
2172
2172
|
continue;
|
|
2173
2173
|
}
|
|
2174
2174
|
if (child.type === NodeTypes.ELEMENT) {
|
|
2175
|
+
// R137:<button><span>{{ x }}</span></button> → 动态文案走 bind(此前只能收静态文本)
|
|
2176
|
+
const interp = (child.children ?? []).find((cc) => cc.type === NodeTypes.INTERPOLATION);
|
|
2177
|
+
if (interp && !props.bind && !props.label) {
|
|
2178
|
+
const raw = textOf(interp.content).trim();
|
|
2179
|
+
if (raw && !/['"]/.test(raw)) {
|
|
2180
|
+
props.bind = addJsExprState(raw);
|
|
2181
|
+
continue;
|
|
2182
|
+
}
|
|
2183
|
+
}
|
|
2175
2184
|
// 常见写法兜底:<button><span>文字</span></button> → 内联文本并入 label(否则 IR 校验因缺 label 中断)
|
|
2176
2185
|
const inner = elementInnerText(child).trim();
|
|
2177
2186
|
if (inner) {
|