From 4077dcbd44233385a756e48ef8f3ccd5ba879af9 Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Sun, 13 Sep 2026 21:16:03 +0300 Subject: [PATCH 1/2] fix: preserve authored instance sizing through synchronization --- CHANGELOG.md | 1 + packages/core/src/design-jsx/renderer.ts | 23 ++++++- tests/e2e/canvas/instance-sizing.spec.ts | 26 +++++++ ...instance-fill-sizing-openpencil-darwin.png | Bin 0 -> 86315 bytes .../engine/render/jsx/instance-sizing.test.ts | 49 +++++++++++++ tests/helpers/canvas/instance-sizing.ts | 65 ++++++++++++++++++ 6 files changed, 163 insertions(+), 1 deletion(-) create mode 100644 tests/e2e/canvas/instance-sizing.spec.ts create mode 100644 tests/e2e/canvas/instance-sizing.spec.ts-snapshots/instance-fill-sizing-openpencil-darwin.png create mode 100644 tests/engine/render/jsx/instance-sizing.test.ts create mode 100644 tests/helpers/canvas/instance-sizing.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c85d93118..b70f44f42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ - Honor `.pen` frame layout defaults and sizing and padding shorthands so imported auto-layout frames keep their computed dimensions and child positions. (#564) - Avoid macOS Keychain prompts during credential status checks and pause repeated credential access after failures until explicitly retried from Settings. +- Honor explicit Design JSX instance dimensions and preserve authored overrides through component synchronization. - Route browser Command/Ctrl plus and minus shortcuts to canvas zoom instead of page zoom. - Resolve `$name` references in imported `.pen` fills, stroke fills, font families, dimensions, and spacing without requiring a `--` prefix. (#563) - Resolve bound fields in each layer’s mode, keep variable edits scoped and undoable, and make broken bindings visible and recoverable. diff --git a/packages/core/src/design-jsx/renderer.ts b/packages/core/src/design-jsx/renderer.ts index 927e51365..95bc566e0 100644 --- a/packages/core/src/design-jsx/renderer.ts +++ b/packages/core/src/design-jsx/renderer.ts @@ -430,13 +430,34 @@ async function renderInstanceNode( const label = typeof ref === 'string' || typeof ref === 'number' ? String(ref) : '' throw new Error(` component not found: ${label}`) } - const overrides = { + const overrides: Partial = { ...propsToOverrides(props, false, parentLayout), ...componentMetadata(props, 'INSTANCE', componentPropertyScope(graph, parentId)) } + // Instances inherit their container layout, but explicitly authored dimensions + // must also replace the inherited sizing mode on that axis. + const layout = overrides.layoutMode ?? component.layoutMode + if (layout !== 'NONE') { + const axes = + layout === 'HORIZONTAL' + ? (['primaryAxisSizing', 'counterAxisSizing'] as const) + : (['counterAxisSizing', 'primaryAxisSizing'] as const) + for (const [dimension, field] of [ + ['w', axes[0]], + ['h', axes[1]] + ] as const) { + const value = props[dimension] + if (typeof value === 'number') overrides[field] = 'FIXED' + else if (value === 'hug' || value === 'fill') overrides[field] = 'HUG' + } + } const instance = graph.createInstance(component.id, parentId, overrides) ?? graph.createNode('FRAME', parentId) try { + for (const [field, value] of Object.entries(overrides)) { + setInstanceOverride(instance.instanceOverrides, instance.id, instance.id, field, value) + } + graph.updateNode(instance.id, { instanceOverrides: instance.instanceOverrides }) applyBindings(graph, instance.id, bindings) applyInstanceOverrides(graph, instance, tree.props.overrides) assignComponentProperties(graph, instance, props.properties) diff --git a/tests/e2e/canvas/instance-sizing.spec.ts b/tests/e2e/canvas/instance-sizing.spec.ts new file mode 100644 index 000000000..b7780762d --- /dev/null +++ b/tests/e2e/canvas/instance-sizing.spec.ts @@ -0,0 +1,26 @@ +import { expect, test, useEditorSetupWithClear } from '#tests/e2e/fixtures' +import type * as SizingFixture from '#tests/helpers/canvas/instance-sizing' + +test.use({ viewport: { width: 900, height: 700 } }) + +const editor = useEditorSetupWithClear('/?test&no-chrome&no-rulers') + +test('Fill instances wrap inside narrower parents after component synchronization', async () => { + await editor.page.evaluate(async () => { + const store = window.openPencil?.getStore?.() + if (!store) throw new Error('OpenPencil store not initialized') + const fixtureURL = '/tests/helpers/canvas/instance-sizing.ts' + const { createInstanceSizingScene }: typeof SizingFixture = await import(fixtureURL) + const { boardId, componentId } = await createInstanceSizingScene( + store.graph, + store.state.currentPageId + ) + await store.loadFontsForNodes([boardId, componentId]) + store.clearSelection() + store.zoomToFit() + store.requestRender() + }) + await editor.canvas.waitForRender() + editor.canvas.assertNoErrors() + expect(await editor.canvas.screenshotCanvasRegion()).toMatchSnapshot('instance-fill-sizing.png') +}) diff --git a/tests/e2e/canvas/instance-sizing.spec.ts-snapshots/instance-fill-sizing-openpencil-darwin.png b/tests/e2e/canvas/instance-sizing.spec.ts-snapshots/instance-fill-sizing-openpencil-darwin.png new file mode 100644 index 0000000000000000000000000000000000000000..7ad08de0ee5c46b6453c3f0ce93976fafd890318 GIT binary patch literal 86315 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 z zd}=>W(V-%hnd?$r=X+9JUyR4H4WhB->zqZ!a77j9!Dc1qb<7t z1x|faN|7qPG$Q`Z>|jxYBw8`fKo+S|Z8jUyPrP&C^=dl0uP4t)6Mb{tWWX(!2Lc@( zeS4tXXe3GC$zr}T;O|iwC&|go8~*n!^l2BOc)zZ_Ey2XVa628H4Mxo8)rpDQdAUn}SzRu62c=`6vT8U~R9JY^*!zC}g1!xSEr=)x zwoXn)(hydWN>rk3zXuh&z<_~2rVZLMchZ5=6fBZeKbK%Eh!L;}UvmtAwU;~gwibsw zvzeB|-fbg%>$0^qf^E~YAJu}FS$(a%cl2#{mcsfm0Mioq#;^Y_C5l!oTX>$ZDXqYi zinIu}pWzqN7`d!5Pbz(LBT2OQE!1;wY`u@>J~r0N)vDJ+9(`-=JB?luF-F&{C(nckYprCy1Ixr z(a^*vc6TxKsdj_@_F61nFJOD$9wPjyk`Mh(J_yw2icNC)jh9pJXUsTbpE_w-*=*wd z6MWG9rh!{z^|ZG~i7?d#zYx8}dRM8xSj5M-GNkZBSjZPsQLq)%k8yL% z3E%3&K7kSeqf!mZkD*Wyp(Dv`YCNqh=Q~+VO?k~(b|8p8vabx%P+JEF#P8uj$}=Ia zU+OnBz+c#{w2Y06@Gy3P($}8=e+eZmC-@Z~KV9d0{HtM6@TR3Wo2XzU&b2|aa@A!R z7x=nuLHH4UKM0(3AE6eY!NKZ#%V}%p;BgfP6xA{xRI+!$7#nc^_X{jG9=64l30OlD@nI^EW^`ikgH zXQA%NE8d=d|6w@nh#$+4=$Qpd#g&1G-S&4ps=Qv8K0f+pURiS zxT4k=qCZ+GoM6X^O?CdcK!Gr%U&4T(bSmVVX-^1$UV~i^D>U*-#|JGHhWcKG*_paW zMp&0tQq|&payqMGyuiTWq;(-?;ohXNQo`FX4-w3f2y%A{9*Ffpjo>7UURb}`&fDz!B4T)OM95#OVoG@qNp<_)ipzJZ;0+<%|5c+z_QtDeM*F@A7p4^ z;^(my$`z3(K;FOB>zL+BWqnDs^doa%vRC;~s#kuqVRZH7g6ebY6j|P{+tlds=X$9A zei$iFPHCR1Q`!Sv@}bhNBFlhy#G|%tEkc)-sWe_LKQjD_7HT_=hSxSWS#4TRm@G3> zRa4dus_!n=tMo8Fl}EZ^=t9npC3?JJ<}J|)!eG9h(DIwXp4y~MT8E~;-ZR2^WCagG zZZ1@73bW=d%Xw-;h^E3|j_L%%df(PXI+9S~c~WTcN-0=lj66=BC}Qr4<@olE=H<KDb1ksh=YM|g>N8O z>i6%T0YL$#Ny&#!&wr8Ke-XCFXF*tM=i_B+fK*~(f#w*A|K_qlPupB<^S@wN6&%6G zF2tuR{+C72%+=7+vb<>B+G>5GsbMR;CQ6zMI$=P7O=p@;{at)w0~H_Jg4v8>m~4NF zYv^}nW#yf%kKp{-u-6d~Fxn0Ys|E!st!1s8ffOxGC#jC+%y$R&=jYMn-(TEeuJh&L=4-2`^lxcjrLDi*UA1L#uH{`F z%y>MmKY;4meMvP%&G>lL?>XTSkxh;D-94X-b7(`qhkZ*hD~(=^uj39jYu`*B-Y%6@N2l@vGs zh>OJB?hF7V{`~Ff;Lp!(x3`cmFff5GG6Ej}QH{ZSfe=E4ujJ@_BY=*AgeKC!d)cPL~yTBj?* zJoW%lcxKg-Z-k|oN}zHiIA&G5-XVa0L#sgV^s}w)UeA!K^IuAJhPIq|8k*5!Bn{L$ zt-qy!1@;K&`B9-@IO3oDy`Z6>;dQkz!hU_YPx?Vkz2B7bIPo`YS;=L9Uy&3OX5#zqHH3>6rA1T zb?9|U`nK}wVvnN*X>?=b5$((yP@b^0z0J+dEr`4wADg5yf7t_18lYkWng~m^M6aTV zZJv`sXWi-D4Pa{Ach~@J3TfznAlBDQ@HXx7m?iDpMwhHhNkuum%?3_pssr)?=rpY8 z(PvOFXZQEvi{z~jtwlwerBT@$LP^7|>3$HtMUk3_O3by*-7yrcd!|ltXhn+Bp9xU| zxrxPlreSzs3DX~+g8*MGYrDfiZ2Nh8q^E}zY?oMRbY#{@3~G9i9jd`g<#^4AHF7#w zgKZ*rYiG8v`>o3L=ifsjY`w7aaSG9!E6Ct$?m#@2fdQXD{XB(W;PQ^DH8R>5K{M6m zW`h(U1z-wN&DA8CdyD^t-r&w`gI2n_CE$~IyaXq)vGI4La9$#0r4y2qGjn&j2SGR( z73T8Mcr;BIGN?Fk=#<(`s=DB4@$3A47KhP$o;jXr-K0iU4m z#}Rj!6;QLqsDN!aoi#83m_xz#BYX^jl3vxTa3nd}c;g&gw-W(rhn!!~{(ay9^|U|a zh-E6R60%}Uumwc9{n_t0cJ0*~*GXtiP0cPOgFyGZ4uM)5)7U@Te~4A4YaE#;nGf|b ze$}?F?}sN-#6q65`Uy>V(EFT>*%DVTgvQfpx4H>OFbZUTTlum&&cVm_v%%~SXm^uI zyMKLw4__)jJIlVkjow`mu3) zb_0)*(SnLpjB-fG&q?`KSCUcSr(Y$8(Y>b>veL17rEa@7SOYG*M5bO|ts3e+O>*9J zUs?kh@+L~gq_de+XQ#flxakjVBgvVzv@~zy@a`N2?JRb0$Ni6Eq16WyM)kQ#(KsUn z8VdSw_2J`t94}5hufl>75JDnWpXV&6pDi5-3k|J6goNuEuadx4Fe{oea-# zdjLB>j;Hpj5BR*fl@|M;27&gnI7P^d zoBME0ROecY6%2fIb2^5;;g^v`X9CT3r<K-jjgL&Jg`W!yw905LBn!|Azt^KyLs-|MT%Dk`e!yfSZ`0XxT#Klh!nw-fYnz|}{46H`S2P@Dj3s$9_?CrI>Zn{A}Bl28?qL+DG_o!}e zqDgJ&&6H>!0C+v|M>|wYa-8SgzN5=Ry2q^-=q*$sut_9QFjZ38BFFb$+ujf1f~5Rt zNAma;BwHf+JXQr~i9V<0_n)@i9kg|4ujk_P+e%VJcPa~`waWsHVH}K{He;t~cJN1T zu5Jt9UI5fkVPWBU6P-KJzKGOV@thzOTpKT*G4k#WZs!xi8#YU=I*UC8O-*bTis*hx zW0tgew*0^o1Con9gKcG>X$-|AkAmrG_D7p*9-?yH*aV>G{s*W?KJ)ZxtW5fa0ErK42 z1r-q~unOvj*4MAkppT1lsw-oy9qC{Ow4(|j`+s%X8Et9y6&juqxbk%aH%V1aeD^tXC!+*&)>B)vhcQ?ZH zR9@%TsdFJ8FagC@-_S$^@h|Jw;C2Mfb&7&we)A$MObkB7q7t4Cx2V*-$%(=*yxz}x zfBg2rs;P&EhhMqRQ=wS30^`&n^>Z5%|=l0Rb5REa>LJ{2*H- z**E>5|^}=p@#HKYv6IkYT@FLmS+q)ap zv@X_e(y%PFqkCEg<-%fOq8&f{MEmKGS(%5#Wj~9555k7Lz^!#RFyP2x57cD+nXGC9 zm^){7cGzOgT8rwcnm={kzBhJT$(uWLT8*AJRuRXOh6AS=Nz{{xmp8Js`pz& z-N1l=h51FHqDD`cI+4DfPX|&^%{0d31Fu(yGE1;E86 zB1DhSv#?%=#_8Ty8HHG;>WwTC{glLikC^Mq&?&1W1;$}>?ytP%-tttsNCN z9-vE5Y~=Tg=Vt*0yzSoKO44v??1uS3N!zhLB(H z>xLN(65q1vxjER`A(=?40C5#16~QNe=N8w=z?)U~*|Av|ARkCB1>|^MT}>PwF0Ey> z3-j@5kYBg+eoc$^I&J5h(l2$RczSx2GnVmu5&mpxX>NY-u9U;UmujTRW@CWTx{QWH z=j^Ov|2~qW-@s0sP_^`HpCO>X53ZJ*=2TyzSZd$>`s;=dDCWt_XAyPQwKj?>QexoZ zI@&wVR~@jD1o7&JEPj+(Rj4$sMJin9PQ2Nf92hQwC}RA@a;H%B56L;UomPY(8SdQ@ zzf$QD0eE6RF0z;*!U9k>MQEb%@ne2VVQj3yWl`J9CORvtBTAv!c$faC*YH>lrGWVi zw4@&eCL7<%N)ooYneG;?N#1z!iiiFUNRQ5c9U7L-ObD#J>l@X2Ccw}GqJ(PGt%biGkDe7SN|&bD3m@@r|=CEQ6uFDy5MDp6_0{)i|*6H&C2ot z{+e}%qjUbF%l+&s4rn>Se~Y($bNrQ$0#Sn9YNf%GoSK4QZLP!eK*v-qI10IXxBAjh z8=uqZ>i)Ad{@TZCph~{c`SD4+w%pXhvdQkr$no=+!QVNNd_4Ye7_Cz3HAKXuoO>5# z5wWp9!PZ5n;LEeK8EIrCA$I2?Rz;N@pfsgySwwZF*4s z-oOX!4kmp6&Ok2qu==!q0s1i>eY3W-gkhkD&%K;(xS&aU5rh zMfjJI1*~c9@6~T^A1pz<k1$dyhPEVOXWg72lr zRt`OpGE=&;q#L0L+yT9vr8Kp)8bpA(3E6uV<(T6M`mMwOSU;F;VA`+Lv9) z5B|-~j}S@|AR#Ss@JUm^!WLoS_P+s8)J+B-U6K9yS6xEB+RK%UJUqkK^3Fjf8PC9F zhp@!t`l9NLlFdkx`Jv=%iyfGuO>VUeN>E|C-)s^;gDhNB3@D}6%kaS%{TXBmAWiWW zFueA^ap&eP&8z4n_+Gj_J(7I-`lw|?utvo_$OYyP3#%dJCkc`_Z~g4*NcdFf;sqH- zv})chLxo^W)YjGc`PLdp@B~_iVS$S5FbR_X3k#H%-N@XfW02moO=uH&VP@e0mEC2I z=tNNCBtDvalap1@eHg}u+tQzKms0IePM#@zlU4?GR(*($w@eiK*evQ^rfB_PFb`#*{SeKoSf)o|kjR=cl=AfSWJ&kkBFO&P-M4OghzxCcl*FEuD{$k} zG(>|Z+lFMuI zPL2HR<#j7tH7M9{ad82JN})Go^Uk^IayM95*b|E2Tmc&6#aorl-8Bq!?9G#t*~!IO zs}u(KjGCU|{o`?6G8*-b?G1?N(wexVfeFT})uO^eI3y&AFSXJ|Fzp22Gg0;CZ~f~V za+PVB6We#QS%fMA4)bd`p_Qoe6L-%vG&F~XhH8vRClH{5-k8$G1w_FNV03=Gr@+Uj zA29$`X~K&=Fp1I;(!f-7!*s*whAG7C8t}-cg70A=G6I;OCdoU>9J7+9zgbfeeJ`mC zDMVQe!-PI}`B4Z{ecGrf(JFykzY=)(&oC; zGx?9f<1Hb$MlT}@791X&%>D?L?;=z`KM0uC-eCUm5$_{gcFNxI-roMP;m5$U&%;~) zUSY?JE`ci+-|o=rcraQ=E(=zIS}hJ*!RC7*g}}^QwYQ@>7yH}+1^ked84CarucOo_!U*@_Rr3Y110%3)@DLOgtY>xWx8&jUR@^9QzFNqzGJm{fiW zx!qT{kvGE9(1FD&SeRC4P%rOr4x((N$aUJ1Qc!7cMZc$|;ei8wrpigk9}@avIpGV! z&XC8DOpZ6z2l@R8GdJ^gInrR8+F zVu+_FP@w~exv|u?@#*Cjr>jEo(alQFYN{Z{eqb|-DE|vD)=z4*5fSpOd>zO9FM5%> zf2u9(NNvmw4UH9z3h({L5x<6Qgt|1tjO;3A(A%BY8zc!E_vVH08BCW+{F%KA_VnaT zp?#Cqer5!g!*wx<)==B7cDWKf$)`b35{8u%(a~Vn1rSjk+IA)E0KiuiGAWWk4*iRH zg57LD^ZUCul+`tfrYa_zZ7B)uE-Zx`ME;}rR5>bgCMrbK)D$X^e!{&xSdDlKu`^!d zi0o+JI58ZYc|q1rOAh15sjd)@4<-aZfBO6gs>Iqa%emPL&<5&>?>(>#b|C-${^}0b z3p~~~7Z+F2Lx1WKF*o-23!`zU7yFv5tQ@JDyin)OP0tc~L(1-s-y1eX{r0>(ZtyUZ zWa>`s=3wFZy||bRI@^`MKz7*H7Fy|>Ge6XmTd5N*su#G+Z)ZX=4QdeRh8p>Rp39IB zNvqWsRgJF|W`E8hK`}-`DW`P8xcfzRUc1mYymx+O*TnO)*SWACXCrwu5QqHs{Yi%L zW*OeV+&(lmHLU-f=(A>gy_uXa00-KaTwedpe|+Ehk<4IGW#7FaA+41Wh(WS1JztmrDg_v-qvFWBV4c z-cUZ*=sDOnG~88L3z{bZ$n2O+cPaWCMq7s2-riOXzh3Tct1cjp`+Dg*yzU= z)F??q#ltxRA`h&IIZ$NdXcaT~sXZe6)h~(+1=Hu8s_>+}Tb2iUG@mOd%$EP&C5Kw{ z?=HF7yu9QpyApZc;h1s(kRBQW#DJrmcu9TTrtwKU6A=HfdC8+bh(+M>gC3G9{J}od z8u6mgPw}NyTou?83-j~(?V_G)0*)Jut-*;Y|44kV{!#wvd|F@~rA-VeI5Y+$cL*S=cy;K zvN7YsWVC%x=i+h@qs99R@=q66*Qd{8q$y%0dLL`g2h_ZNvE5#BVQ!GVo;ETuxecn? zkxAua=3_&y7+f5pW@1_bJ)g6Enk1EtUKiKX=IjaN!;kN|N`L9sN~CM}yFz#!eCXXh zt)6M)fBbr7LrS_@KPCJFa~5q6RxFo^T_4@}T#yMtu&3;Ds>+`FLJ`qxB``9t?!Wib z2^0B;VgG+{j;|-3Ka6`!>8TSSlJ9po`2W$#tfZi%ZF2at02UqkBA2SeY%jVO;e8Sb z@EBLUxjm>MGADRG?A#3!q^*wqAD5=Tk*zeT4BnQj?X-m5d~4Y>K+JGGY`R*@j&*mZ zM?j!!z>5+&5w7nK$KiY5wl*avw`N#aSlkjf1AqoZkc5SO`8gb35gs&sC3!c$$Y0xo zp`?*&{;}SW?C@rZyM$=FpghWdxbYjWdRAVZbBZP$le;=jTWh=C%n$fakv-Nq*vzYy z%&1dD+kuP%r63+09vTkD=Q0nu8X7}WV`Ei)#j3V+Yds-fxA`HokPm6c8yn3uq?~+w z*GF~QLHj;pt0Rrh><7=e)U!v2hx~WDkbu(iM5(N*5>}Vpr7|ao69+xlaxox^OY0bS z8}kY?02Wl$R6bcsrpX!YN7*co^a7bcm)8P|lr(gA>%*M+S?05) zD^>PE-rv$|#0{)Q(}ZSbXXCZyx_P7oF5Xv^1tuKLwO&m|q8wL`K3RNz<*!=Y)vq(-)!Z<#iRliK?EOzw63+% zaL0TRtU^5BWJoM?X{lQ*0%cGVoi*H`6bd;(cD>MD)$VoVl)R7 zkcNdtaB_2Fb1>P0Jz9hyfu5X#)itT9DQiNPS6AroKQ@6jSU}@M8v9^F zM#KIrk|wJ|g>7zWsg{-{ts`kae0$pq%+$U`?ESIJ%ge)qhM@*h$EuY(EDWsu{e7^{ z#PhNI%QSfRd292x`WrC2E7GRsU(!b~;KiV21%P_6swzdW@J(0|;S!yeU79Yw&e=iW z76Bgl_hZ`f=xW``y}cV40FD^^820g=yXp2cQVCCtCb3Ua%}8mF0Q6axNMmSXst~S|{L)Z%cKzQ!4P?VL$=W;C( z6X@DMI!aDUT(2ceb05<2%=o}&a6q*_ua;w#~n4%owvw+HjD4O*6&*#N~idPVI zj1)+VpfimjRu#}w6-UZ0G|pAWKu^{cqS>A$0eKFfSBr>#0)pw!I8`8rjMRkO@^Emd zsVf7Hh%lbtLm6I1TuluYrw6>q!RDrt1F*edfB%5c?z4=H8Ld0O6uW32v!JiyZB{@# z$RIV|t5xB(|7ZaM^TDtvljP#Of%6;980KL5`g_N^xkyfw7g{zqvH0y#1J7O=)H%zV zKPDmPmjyPr;bLL=8kV`9LQt1pU4ctBqrI-se1(lQ=jdpA&ma=9kNI0{G+YeS@x@8i zyEQ?e;_)=>ZcJ|dl`aM8l9Eu64rwGrO1itdk?w8*5$O_1X{5Wm^QB8bx;yp+*IM88{p~&W zIOm@;&KQif9HRKX&-*-c&ilTv>-t=!yw~mG7Mt}`JATy8@L<73v`D{q;3{Zc2ggGP z8G{n94E1{Wy_(v43yXS1$3UCBZ-ZhZht)ad81Av_L*wV-lCr_U>SfoFI+@Fk)-tH+!V;GV9>WVTf25W#nl-b{)AK zmFZ3IzCjR*AsuNHhi$ZJLf*>&^RO4V4e|au39!1jYFug{5v^~I4BD~2f`|Pj!ssTj z{`3Emp>l4hf5Xz2mi7oC7c^dR56T_h^IMYKzARsgk|_|Q!Iqi;n9Gcxc^HMjyx@Bd zjKWJRJFM?NV;2##{d?VVJ2dX(pQ-|QkEuGFoAaqQuqj(Ebjx0$15jfyqBtBJJn&)qx-HVW z$!@&fiq4iayU?i0%lUp!=#!KCZ1NSaT3u64&GDk=Yf=G#UN`K!s2;R;Eg%b`srm~ETGf1MHpXXKX7@ft-vc|Vss0OEe7A_4yd?9P{6TouO%wbHYDrx5%6XanK()N#g&-gUbh9G#*iZg70H z3P4GkOJIKSPnv~dSMv7u23d*|5she-RV4yqWxI2CsdrnRcL!2h*f_Cim;KfxN3||4 zi+v=@T)@wF(-QCN>u#$nAn{S&*|{BJhXcrb7o~=kM~O*wj(lemJGEp{3hELp*A8p1 zmirCmeabTQbaW14XeQH9Y-z(j;OBLoB)-`*SO`2ysxi;?ro{>Kv+!*(`tc-B<%^`D zjm|>+FHPNdAtaqgkatMGkD&BfxzyCg;%_}1IN0zp7fia+O#uzB)}gGhf`1G96ca~W ze1jGJ6l)Q2_mJcMPDg>k!odM5HoWoM=2G zF6hhnm`o92^*Zy1wCecWa~Iq`hPm#V^+jW_N9^pK?GM>`h@gkIJMJ19%=In>l2_nS zW6~BB;LvHb6KYC))OVR?I=R{dD!vAD=eUk9t6#rXfKiu{f|8wyesf^y;bE^*Vfq3{ z7w;UpCRf}cCECy#(h~j7)Y`5e-faTUr9R5XFf~5Md{gY17}cxaPVuX_?Wbfb^W#?R zE?OS!E_H78wcyJ}?icQzrv>03g3H6Wd0+WV&9oKGNGi5(nn+|XUAN-b?nZ-H4 zZ+V>vB1!-FE#p2`U%)!<>VF7o2RyB3OG|FjvzMb`H8qz2oOX9mMo+qF@IAYRol8nI z3zYg+vo)jR7iq#r6pp$4=CtK zqE7kSx4++*P4vk)G_{V-@ih?>Va}o;d;2rTrk-1s*tR;k)zy>8ldgjF?ez1nndG2l zXcn`gS8_Qjpw~`ojPwNg2`x4C#T+r8mC0UEa7gJ-mc89wUjkGW3{ud4A6G5UL!1_G z`F!4=IN^RUJ`66=$?>U$a^-aEs33LJ+X!E3r0kC%M-E88xPSGx3t4N$W{*!yB=dMK zfyhKQw#t0uf8?OfP1g@(SU9T~zpD0*;A zGvR0a2({BryW0+b7HotjpAPJ>V@*BqsQ0{4i-k)uZ7;sDY5;1Vaopoi22^8H6L<6B zm-rb)5fRzhMiv$~?V(CcOe4w3&)w_lpS)IBvpPr^q=iF3egY|VhSv2zFwoXEZVf2k zID=VROV-eEEG<1cL^3zeXS7>cUpJC4-re0bW}Tax^SncCoCn?UWe!$WfF|(UeJU`% z*@v|?k*`?P^YQ=SqRluFnBCsksB?ewBd2PtzaMMmg^P^+Ie7NG&70AJgXgo>z9uEP z^+8$ARz1xP7*LRta|DQCFj_+?QqzKbS2V|oovyhoYTyl7HD9>hq#}0L*7g;DqZFId zh2W?(nKbM6{n<)+ZSBmz!IQCb@Y?*Nsin+Y{jIbFB>O4TVxQEM>O_0B6bg@prq zQg=?jrtLvb2gD)s#}8DVb!^0c@fx<3^(3}Pvk|1n_N!I)_w_4K|N04amnbO_1V9M9ez^vD0)h~bBCB3r#;3{d zxy01^Jds98!u7#Oiz8v7r|AqNg(6bouW0>;WK^^kNWchxzItVl_ht%aYhu-}ucLqb z1k?xyOn4)(%?LG#)lGy0pZqi10nK_T9i%f0b93Z6hZcnQ*RaN0?Cex!{>=YYQ!&sY z;04cb4^Ol*pXHP1%e~|t)EsY+|N)E2jdyWkCa@z}Fh;6~}=t&G+vWa{&KX=DQ z*-YuKf_H2)6%D0#$#3Sc>(sw2&1i2jPr?y*^!J+e`f$a!w@*xb z9W4Aj0us09h-qPb?6(x}mRDMb9C4T9;jvK1_sSBs6)b1N!LVz=pKR&I=86k>jXu60(ZF=hL0xSe&v~XJ5hMsPGt_w7)dLT zPSK$BGOLlp0jd>mB#1y^R#lSwB`4=$J@l1QVV82g2{$c+1>y(n=a_A*t=S^{Z`I3n zodLGwjPKfMeV3;zV|yZ6T_sJkK&ugM8U)k{qDr>%dFbRQZVRN93l>$)@3E!Jb#L|TU5X}5m= zzFFI-EM5h(qG}*KcbGNUXQ`{>78mOQ58S`astj1DKc>SIO_TzC2T7axfrYjeNH&0I zInQkK^75*{uLaC##tdHd%6`2BvtmWjK3J$KnvxO(R>BF3f6Te;k>?{_7&2()YdtY+ z6BSBD8i8qWM>8!Wwx%IG@Ps9$-i-#dBPL-jeEb1HLW*nnNTDW(@lWF~oFrb$tf(W^vvq<`Dl- zDmXqn>Fw{Or=tzzdICQ%ImyLF2?xO<#z7{QaL*XP_tyeT`&q+@u&pdq-7E<3bieUs zn*jKNAdq9--5osig!K*Cn36Sj4o6U4czAf!`zgU~VK)-^x57q-M)D&2*^TGM?IFLc z$H5}m(b2iY&?)>rD>IueIMmL;VZ<$6c4hd8*>;Mp$}}^)zYNqs>39p>eJb8YTG|38 zwmquX0N;v;&-(q_a1EkJtD_ZEWjI*aS3#GEg~McSS^_Np zASzzieJJnSki-IC6<^aJJpN-l%Q2=6dH}IWfMxy|V-Ia0x(CivuLPg?Y;g9E{v zd}L(g?ta>ruV{eJ?`@lapulGg3}CU~Pa5IepL@IKM@|wShn{%TbFnQ6Qj{d!Z{k9c z5TB+n697Xr15YsNn&iYy-sYz0fxcJc9*C${h^GPMpm*)i1O#UN+$`xh;}+g9aD^(Z zswAM`SNEDId;bJ_DUoMhyj2?L9q~!s{*G^9ouq zj1B=nEG+>r{C|fTdpT>&V|GEi>w}qCZTe0`dZ?dErJ%qEpxx|cgu8L7a0htR);s@4?oG+z02 z3g~|q>@6;)*}r8bN4ednATT4Sk}{R@;?q{5jPAzTo_=HJT^;GFhU8EnIhxAH^Oibh z`7-`@anh6Azk30Al1#-vmxqq&(AI$TWY4#%F@M5bISW zeM)ryD$+=wmSxY2eygbURFCVWA4TRPb+ECdt(mfTWKDcH9X~0kn8Qgc$Y|`%pL}`6 zJXpFyL>(v|5W1vJ`d00U)Ogpdc9}dk2V**yc(_pV%k&sD%|h>Sw@?BaZXEt@X-Op5 z+Wdeyx3Iy&&dqdhe1ED}S=kq*!p58DB(3F}VM{)OFw%_D4rs_>&R0b5!nPn8+S>q> zs-aGy&m5vLl9}X9-#H26@q@RYCd%o+4>uN48o_3|6SpRplFMc+K*emNFzoEzof$k$ z7M~zct2c;*6Ks7|$5~J1CqRc0+R6Br2l5yHQmH%Tc)7Zw6cR>q|gXpbr`c92jQRid=t zY&VQ6ZVw=;O4R{mJKyc773go@Uh{#>p%>3jL|dL%VcVrzLRE;3^^db51gw zK5iasHz10baOo+7z&VEjDQ!MACp|+o3#q>{XI!Zk`9WA(QT^5rRAC1uyLsKJWc=Mz zNO>S(n5Z$&bk`^U_X|T=sKDZCEs38x2)xxW5 zkZ#uh_#0=ckHr*dKcIzL>;za_Vck!4+v zFNWcddt}d)#s83j*9QcwR2@`({rx-JJ3@+MeINWJGpP`CpQVF40Y--`)Yk37uHP*p z5B#2{G!-z4ANc6dw#ef=w|WPDjiNJf|7!pBRj2>|N7K79!~Hc~d0?6bqpks_siC2r zX3=U>jIgHE{mZ9^zIMu!)!{Y>6bW!T|t6($UkSTO#q>2S zZ(Dtxl8mVhc%hX0Fy*~{eG>O*c1YH@0&dr;e5Jd z+7Q6%=AF0f=kt@6$mRQ5kZD!MNKu|Xeg1E*XcJJkgG~+mXcW2s6C5?3FRs|n(w}sy zr3EyG`xf9tC+d2a}I`ldldutq}3Z)ssRD@MG-xCvsgoJ6QV7p-n{Nl$#M}XPf zi_%+2;kIAfzOb0lylC$Xyf-qh$GK^1#iKB6!{KG3bp-ZxeNTT`f2+tJ@2!-$xp5ZCDUk(HCJ zWABmVMr-fr3f@oAgap-)5OF_&B@px3aCEu_qFxmRXaI+6?G@BYK~d2{b2HJ=LSJa_ zx1a37jl=g*$^rs2UiVnv05AmuZ9!}4N3C&?DdoXxo@f#Mn5eG_Uy5M_s0;rDW-RXi z8+qD^$_*PiIGFZthrpM4kv zjNfx}LrY6i?P15RSFSvC?N6AQXLXX-u(6@sDPIUQSsC`VS~FPCMR#YDqtE6)kcO3C zcf1o27f+Y&;(a~|jqE+JPJLj!TP;RWs1Fk{6q4<7T-r+-F%K&HN%9N0MrqALg@uc!qI@AkVzL4C;^$xDE__easUf#>4^PIM+ zA09tB_1z-agQ%z=dgzcPr+cTgXQprHxRlOvPkbOSvR7BXU9ZYz9kcyy2!Ja7iUQt+ z{EGFhxz%sIY_zg}dA-%&=KmBXeLflx)(yzU zh>a?jB(7nKr^Sy;g<^xBGG|NA>$9{;h!3dxa1{kI&rgO;_K5yf*-eD=XcLjZtb!1~=z_$dx1(_jv}& zy@DMwTMjm5*HPPk58B{`NAwZiPyKQuR_#G4J6Xi z(HEgr3~ii)KuU3S^N+&Qr9oW?W@ct~;U5oRCm|4j%x2|0uXcOB%B%|P>5uwCQ-DPh zOG(AS$%#K9?0ke6fF{qDD*?i6547$st^AX$>x|CK?v`+fS1fr=KqRq&0hZec2-g8} z2RAo$m+8{9rbjQm5~P-BS(KDwf#0d5vaHel4NYSj0^D?AG8fpHP9Qd3za0Qq2sq%# zo&r}F78dI5X5)<`g4?raOYjSGwYttVh8zO?7DZ-NvA`^)&c@5A({!1jR4@vk+P$-r zd^PWE_p9eump4!wfEimFNlU9>EUmao1xt6og@?jBqtF%RC*`~KzE?mFd4wE#ba^?;uQ<&1DMMOwRerQ=}Y6p)wl0PBwcP2bf9-p1xJJ0c+3+j(~FZzJMj;UCxMy|P;$unzv zxPMHq?SD+K{j7>U`!jc~0}UQ4r@?y-dz+hIX;ypiDEel%uQ=j=C^l`j)7m9WgH0TU zkqXywbCci`A&!fZ!9P>!Rvj4X`Y#ZZ6yHnVOn__`uM~K9T~>MrVwk6<7ELun~F##$UP- z@CY0k)huguDS-17ZqPV19q(TjX_3h5WuAMBv@nPCR({^|i%V^~vY+{6j3s0g9HMeLy2`&TpqR_!ZY89|+hgpgtRVnz z$}N$mm_L2ohJ^DaR>|X}zr?3Sm%>b{*bJms)}$fMS2+`)FM(e6W=vk3RI)`h2@Eb4 zmDG*((z1bm?*E`>g2y~Iu(o!(X%YEpW^ne;@?_yJZMuvf1y9{B0yifn~_N6~dUGQ!k`gp@0hd)vdY1lh2`2^yEJ4%3B==Q?1KauG>7473aKv*y6HCJe zqcac_+j_!)=E;7vGOV}Iatp|W%C!!x+vf)*C3QaEu6cqDe`?JC#Oq__x91~RnQ&4Oc$!xJ{Fv4ZC%MgU2t@&S;u-f#S`HY ztEs9n8f#X&v<`gbv1fSUj)$285YPw|!1rfo;}FFcuV6y4u1f8X= zy##nQ6g6$uck4l>!G9>4y`x91XQ;Z^N7wDWadQ$X33cG&frSKU#~8jJ=H~ok{him; z9D-k2)_o1*)6tQYSh)vOB9c;NMW=$9BQCYob>F@=^*nrHFx zG@sEi&{{uLe40@?(|+m>yr3_eHMlCx>f7dqhY>N5pSi9lgBWEpkbz5VMW1X_{Exvn zh+*v!&^~G{)HA;#)zr5L5BctFU|}%_PWFX&$I-1_rywS3#<9%S7THiui*k}PS)1%} z_j?F!aHv|NM|gH1d|1=BWnCfMbW%SlUS2|ULVbM&#-^d6u1p#wnKNEaw;(LF{yq@i zJCNF_e36E4Tiw`brMk()-Oln*jZ_ExX}B+b|FwptUhgnE*KYyx9V*Nr2#%i?=n-#6 z{x{s-fRjJ5kBXy2V`Ih2I5bE@b#bu`l{N$;$UzVUaacRbaOLCci^7fB!TDM;SAMe_ zGGr~XPu$8OerefkM??K1%|ifd4n+1}?bUAqW(}Hhj=Y%D3qbVN0>%a|t~cy2_ah@B zCJqqhcRMnCTinSI+wyE)K;Hq%u2$hPi`{jq`fJ zq~q?Csg;$Lq2axL)g6Wm|L12a8xq!z_g!w2g$sFB#(nD5%dM^31P9Vl`|iRn)W-?* z4ct%#bSMjOupvT!GQq>O~f%(`5b1&I+wUat&N?XlidbKk}xtgG;hE2 zDK9TC`o_zwAGO&f)f}HN2<@R}5CwKX-Y%(I<4MOZPpuzS zMrty*tsiPE<#i2Ubd?RN$8v*FI5Pr*HY#eS+16GILqpCjO-UOQ2+)b9MD&Ix?5|<8 z4xCSrWxni;i!=U!jMVP9vX(sKSn2}>^^|C~(sIW%Dh8pk3B(<1ot{MLDHScW)maNU z;f8U3$S~8^M#F;c7%%;z?@=b>j{e=>AC~2#P-#hSd-w2gI|PrCj2ONEtWz_3XZyDydX0uW1NV6Kt&dFHOnK(!_W{u0n9-C3XtZZVLW@bwrYG=%jc%4qL8d5{Us@h{O3=W<_!>v z?=+uYzX|@A0%#aCuV_FLMJLL|k0Q%}6OaL>jWIJd<#$hKoZF}Giuji+Z>GeZ z<{CREQc+O=Ac$<5!JHHj#1cG?Kd14Y+o7Ciz&)BJ@Yep+e*&y?fIUp~oEWDJIj<7ap;@>W!gKf5+EOc%FE8P>kIWZNsbT2N%qoC|ssLD>DlFzob)7jse~r~*=jQ(A{36Q` zfF2YJls|=)ujZ3{Cu5`J)agcVL)s*7(LX-g$IW>UFPS&Uv@9;I;U@BXbDSp18X?yF z`Oi{;PoxXl6-x^}512aU2&<2az!iYS^n&LJEbXdf9TN$%X^O0WNUKsh#MP^#O~_*A z5~(NZ%~U?*!&0k`g~04;ei7X*lb&gES&C{l#!sf4RWR*2Iyos>M&T2}>NyDs`*{6^ zlM`tieY$c&<0!9*yGsp|u=a4WBY+;kO$4MNeTie|-~bqna3e-ay!+F}AlF#)GnfPJ zVep$nQz%@#6cmu*X77dTl+G~sP+A5iGQt22GqstGDcnL30B~lSLT;&4s~iV{4_%+@v%%J8&Wmn&WisSPg5TN)#Zp+;-M)TxbxS+89%8x=)AffWj(NI>?s05*FeL<#QXqJ&v%_^)nFkY22>xkKDq`(KHF*m z>U*v&=)ncWA~`%;9+Gx+lu}lH+0hI!Yi97`O{ayWqGX_pC>>3p#%iPN(p1IKeu<-^ zqVvhlTD!|yTG|#4E}&{9t}i<)%aFb)DJ}_974hIpLxV@P1ZC;1iFx_YpKVfM!|YsK zVA!jp9GC!s;g65Ti2{M7vOrjUJAYz5E15^9U1WcG%%0`P^n%`5E`0i2rTN?@S_IC8znCxkZFO)aU^2Iz@Xsn z-|@fkZsjRPwL`6}je#pGSL@!Dg-;B_MVAUOs0M_L;v0{UvLKD!p4ZgUC`Mbo3`>OD zJ8CTXMgC))JcH$@hlc>MG;~R{*zx;Wj7BruEN5L_SYbGj>7HZqb(^MhP+pnHHkcuDa<+)=)uabE6U1Szf=t{ z=p47=CVzf?NX}ty5L9*wJftr_4y+6Q0vOiV9{rVBo!W$Kq(xg`KFT?h11(;XAXuLR z%nVd{t{^6d8f*ex`O@-|c)Ljf46oN+#A=>k8a+FE4Z+cd0oj&5LC`zh*3xlg$)Ahg zTdn`X;&qbdQ6u)7VE&tF#!V>`&v=9{2T}N$o?gPp=zIbD3k&rty;L9*Y*prjj-No2;cEj=H|SzNOxA$4xnM3LnJ@? z3~pGW2j@|W_5$IGW@>Er_aO{>%~q?mOtXQJ)M` z9a-NmV+?*F&vA)wQ&W%`W(V|w5;~oFG+4odeNi=?DQrx!x*(mxg}WO($~+pkIF`Hj zcF0db+vJrzwNae^V^StE?&H(sTEHO!$R}{d14va6CUWY-9T2? z2e5!ZbQ_4B18pWCB4>es`UW|+&~o8)GqGq7IMc?ntzQvihsS#`hRb!zhc)!MNj{zBVkd5=;N##$w7Tt;EQCJ@YkfFL% zjZu@*YuylWOrwZaq(ce6TzxYp!5jGz})2`xlp|S|hpM_^-YT zpktQQ5+?lZesO(5I2sag)(;~fo-Wcx*Qu6VeYgTDOGmp=M~W+fpT0b04BAR<9UXo! z@b(`a0P`E{3ao4u+&Ot5?P2+BW0hX54aOA8Vr+7|RdHDfn*U=XmdGV0`}jg*;~H5GeR3n#bC z39C?Z@OLj@3ksn#Lr*UwLr)-me0wg^gATiX0)({#gW?=pp1!F7w~3iv#$GuUc=Nh4 zf9#Hkj&GERt*k^sKq52PAIv_*o$^qFQhI z&Pf^J2nM~YwRebFjKXqJ3V3a-y>8I(o?&C*-9m7*7HZrp!E6kiP-l;WKBDcB)5oZOeB%Ks&^@Hlg1pvKFN#W(w+R5+}7VdO$y~;8&BoXD} z;9wkt3)S4xruc^U6g8r%nnzJVTIyUcR(is+P^w6sg>mGsleOGE|0e}>rxB5nP0Xz5 zsp;?t2u9UQdZ>zD@w+U;pHU^x#Y^3hOBi`cI{aDf*+_Gf^$xOiysP-IS5(ATdMrH5h#>5)9zrq;!! zc{TO*f^0i->gm8vRFr2Z7*LfISuAA7pZW@s1z}`-WZL28vS9f$lf5xo zZu-#0#f5-WTdZy$?$!cra(S|VAeg&_hKQ#(oBTqj4EitZ*iWynPkmvZLWKJH+qC

3cRl~fiLeJe%s$&H9m($;=- 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 Y)?zI>+}4_(<_*5VVbenobx;4}pT@Wn*#H0l literal 0 HcmV?d00001 diff --git a/tests/engine/render/jsx/instance-sizing.test.ts b/tests/engine/render/jsx/instance-sizing.test.ts new file mode 100644 index 000000000..472e8f43c --- /dev/null +++ b/tests/engine/render/jsx/instance-sizing.test.ts @@ -0,0 +1,49 @@ +import { expect, test } from 'bun:test' + +import { Component, Frame, Instance, Rectangle, renderTree } from '@open-pencil/core/design-jsx' +import { computeAllLayouts } from '@open-pencil/core/layout' + +import { getNodeOrThrow } from '#tests/helpers/assert' +import { makeSceneGraph } from '#tests/helpers/scene' + +for (const flex of ['row', 'col'] as const) { + test(`instances fill their parent across inherited fixed ${flex} dimensions`, async () => { + const graph = makeSceneGraph() + const component = await renderTree( + graph, + Component({ flex, w: 280, h: 100, children: Rectangle({ w: 20, h: 20 }) }) + ) + const parent = await renderTree( + graph, + Frame({ + flex: 'col', + w: 220, + h: 180, + children: Instance({ of: component.id, w: 'fill', h: 'fill' }) + }) + ) + const instance = graph.getChildren(parent.id)[0] + expect(instance.width).toBe(220) + expect(instance.height).toBe(180) + graph.syncInstances(component.id) + computeAllLayouts(graph) + expect(instance.width).toBe(220) + expect(instance.height).toBe(180) + }) + + test(`explicit instance dimensions override inherited Hug ${flex} sizing`, async () => { + const graph = makeSceneGraph() + const component = await renderTree( + graph, + Component({ flex, w: 'hug', h: 'hug', children: Rectangle({ w: 20, h: 20 }) }) + ) + const result = await renderTree(graph, Instance({ of: component.id, w: 120, h: 80 })) + const instance = getNodeOrThrow(graph, result.id) + expect(instance.width).toBe(120) + expect(instance.height).toBe(80) + graph.syncInstances(component.id) + computeAllLayouts(graph) + expect(instance.width).toBe(120) + expect(instance.height).toBe(80) + }) +} diff --git a/tests/helpers/canvas/instance-sizing.ts b/tests/helpers/canvas/instance-sizing.ts new file mode 100644 index 000000000..60801e93c --- /dev/null +++ b/tests/helpers/canvas/instance-sizing.ts @@ -0,0 +1,65 @@ +import { Component, Frame, Instance, Text, renderTree } from '@open-pencil/core/design-jsx' +import type { SceneGraph } from '@open-pencil/scene-graph' + +export async function createInstanceSizingScene(graph: SceneGraph, parentId: string) { + const library = graph.addPage('Sizing component') + const component = await renderTree( + graph, + Component({ + name: 'Note', + flex: 'col', + w: 280, + h: 'hug', + p: 16, + bg: '#FFFFFF', + rounded: 10, + properties: [{ id: 'message', name: 'Message', type: 'TEXT', defaultValue: 'A short note.' }], + children: Text({ + name: 'Message', + w: 'fill', + font: 'Inter', + size: 14, + lineHeight: 20, + color: '#252A31', + propertyRefs: [{ propertyId: 'message', field: 'TEXT' }], + children: 'A short note.' + }) + }), + { parentId: library.id } + ) + const board = await renderTree( + graph, + Frame({ + name: 'Instance sizing', + flex: 'row', + w: 'hug', + h: 'hug', + gap: 32, + p: 32, + bg: '#E9E7E2', + children: [280, 220].map((width) => + Frame({ + name: `Container ${width}`, + flex: 'col', + w: width, + h: 'hug', + gap: 12, + children: [ + Text({ children: `${width}px container`, font: 'Inter', size: 12, color: '#626975' }), + Instance({ + of: component.id, + w: 'fill', + properties: { + message: + 'The blue feels right. Give the date a little more room at the bottom, and keep the quieter version for the print edition.' + } + }) + ] + }) + ) + }), + { parentId } + ) + graph.syncInstances(component.id) + return { boardId: board.id, componentId: component.id } +} From e50df9ffda8eb4074652de84a3dcb1eba9638e4f Mon Sep 17 00:00:00 2001 From: Danila Poyarkov Date: Sun, 13 Sep 2026 21:29:48 +0300 Subject: [PATCH 2/2] test: cover and document inherited instance dimensions --- packages/core/src/design-jsx/reference/authoring.md | 2 +- packages/docs/reference/design-authoring.md | 2 +- skills/open-pencil/references/design-authoring.md | 2 +- tests/engine/render/jsx/instance-sizing.test.ts | 13 +++++++++++++ 4 files changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/core/src/design-jsx/reference/authoring.md b/packages/core/src/design-jsx/reference/authoring.md index 89bf846a2..3b421fe26 100644 --- a/packages/core/src/design-jsx/reference/authoring.md +++ b/packages/core/src/design-jsx/reference/authoring.md @@ -35,7 +35,7 @@ This reference describes scene creation, not React DOM output. Use the `render` - Child `propertyRefs` connect fields to stable property IDs, for example `[{ propertyId: 'message', field: 'TEXT' }]`. Supported fields are `TEXT`, `VISIBLE`, and `INSTANCE_SWAP`; text and swap references require text and instance nodes respectively. References do not depend on layer names. - Instance assignments use the native string values (including `'true'` / `'false'` for BOOLEAN properties and component IDs for swaps). For example `Instance({ of: noteId, properties: { message: 'Updated review' } })`. Assignments persist through component synchronization; unknown IDs and invalid values fail rather than silently creating inert overrides. Select variants through component-set variant props, not through instance property assignments. - Reuse existing local or library components before recreating them. Keep meaningful text, visibility, and swap properties exposed rather than hand-editing cloned child nodes. -- Distinguish a main component's default size from its instance's placement constraints. Verify the actual instance bounds in narrower parents; a requested Fill dimension alone is not proof that inherited sizing changed. Do not compensate for a sizing mismatch with guessed heights, clipping, or manually positioned siblings. +- Explicit instance `w` / `h` replace the inherited sizing mode on that axis; omitted dimensions retain the main component's sizing. Authored overrides survive component synchronization. Distinguish those placement constraints from the main component's default size, and verify actual bounds in narrower parents. Do not compensate for a sizing mismatch with guessed heights, clipping, or manually positioned siblings. ## Verification diff --git a/packages/docs/reference/design-authoring.md b/packages/docs/reference/design-authoring.md index ca61b2d0e..36395a9f6 100644 --- a/packages/docs/reference/design-authoring.md +++ b/packages/docs/reference/design-authoring.md @@ -37,7 +37,7 @@ This reference describes scene creation, not React DOM output. Use the `render` - Child `propertyRefs` connect fields to stable property IDs, for example `[{ propertyId: 'message', field: 'TEXT' }]`. Supported fields are `TEXT`, `VISIBLE`, and `INSTANCE_SWAP`; text and swap references require text and instance nodes respectively. References do not depend on layer names. - Instance assignments use the native string values (including `'true'` / `'false'` for BOOLEAN properties and component IDs for swaps). For example `Instance({ of: noteId, properties: { message: 'Updated review' } })`. Assignments persist through component synchronization; unknown IDs and invalid values fail rather than silently creating inert overrides. Select variants through component-set variant props, not through instance property assignments. - Reuse existing local or library components before recreating them. Keep meaningful text, visibility, and swap properties exposed rather than hand-editing cloned child nodes. -- Distinguish a main component's default size from its instance's placement constraints. Verify the actual instance bounds in narrower parents; a requested Fill dimension alone is not proof that inherited sizing changed. Do not compensate for a sizing mismatch with guessed heights, clipping, or manually positioned siblings. +- Explicit instance `w` / `h` replace the inherited sizing mode on that axis; omitted dimensions retain the main component's sizing. Authored overrides survive component synchronization. Distinguish those placement constraints from the main component's default size, and verify actual bounds in narrower parents. Do not compensate for a sizing mismatch with guessed heights, clipping, or manually positioned siblings. ## Verification diff --git a/skills/open-pencil/references/design-authoring.md b/skills/open-pencil/references/design-authoring.md index ca61b2d0e..36395a9f6 100644 --- a/skills/open-pencil/references/design-authoring.md +++ b/skills/open-pencil/references/design-authoring.md @@ -37,7 +37,7 @@ This reference describes scene creation, not React DOM output. Use the `render` - Child `propertyRefs` connect fields to stable property IDs, for example `[{ propertyId: 'message', field: 'TEXT' }]`. Supported fields are `TEXT`, `VISIBLE`, and `INSTANCE_SWAP`; text and swap references require text and instance nodes respectively. References do not depend on layer names. - Instance assignments use the native string values (including `'true'` / `'false'` for BOOLEAN properties and component IDs for swaps). For example `Instance({ of: noteId, properties: { message: 'Updated review' } })`. Assignments persist through component synchronization; unknown IDs and invalid values fail rather than silently creating inert overrides. Select variants through component-set variant props, not through instance property assignments. - Reuse existing local or library components before recreating them. Keep meaningful text, visibility, and swap properties exposed rather than hand-editing cloned child nodes. -- Distinguish a main component's default size from its instance's placement constraints. Verify the actual instance bounds in narrower parents; a requested Fill dimension alone is not proof that inherited sizing changed. Do not compensate for a sizing mismatch with guessed heights, clipping, or manually positioned siblings. +- Explicit instance `w` / `h` replace the inherited sizing mode on that axis; omitted dimensions retain the main component's sizing. Authored overrides survive component synchronization. Distinguish those placement constraints from the main component's default size, and verify actual bounds in narrower parents. Do not compensate for a sizing mismatch with guessed heights, clipping, or manually positioned siblings. ## Verification diff --git a/tests/engine/render/jsx/instance-sizing.test.ts b/tests/engine/render/jsx/instance-sizing.test.ts index 472e8f43c..336aad266 100644 --- a/tests/engine/render/jsx/instance-sizing.test.ts +++ b/tests/engine/render/jsx/instance-sizing.test.ts @@ -6,6 +6,19 @@ import { computeAllLayouts } from '@open-pencil/core/layout' import { getNodeOrThrow } from '#tests/helpers/assert' import { makeSceneGraph } from '#tests/helpers/scene' +test('overriding one instance dimension preserves the other inherited dimension', async () => { + const graph = makeSceneGraph() + const component = await renderTree(graph, Component({ flex: 'col', w: 280, h: 100 })) + const result = await renderTree(graph, Instance({ of: component.id, w: 120 })) + graph.syncInstances(component.id) + computeAllLayouts(graph) + const instance = getNodeOrThrow(graph, result.id) + expect(instance.width).toBe(120) + expect(instance.height).toBe(100) + expect(instance.counterAxisSizing).toBe('FIXED') + expect(instance.primaryAxisSizing).toBe('FIXED') +}) + for (const flex of ['row', 'col'] as const) { test(`instances fill their parent across inherited fixed ${flex} dimensions`, async () => { const graph = makeSceneGraph()