From a92724d5e149d8b4a77afd676ae5d0a8cd0d73ed Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 1 Sep 2026 14:06:32 +0000 Subject: [PATCH 1/6] Add per-component appearance, composed shadows, and hover styling Appearance could only tune the dialog surface and backdrop: the title and body had no color or opacity of their own, the border had a color but no opacity, shadows were fixed presets with no way to aim them, and there was no hover styling at all. appearance now scopes color and opacity per component through surfaceColor, titleColor, titleOpacity, contentColor, contentOpacity, and borderOpacity. appearance.shadow additionally accepts a composed shadow, so both strength and direction are adjustable without hand-writing box-shadow: angle picks the direction the shadow falls, alongside distance, blur, spread, color, opacity, and inset. Presets and raw CSS values keep working unchanged. appearance.hover applies overrides only while the pointer is over the dialog, and only for dialogs that opt in, so every other dialog stays static. It reuses the color and shadow options and adds lift, scale, and duration. Hover rules set real properties rather than redefining the --fd-dialog-* custom properties, which are written inline and would win over any stylesheet rule on the same element. Hover transforms honour prefers-reduced-motion and are suspended while dragging, where a lift or scale would otherwise resize the box the drag logic clamps against and let a dragged dialog escape its bounds. The richer options ship as an opt-in capability behind forgedialog/appearance, matching dragging and animations. The main entry enables it automatically; forgedialog/core and the single-purpose entries keep a lightweight applier, which holds the alert-only fixture under its budget. Only the main entry's budget is raised. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01MtJ3nDatGiv7dHjvZL1uZ4 --- CHANGELOG.md | 20 +++ README.md | 44 ++++- demo/index.html | 85 ++++++++-- e2e/dialog.spec.ts | 51 ++++++ .../alert-dialog.png | Bin 86697 -> 80774 bytes etc/alert.api.md | 9 +- etc/appearance.api.md | 70 ++++++++ etc/confirm.api.md | 9 +- etc/core.api.md | 46 ++++- etc/forgedialog.api.md | 45 ++++- etc/prompt.api.md | 9 +- package.json | 17 +- scripts/check-size.mjs | 5 +- scripts/check-subpath-apis.mjs | 1 + src/appearance-entry.ts | 13 ++ src/core/Dialog.ts | 7 +- src/core/appearance-basic.ts | 62 +++++++ src/core/appearance.ts | 159 ++++++++++++++---- src/core/appearanceRegistry.ts | 13 ++ src/index.ts | 4 + src/theme/dialog.css | 93 +++++++++- src/theme/tokens.css | 9 + src/types.ts | 63 ++++++- tests/core/appearance.test.ts | 89 ++++++++++ tests/core/capabilities.test.ts | 36 ++++ tsup.config.ts | 1 + 26 files changed, 894 insertions(+), 66 deletions(-) create mode 100644 etc/appearance.api.md create mode 100644 src/appearance-entry.ts create mode 100644 src/core/appearance-basic.ts create mode 100644 src/core/appearanceRegistry.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fecef3..94d8ac7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,25 @@ # Changelog +## 0.7.0 + +- Added per-component appearance controls: `surfaceColor`, `titleColor`, `titleOpacity`, + `contentColor`, `contentOpacity`, and `borderOpacity`, so color and transparency can be set on the + title, body, and border instead of only on the dialog surface and backdrop. +- Added composable shadows: `appearance.shadow` now also accepts `angle`, which chooses the + direction the shadow falls, alongside `distance`, `blur`, `spread`, `color`, `opacity`, and + `inset`. Presets and raw CSS `box-shadow` values keep working unchanged. +- Added `appearance.hover`, applied only while the pointer is over the dialog and only for dialogs + that opt in, accepting the same color and shadow options plus `lift`, `scale`, and `duration`. +- Hover transforms honour `prefers-reduced-motion` and are suspended while a dialog is being + dragged, so a hover lift or scale can no longer push a dragged dialog outside its bounds. +- Added a `forgedialog/appearance` entry point. The richer appearance options are an opt-in + capability, like dragging and animations: the main `forgedialog` entry enables them automatically, + while `forgedialog/core` and the single-purpose entries keep a lightweight applier covering + surface opacity, backdrop, border, and shadow presets, so the alert-only bundle stays under its + budget. +- Expanded the demo's appearance builder with per-component color, shadow direction, and hover + controls, and refreshed the visual regression baseline for the taller page. + ## 0.6.0 - Fixed focus trapping skipping over targets that cannot receive focus: hidden inputs and anything diff --git a/README.md b/README.md index a199edd..a4fd9c4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ForgeDialog 0.6 +# ForgeDialog 0.7 _A modern, lightweight, and highly customizable JavaScript dialog library for alerts, confirmations, modals, drawers, and interactive workflows._ @@ -111,9 +111,24 @@ const dialog = open({ opacity: 0.9, overlayOpacity: 0.55, backdropBlur: 12, + surfaceColor: '#12141a', + titleColor: '#ffd166', + titleOpacity: 0.95, + contentColor: '#c8ccd4', + contentOpacity: 0.8, borderColor: '#7c5cff', + borderOpacity: 0.6, borderWidth: 2, - shadow: 'xl', // none | sm | md | lg | xl | any CSS box-shadow + // A preset, any CSS box-shadow, or a shadow composed from its parts. + shadow: { angle: 135, distance: 24, blur: 60, color: '#000', opacity: 0.45 }, + hover: { + borderColor: '#9f7bff', + titleColor: '#ffffff', + shadow: 'xl', + lift: 6, + scale: 1.02, + duration: 150, + }, }, draggable: { axis: 'both', @@ -132,6 +147,28 @@ dialog.update({ appearance: { opacity: 1, shadow: 'md' } }); be constrained to `x`, `y`, the viewport, an element, or a `DOMRect`. Bottom sheets keep their dedicated swipe-to-dismiss gesture and ignore general dragging. +Colors and opacity are scoped per component, so the surface, title, body, and border can each be +tuned on their own. `shadow` accepts a preset name, a raw CSS `box-shadow`, or the parts of one: +`angle` picks the direction the shadow falls (`0` up, `90` right, `180` down, `270` left), while +`distance`, `blur`, `spread`, `color`, `opacity`, and `inset` control its shape and strength. + +`hover` restyles the dialog only while the pointer is over it, and only for dialogs that ask for it, +so every other dialog stays completely static. It reuses the same color and shadow options and adds +`lift`, `scale`, and `duration`. Hover transforms honour `prefers-reduced-motion` and are suspended +while a dialog is being dragged so they cannot push it outside its bounds. + +Per-component colors, composed shadows, and hover are an opt-in capability so focused entries stay +small. The main `forgedialog` entry enables them automatically; a core-only application opts in the +same way it does for dragging and animations: + +```ts +import 'forgedialog/appearance'; +import { open } from 'forgedialog/core'; +``` + +Without it, `forgedialog/core` and the single-purpose entries keep a lightweight applier covering +surface opacity, backdrop, border, and shadow presets, and ignore the richer options. + ## Advanced UI and workflows ForgeDialog uses the native `` top layer and adds typed outcomes, close reasons, @@ -159,7 +196,7 @@ const data = await flow.result; ``` Tree-shakable entry points are available at `forgedialog/core`, `forgedialog/interactions`, -`forgedialog/animations`, +`forgedialog/animations`, `forgedialog/appearance`, `forgedialog/presentation`, and `forgedialog/workflows`. `forgedialog/interactions` exposes the standalone draggable controller without pulling in dialog APIs. Framework integrations are exported from `forgedialog/react`, `forgedialog/vue`, `forgedialog/svelte`, and `forgedialog/web-component`. @@ -178,6 +215,7 @@ application can opt into either capability without importing presentation or wor ```ts import 'forgedialog/interactions'; import 'forgedialog/animations'; +import 'forgedialog/appearance'; import { open } from 'forgedialog/core'; ``` diff --git a/demo/index.html b/demo/index.html index 66a36fa..ee66eb6 100644 --- a/demo/index.html +++ b/demo/index.html @@ -130,15 +130,58 @@

ForgeDialog Demo

>Border color + >Border opacity + + + + + + + + + + + + + + + +
@@ -207,13 +250,35 @@

ForgeDialog Demo

}); const value = (id) => document.getElementById(id).value; + const checked = (id) => document.getElementById(id).checked; const currentAppearance = () => ({ opacity: Number(value('appearance-opacity')), overlayOpacity: Number(value('appearance-overlay')), backdropBlur: Number(value('appearance-blur')), + surfaceColor: value('appearance-surface-color'), + titleColor: value('appearance-title-color'), + titleOpacity: Number(value('appearance-title-opacity')), + contentColor: value('appearance-content-color'), + contentOpacity: Number(value('appearance-content-opacity')), borderWidth: Number(value('appearance-border-width')), borderColor: value('appearance-border-color'), - shadow: value('appearance-shadow'), + borderOpacity: Number(value('appearance-border-opacity')), + shadow: { + angle: Number(value('appearance-shadow-angle')), + distance: Number(value('appearance-shadow-distance')), + blur: Number(value('appearance-shadow-blur')), + color: value('appearance-shadow-color'), + opacity: Number(value('appearance-shadow-opacity')), + }, + hover: checked('appearance-hover') + ? { + borderColor: value('appearance-hover-border'), + titleColor: value('appearance-hover-title'), + lift: Number(value('appearance-hover-lift')), + scale: Number(value('appearance-hover-scale')), + shadow: 'xl', + } + : undefined, }); let appearancePreview; document diff --git a/e2e/dialog.spec.ts b/e2e/dialog.spec.ts index c22c856..7a24419 100644 --- a/e2e/dialog.spec.ts +++ b/e2e/dialog.spec.ts @@ -72,6 +72,57 @@ test('appearance builder applies scoped styling and keeps dragging inside the vi await expect(dialog).toHaveCSS('--fd-drag-y', '0px'); }); +test('hover overrides restyle the dialog and revert when the pointer leaves', async ({ page }) => { + await page.goto('/demo/'); + await page.locator('#appearance-hover-title').fill('#ff9f1c'); + await page.locator('#appearance-hover-border').fill('#ff9f1c'); + await page.getByRole('button', { name: 'Open interactive preview' }).click(); + const dialog = page.getByRole('dialog', { name: 'Interactive appearance preview' }); + await expect(dialog).toBeVisible(); + + const title = dialog.locator('.fd-dialog__title'); + // Park the pointer away from the dialog so the idle state is measured first. + await page.mouse.move(2, 2); + await expect(title).not.toHaveCSS('color', 'rgb(255, 159, 28)'); + await expect(dialog).toHaveCSS('transform', 'none'); + + await dialog.hover(); + await expect(title).toHaveCSS('color', 'rgb(255, 159, 28)'); + // The border is blended through color-mix, which computes to color(srgb ...). + await expect + .poll(() => dialog.evaluate((element) => getComputedStyle(element).borderTopColor)) + .toMatch(/^color\(srgb 1 0\.62/); + // Lift and scale are applied together as a single transform matrix. + await expect(dialog).not.toHaveCSS('transform', 'none'); + + await page.mouse.move(2, 2); + await expect(title).not.toHaveCSS('color', 'rgb(255, 159, 28)'); + await expect(dialog).toHaveCSS('transform', 'none'); +}); + +test('shadow direction follows the configured angle', async ({ page }) => { + await page.goto('/demo/'); + await page.getByRole('button', { name: 'Open interactive preview' }).click(); + const dialog = page.getByRole('dialog', { name: 'Interactive appearance preview' }); + await expect(dialog).toBeVisible(); + await page.mouse.move(2, 2); + + // box-shadow is transitioned, so the settled value has to be polled for + // rather than read straight after the slider changes. + const expectShadowAt = async (angle: string, offsets: string) => { + await page.locator('#appearance-shadow-angle').fill(angle); + await expect + .poll(() => dialog.evaluate((element) => getComputedStyle(element).boxShadow)) + .toContain(offsets); + }; + + await page.locator('#appearance-shadow-distance').fill('40'); + await expectShadowAt('90', '40px 0px'); + await expectShadowAt('270', '-40px 0px'); + await expectShadowAt('0', '0px -40px'); + await expectShadowAt('180', '0px 40px'); +}); + test('touch pointer dragging stays constrained after a mobile viewport resize', async ({ page, }, testInfo) => { diff --git a/e2e/quality.spec.ts-snapshots/alert-dialog.png b/e2e/quality.spec.ts-snapshots/alert-dialog.png index 4546e80f820e6f3c905710a7f37f3cbd3b99d726..5d34c1ce0643ac4b8788f1d08906e62c6452e179 100644 GIT binary patch literal 80774 zcmaI8Wmp{F6E!$!a0%`qxVsGj0t9z=cXxLU?(XjH4DP|*H31UbU3d8X_kDK1?Dm&w znCZTEs!ms(I(6@a%gc%(Bj6(d003kO@gIr+01WsPat00({PLYd5&{4~14#T3RCdog z$^PVTEunH>d3Ks}zxB75ksgjt@CP|#oiV07%U1~q1r|U;(id@97{P?SGPp3F$UtbQ z1ZZ+Iajgy-_QX3gth06-lYmjIwNfT;UCH+#n<`P@TV4|=eIOhZGb8RknF zE07oEKfZyigQ_`I$;Zxi_?w=p>p40*9((7>he4ab>Xg(cv8~y)-fZn6$Nz{)6RahM zN(1OE=v@JDbBiM3+b!cRq7MvrR~BEB0PX_gdx{kas_hf|g1MiET3UyLx5TPtfroo* zZ6s`J`|HDAo-V(AliYD%g!>-UjyV7C8=+}xK~wUBPRdxXVR}Mj+iThvLYow!} zIzlo4BjKg`u2^2yZfU9WQh>JI|6fIr(f%R?yl=`q*k{-X!?3*p%zfv1otKO8Axnb} zF`r0~s{#6k(l1yK&jEbs`z8u)wxiqtcXa+8X^2YEPldh^fD}L!vVYKy4Bc`q6SgW9 z1H~}1{&pV5&X=%-rYo*WF;h|$eXQ|906>2<&jEIYHtrz?PKI+iF_=8acKJ>}H1EBsp>lO6}!2WmU9}R#&s^d0Z zTP986#!E10Xu@LwF~;FoL1}cELYTr#LIQf}!I#kkSgbaV{R4Ix2zuyOxiJWM2U_OX zPm0_ZoSiXZf!;TD$bVOf%`5uLKr=N67<#Mdrq^$_W4H{QNcY|dRq~C@N0^OeP`h+H zp380fw%C+r5T($7GypVnZx+0$%&8xwZwM~zYNc2GdsN1tAuem?YYy3KbE3wVQRwlA zG}n7o_2Yw8N~pi9P3pn}G#gEwoWCNR-#=9bX51{vDC4-c6&VexZ; ztDK`p+Sq&seQm9a;jjwN3_<_7;quzswO-uBjs;*w1>4DqBCS1U?9Ut5 zsQp6DaQ`d_P5_t=1GV%++c;F3Vzt~vHW(EnWYGjxoq6DoDloZh)nuk+jJ`SB+-|nz z`YJ?Fm8MITvUY=059>vah^f)G#@2gQLu93x@qs|CwaQeFAT;Diwyz~f)cu)#bydlQ z8n&r6d|RY=#v^K-rAoRHtrh=-q`tQLslpYw0GIo>H=^@?(l6ZAg)!phHBuo&+ad*| zflF<%#T8%8$?)z{MIrMjwpFW+Y(WdqM*;iyZ+Ih|rP-$Pt8eXg?ciGUu%OW_tW+Pq zr^ul$LOjmypWlIfd#8WfyjVYHGF-ne?ie`EH}e>?j|@3Rm^A#n8<}PxHgYUgS)Z`T zc22Ugic;7}7*wz@QCOjqS@@P*jTn>X1zRc9;3RBvfuoDU>^$08PE+EvWQKm8MqGxt zJ2_LOsnQ+nVjI{hM~tF}Nm)gB@${pzHSAui?@Q$@eGxx;VTNCO@03)>cy5`6Te-O( z@?3 zZq4^0^d$rVP!l*9RRm^RH=bK-$T>OGG(kR}rIQq?6N(8Y!dnb1vurS`O_Pl+>zoUt zdHN4#W(ShmlL~I?O`HYJiV;i`?ssB`1h^Pq9iLbQcFi@9W}ndddhJKQsbd5dudn1*gXG6a*_KcIRmC;3;-{0}WDE;ClE+?!A!7~FGef?kEkqMXf94&{>kBP< zv=uJ><<;kW24TA!dnSj^?){cJbLc!4!(r$>M7Q(UBIw5m>rjbM_)01utNB#x155Kk$KHElv)3?YR6&YG{*sjpA zaja=-gEh$qPs}~JFnhV4M1%3yYEU%zeedvLB zUG)JrrvwsUiVQYYOd5R*Gb|OS&edI)_?&4cZ&mSp}vF=LY@UoH2);?hkjit;=~s!5ojjE5N=f zV$X76d_v6#kc}J`x_uw6*4trgw+{phcOiJtzcd_Y}!+m=y{DqgKT0!A=U8}(bxf1M0>&du# z_)6-G?NY6p1GaQjJuj{W?gp6_hvqTYfR7hRYpWOYUNL!eK({h25Yzyqc z=}o@>c9VhI2?`Hr!B&Ga!N}%SKbq*27zP-!X_gKb)ww&5q*S zow!U^Q!M0Dm0)YK%}5k1xge>e^$gg1T1fX32a&Uqt>li-!diVT71umo;cy|WDAlZQ zmL+uAiz-$WIaszYg)b13&=aLCu7q;2xvh2CSWsbZdR@BgZU?Drtn*}}G`g~;6luVb zZ2D9NLB{YIx+HN^s;uGu#&_{hJk5_VC7lLgSz2js^G0leW);hgLv++7(Vszfks1=I zS$J??G*nXBH0&d_xqtG-k`QA&3n{iQ`aj8xcJ4*#N~qBQ`iitpmbiVYPr{F?7y*C@ zgpcGlOOsKJr@vf;G&;dY^m9{Xioa@ryRS$DAN4!_D+Q$(eo(Qr1vz_NvN$Ch)jptE zji&gf(@VJAQiy7(N|v9PB)a@WA$wJkD^#<=sW8N<=o?Fjls)Yzn&JE8yzlRhBTS-F z!zNwK-WKCOGF65D%EQaGT?||O-_M$zG6~pd2co$D>M)e46le3+V8yIy_kPVtx%9Q- zk+e7(KAK>cdiZxPXTl*@=dJ_ioG+a?S2D$}zSgnif<6qWSbN?H#C5u#+_Ji7YBWRd zG16Ew&A-X`L698%jFi*ks&hr5>gx{y3sGhYc#9@K# zg1Xg}1`7)?c4ffK=BdeEQ5I-7uQt=exnVTn(~$Uv0uHJ4qL=LD-=U!}GIiDPF63#T zsp_1XcFTnAgJB*LI#p3|{}Nh?fe{&mZ4S%tcU7J%Pe>YDrhVkKJuzFOEtru{k4!JkdKjA)%qkLY97kU-JfveocXYxH}55A|P%Ea$~< z7IHtkhVvf%W&a)J(ilEgxN3x~3;?h}LLf2wHAN6zv$#)tI5suvM1OnC%y%{*uZ|>* zv}9Ko(@2os{DFC7IFlBKtevB5*SKIY=;eH5<)A9Ao6>8c0dWCz(GX6J|=6 zvx-i3;H<<-#8w+z1*Ao~zJ}z+;&2P)k!$RvDOfhwaZb9S4n9t_6gsRmvk_7@m;oC6 z#c!ovE6W%DS`o9rI}4qOr^Q+@?~SQ-^1TUnNXxoGYI*Z z&X{a0Np=(OvgW6j4rlmJjwd&&lxB@E!O7;}up%;d^nER)_j@bFII)G2IS1^4TBGNJ zNL3JDht2+1_&_m57`0~nGkzLH8QRYpD5cH%<(VNjg8S!+TD6&V7DkGs+Js?AWE+F( z&(39jw)1hLz!oeSWEemiGMv7D`{z@C^NpmfHu$?@iTpqoEz^UIR9hbwRaz^$C8&8r zY^a)?l*0o70=so%S%O5!4QVlkzn_P&KkcN4s+8F! z2oOOmnM&+Uk_xj7TC{6Uk1xfP1a2ve3YdzN$f}7_i^!A-yiuA^@F!XB(PcERX;R=) zD_v0I!21u{Vg+kCXS|tSP3l@w^eV&Uz z({JkBs$8z_=H5Uf^)u6aB$vLgZ1FD1aC?{xxhg#q9hJ(z3<$--IlGOCN^_&)qOi%9D1Aa6C3C!w4fN_jm^8Gdy)Xhc}k1D06TW&88jXu z83&$M{4{aFn}@L-{-X-qXtD_2|Dy%eARw1(>fduy@bx)`fX8Nk?_Uo_S1K$HW7RZt@frr`R_x6eXATg)9k7{{rb}2)aX={cH0EVt_x1@YB`(TvE%O37yf z*5nYTZhKPBnw-r%{0Sw1hUN4-wr>Js81-56p|-}6X?~R8?W7VJVuxJE@ZA@LZTF6b z(61^B@_L%5C^9gB34Cz&*S?%mNmZ5%ANnV{{I_4ogj2Yn9(RJeveBVGYGpMo$%8|S zg<3U1=dh54Lb4vEF}h*`3oU4+3126!4{}(ZD|@1Z^qNjh&conStrl});A_)lyhPaXA(R?F-CcfS!$lI>j4mh(`z@PC=nCognlGHr+B}P@R1Fx zZ8_W~he87WeiR!H(r+8NH6hIL&e??ufv=6dpggLzFamY~a8bXqD?xQl8(KAEo0E$f zN5}XZy=EJklxDs~m_ru!TXo@iC%yBpK{*AcbFP{oS7<;A3^X%XxSh$|(^mf_p7J8dUcl)oS7prhR z7`0e+q!j6&dnN(~_4NVjDq#44k4P$t?ua12Z1NOxWg0qXcL6pSYiBkTEebxuM2FQt z3mUvNod3-a>Fd&Boe$R2J63N_z9Iw9M&3SYd!W%nJu9n})33;4(_EzSaxJbUwQ=Ra zde5Rj2tXApSPU~~Hni~QsEn~oLV9YrizE0{^3s`wJIG9UZ=~^G#fO^t;$-(UZ)j%)V(z9 zPO6I=MT#<+G|SN7aT2romX588&+CmwYTEj{2^;ZO7+KgbdQ}fKM`{ zTa7a~(Pb~IflUDflOPx}RcUvP8E>3Xlrxnl_u`n_h5GK-#U=a}M26zlAXK-B-!Z^B z7XrKFVMh9>e&R9o_wY5Qae2Iwp-{Do{aW~!#p!4$W!PP^+-Fq)37_YXNvfXfD3nef+~OSbo?@8*>e99+bJB`EOM?2oH=H5^{J?8r?kv(Hc#y`71zlb zV`kv&Qe^Ov*{SvQCCp=8=!4qe^?gZG=>e<6=`PUsPhDxqR! z+r{(QLa|n_E_RWNB*c?>JsTID-sdINj^(KRcP-`@mAULU^W!KhLzwZW4` z`>5$7a5WBbo9tBU^w>ihxwU^xX-Bdd|Gz2KosY%A%|m)2Z=By(pS!J_4P=x9TI@h~ zU}-SX*^^_P6yP5ZCMnoKh}Ml~I5^(sH7lGWRbA_9U2DZgSi(lWe?yyVqRy6w@w=BW zy9>-t^?j;pWA2-a2I8Bzx)i;b;@G@9LRM*`d>EQrLnR`1p+h>%wgz1kf+bDQvnEz_ z3O*dwrdTcd;V4GJB3AZKEbT}&7;K+=$A-QHW8i(1cpP9tPzUf%Dr`8*HsW)7bZ}aA zaC&UH9)Pxs&B*<8`Ol#{Z|p#~x|PnSvo>bPxK8B;s8L8w5xPmcfJNjoXf{$0>rfr- zglpZvkX0lB=g_29-g3sqmLA{nE!jZR+O}9TKBHIf^&7Xk$;x3bo+a!T4+#C!59N^H za0>PEr;n5Ky0+(rw&R3{{);-VPG!5H4Vy%((&N|Lmn`a6&7XpPz64wswf3uqt%x|E zEhbI07JQ43WFLU){j^bY>~EG>h9YOcBRgdi`BXx-$O@!+!vVU*t7Yi7qkqHvwBTqt zfe8jaBs1yKEb;~KlA4&$Q~J2hn~Dv?CJ*mx6qmD4eAQzmod7p;YtSoaLM%J^RC#Bn zI6rN8#`=!CxL=R-T_5uDg6Q1+ne9G`3T$KVhhZBPtK~loyF^&W3IOz;d`RyymdjFR zag8Tjh`H#U;ib2y0d9zK4uUf?|Gf6oTW)X(>w$=Bs6~BxvSo-Rq~C3$DQz<8Nq!I` zLqq{Mbdoz>Q){-{o2+zteTCyrf@bR>g$02y{4RS@Zq>>*B zbaV-|h{+UEM=`OJw{F=ASGH~OtPP2fEa(kmv2oJ1Q^S!)^2c@@uNiAtr6Z$jmB)24 z9x8LmylRmqYoc!$c(Y|&=aVHo&G=C3_~Q9=4qceP;sTbCz;5Y`&v#m?HDnkUCbC(y zJ2k`OSx9!SWicD;3=@XPrm;q>(`hdkY^5_pQ*%j#UGglbQt&Mz@I`fzUVaWSHk4}k zPKPBV?6kLw(h*aEG`yDi9{_~u7LOLd05F?^pcM|CpD6HcZ2|p6Ap&~ug+6F79W%;y4N>6V!6BJf%l@LgDHMLy zb_v1FsJ!GuHPF>Qbu&YCqrcpmB9&b^M(aX+OpD1GrlxdZbW4=;HNMP-ArtnQqYBsw z;mMZ8|2bh_Kbe$J_&Lu%&lfe<+$u=%&ZlQPch*=$QU3V3`RINSL#~br86TH~8Bm1| z4pBopMnsdUBY0R#|D4()8hxJH`X3Q;m`Nit{f0_&n@cVf?2zxZ#f#PpoLS;k=aO(mi6xN8gKh^Slrct-8I?ZZrd6(5^Z_?i6h*u}z}D;f>e?Fc zcktSoxld!4Zf!*c-sB?PnMI|0$L87ZfhA;Xn2QvK?|q%qfI86+Nc!L53F(xASVh#_ zB)O)|_J2A*YOwybGz-JpmoeblJ#er>xL<_lbE;y(hyyjxVyaTDZ8P`?sS%yEQDh74 z!hI&6QYbgxmbLuLsPZu%?Q+$EkNJ??>EJ1+nUC#9-4X9F%ohJdvAKP2QCzSzg99Y6U z1NO)>v4wOL0~Z{yFXCee3e5#vv$Bio!W*}&-r@Op z=v|jBJM!d9@w!;02}_jK%X-lkrBONndJ*^^wW?ztj5O>V`hALce4w#XR68v9X|4J; zh0DWh3Wf7k6-a1?yuMvMw`Mr}RE`ir^iACH;lyLa%2@8)Y@y7%Lj?LK0En zS+jQD&6qP_u4f!TQf{=yQH(}3 zi!PnBJU2=M_c+nPwqtDoJPWV*X6wK!M6J4(UJ3(~M;q`2XTGG=#0P|V4r+#=BY6c&Ht&Hi zf{yQ4qk`gMd|To5JYFE1-BO=KW!Tc=dQEYXzXq+GyGBLCot1@hY|iy!l3B*Max1Lne^? z+B$MJhhCZ#g5AkV|ALANuVH;v00woW5KiBQMfmoFq@`AaA;~JoiYV_F)0$fNyN1%C zRf?A7Mb!Xjkx%R++#Rl|AhcGNYDwHDV8qKes6K#Y+g*BqE=D#>3&19QKBd*OEF;4` zy(mEhp3_|r77^&N)2~>UW=gtVbqGP=k{Uh6*x3Z5L8Uei694rJg^MF`C4X%&6ZkOc zYCfd;x8^Kzhzs$obGRsCWofXxIBYtkpAX;sAA~;E2R*^5XQ7?Vq%l{gPc=7j=WV2J zB4&Olz{((!I-MKX#!YR=9sRXvSAarU-e@l=CPtra*t-$Y(tsEDJp_AQyq%=FE^3%; z$#mb(lC6R9AybXqpdynFWTb<8DrKbtsrKs4fa!rzwdP*1=_8sS);(QR{tL+a>tb@* zCg7X0R|C^tWobl-o1&S+d8e4^4Nt_wNTF)r5IdrQ(>65wtDb^sIq695LV`L`qPYy$ zw?sQrbq9`p$;{xj(nkG67A!H@!jni=Iw!UJq5ce*#cxOj2(~$&^YbtG3h(k~4%1{y zl`D$C3s;gq6d{4ZjEk|t?ekCd7B)YH2x(kQw~(Z!%o|~^mowQY@#0N`Q5iC#XCvvT zF2_o165%yRt{%RssG$AW8gqDRrQLk~T8_fvitjL&K=n1V+Gb%E#J;AF7u^?(crYR3 z_WL;R+Y7~%OTI0g5@~9@V9nnp%QA#^9sHv}fjDKT_J6vNBLru*x(GIe2=X?Fw245u zBYi^Du>*BbA0#w9*2F3BwB~AUU45%QrbGror)eV&Pa$xfwsNCqF|Ie#61%_pE}8V@ za=G1+V--Eai{ME9$oyAl0O(K?oniBCkn5H$ge0xx&)`*X^z~IJlkJ$Y%aRHtQ;Wuh ziXbtxO9c|Gt7E%>;4;+j1-t#ToV6>n56fWvr7yXrPE0%2-Rul}^+kuapXIi2)`Act$y+a( zKODZIt12K8SLxHe(`9-v463Ah)O+EOxe^L{>ygK4QfyD9)Bu4l{g33av`yj&$T;d+ zH=XV~T{9mVlgdkt+v;Xn4q{KYMg0_X(t)04T9EF_5Z0v;tRWJ#-$aSn4O%od6YLhk zj9a^@oq@u%y1=g1X{p6SYL-d0LIlP#4STnBPWX}vPoMjFRM`<}o^Yk*@XN2qU1+(v zO`rKC2X&o{5Kakj?-^L-TnpQzE4zLfd220-4n0x47Yw)jyC9kH6x(2|)3A3D%z^I8 zDLX%zW>OYv^=Y*dIFJuaa3uz)e&iNyixUDXlbZ_QflM{4l*oyoRdQ35x0vasF;vS{ zKoBrQ4EDMyQ38?5Z_}dMM`?(qhY}vWUh}j^-`P{Cg?8Nd7B(R9(fNhTQd;AmsPY)j zCRRCI;i5jd0-}2)o2Qp@7`csdtXqW{sOhr8rBXtUIm8GTZCU-?bEGuG=EzWn8)9BL@Cd!qi!(R;fn0yfu0I45A zwl5L0E%%mHg#~$6UTMk9(>U|=E7g(mIGsm_5*TqJxj%hTnfxO$VLqc$UJ`HGF54_P zY$ErC;NmClK}>bUJNR2Ae?|$;Neq}uRp0%ibNep_QEm4l%y1y;0)F<4IiG1R)&oaL zENIA#vk2N)vr$gJ0jkKsRPXV#j1CJg-E5}erm;iN(m`XWc!YH1TdQ%`4=4`tAWEHx znEHG}(nTFR+C>o?9AM#?X8U@Ku7GG8OsYbZ7;@whE{To`EkPd62D<|4bHa$bD4msb z`N`-XL4B_NM23rid?J%5Vn<;0JQy!q0;k!Y!C6oU%4Q^lAi?;;zq6$ND z=e{vx`6w~<}^TCB7LupcmmI`v{1d6#fp(rIq|_*KGMbok2Mq@?3tW-?=2HXs+p4EFM*c z%T-b6V!vC|`)lX+dQ3PbH(?oCik$$$ygaF~yMppqGO2f#=|rYlUl-51pzAa2YxowN z8_Skjy|>Fs5%HCK#f}zYYwHxlW|7g5gR10(xv$+^6K}d=MdhAsRJU(?JIxzQVl$;g z^%wbLX)-bNZ_55?D;4TQlUzIUzsThrnU!W&* z!_C826rrEr3@I(FoE_Np#Z6$p4cVZIQAnM4erek^*;44JB8+A9_PdC@LKdzB=H9kx ze*9N`#8zh2$cbEng>pWZ-!O8dVkqtQ%G3dtXCC7K6j+A{g=iIz9}t>`O!vC`zo%su zW03 zBp|_;JZEWAU*H&vhE@k=TB1SHn91SsVB_ufPMl^di+){3ybOPSBZ);LqA_q6C?KRL zdT%no?}A@hTJUqqY9E;N-D-1>NOdM1wzdBIF`@#jDb)pj}>2Z z*^{4jl1ccEy9A?62tsnjqs&Q;^DE>-vp8fGOmw}~FqF?`Bm}2s_hc%BaV815Z4b&a z0Yf3On#J1q3Z=7?n8#ybkZo8MH7Ppdf`$TOBiLg2;MNQY!JiMW(J-IejwDUnoP0tl1>3dWxW-L zq6=L{sPIuc&RN$vy;Q>+`rAi7l=2R8)w9zK(W0|{4$6Fk19XhGf5lD@P(^nZoisApOEESW-{w{9x z`-fQUD2zRGw^n$b2tLJj9ZI^jriP^fy#mFP1V=NY5=hPD&%p*|?Ch_KxJ@@AEKyEK zUh$c)%B?ZuvGk5Z#7k0<4ZDq`i!KTy+#|-9q4U(GB6G7s%1#F)4)0A)5{panwTUf4UW^g6W@kc^wPs1SsDJ3YTH7LJ4wpzA0BYTe#cevQ}tf37Mf( z1V9GcLwCeqv$(we`m^NBR}zho-;`dQ8>FL^cg}bTceQ?%%Oy zP({@0gmh)_VRxnTW{~u;rXiV8ftK!}c1cLk{=Kq9ozD$pY&ZR%#dC21-T0Tc zYc_S)Qus3WLWpLCIYC5qqjX)9t;t%7ARCVq;R- zC|DI)l7}Y8^s1^H_u8fYD}9i^SgfN@2HOHar!$sx6beSscO2Do;bC(M0uek+_+BRc zXxIz%(51OjI{U$`a!5pSh4{?`vFV7}+7OXp5ek$B!VDu3rM9k8)uO}$)rM7qm1E_Y zpR~ovn^GQsF1M>_SU2vxrAYRK1b<&XjAa_a3Z8B-QkVnVB;q5dG37&T{=`q2Y#0_V zPpmd%?NK)h$Vkzs=r3q`^}jGT%rY@Hp_2BTy*rL^=ue}xXF*l9uC`1TDMcU7AT{jx z>iGkRJ!bto57jx35mRRGap#uAzJbG%+%gvzpU_ZZvw<6L(*M_JEZ^Siy&3hui*P=E z^wnN8{daqgc3h3}=wju^6I@ER^F|}8>QuUJ<2SB>b>TmGDuxD=fjY-@xn(uhXN80Q zObQ%k^Z5&x6&)gikT{bQybKUk4PL;jl9rmVsZR+wLu1YsgkfOrldp5pI-Qi=XIrj{ zH?WQW!FfJ1lgFQE7%o5!`&yLxxw8l(V`3}$Y6MwTrXa^!3nKx+s@rAimc7KVyi<}Z zi65{Epa1HDXZK1vDtMj_H|UN>)kkM$_o$!RAZ~MOHl+q%2gi^vEU@q*yii)f)b+C0 zf#8t6$X@uj<0{A6K2X_T84r=H#8mkk*6futFU(%0cS;^Z|k>wE49?b*^V6V}OckJ+Th;DZ;9cGw~ zuWe%i)Oo=o!L`V7(v$PT(Z(4r&9@Px%4qBVqXi^-g${ScUlZ^-UT>mS|LppX2UR+s zCc?WLy_mibg09u-b{$&DyAV?fpIQ7OMdnK6ZS>MBq=plTK15`)5i8)b z1;J+elfsO2GLRis@<$b(GdXIi{h-39w*?VotW(&M>R%&-_U5lK)hocpUQ^Ps-A*_SQ*I2@JP0#@SG~~rMR+npa zE<0A>_t?wzMa%$#`9z->J#mM4XDG&L-TZc_W{_qn!S?-u3kKun<%7+H{zemyu4N!u zD<^J^n5FS4u3zrR#zM4>M9Eti?rrc&F^rv?Skp-Gc_%NRcPwB+IwvSK8YCZn?AB!laLW_uL1x{I|w0zFB77g{y87AN?!J9aGH$E2O)B9^*F0dBcYTeQMQ+s*4(sJQMK2urA^RoqIfbYaC z_aXiul7;1fuEs{_WiQ1oHX>EmFhLh2+KSr^%FJG6AB+62!Cfr?vz>I7Xsc|D!1KsD(?w#2RTll*fGzVC&(w_qRLVql6$f7j%ETw{rgW$lvKb>@FJYT6u*VSO-}*f$H2 zR+BUlc~o2Yp6x+hb+@cDp1I&Li;46Xk^@3DY+(Tv4H6a;(5ncxy#L{sh}OFv6{4+^ zya16`?6+3>7lLMqVWpef{W&4t!iKw^0)6evLFck@DDK$Q~an^uTpp4&+5LrW}w0tnW9p>$gb4BXLIg# zjVrS_Kr4{)M}GyV_9*9-LuERGq}q~$_g`kqu;p)PxmA^r7uP=wbC!4fV&d```lINz zcGcRIx{tb33$x|Q^T~(4r(WA>^IDLAad@zxR}$a`qdwHJsW$R-6p`bzs0w@E6_TV4 zEeSL2AG4&`D*qGsSDeb)NWgR#jVom5$*H1LQT0@LWW(+~jg!yD$A9bq4-O4ONEflN zqr^!)`A+STqBv1_c&9I2U;#QU&cjXON2;C5Pu(e-?O7UzPQ`q#`8y-q$E}GP1fBE` z0Tcdz-??S>Qj+NOP%5@^yfyoC3wA>AC=J%1KM|OBComWJF+fEN5)BK<9(y)qN)kOy z-cr5hYEQL;xBUt~<>is)BP%K|Q~TjOZ(s?x@w64tHQ?0uqVK>LMI9#6KLY?2tc&iU zF$1kp9&)a-#(6cOjbnDO-vn+FtM&Zk{aa@<*I~O`J=a#xV7d!rcl%Dcq6(-p2cy+q ze(+1;!@pf0A7?EM2=7sr%HV9_wkzz+6kHyXi;YV=$#-4M1})tqTZ@wf#c~;r^r#9t zoLfzz`9+1zo~p9gRXXJ~&B;(roMx9rOum2W&cAE5DpFR|)ae(X?FX#`MPbv@aLLf# zC+o?_5Og-37&_YvN}0}A8D(uuE-s}3;O6noB9$%PIkqds=9LUc6q2gyDOqAFt`C41 zGC}~54qykkcPOgeWIx}}?LIY}iUK0X)gbpy>}U=fwB<{6Oj@#zzeG{5FMQ)okQ=7p zbG)p%b*S_hdx}uBnO442wjA#&?^q*rHE111WnV;k)cyjVSnv;}=1VBsXc8wY#lY7` ztbv}0=Vh+*HO})Eo7UQz$VLW#xr4EUIM9Yl?wq*xbSPQ3Ub>{TGBZA|e!$1G1vF-H zT$1_%;dmCUQ&9NSEUJhQtU7B!4}MyTu3*WWwiecuL!M8;aJg+trfS4{ERP;nGLjxC z#&_*;p@yQzwd^k;6I!N~;M!@iYoVKW>Z!@TshrS0kDev%rMj^LP03XHR)2EuSgHw8 zV~iMi@``;{=wr3+ly6aeR5%tfzu-#e7EJPbOXscwAS2aLgMG;i)87>5fKv2LtgLEI z1ee@2yXz-#idYf@rqm+QI42dE3*;j1tnAgi>-dh%mdMx4n=Qw5BA5TqT4f+c9)pwc z_{>FC4ad>?zuq#^S;xs!f~MYNqhJ4B8180mbaIE<1L03GueEzSONl^=(HhUl~ePudMxo1K(A||UYr|(2( zpgrol)?>#B&)Qmx5=0cT4NPw5YpWY;$M*_*d(i_1j)maK!A}Bo$G3b-Y^fw%sYG0< zcD(0S_K=m2&B+OUGcHQ_o0Ye S(hxc(JSa-QgK8n2Sp_j~S$eu4E1L+zpkvje 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 literal 86697 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 z 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�T~0&14T;fzwa5*%RG;92pgY5thM%x)-Se9YQ8aHa)S97wEM zM6I>47iagVw=qjAY6+7hcBFhT!x$(B#pnqt3yw-+MQO1ek?-cvL;Ps(rvsh67!0N; zl+e|sjAaBNHteyqX!v|AFr3xZ7AbM_E}=})KHU{+If9Au*IGOv12ys52Lm>L|mFdLC;9m&s(C5H$}ze911r^fG*so z2z!Rg?|kk~dbP1kudB+ZEkX;7K8FRimrF@(Wc?zET}NVsiv$8ijIknipGc5P&LZq%Y&^ zrp3{WP)0>qR~~|ro2ds3SA^BnQa<=S3VN6kMtfsh%amj{p?7vFfIk4q14m3_uV?`# zSlTF_t_B!yE?EeJGjC4yEc!i^45q)wcGZERjVxT9%ClOAgiF(wu_%UzGvy6@n}N2S zwp)U+YkO5CDw&}dh4hB%T;M;Yf3*sPiXWoVJuctkffVwa{e)=qzBzBjK9VRuj-BaY zFR2BJZv1GUUay=>&rE#Stm3S<9~Rbe4Miy0{ftFZYjEpGbo2-T%Z!JUdx3ahZsqYN zbE{Vzx|W|c`Ui_z9Y^g#fx|k}ph;lF&NIRQ7JTVe|0X2)gt_4P}NZ=!uCcYk4GrCr_C<9FNvbxYaDHVIXTA{QAXhzaHqIOOizHJ!X z24!plRTHxqR*6X9N1DEeQWJg6Eq27~~1G?WH9RXnQ< z07-{FI6DH${3617rzN&NHbw0x5KI6#00qyWFg!GL%PmR8G`N6J5;h}_?!eOu0s7`# zTlP!bZVYbs7|@@iR+9iyx0n-X((yIgLUM!mKM+9e=VlPfq*x^R}05NhIN5~bRG_XvKkiAjpE{RbSSz9 zSbSlyL}{TiS`fQ!>}~|55e<-lW?*dSx0tjMLlg0zLmxv(?YN0gp#$`EpXsHrgm|@9ygbW zW~2erB$&m5PbBCD^nu^vVU6?QK8fdwe=r+ zN$Qa4%HJ^BK+#@E_;_N=(RPZhj!MVTrj@EE7rc+s@7bw}8RDsi*l6HahFj7#qN5j?|50ZzJeqwlB9@2cLy4R-ji^5JAKOt_DLw4t@uuEc_6X z&wCT;MUn2XD*)2hNO%q(nTS{H!rjpfdWaxR!Mr@4Kp3*`h^80W@+8EI4xmbohn*7|2IEz z@~{!!ps#15esHNiSpW<(rtcgjp^l^sT*7+|_#f7Po7@Zu*X5)F4bRbH&7ZbP)9!Y# zbQKil3L|Zfzahq^hsONDOuSk@eCDKZiRlvp(IjsYXM*4ZskSzk;{inh+!a55HaT$% z?T7pm{tw)nTGEJ7T-W*v-TRC(pB=wK`hLWJusS%eQ1y*-yEncvjJ>!l=fMsMGur-0 z24V7SG`k-!0>+;`!BsVy($9R=eJ=4pEdF~~Y|I}iNhET<=p6yeBbqf7SfGtQ@MPW4 znM@xJ09(n^mGf-5VI6a^F#Z-ni1r~4_>KE+F#W-lRl+ATdSo;Q89E;$ zhqfbjt++EEjVsU?eRmq~rR^@Rs)Mqae)~_aamd1|4`jxU%5I0ZfByem0Qd}z<7Wxc z2cl0pG6-2ePK|b2h2oT7^9j5C@nLS!U%7)gSUkn$Q$YOl|9|(@%*IFLPH9v`dXoZI zsA;6=DqIXmCt4lYPEvcGsr44^Oy`P{flTMW8fn!-KzYLir=cK>;Nxuh8>YXKhrECP z1g_0bt@R2IBYx)PXm;J&gc&cU#HmpPl+_=#FkGU2Q+w~^da~NBGyj)_bPqlAQ#(8@ zfZXWRP^>mIAFWWrNNVu6tz16t4u~J|~9SsQ|>x2J!BBd->k*l}q@a`vaRl%(J4@u@oZ^9B`>;s|Tq zlFX>{9fc`8OvN18Tw#c}^Ut?WC904B$S6f1r2%Qmq_y!fq3DcN9+q-DL)k!8ZR82 zUBaHes?7I)nj3p!ImBjcMOeSVL$9v!Nr{x^*!B{=8Pv4vcH+8+)Be~!t;nIjXmNRM zO1^?M?OsQ7LHPMN$?(%RYaW>Pp=lU7l){wqh!#?2+;?sCyOQg+Fl2h-)$Q-btP|Pl z`0Npr@zENRFTMFZ90mjsR2ae3aPX>^GNVHdd%&U<6V6~ng`b@xl9r3&l&TUhPs!SP zNch$X3sG+`@sivfr{FsMFf#b==-XcXtH!hHB$;=WWO0EV6_BLnsE6L4FGsU_$y(h#h$w z%537FHsw6Xz4h3Kzi(c3hXzAdM}zApEVg}Zm!=ZtwA?bl$;CHQe$DiQW~ct0DE(vV z)Z>wpGduG;R}-O4eB9c1@?1!-A>aBIRnPQ|COQ>%ALjdCic|Y!P|}@$e~Vszn9-W9 zzt?;}vH5w>`FUWdcNK;V1m|o9-qn!n8%^@wvf0@CZP;G#LfBAm)xl;JV&I%gTCLw) z4Zl(It0l)HLQ-Kpq7p~Lc{o*h2Y>E=C-nw4_I}Al| z5Y>&@eOjdU1YH)=-Oo*5<%tw8>wtbkw`%S(!iV3G&h5RQqk*T0%ob9^;NACF)kV#X zV>2A9YRLg+jmj^zcwQbf`tPopIOBcbbw_fzjkS?as;05#(?@0FN~Fm_>y4m|2S7ee zr5!XZefswwhjHVS!ZjQ#P3TW(i*B~y0x6Hd_7CPg;1y!tx!?|i1exU9bJ{P#?)od5 zfwyMuK|B1<&ZgZ%TiwEXJn#S|5soIV)`KxI7Wi$+&LBh+tUF_XR{pvf6ZCc)vNllX zn^YB9K6(bn`b1*2$J6~tfo;7}x}X0Nv(R&Goh`^Gi5_GBP0MxT6t_;#lxCSwiSk%r z4WQ;t?V#BYXj^93T>%chP=KSy(tw8ZIY|NN6(tli78%+cD-LT*QYgZW{jl2OnNXJ2 z&PeGV-vjx{Q^VILTgeCU-p5&qjIg7f?ddjfvPk@s%^Q)YLBIIlxQ}B`>ypbl_v-qf zyy6pfHYPO-D??%ME-pfQM-|yi$G~p?PbquUNgzXNLS}k|+CD?LfBj^@Bg4v~qON&5 zux!ivNM_-8KWi}oph*kGArSxqmR*FSxuC~8|2+~|QMWybN6(|_{X4`&4-2nn=Jz_G zk1`34%tib*A~5MZ~-9>@&17;B~pI&-5cfhFgwdY$|0l9sOPg{f=jW56XXC~V!Cw#)?#_>D&2<*BCyZ&L-yk8MLftbrv!AAugxXkV5bbr_UCebB0j%#!eHEjow771yio! zwy#Ywrl{Aybu^Lr(HqeyDv2&076IQn2Tx4Stz|`lq{qlJJZl)qm1@SPu5}^Ex%AQ*~+eOx1@Y*Q;DiLK%3*Cu-k?k&oUdqaLNoi zsprDpa0CjFAD`7Ybs(6QxJ60SWYOfAsewiG)Z#;cmh||heUa94B;C4LN@i-D9 z+0(tkEv;6ebn-2F5=|WeNlHK`fp|@_%GCr#8v*m__$?V&T(bCw3R(qf5MB`?s?$)f zI3yLG#^2EnUTg+dUqQTE(vuQG38*__A)qW-50}?cv&RC$7IC;EJAY;dMM9@vAlQQS zrz~l!xJ@j57*1D9%(T9_u`I&I1F?FITFgY;OhD)sGRJVY4NWPck0Ex>542FBp|gie zmHU7dV41prFA<_qVYC*+`Lvhm0W(^_H}nEW!N!S&=_6z{^sWeN47p3{y24h$k*Hp_ z-yKR7f>P0pabOA5ew5C$buRl-P-#zDR5oU|!64IS0^s^-xC4-B@2`$Wvam1T0le=K zHLl9Ihhv{rdwsLkHju*f$7C~x|4tb|(R#GKz7)y&gaXy83(eL?JiDHIx>B9ZL~lUZ z3FuYFQU~Xi)B78`w+@qlb|@RohVOEnh*u6Wrqt=zj)}9cvj1Y{_~!>aQbXd1fmday zLou=jhBv=6uZzs@s6P8%3RbEM$u~eCr@0&XFQ#y_Ckt8;ASe=l!w&ap%kdbY?533ubExC3c;2-b)~DiPBdaDv)sV*!}L>)`y&MXtzC zpu)R*3-UtlaO#mDr+IXJkFN7TAg%&8Y9Zk&yr3>XY`BqN`BB9*-(HYw`$P-jkOr^mw|obqSXHm^0F`S(Pr9BL5TIs^3rX zM;Bh}D1KGj`jJr=v}z5msqS=rH{W}c5$!OuF)vok1vyVkAKa^L^9RcacM9KhBqvj4 z-(jiir+ACBK(z;k+h#J}>em=vk=Y)aPuy8wTg_fJf&JFs+)w%C0XAEEkN=t4{`Mx| z3fGI2r#yL~_gBQv9u0Tnpxwo9kMF)VTYyg-|MRK2ZdVv~kn2>0L_xMk=UEH_Lh0r(Kx83CU z5=9Gu4D3ZhK-IKhD;M_ z)0Xw@Fg$w>Pt{@@I6>@DfC)geTtuUHLf|_gsI3s(bSa{rW>>FNfh}6w6N;nu{$vTR zh=+@F&w-!h^YZj#mJr#%`|%OB{vx~t|0_5cRN$=|pgrE{72UHVZ5sw8K(o%3vI~#e zSfXLT{Kvvxf8EOjWf6*CLs!IJaQ*vp46QxIi{ec|jlr}Buv@V72q=4x({c2AG(16z zgk_RK#WDnJALmXt%|@5P{6p)vgBj~H2>1JtGG9ciGKt9!|s2;vRuN9Lv#G@K%Fp!@!41y*^>{;bLDBC`OH%Q{BD3oKvd{6;%A>Ai4LyO;5Yq)`xga&WFBZyz|q?*PQi=+dpW z!>MjoiEkfV0L>V5H7EZh^x>RM)B0%p!Us7&EOHv6lmIoR(SGB$Tsp9~UgKBtI;8ga5C76z%Ii>CA0HjLHfZVmr{36u4>B!m z_JC*erR$w%-mb23k4g;T%GIxzU=SrvmUQ_@z(o!3t^K|P$=$YyIoYr0!je-!Rr^%? zk6pKGBcbcf2jY$^d5zz&u){VJ#f?X{q-sTn)4C1QxWNuDPX6Aa<=H{cM|b7yDf@1W zCP<)-aLb;;-Fca+Ae- z^TFB=VY*J>T~Jc(BVm*pAOM&Mfv-BHK^fCI>;*h)UObGLm;Vw3VEy9gG2LqTCctQa zFpFkup}+-f>axiqY!-S;*T58Zb$Q_&W{-YC?Yg7HwV6@zU(D3OpgMaQu~h}94r<|97=s-gkcGB2pe^7x zc!57fv|6CCh`EN_7%^baK~Y^ff3WCo+uBu=DQX8EAk~uG;OF~>xHA0DCZcc$aFFza zw<7qapUg)m4!ivok3cNJz2&BFfhvnduVGNF7*xNm0ke1nO$GofU}LRL~{Ug591H$SUcLTZm(%efof)MC#ANsp+&sTEqCtzvDv8T6ys zZguodSlA+#9*=sj4zYC4C8hSei%;1Q#(S=~=u~W{F5JS$Wd(o_7fFIaEIGDmX{_s@ zPygu5SDI|yBnMvH(Qu{~$U@dpTz8qhp@F2uy6zeVJH4VUpw4$|;Y`@H5`vM0o+%1r zt^$tO%{(9h%b1C;V>bhALEDD=mnAzV>2=%w{#PXMw=m9w6Lnf^6HN;B)kd&7#$Vu-(J{<50xMK!sh)H<3&VbX0wScIz z4I~V1Q953qwZspnwBZc?Q|8{w=0&Aa3$U_ z5cvcMhN^;rg1q+&5HX$P;Gds|e{)JL8r2R$ya^mo^}pADTrT8uiEjD9z5OC!$zXBO zHFd8yU;-ATyCL4^_3R%e{j3Gsksy5~Tdljtwak-RxIyy**V^FeBOEQDE)MdhJ}c`7 zQ^g<~H#rX`CN_t`Dm@^Og>!hn{w!02jsOb5`~9oBu+egZ#-#>GxH9PZ zNS_54mbH+K*2;4#5(OYxdF{WC)|HxZRqN)87J~fz&9THj-YvbffYvl6PT`Txe^u)S zIl;CYJrIZxf;vQEKSXRUKTBY~L6C{HLEC%Mo%x^@Hz5rtI2H8}UTs$}L}Mb^%P`cx zI}=WG(#ROxDmF}{Zck+-H>5B!rf?SA5tz|M61daC_49&LpjTTHM~_fL*Wff2D6ooV z9EP%%wYGgid))MxnV>}#F;@c6%`o74u+8USF31Qc?eO{ir)%5mcKt-pe{6rU8LCF= zm8m0f>}_9nY1i4Xj&8@jE|7~S1bf^@(tEp)Zw2|haH_;-ewKwy`*0BD)IBFEv#?`U z!XEw2&^0~uy~9lP1r^KW0;$-A4_^z)8e&0zV(%;~`xey#Iu_1b3O`=$p2vL(t}{W^ z=yKm-ezr=|D&})umFbp_eb?D`@6kF46h$;D`bTepki1d?M8=iYsoFnY!m;)f*)F(A zQLdEZgs&Z)g$~xM84vYq>x!6W5;)5v?rvc32ZWeJxi?a0{%-FKH{=rs@e>o&c)w3N zBD3WXCp@Ni3u<9!wbw|Hwc^;#{=G{qK}cnQ&B>wi(v6-D(7GWojv5EF-O1Pb8@{Y| z;F*ZEg1gQ}&AMOg+3y8R(Ga)Wo5Q^zx{o`Cza*~WqV`9yAAH1K&bPG9J-h9_C>p3V zF7T&Rx%(kCkU#IxRGlv){))ZLGy<%Xp*EXV83Z{_ms>=EjUMUZoUa#iMMV)=CNhMp z{CLFuM|83V{}}uje?&#xm1XsGrB{c@=9$l5Bqa|2;{aLx(j&V<;~@Fgz{@%RrO!yn zn%)ub2@|duZjyO&BP%o9(7N|c>WkB8jYCkOk1u`&r+iB)>s)d$c`O^(1CO+;aK62Xp91(F8Nl1> z4%`PXaA$Ii&pCYSg1!o-{QlX>`=C>ZiDWE&+Gn>|a}5dsn_ljUfg9LRR}4=KYV>># z;{_Svo#iR%&s%#T(e_ja!*}xC7FP62dgLpH} zc81Qnp?6+D>Cqxr(Xdp~v4)5())2+Sy{i*hG@Medg#x7T##NvDh0O! zRe&@+b@$%h>|Pxy!qfle7*K3zK`OW)>tC5hFu$uA6EDhTrt?P!DRbwsn9q;QA$NzgXsF!}_|%BPE{5sU-WY zGs@%I-{+;Gdz?DP*}^YcW4o9o3nd>+gf5p(#Q#EWnJ9GzOnyrt{!Yx2^E?vaFB4a5 z4>Co}WW;t1kVZm{{MOit|6(p8oYw|^A!D((8IH&H`3JndCT;k}Bp zA0>G@ucX)^rwl%6BfqZMO{JA96~pW)rMdW$7#i-%JE)BFQ*F(tFQEqxt>@L2$Q#tI z?7rgeN!uBAM6z_zv*YMNB>fwV-qd>nJTKG?HX7sE%kZt7EtWxkWuxXAP89T)wHhF* zNDnuyl@E{MX3s0ZX~T~8c|xyCUucOGIg1Y2vEiob&#XKyG3wu+`kjl;dIXPQJ%&4q zzBzP9`i{gkSF&XHH4D}1QjO5SvQdp6BTlD|HMcROek{jyO`>0h997xY>@djUx=z%oYRRB6&hbr24U?at>+(L1p8 z-2l{L0Q0vc^Ci0Sz*=?~t(V_cJ{=6ww=y+AYN<*~8i@LNC9=BzT5Vt?!S*8Yc)nJ_`R7&sctS@#wzrs zMH{7=_j@^M+w;`i#5CC&A8@6liCl~e$}#DX-)Xute{W@~w6seqHA3&Vyuyj>w6Cc) zZbpY2;@`tFM3xm`U$0AUv2)}p{N3N2cZ!;1=CWBn%UNYreku!EV( z?zY4u*X*uN?W8~WiMJyNce_TNCp%TjhEA8G7zwY|mItcu7{vZWihv)ALKA9W5SIVfI*z~Bx zPxlCtvEGz)&!67$JCxk6Fj<5^uZXZcfHB*!AzM&x0F4yZ8)C3pYQXSBqIJP@l=4ne z0?yuyM=v!)>BTsP3w$R4^(*v9Q_1fP%K&mDcYWMRnHxy?%Y~(^HOK-50trG(H6u+tsZP zjcZF}*orMk@;-G!F}yU25@kl-xn5nl zUVZy3BK{X~pV@@^!e8cM-NkcYy*;P(eX#g!yHRS7N`^O7b9V2wQ`_%whp1SmER(@oIieC9osF^|1&2NLCI)$ z$g^^~Tvu$>AXnyB|7-473VJ~6e;_2 z4Wn@Xi@S5?-I{)0X-{qR!S@0Nhm^lY-}^adlhW`ej$d0*h4;!O(c%kKtkXlqIG(r6F9J@o!&x@E7wW!Uw}1JO@R zF1Y)CJeefn?sIARl4R67x0!mriI2__5(A}g%Ek<=QZMj%3f^_OA*b^3z(g6`!7#$_ z2S)MG&2ibHH#xS~pIx$+48NRFDVDZ1`=m~WaNk&OOf%az9pSAVZCW~+8KBYlemnch z>{=UT~%K6Y>1ZGlV{mrX0km=VP7xCb^N9h2oH1TYUj%=ASciH}zX*?Bw zjiS^JfACH9-CJqo)sfD)Q5y9_q_`J;)9-Z-;k9pm#U9)t@tf*g#x_^g_e+vo1C&Oa z4~|-0cq`g%?9gxKB!0z|3h|^ff4=tm%Wj*B zcfeE(Q1^|!9znpQWQ6q8)g#xQv=zp8$VclXhAN~bMI}7mYzQ?#YPhp2J>lmQD4~B% z71~ri6U{SkH{51DlJVESd?a=6z0tjbu5p^^61M`SKP1e~KWSpitM6WL>~3Rca?ZW) z#{H(k2d#ws6mM6m9`ln}F_p(A7_JRx+!+&pc5V0Q_#stqvrq0ny;nMcVD0s+xt$T= z{M72Z<`!Z<3Du97O*?~<@z1<;T&qjTU#{ORP<^8Lsi4oM-^KB}5W+AkNVU$d1K?_ZovBm zT*=L^a<>Xj=It+Yz4a63bay>IMy57K#!EEWVIDaZA=~5sj#$GS$?QLorJHLrbkZfa zKUZ$ZXeD#%H6`DM@mNC$D)p)9S@`h2E#*Z`%By$CpL65G- z*L;kTzVY_nSO0IDQmm6@1)wwy<8%F14 zoP}R`p3NIOP|$MG=fwP-uAYxOv7fl5nR|`uh`v8-|GhXWMZJ1A@ql6M5Rq`HTcen6E9_R4adWAJKZ{r>oI{Uly*m`R*)bf3qwvfX-R z;l?Z-`{QP|y|zU%ziQTGjZ<8tjbBZS>hu?QXXnoC^XOA9I_&^!mJjz#|LRQFd;HZ# z#V*Fy^ENiR@qR{eqQ(u8SO=>4?Z9+yl}78K+OuzyhTb^Oos(92ePXXvYl+>9V#1ST z^M6SalLD6lEeDcI|V>z;MHed)wsmxp#c) zck}of`LDdF9;T*f7mV?@?})yy9g0yNw?xFrh+aF@{M>$cPw%MN$i4zKw`*g5L#op9 z?TI<}h`Ia64@a)+lp9>%Vnvt~iT^Fan=K|{7mZ2775tDYK}ewee*i8S*V6Up5?-oh zJn6{-zgR=j)vAvgdi7S_JMB(-YTQh_B#*nscS=$VY)My|avc<+3AcY;zIpSBeag+h zr127V*z|LUo2=FgLaTPyZl1i5E`dw1^L$lL_UwZIZv`Q% zD(bdZ{7E61%q=a45><22pE=(iYioNMp}os1rJ_P_Bo6nc1R3vrYIsrSNwsV|AUsCX zQc?b))B2+s_3DkVb={n&9HTkxnOGpMt3&My9VeJH8pTzx`ku>oHp1y!IRmu!4IvBlwRb^e*6`-6`f0uMB* z<{c_a9eVd5p>-}p(7(ob!B1p4q9TX%OhH2|Z#MY~_rDCrUGB=O(;9&SO0Ri?gI&K{ z+aI_tI`_S|DE9YX(J#L)Ph$`5`GjgJ`(SNQJ8&VPj9+W79nNw!=c@Ags+w=nMm=_m zw*8kL+D4bF6y-!?;+hVP_J`uhIe+(OIo#;E%4x-^W#Xkjb=xoE zLU;jtYCxY1Bs=zduPtTT>7yf8f-3jKTCo;!>6j8SG~shqo`i?wzSIV($Eil1hDW!@ zt~$f7Eu2y;J{Yr)WI^>>1EC#4qn|m3%QYybt0BFlRW>xOXllm-yb`FUVk($7FKt&pTGLieHh1j zSNksR>P69n^T?#%FH+pUMAlVyidAtJR>cpj7%-+U!PIj zZS4@nptoX|%H~qaOHkcg=Ideu=`Zq>8}G%7z4!f{C2C)440kUpEKV6zE0LaI20j+v zFby0oBxPlsQ5d`vf?OSyv+J$HeHHyyBHUBnFp8ho5BE&#I8tD|X6+d(aCnR+7eHAy!xoH@}6fs__eUE(E)|U`@IF)Yw1(O_dB%o;S;F>%mE9E zBR;#h&ok|*zsf!P%Nyq-hi33|dw-fj8U#4h6t{%5sOOU0xI>P1Ol9o#a~h3m!=`Ef zkE*YXimM5>9XvpA*M#8iE(z}L?(Xgug1b8ecZb2<-F0wxmjufjzWeTa>&+kdaZXEh zo$l(YUAsaBLLFZ4nb=X9;qB84%czHJr)ph(RsC#@smAw#jD4Aj4~tB~5!L!@$y%s5 zWLKIn#G)Lk;`_ve=0aV>!MRdgf!5&mG#dOeU|H!TziDTCA7AigcIjsarNhiOje!C_ zwAcle`aJp}ZLCUaD=Fc5B8}T2SIO5d()?M+ZRFb9qN?^;rB}mLC6L(6Ia7QvTo6*; znUXjTXCTxfA7|@1yz;{|3B_H#yL&D9+#eggm!2vCVacCy(Th5e_)QvQ81;$$s4@r9 z^1Ci_f9bT$?%isRN;dTwZnL!6Rye-RB4;+BzMH5wSI4^D-iUPlODu-azKxQMYHZlh zkKq+jAUL8p|3g71!?)DgNacG1=5r{Hcl)%_igIM%9qQypO<+(32=M(7AYWxjJ=~__ zHmBvnoC*W)b#~Y$M`2k$nJf3_tPnMZH7D(-P5yl~4lRe0=%S)JoBKM|e3*rpq+h3O z&hdHWf7aMf^vbfRlY5jfAk(}^K?#oaju?!7jkPDm;fx*$ORAb$K|Pk<>66}yXM6(k z=Dm{~A=(_A9R3##u-Lya`}b+}0kQ(=KBXjkm>E~=8%S)KN1WtZo2L~qUXd= zBhW+gq{MRzY~;PXX4sCm^>ObbqM5Kou zOwa>!-ac*Mg?`x@bXNMVx6s)r{G6aU1-vi9Bkxdti^&WJ;zys~DKtOsOQU@Q2VV;R zQ>Wq(plM#`*gu{M)OEki79)jx{`j$Qf?6z!yEMla+X_DM{1*uwa|XJS>S?1wL}d>` zmq?;e!<&jWg|%@q3c{t(Fak$A=M!f7lG=zFHmj~}2p@5J^fprb3!pvhOTs! zXn@{(r7w@3*R0O0n_Wzrn)+BrHkQCnKB69fBs-b(Tt0Sk7#Cc(l0Io8mk8MVeBrk$ z5;zry&bQ;!cTUGAIQC?fV<$h|W>Wa$JIS4Rtz~kB@~@)SzCQK#BF4$`t?e<6*`-En zy?Ji1@yB2AJ0DCS^kMv^ul$wCc|k|HxvNz=t44v;o_S(IT4zY7+oXjAE_Uu2FuLE# z;{PgRX$g;4BbO;=%qm7GQoS_K!HRsep{EC zuI%}q1X~I1yzR2j#irykd$mln9mLi89GRSNKKPdf2VtdtPMy^!>+c~1n_HwSj$ywg zmg=6lf;aR-h%lzl^fILMGmu{AkRNze`z}COIDNf4;M{tTk7NLV`m_?6+iM;r$yLU9 ze#f2Q_643hbjomz=dALEws3FTqTifi8SS*a^;{IJEYheOzk25owP^VMR2f^5zQYl%!~Ugq5W)(anD(@#2D&Mw(u zqd;=PNpK73l;sv@QSq`BR#!H&dHsic9v7;LImCMFzlnd9RCDqPlGJGKS@mF~FI~|M z)Ypo6o3c1c9-W>p(9Mg30F-?A(cg9-()Xw7xv?1p#VSv_3G`=pXyvYGAn{oB<-oXKi#5LB9b(F zH4p16BcnIpMU1XQqOT>;^U$JFz6#2cYl;y;gR-`AXWQS9G+ zJD+mi%!S$Tsi8?ywZSzBBXy1%`!g;njExUXaa%AuviYVVXX3q`PhZwSe@>ZmoUs&mqn!|wgFYq~-LJ!cXhk!ra`H{);4AvZ@;h;FxiIup zf5u+=;{+CV7ZNBps_5#m(Oj{68vA{NpVS5mQ2T*zzl?OOQE_uSW8&H|CDo;b4V;&N z$fP2d#Yt%f<)o7foek{%MXAgpFy$pkbIogi111lE>{){~=Uusz#T9h&4q^92SWfO@%AD3*GM8Wk zL(vE4Wv3DSAKR4#y(CsM!DfGkgj9PN+}7ZgGce5=e6sP3Dkn4920rCrSM^O84dk`-&Rz zAxDu~cS#aqZYV$w(#ND@;$IOnXk~0OE)nbGcdDmqa#qX!%AqTMU6?rf zF>i~Q7aAv)6b7Q0TN6(Ni&359unP|p1q}a@;{u?$QoH0hS4gw1tBJ>j< zO#7XeyDTAat179><=3;V#v+@O9>z~WNWjzwZsbYA!deeYe9P&pJ_n4~*4mTY51{s9 z{E@z+Ij3e-5V@3wX+UT4qSEib-wdNQtb}_Lo9E?~?!x7nTmH2+<*+#lrh*{UsGBmb zjv;--Kc9Y+J^0%9Sd$6fow$xs13L*l&r^g7UW#p87$@O%^INlyF64m}8VH-kH`*D# zyoi0>VEDjCK-N2$KgR4H2hHUDj0PTkmgsEGpq*3Jn^?4OvO$_%gYKrsEaFF_ZUfCE zW1LSdxvw>b!k*eC9;_ubUB?A2M}#ff^74iE_q%pf zq6b9G)yz4AD|)UKfBGHxVxXb)8_Lkwg#$+`f8iXd6#UCkEk5; zv^2l*Lmr3V7M ze%%3Ey)_lFNfhC(eF>yAqQ2(U9}G9c@$kEx-1_B@loNI+l+%d@lW`K+&OdqHY&ab1 zUBn2MQv;v>A8>dU`9G*f5Z&n7>a@9-=-R_*0&Fn_CLwlTM?-|W_;xBV_)@^Jorcuw z2<(_YGV-<7{oVBD@B2(NUkO&g{Abx-cxBQ&_i?PMo=F0~`zi>>{nC3vO) zy^k!E9#h9^B@JHZ%-DsV$xz}GT?CkUH!(K)d+1_%av9@)uI3Bwz9Y@Ln3J~Ph>9ea z4iqsSl3v09Z9!Kf&&6Mt2XCXJ9pO|k(&mHz1waL7Ww3^aQ0yqic2Vjp8Y!jm9prY6 z4F6Z|F$@emnOr+_pmz7zGI;qJZxvcAMHokr?Wt@cZJK1NtV*Le9dfWcMPyld-+ioIq*DTycjp-`Cj{&2>$o`Qj;vU-kUS6SIunk6p|EDNbty=+%uP6P8_pfuw zmjs4WB-dFqeJ;+Xo@o>~^>+GOaiRrIY<1#bc2l6HTPyHBaXFEmt_FjA|GP;7bZBXV zdWPvua@Tb;JUTxYZ-A$&74_WKEM=|Xp0%9@dEJ;*fxpz&)k~{-T%BdkqjQiWx+_Ep z-n{;c;*&dJJGMJn!dV(<6-6(P7-*^WH5S^d4|_Lr#sUC1qhmhX4-HpS1p+^wb8ha~ zw}=r$z>pxW|7JUe=M6cJVPT;431+_jbMc#0+Tj3GRrpi>H5OobY8IyMQSVk;>&D~6 zd!5d^o8Lw119mVAKEVK&!3FG0^q-bp8~#9BCo$1WY#mYgxORo{0-i=%u{61Mv@n!e}pQHDi`K zT`C9o3!X*68h^d;(N}ej`Fu~K@>z9`qaOUcAG6MpmYID7J761<`{7&m{4dKvwu&x( z(XAZaH}EME{_zS!#{BRLzsqik!U)@!TOw-1HK+F&8YtK&w19R4Oz_G?H<;$$aLU0j~5IUEp)AuzMYju|8eG}@0ha=^sZ`Z51o8P>TvgR6m%PkP?!DDXeB!3 zv77vmZ=S+>_XaPgY7KIj>Irtd0A{QCa~ZjJRvd&sNgeM|)>WwYvnOtiuzN1in3;b5P*gcyM-92Lsb}-lm0Nf(J&lnDO#8s zgYZbK)MCBdEIlsyNSX9cH88YOI!o8XDEBkC<$#4(_*Y?0L(q%M6hzUx+Ef$xl6nT& zeVYgd(P z2QQW!ai}lN-#i`Hb*5IynZ2cVWmKbUi*w0r2z0otKnIKbYmeasuY6X2kMXWv)ts}y z^L_ld-u=DaX3UY3pLVt~;K_Trqy~ovP_J|6c%Z=2AQw-m@C(o zOhjf*mI09f8XqtCiqVE zA7rk_)!F6ChVubgZcCPVX#g1ZWjMvaGTroJ0KCzq!h@x^O_idu#`?@y51(`Bp_5(C z>Nd%r>Y&T>3w6lcaED0%%%@`8Lv6jKM=Ua6>tuu#(Akh{!|6Jy?XJE;2H5`jah4E% z;$@c<+hjv2aRaiZQqsltdxk8=4jIVpv2#{xxaSz8+1B2M8`y(lgYfs=^%DkX^ zfhiOIuP)!}ug_iY(}a zrR`7kX7uToX@6hR;GZ2Eg)37`g>1m}Ln^Y3lkCug78n@qQX_qo@QKF$jwcqifY{#pcCGBz!_n6Ip>aR4k=E)HkF8iN1ft zMfLZ{7!QRh(nPsQ^h4PKo{1qHw}!RLYvS!cx}f*%=YiXikyaRe;U?_*)Ow)q6-W)-N5RD^`U`M1Fa)niv>y@MA6M! z5`ozSi&%aw5?o`3ZQuCf#i3U|d=@%8VV!Na?I;a)44|7b>>7R8ObBlnO= zCKl3_{{F5*nCGKrtl$bd3+}g~Ab{Y1^-0@#G-|W2KPd++-BmyL$Z%$yWE|WI6*>l! zRs6svJZy_^w)cT#)maVETh3L-5yq}G3KoUBL)iG^mLzW6RKQ!fY^bN*iq4VQNG&ae zzXu8mhF&%){fRhuIca1(?QOq=gsSb+ub#>-cWT>GX{+pai*4I>LeFhK`=dYVr0T44 zOYQ)vkRiZRT)JPWFhFnu;y)YCfM_)P^8BR3^Nj~_hI4VW9+$2l+@ASm7bc~IjyZ$E zD|@El8o$|$(6rQ$+x>Y9{NR$dCnE8SNJmQOdmd=uID2Mdlz`{yH3M^*B8JY+X!qi3 z>@cHUV{cS`Ad4!L%n!XqRV1ir(5?PJAf*_ko-SC9$mxs)Z@~#;xN4+ZYOhi0t!dc7 zR4nrK@ZtN?CkH)cT6poi(Dl!NWV0FfUz^sKFff?_J>c^IP&v4c z2;Wnmx#;|vLyfXRvH8@PpU-63e132xOg@u>jqPk_>-53{rJf~x)LyN}zSDEw9Btl~ zSSs&n+q8}n-R<6`8$w8hhMr3eA`*1uc_d*aIQ5?o__$R3+ro7mnpV&mf%2HNee*Ao$dbP3eP<6}mB>>sD3 z_SVX|b9QKa+2V~Yc3$IaVpyA10=X-+Q6!kpfRA$W0Jt8#(HZGW@{$A!Sq_FNgm7Te z`PA#*y***%sYhS8hKQ(7*t8PHDBl}3bNA&^;27(hixr_xOwHu<9$!Px$B^(TkK6L& zOp!MKM%|?c)fDr1F$BEq(j0sm6gFyh*gl`7`20A*;vu9_BKkWqwJr-v(sNlv7G7~s z&M6qqPNz)QvH|=}35Y!`*pigNV@kJDH|ffEJ=JEqoFCW^I(W;)E81FUz(BJBj-8ITpwWEvZ@_`D%=4sjIwR9<2 z_Y9`d3p}p(OtSAIjD!*ffPjxoS}tf;FwY3-sjkI>x^$dG7M-^MKR<<|*8~ndB3fBo zC6u}o=Y~kc5tDtyKcU+cnA*jyT^6CT`@M;GzvJ<_$o7L^H+H9<%>-<21nlv+xU3fq zm0gcwWb`6mxb6I8rWK(!e69OZG2JEyRP%_8gERru@q=GMwMF^m!r7G=##qSs1ZM*d zhEIvU7I7Ill#7!FO}Iqh~cm{Z*k+DJp5>yqlPN`L!nY?Zj0HYNXOC z^ghk26Su;O{GW1D`&O*yw8>K+nRJE>ul9T~{PwL56;?@TThvEtYrw~iXB)uR*+AQB zPsa);*`5S&NGux7i4_A%{rIZcAww!doM42;bNdkPeSjUR!*aq?eVq8l1SSJSOAGVO zc})>U!k08AXI9ygxV@-EmyuEx_K?JKuUw+^7lPM^5AV=Yy%*Gk#fCn0d@3Yb&oq%) z8tRl0lD)UIXTUbfFKeFm0(uz1Ly65ejU5kLNmfxo(h6JK zPU4@gol4X&(tGsMf|%GdSYs0;@|vZ=rlR(&?tP?+D8MdyDey22B}DavAom%CcIv;V z*Q}e~B-3mQd@e29#B!u!p2q|kwM7fy4lpUBdumozyxz3X1yi_Sxpb)NGM%AH4qjz4 ztFWuGwi3o=v~d*Ul&GXq5f3}vg-X`fj&ekA4J29h%X#L0rxp~PolQ{7lM2h2O4^R_ z4D@cOR-Z@sx#3uVmC(QdXjNtL-?B!{$k?t)^DaMR$llL%8?~y**|Vk5d|Ij8WNA#a z3k&x;{$D}R;BRp?`lT#w61tE{)>M){xCXiMp9K}=vlo;mi0e~pFiJ@S5zE|uegin|S*k#D1NkR39X# zs$;5ay+`Ailc$o1-HBwcm27B$4J@FC<3C%vZjI+W&&0m#{x^9F`kJ}SZkcY0vAsj0 zU#*jJf!iCOeM}`xOhIr?WTD8U@PVFLmJq%xlm2uVZ5<3v)jNr&Ag$~p1|#*>YG0fW zsi)xVa4@w$uVSxGN3dxqx3&ufMdVN7F6fNSo^k`phU{hMK5@_9 zVr_~Yfz*NGh2+aln`R#p6YFv76WB{uROu%A%PVcnO6Uysrxv%!g*04y^I_{dA0r7(PTaXpA#bP%X2_OpBan-=w29}-?C$ycaJr>rSR7xg=4X|3NHhb{t-qSy`&6++CG6tZ zYMLYUY>sT((%kY+r`2ffxEtrh7Rw(Mm4>dbq>F!AEDK#*cICMAxF2`?D5Wm9ItPe% znB+U^Y#jkbXLzJ1e*a9@!48;sPE{v!*V+Wkcjs(xSu>`_w_3A^v8J()W@n2-hOIyT zmEc=XFqOP+xnln1g_R-O4-Sp~SNXEy6aLMu%kDQZ>U%>An%^y5Ha12t*TDTc(bnu+eDFl@liLGyLJ%skX25w`V%J1k zPpNM3IPDn0FEj44RB6(S+y;j6QKcwX8j<1y^*MCHZ>>ti@%Suen17W+K4$H(38mn= z5^lpWQ*!757vVH@?W)7Ix;6P9G^`JRbwGm@>%ZB(5o=>G$wP-T9o5dVPB*q=ULJh1 zLP0?!Uy+`7SKQ61boHT1M)=M;TiF!s8oxU(<=MCgA(a=g{~o`m4h;==bxZ`%)5{24 zFE6b3mtHnpQclnDuVug1F=k>m6x9$m$8cvWSMdW`6P{u7*BnVwq6%XP0ZVX<|xEJ?j%u1)U9quDS7 z0=`Qma|l5KVzWJ{?`|uTJ-MyI6Mp>>S1K2>Ts=T5LBi-oi{*<;73}Q5I*yZx2CKDw zGL{4xN5`(dGJL>9&$=EgvMwlu)nA)+dC{8ln0Ek(*$9@4xZ z{sm=s_sp45uK--mX00tk$){A=Q3)gU4F7Cy9m1yBo=vh*OWd##OFI*`I>HITTFrEU zZQ=rRpT2+5xjMueduGZA$ZOwnIY!y#RQN{=c`~{ti$@j1)_RG}S+$7bVfDRumKZK$ zgCx_J$JDuQBkZ}8Hs@rMkEMcXOo^eu5sP=(jogZ%oP}K9f0WH#*J!?$jom#zeJRt) z(`8QiJKS&STeirv7~xsME2ILVg>ghrBtQV#hf+U;S;xQqQK}{Tr}CZeJf?}Om`cXz zGPmF+-{pOjkHiItM-wZlKI;SAf19kf^~--$4%?yaKWFtm(IE#~lTi?vwTLuYrNj^Z zCD;r|8*<~;Qk#p(gwr7{X&_7MZMrsjIy}GwsgX*Tq-6)#kkzGQJ$HI%x0ZBR=PfMI z6oE`W8DDhduTD8yyMg?{$;;r305JVzFI4>G?NN$)6nI@||{ zLpu;&OXOW~QkT*jL1n{4)bpSzI0gK_&M?JWuxQO!i%8`3{%9U$Wqj3|i6%8*PXH+I-iNaNVd#z^ER}E4va0hy>mXZnM`C z+#WdDzX&wg3K#!W*02YGm-E9_&T)Ri1_qx6NcX_KU~*cqoK7NZ+lrxD(%AF^dj}P0 zpw4X7D>c7|+6GydblQ{NBlh5ZxQJC;P(_G`;>5!hni2T^`2y zSf>H~!uy{Dt^bs0m0UBL@kN0OO6K26~p&Y zGK7!BBOp*428d*b1#S_r&H+v_{-0j}FW7hefB*mgshoa*X75zZJ195-^sAO zvRGk2usARuqcU#?m8tTPaWhw|HB zz^j?LO$TDOY9iJF#O!+o&g6zF!$Ec zWYX$v!5v8V)8T<-5p8S(cISVv)5erg|DG$|x`mvkaIl1qBnxB23OkFK1E*kvVAX{_ zt#Q_CaDY2O{eOxcv1mp%cU%LDdF=q13gs=Wbs+v)x~o!kObHK`V$7PGC-_y)LC60c z{!xF>Cl8)L!~$l?GBT-92(SW3aY&xwr<3WpZNGwrnU`e+{s3XVK>%We$bP}YQ|INo zs%(n}B2s98a}o;Z$dxpBA; zcs5Z#Xsu}Ma|bO;<;Ec@v>#pW3G|mvUg9bpB&-DH`UfL(x6)Rz80|R;8>I)TG0Rh> zIz^7tr1zPU85gxPv(>?d^{B~)GGIzb<)_7HYOH9P_M{$c2n~=+l2BAY6 zYa044tJ~=$0mWZ_XCne?QNT-5jdg<>!e+8BUw#vWYCQ7KcsrLRY=vH~mgK4~TtX169(uRJ>#(U<<@d%V zae=jU#$YiwTTZwM4L%S2{T0ftz%%|1pTY~~y7ey7tv+hl+myB-^@MxiGT*lmJ3mu) z5*d($de(~xL9U0++HYG4>#I4$22iT7Z{?y|F;yl(r{?c>%d6ITvEX137hrqpL#KIm zhJ73{o`;8ryA7UnpCSn4csaB%? zsmwQ8ZnT3u9D=PcKKssPpNWT+BF+tZ_z?RCoa}c?F6q6uur;g4Mq9Ih*Az0fQFljf zl4xC)1x30Ct(88=3l{l2tRSc2yZqH#Z-EoOYsbbHt26~0&#hMbY8rdlgkVJtMa|;b zxAH%_YbjUvarYMxhV$pUE{Rn;Lr$JU(Yn!wcRIs*1&RF#fEEbw=Gmf_(1Nh)?3L)R z0gY0QzbJp)Hfffa9VL5nZ9UFCEkgkb#O7(P9(A!y60Pi#Nlso>9R0qEVH9g@7*Cv0 zyB#X2d{ZTcUvw_{o-G1%CGVaYa5h@|N^IMPo$mQDWwIWQGi2V2@%U}^mb4E1v{j6V~1jL^ztqBm37hnfYlMF28W zj^Un$LMg;(PpoP7IQxY+!zr@(8>rt`sbHq`tt*Q>REz!Z5<&;wRUGXnR8^KG3z!a8 zP6AoqKzH(c23WaKz71S5ucX{49Wqsw7Her^V)XHK7NK5$?};9dA}@o&P*UDIKjWk<(xSSI0}8aP31wYIA^7Lr1};Ze^^ey%_E*-Z zDmk3_MwoQK;eo5J6Z0)RZF9NJ*$>er}FzHk}_s3Ll!4fW+nV~`A^~Nc4xhSrlJ@S^Y|^?YNbJ{ zjPGSMIuBpn+7!Acse0{_`g$eA|0us)f(Pff)fG*HqtT5()aT*zse9dbkAB7t=ABjT zSj&B1=d&&uOs#+BZ0T+_=qQ59O9NX}Q$yD@ox6obb{t=9T6a+t8{pYln?wYkPm`BF z)qdIz4OM>={&%_)803m?EFqhp*`l>zV`wEj)*ojD%!A*qFA54v-Sr4B(fEn7`%4Pf zjP)LydmAc|FBMFKl0(++w<;WYs#>&QBKGpWBw&kuJA*k)HM#*k6&`#xxOgZnLTHE7 zoBIY}2@>|XD~(pY1?+G?iwk&%1C!Q&Ac(rQ{% z)xug-W>%e0)S4qp(`YNp?v_SSF(y^!)*{kAk*GK?0?9r)WAvMOlzz94O(@C!o=?8u zwk!}wUD;n_Xz4yQpHiCDl7s&0o3hrKhvn#<+d|UAa~%C=bgRV|tkHY<85?X)YsoGJ_e%+McT%7;yQ5}`R z8DG&@U3jKfa2yTZFyxAmY~Ik1#T_Tp;Zd7&EiA@kl6YvG2tcvrt|M(g8I8fCr;NG< zJMOsBW+{zdGFv{-&|Ivj)YXK{c{PE)9dy|9?5OBe-_{A=NwrzIKWs=4^b)LS{Ep*Cj(A_yQYO(Y!rqXKAkhsw48}- zaEnTvBw9n1*;NG+v|ZR%A4_DU1t!3id9H@5e%5&_AzKgud}lv!=3idLcbb<;@r~tk zyiT|AQ=O{zmy9ak14)hclu2@QHeDdOY12ct9Da)Xv~4ridAe21RJ6JAzrFwnGavH? zxY&(Gc4=-i<0;#!?DgzX-XVuvOhOl_* zKQjz;ovj(%mCA;~)KXeN+oHztJHV{-&AQx@uurD2L!R5#9+*wC7FqH_1GW)94%Tu! zEzV9Vg{kKRlUmGMxPc;hqe_T^ZG;sJjzL;H9Y}Quo9fk4jLNYVia%stze@!rE%q+r z3HjVyh&x|2tzOvc%l8?{peIIW&U++^upb3NI9g2g4Ae>C@fitBg<_4yUlY%jT_3my zTV;Ajckm%nJ|7PU7WpiY&cR8)oP|=1d>sz(tuthG5ng7OtgVkN<8CWMQ_Q01x>@f{ zh|>NRpwMGZt~yKQ76)rxyJABpbI=N5RE=*_51W+NtdLM4in3&xBjgzCZE1Adpl|#R z%fj{-oQwj#6W=1iDc@a4oY6=>SXf11 zj`6SH3-S~EIQIxMx>Ib><%2U^&?7@v#9p*s0thkO_8VMgsICf1q}-5|z$2!cNQmq~^AN=x4z>QfLL6`41sCdT*pma*rP0 zzv{(k-G*ZC(a)vs&XjhtrHTL3qU|V^R&6&>9hPZZj96CH$-5O+yxpvCH!)%|etn2Eto8iNO$8H3ZS@w7`wFlgYYPR@>0(>#D2_LosT{HkNhr z9C5O3Ta7Ir(-@_&-Mpd|o8~2pcF{gzVpHD&F^=0-<3xg+pp9CSI76-)(f83)Bnd#G zY@*cRcTFusX)WdQoWpOL$W7i3i996Ex5=b~?NXoB*BD=-fs|h2I;&!_&Y^0=sibl1 zD-n>@-dG($zMH3f2iwt*Me;5=-?hFu&$V}iTXnDSuHHG7)VvXlKwi}6WMmr?jGNgL zC|YSrcw4GxaJOoHN`(Qae;}7Rf3^*rGpDsw<|rElCs*!huiwX6%)tFKXia86o9M9g zJ7eKq6i`vB|CQ}57ciA0Q{rh}FDbe4Tl^wGEniDk>!{Iu_4nxL5_w&;W|0Z8YHl{F z+F;6d`3A4%Zb-&Txjz3XmEx$o=mP5(M8)NzE4!TOL=@F-3GscpfGW_{*Dh6lfFLwa z9V->0J7=Qr^x-kZ7Ny(o(kpHlZ8?RUa?)#)LW(pib8(O)TeuL9KE-(CH3f6-yeP!A|6IN|(0!Rf}h}SL}tRa+**3KE51eO*w-%tv?OH}15 zsCjt&;#HCNK_&=_yc(q)mxU1!ju-`I+Y+)|5vI1c2G=onzKP8A4}kHS9u!=`t1


0ATkpZ^!T#UOI#P>?TQkx9PVLofr0Ch}=1 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 Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +// @public (undocumented) +export const applyAppearance: AppearanceApplier; + +// @public (undocumented) +export interface DialogAppearance { + backdropBlur?: number | string; + // (undocumented) + borderColor?: string; + borderOpacity?: number; + // (undocumented) + borderStyle?: 'none' | 'solid' | 'dashed' | 'dotted' | 'double'; + // (undocumented) + borderWidth?: number | string; + contentColor?: string; + contentOpacity?: number; + hover?: DialogHoverAppearance; + opacity?: number; + overlayOpacity?: number; + shadow?: DialogShadow; + surfaceColor?: string; + titleColor?: string; + titleOpacity?: number; +} + +// @public +export interface DialogHoverAppearance { + // (undocumented) + borderColor?: string; + // (undocumented) + contentColor?: string; + duration?: number | string; + lift?: number | string; + // (undocumented) + opacity?: number; + scale?: number; + // (undocumented) + shadow?: DialogShadow; + // (undocumented) + surfaceColor?: string; + // (undocumented) + titleColor?: string; +} + +// @public +export type DialogShadow = ShadowPreset | string | DialogShadowConfig; + +// @public +export interface DialogShadowConfig { + angle?: number; + blur?: number | string; + // (undocumented) + color?: string; + distance?: number | string; + inset?: boolean; + opacity?: number; + spread?: number | string; +} + +// @public (undocumented) +export type ShadowPreset = 'none' | 'sm' | 'md' | 'lg' | 'xl'; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/etc/confirm.api.md b/etc/confirm.api.md index 69335f2..4ea4468 100644 --- a/etc/confirm.api.md +++ b/etc/confirm.api.md @@ -13,13 +13,20 @@ export interface DialogAppearance { backdropBlur?: number | string; // (undocumented) borderColor?: string; + borderOpacity?: number; // (undocumented) borderStyle?: 'none' | 'solid' | 'dashed' | 'dotted' | 'double'; // (undocumented) borderWidth?: number | string; + contentColor?: string; + contentOpacity?: number; + hover?: DialogHoverAppearance; opacity?: number; overlayOpacity?: number; - shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | string; + shadow?: DialogShadow; + surfaceColor?: string; + titleColor?: string; + titleOpacity?: number; } // @public (undocumented) diff --git a/etc/core.api.md b/etc/core.api.md index a718cff..1b7b086 100644 --- a/etc/core.api.md +++ b/etc/core.api.md @@ -46,13 +46,20 @@ export interface DialogAppearance { backdropBlur?: number | string; // (undocumented) borderColor?: string; + borderOpacity?: number; // (undocumented) borderStyle?: 'none' | 'solid' | 'dashed' | 'dotted' | 'double'; // (undocumented) borderWidth?: number | string; + contentColor?: string; + contentOpacity?: number; + hover?: DialogHoverAppearance; opacity?: number; overlayOpacity?: number; - shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | string; + shadow?: DialogShadow; + surfaceColor?: string; + titleColor?: string; + titleOpacity?: number; } // @public (undocumented) @@ -63,6 +70,25 @@ export interface DialogDragEvent { position: DialogPosition; } +// @public +export interface DialogHoverAppearance { + // (undocumented) + borderColor?: string; + // (undocumented) + contentColor?: string; + duration?: number | string; + lift?: number | string; + // (undocumented) + opacity?: number; + scale?: number; + // (undocumented) + shadow?: DialogShadow; + // (undocumented) + surfaceColor?: string; + // (undocumented) + titleColor?: string; +} + // @public (undocumented) export interface DialogInstance { // (undocumented) @@ -192,6 +218,21 @@ export type DialogPresentation = 'modal' | 'drawer-left' | 'drawer-right' | 'bot // @public (undocumented) export type DialogRole = 'dialog' | 'alertdialog'; +// @public +export type DialogShadow = ShadowPreset | string | DialogShadowConfig; + +// @public +export interface DialogShadowConfig { + angle?: number; + blur?: number | string; + // (undocumented) + color?: string; + distance?: number | string; + inset?: boolean; + opacity?: number; + spread?: number | string; +} + // @public (undocumented) export type DialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'fullscreen'; @@ -393,6 +434,9 @@ export interface PromptOptions extends DialogOptions { validate?: (value: string) => boolean | string | Promise; } +// @public (undocumented) +export type ShadowPreset = 'none' | 'sm' | 'md' | 'lg' | 'xl'; + // @public export interface TrustedHtmlLike { // (undocumented) diff --git a/etc/forgedialog.api.md b/etc/forgedialog.api.md index 5d147b9..4c2f66b 100644 --- a/etc/forgedialog.api.md +++ b/etc/forgedialog.api.md @@ -69,13 +69,20 @@ export interface DialogAppearance { backdropBlur?: number | string; // (undocumented) borderColor?: string; + borderOpacity?: number; // (undocumented) borderStyle?: 'none' | 'solid' | 'dashed' | 'dotted' | 'double'; // (undocumented) borderWidth?: number | string; + contentColor?: string; + contentOpacity?: number; + hover?: DialogHoverAppearance; opacity?: number; overlayOpacity?: number; - shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | string; + shadow?: DialogShadow; + surfaceColor?: string; + titleColor?: string; + titleOpacity?: number; } // @public (undocumented) @@ -86,6 +93,25 @@ export interface DialogDragEvent { position: DialogPosition; } +// @public +export interface DialogHoverAppearance { + // (undocumented) + borderColor?: string; + // (undocumented) + contentColor?: string; + duration?: number | string; + lift?: number | string; + // (undocumented) + opacity?: number; + scale?: number; + // (undocumented) + shadow?: DialogShadow; + // (undocumented) + surfaceColor?: string; + // (undocumented) + titleColor?: string; +} + // @public (undocumented) export interface DialogInstance { // (undocumented) @@ -217,6 +243,23 @@ export type DialogPresentation = 'modal' | 'drawer-left' | 'drawer-right' | 'bot // @public (undocumented) export type DialogRole = 'dialog' | 'alertdialog'; +// Warning: (ae-forgotten-export) The symbol "ShadowPreset" needs to be exported by the entry point index.d.ts +// +// @public +export type DialogShadow = ShadowPreset | string | DialogShadowConfig; + +// @public +export interface DialogShadowConfig { + angle?: number; + blur?: number | string; + // (undocumented) + color?: string; + distance?: number | string; + inset?: boolean; + opacity?: number; + spread?: number | string; +} + // @public (undocumented) export type DialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'fullscreen'; diff --git a/etc/prompt.api.md b/etc/prompt.api.md index 61520e2..be8235a 100644 --- a/etc/prompt.api.md +++ b/etc/prompt.api.md @@ -9,13 +9,20 @@ export interface DialogAppearance { backdropBlur?: number | string; // (undocumented) borderColor?: string; + borderOpacity?: number; // (undocumented) borderStyle?: 'none' | 'solid' | 'dashed' | 'dotted' | 'double'; // (undocumented) borderWidth?: number | string; + contentColor?: string; + contentOpacity?: number; + hover?: DialogHoverAppearance; opacity?: number; overlayOpacity?: number; - shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | string; + shadow?: DialogShadow; + surfaceColor?: string; + titleColor?: string; + titleOpacity?: number; } // @public (undocumented) diff --git a/package.json b/package.json index d454a74..ef8978f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "forgedialog", - "version": "0.6.0", + "version": "0.7.0", "description": "A modern, lightweight, and highly customizable JavaScript dialog library for alerts, confirmations, modals, drawers, and interactive workflows.", "type": "module", "license": "MIT", @@ -26,7 +26,10 @@ "./dist/interactions.cjs", "./src/animations-entry.ts", "./dist/animations.mjs", - "./dist/animations.cjs" + "./dist/animations.cjs", + "./src/appearance-entry.ts", + "./dist/appearance.mjs", + "./dist/appearance.cjs" ], "files": [ "dist", @@ -118,6 +121,16 @@ "default": "./dist/animations.cjs" } }, + "./appearance": { + "import": { + "types": "./dist/appearance.d.ts", + "default": "./dist/appearance.mjs" + }, + "require": { + "types": "./dist/appearance.d.cts", + "default": "./dist/appearance.cjs" + } + }, "./workflows": { "import": { "types": "./dist/workflows.d.ts", diff --git a/scripts/check-size.mjs b/scripts/check-size.mjs index b10955c..9f33cd0 100644 --- a/scripts/check-size.mjs +++ b/scripts/check-size.mjs @@ -3,7 +3,10 @@ import { readFileSync } from 'node:fs'; const budgets = { 'dist/core.cjs': 6.5 * 1024, - 'dist/index.cjs': 14 * 1024, + // Raised in 0.7.0: the main entry auto-enables the full appearance applier + // (per-component colors, composed shadows, hover). Focused entries such as + // forgedialog/alert keep the lightweight applier and their former budgets. + 'dist/index.cjs': 14.6 * 1024, 'dist/interactions.cjs': 2 * 1024, 'dist/style-core.css': 2.5 * 1024, 'dist/style-forms.css': 0.9 * 1024, diff --git a/scripts/check-subpath-apis.mjs b/scripts/check-subpath-apis.mjs index 2a1ac87..fd6a510 100644 --- a/scripts/check-subpath-apis.mjs +++ b/scripts/check-subpath-apis.mjs @@ -7,6 +7,7 @@ const entries = [ 'core', 'interactions', 'animations', + 'appearance', 'presentation', 'workflows', ]; diff --git a/src/appearance-entry.ts b/src/appearance-entry.ts new file mode 100644 index 0000000..1710151 --- /dev/null +++ b/src/appearance-entry.ts @@ -0,0 +1,13 @@ +import { applyAppearance } from './core/appearance'; +import { registerAppearanceApplier } from './core/appearanceRegistry'; + +registerAppearanceApplier(applyAppearance); + +export { applyAppearance } from './core/appearance'; +export type { + DialogAppearance, + DialogHoverAppearance, + DialogShadow, + DialogShadowConfig, + ShadowPreset, +} from './types'; diff --git a/src/core/Dialog.ts b/src/core/Dialog.ts index 3f2a874..490386f 100644 --- a/src/core/Dialog.ts +++ b/src/core/Dialog.ts @@ -13,7 +13,7 @@ import type { import { generateId } from '../utils/id'; import { resolveRole } from './aria'; import { animateDialogIn, animateDialogOut } from './animationRegistry'; -import { applyAppearance } from './appearance'; +import { applyDialogAppearance } from './appearanceRegistry'; import type { DialogStackManager } from './DialogStack'; import { buildDialogDom, @@ -79,7 +79,7 @@ export class Dialog implements DialogInstance { this.bodyEl = built.body; this.buttonElements = built.buttonElements; this.focusTrap = new FocusTrap(this.dialogEl); - applyAppearance(this.element, this.dialogEl, options.appearance); + applyDialogAppearance(this.element, this.dialogEl, options.appearance); this.setupDraggable(options.draggable, built.header); this.closedPromise = new Promise((resolve) => { @@ -232,7 +232,8 @@ export class Dialog implements DialogInstance { const header = this.dialogEl.querySelector('.fd-dialog__header'); this.setupDraggable(partial.draggable, header ?? undefined); } - if ('appearance' in partial) applyAppearance(this.element, this.dialogEl, partial.appearance); + if ('appearance' in partial) + applyDialogAppearance(this.element, this.dialogEl, partial.appearance); if ('size' in partial) { this.dialogEl.classList.remove(`fd-dialog--${previous.size ?? 'md'}`); this.dialogEl.classList.add(`fd-dialog--${partial.size ?? 'md'}`); diff --git a/src/core/appearance-basic.ts b/src/core/appearance-basic.ts new file mode 100644 index 0000000..9f5cf73 --- /dev/null +++ b/src/core/appearance-basic.ts @@ -0,0 +1,62 @@ +import type { DialogAppearance } from '../types'; + +export type AppearanceApplier = ( + overlay: HTMLElement, + dialog: HTMLElement, + appearance?: DialogAppearance, +) => void; + +export const SHADOW_PRESETS = new Set(['none', 'sm', 'md', 'lg', 'xl']); +export const PREFIX = '--fd-dialog-'; +export const HOVER_PREFIX = '--fd-dialog-hover-'; + +export type AppearanceValue = string | number | boolean; +export type Formatter = (value: AppearanceValue) => string; + +export function clamp(value: number): number { + return Math.min(1, Math.max(0, value)); +} + +export const percent: Formatter = (value) => `${clamp(Number(value)) * 100}%`; +export const text: Formatter = (value) => String(value); +export const length: Formatter = (value) => + typeof value === 'number' ? `${Math.max(0, value)}px` : String(value); + +/** + * The always-bundled appearance applier. It covers the surface, backdrop, and + * border so focused entries such as `forgedialog/alert` stay small; importing + * `forgedialog` (or `forgedialog/appearance`) upgrades this to the full applier + * with per-component colors, composed shadows, and hover styling. + */ +export const applyBasicAppearance: AppearanceApplier = (overlay, dialog, appearance) => { + const style = dialog.style; + style.removeProperty(`${PREFIX}opacity`); + style.removeProperty(`${PREFIX}border-color`); + style.removeProperty(`${PREFIX}border-width`); + style.removeProperty(`${PREFIX}border-style`); + style.removeProperty(`${PREFIX}shadow`); + dialog.removeAttribute('data-fd-shadow'); + overlay.style.removeProperty('--fd-overlay-opacity'); + overlay.style.removeProperty('--fd-backdrop-blur'); + if (!appearance) return; + + if (appearance.opacity !== undefined) { + style.setProperty(`${PREFIX}opacity`, percent(appearance.opacity)); + } + if (appearance.borderColor) style.setProperty(`${PREFIX}border-color`, appearance.borderColor); + if (appearance.borderWidth !== undefined) { + style.setProperty(`${PREFIX}border-width`, length(appearance.borderWidth)); + } + if (appearance.borderStyle) style.setProperty(`${PREFIX}border-style`, appearance.borderStyle); + if (appearance.overlayOpacity !== undefined) { + overlay.style.setProperty('--fd-overlay-opacity', percent(appearance.overlayOpacity)); + } + if (appearance.backdropBlur !== undefined) { + overlay.style.setProperty('--fd-backdrop-blur', length(appearance.backdropBlur)); + } + + const shadow = appearance.shadow; + if (typeof shadow !== 'string') return; + if (SHADOW_PRESETS.has(shadow)) dialog.dataset.fdShadow = shadow; + else style.setProperty(`${PREFIX}shadow`, shadow); +}; diff --git a/src/core/appearance.ts b/src/core/appearance.ts index 7a38a8c..3571e24 100644 --- a/src/core/appearance.ts +++ b/src/core/appearance.ts @@ -1,54 +1,139 @@ -import type { DialogAppearance } from '../types'; +import type { DialogAppearance, DialogHoverAppearance, DialogShadow } from '../types'; +import { + type AppearanceApplier, + type AppearanceValue, + type Formatter, + HOVER_PREFIX, + PREFIX, + SHADOW_PRESETS, + clamp, + length, + percent, + text, +} from './appearance-basic'; -const SHADOW_PRESETS = new Set(['none', 'sm', 'md', 'lg', 'xl']); +type Field = readonly [keyof T & string, string, Formatter]; -const DIALOG_PROPERTIES = [ - '--fd-dialog-opacity', - '--fd-dialog-border-color', - '--fd-dialog-border-width', - '--fd-dialog-border-style', - '--fd-dialog-shadow', -] as const; +const ratio: Formatter = (value) => String(clamp(Number(value))); -function opacity(value: number): string { - return `${Math.min(1, Math.max(0, value)) * 100}%`; +function applyFields( + element: HTMLElement, + prefix: string, + source: T | undefined, + fields: ReadonlyArray>, +): void { + for (const [key, suffix, format] of fields) { + const value = source?.[key]; + if (value === undefined) element.style.removeProperty(prefix + suffix); + else element.style.setProperty(prefix + suffix, format(value as AppearanceValue)); + } +} + +const DEFAULT_ANGLE = 180; +const DEFAULT_DISTANCE = 20; +const DEFAULT_BLUR = 60; +const DEFAULT_COLOR = 'rgb(15 17 21)'; +const DEFAULT_STRENGTH = 0.25; + +const time: Formatter = (value) => + typeof value === 'number' ? `${Math.max(0, value)}ms` : String(value); +const scale: Formatter = (value) => String(Math.max(0, Number(value))); +/** A positive lift raises the dialog, so the offset is negated. */ +const lift: Formatter = (value) => + typeof value === 'number' ? `${-value}px` : `calc(-1 * ${String(value)})`; + +const BASE_FIELDS: ReadonlyArray> = [ + ['opacity', 'opacity', percent], + ['surfaceColor', 'surface-color', text], + ['titleColor', 'title-color', text], + ['titleOpacity', 'title-opacity', ratio], + ['contentColor', 'content-color', text], + ['contentOpacity', 'content-opacity', ratio], + ['borderColor', 'border-color', text], + ['borderOpacity', 'border-opacity', percent], + ['borderWidth', 'border-width', length], + ['borderStyle', 'border-style', text], +]; + +const HOVER_FIELDS: ReadonlyArray> = [ + ['opacity', 'opacity', percent], + ['surfaceColor', 'surface-color', text], + ['titleColor', 'title-color', text], + ['contentColor', 'content-color', text], + ['borderColor', 'border-color', text], + ['lift', 'lift', lift], + ['scale', 'scale', scale], + ['duration', 'duration', time], +]; + +/** Blends `color` down to `strength` (0..1) without parsing it. */ +function fade(color: string, strength: number): string { + return `color-mix(in srgb, ${color} ${percent(strength)}, transparent)`; } -function length(value: number | string): string { - return typeof value === 'number' ? `${Math.max(0, value)}px` : value; +/** + * Resolves a composed shadow into a `box-shadow` value. `angle` is measured + * clockwise from "cast upwards", so 180deg drops the shadow straight down. + */ +function composeShadow(shadow: Exclude): string { + const radians = ((shadow.angle ?? DEFAULT_ANGLE) * Math.PI) / 180; + const blur = length(shadow.blur ?? DEFAULT_BLUR); + const spread = length(shadow.spread ?? 0); + const color = fade(shadow.color ?? DEFAULT_COLOR, shadow.opacity ?? DEFAULT_STRENGTH); + const inset = shadow.inset ? 'inset ' : ''; + const tail = `${blur} ${spread} ${color}`; + const x = Math.sin(radians); + const y = -Math.cos(radians); + + if (typeof shadow.distance === 'string') { + // A CSS length cannot be projected onto an angle, so honor the axis the + // angle points at and let the author's unit through untouched. + const horizontal = Math.abs(x) > Math.abs(y); + const along = (horizontal ? x : y) < 0 ? `calc(-1 * ${shadow.distance})` : shadow.distance; + return horizontal ? `${inset}${along} 0 ${tail}` : `${inset}0 ${along} ${tail}`; + } + + const distance = shadow.distance ?? DEFAULT_DISTANCE; + const round = (value: number): string => `${Math.round(value * distance * 100) / 100}px`; + return `${inset}${round(x)} ${round(y)} ${tail}`; } -export function applyAppearance( - overlay: HTMLElement, - dialog: HTMLElement, - appearance?: DialogAppearance, -): void { - DIALOG_PROPERTIES.forEach((property) => dialog.style.removeProperty(property)); +function applyShadow(dialog: HTMLElement, shadow: DialogShadow, hover: boolean): void { + const property = hover ? `${HOVER_PREFIX}shadow` : `${PREFIX}shadow`; + if (typeof shadow !== 'string') { + dialog.style.setProperty(property, composeShadow(shadow)); + return; + } + // Presets live in CSS so they stay themeable; anything else is a raw value. + if (!SHADOW_PRESETS.has(shadow)) dialog.style.setProperty(property, shadow); + else if (hover) dialog.dataset.fdHoverShadow = shadow; + else dialog.dataset.fdShadow = shadow; +} + +export const applyAppearance: AppearanceApplier = (overlay, dialog, appearance) => { + const hover = appearance?.hover; + + applyFields(dialog, PREFIX, appearance, BASE_FIELDS); + applyFields(dialog, HOVER_PREFIX, hover, HOVER_FIELDS); + dialog.style.removeProperty(`${PREFIX}shadow`); + dialog.style.removeProperty(`${HOVER_PREFIX}shadow`); dialog.removeAttribute('data-fd-shadow'); + dialog.removeAttribute('data-fd-hover-shadow'); overlay.style.removeProperty('--fd-overlay-opacity'); overlay.style.removeProperty('--fd-backdrop-blur'); + + // Marks the dialog as opted into hover styling so every other dialog keeps + // its entirely static appearance. + if (hover) dialog.dataset.fdHover = ''; + else dialog.removeAttribute('data-fd-hover'); if (!appearance) return; - if (appearance.opacity !== undefined) { - dialog.style.setProperty('--fd-dialog-opacity', opacity(appearance.opacity)); - } if (appearance.overlayOpacity !== undefined) { - overlay.style.setProperty('--fd-overlay-opacity', opacity(appearance.overlayOpacity)); + overlay.style.setProperty('--fd-overlay-opacity', percent(appearance.overlayOpacity)); } if (appearance.backdropBlur !== undefined) { overlay.style.setProperty('--fd-backdrop-blur', length(appearance.backdropBlur)); } - if (appearance.borderColor) { - dialog.style.setProperty('--fd-dialog-border-color', appearance.borderColor); - } - if (appearance.borderWidth !== undefined) { - dialog.style.setProperty('--fd-dialog-border-width', length(appearance.borderWidth)); - } - if (appearance.borderStyle) { - dialog.style.setProperty('--fd-dialog-border-style', appearance.borderStyle); - } - if (appearance.shadow) { - if (SHADOW_PRESETS.has(appearance.shadow)) dialog.dataset.fdShadow = appearance.shadow; - else dialog.style.setProperty('--fd-dialog-shadow', appearance.shadow); - } -} + if (appearance.shadow) applyShadow(dialog, appearance.shadow, false); + if (hover?.shadow) applyShadow(dialog, hover.shadow, true); +}; diff --git a/src/core/appearanceRegistry.ts b/src/core/appearanceRegistry.ts new file mode 100644 index 0000000..6607c29 --- /dev/null +++ b/src/core/appearanceRegistry.ts @@ -0,0 +1,13 @@ +import { type AppearanceApplier, applyBasicAppearance } from './appearance-basic'; + +let applier: AppearanceApplier = applyBasicAppearance; + +export function registerAppearanceApplier(next: AppearanceApplier): void { + applier = next; +} + +export const applyDialogAppearance: AppearanceApplier = (overlay, dialog, appearance) => { + applier(overlay, dialog, appearance); +}; + +export type { AppearanceApplier } from './appearance-basic'; diff --git a/src/index.ts b/src/index.ts index 437c381..dddb141 100644 --- a/src/index.ts +++ b/src/index.ts @@ -2,6 +2,7 @@ import type { HookFn, HookName, Plugin } from './types'; import { pluginManager } from './plugins/PluginManager'; import './interactions-entry'; import './animations-entry'; +import './appearance-entry'; declare const __FORGEDIALOG_VERSION__: string; @@ -36,6 +37,9 @@ export type { CloseReason, DialogOutcome, DialogAppearance, + DialogHoverAppearance, + DialogShadow, + DialogShadowConfig, DialogDragEvent, DialogPosition, DialogPresentation, diff --git a/src/theme/dialog.css b/src/theme/dialog.css index 26b1696..13968a5 100644 --- a/src/theme/dialog.css +++ b/src/theme/dialog.css @@ -36,16 +36,98 @@ width: 100%; max-width: 420px; max-height: calc(100vh - var(--fd-spacing-lg) * 2); - background: color-mix(in srgb, var(--fd-color-surface) var(--fd-dialog-opacity), transparent); + background: color-mix( + in srgb, + var(--fd-dialog-surface-color) var(--fd-dialog-opacity), + transparent + ); color: var(--fd-color-text); border: var(--fd-dialog-border-width) var(--fd-dialog-border-style) - var(--fd-dialog-border-color); + color-mix(in srgb, var(--fd-dialog-border-color) var(--fd-dialog-border-opacity), transparent); border-radius: var(--fd-radius); box-shadow: var(--fd-dialog-shadow); translate: var(--fd-drag-x) var(--fd-drag-y); overflow: hidden; } + /* + * Only dialogs that opted into hover styling animate or restyle on hover. + * Hover rules must set real properties rather than redefine the `--fd-dialog-*` + * custom properties: those are written as inline styles by applyAppearance, + * and an inline declaration always beats a stylesheet rule on the same element. + */ + .fd-dialog[data-fd-hover] { + transition: + background-color var(--fd-dialog-hover-duration) var(--fd-easing), + border-color var(--fd-dialog-hover-duration) var(--fd-easing), + box-shadow var(--fd-dialog-hover-duration) var(--fd-easing), + transform var(--fd-dialog-hover-duration) var(--fd-easing); + } + + .fd-dialog[data-fd-hover]:hover { + background: color-mix( + in srgb, + var(--fd-dialog-hover-surface-color, var(--fd-dialog-surface-color)) + var(--fd-dialog-hover-opacity, var(--fd-dialog-opacity)), + transparent + ); + border-color: color-mix( + in srgb, + var(--fd-dialog-hover-border-color, var(--fd-dialog-border-color)) + var(--fd-dialog-border-opacity), + transparent + ); + box-shadow: var(--fd-dialog-hover-shadow, var(--fd-dialog-shadow)); + transform: translateY(var(--fd-dialog-hover-lift)) scale(var(--fd-dialog-hover-scale)); + } + + /* + * A hover lift or scale would resize the box the drag logic clamps against, + * letting a dragged dialog escape its bounds, so it is suspended while + * dragging. + */ + .fd-dialog[data-fd-hover].fd-dialog--dragging, + .fd-dialog[data-fd-hover].fd-dialog--dragging:hover { + transform: none; + transition: none; + } + + .fd-dialog[data-fd-hover]:hover .fd-dialog__title { + color: var(--fd-dialog-hover-title-color, var(--fd-dialog-title-color)); + } + + .fd-dialog[data-fd-hover]:hover .fd-dialog__body { + color: var(--fd-dialog-hover-content-color, var(--fd-dialog-content-color)); + } + + .fd-dialog[data-fd-hover-shadow='none']:hover { + --fd-dialog-hover-shadow: none; + } + + .fd-dialog[data-fd-hover-shadow='sm']:hover { + --fd-dialog-hover-shadow: 0 4px 12px rgb(15 17 21 / 14%); + } + + .fd-dialog[data-fd-hover-shadow='md']:hover { + --fd-dialog-hover-shadow: 0 12px 32px rgb(15 17 21 / 20%); + } + + .fd-dialog[data-fd-hover-shadow='lg']:hover { + --fd-dialog-hover-shadow: 0 20px 60px rgb(15 17 21 / 25%); + } + + .fd-dialog[data-fd-hover-shadow='xl']:hover { + --fd-dialog-hover-shadow: 0 28px 90px rgb(15 17 21 / 32%); + } + + @media (prefers-reduced-motion: reduce) { + .fd-dialog[data-fd-hover], + .fd-dialog[data-fd-hover]:hover { + transform: none; + transition-duration: 1ms; + } + } + .fd-dialog[data-fd-shadow='none'] { --fd-dialog-shadow: none; } @@ -148,6 +230,9 @@ font-size: 1.05rem; font-weight: 600; line-height: 1.4; + color: var(--fd-dialog-title-color); + opacity: var(--fd-dialog-title-opacity); + transition: color var(--fd-dialog-hover-duration) var(--fd-easing); } .fd-dialog__title--visually-hidden { @@ -188,7 +273,9 @@ overflow-y: auto; font-size: 0.95rem; line-height: 1.5; - color: var(--fd-color-text); + color: var(--fd-dialog-content-color); + opacity: var(--fd-dialog-content-opacity); + transition: color var(--fd-dialog-hover-duration) var(--fd-easing); } .fd-dialog__message { diff --git a/src/theme/tokens.css b/src/theme/tokens.css index bfc21bc..ec67ceb 100644 --- a/src/theme/tokens.css +++ b/src/theme/tokens.css @@ -23,10 +23,19 @@ --fd-duration-normal: 200ms; --fd-easing: cubic-bezier(0.16, 1, 0.3, 1); --fd-dialog-opacity: 100%; + --fd-dialog-surface-color: var(--fd-color-surface); + --fd-dialog-title-color: var(--fd-color-text); + --fd-dialog-title-opacity: 1; + --fd-dialog-content-color: var(--fd-color-text); + --fd-dialog-content-opacity: 1; --fd-dialog-border-width: 1px; --fd-dialog-border-style: solid; --fd-dialog-border-color: var(--fd-color-border); + --fd-dialog-border-opacity: 100%; --fd-dialog-shadow: var(--fd-shadow); + --fd-dialog-hover-duration: var(--fd-duration-normal); + --fd-dialog-hover-lift: 0px; + --fd-dialog-hover-scale: 1; --fd-overlay-opacity: 100%; --fd-backdrop-blur: 0px; } diff --git a/src/types.ts b/src/types.ts index ca07805..7846783 100644 --- a/src/types.ts +++ b/src/types.ts @@ -16,6 +16,51 @@ export interface DialogPosition { y: number; } +export type ShadowPreset = 'none' | 'sm' | 'md' | 'lg' | 'xl'; + +/** + * A shadow built from its parts, so both strength and direction can be tuned + * without hand-writing a `box-shadow` string. + */ +export interface DialogShadowConfig { + /** + * Direction the shadow falls, in degrees, as if light came from the opposite + * side. `0` casts it upwards, `90` to the right, `180` downwards (the + * default), `270` to the left. + */ + angle?: number; + /** How far the shadow travels along `angle`. Numbers are CSS pixels. */ + distance?: number | string; + /** Blur radius. Numbers are CSS pixels. */ + blur?: number | string; + /** Spread radius. Numbers are CSS pixels. */ + spread?: number | string; + color?: string; + /** Shadow strength from 0 (invisible) to 1 (fully opaque). */ + opacity?: number; + /** Draw the shadow inside the dialog instead of outside it. */ + inset?: boolean; +} + +/** A built-in preset, any valid CSS box-shadow value, or a composed shadow. */ +export type DialogShadow = ShadowPreset | string | DialogShadowConfig; + +/** Appearance overrides applied only while the pointer is over the dialog. */ +export interface DialogHoverAppearance { + opacity?: number; + surfaceColor?: string; + titleColor?: string; + contentColor?: string; + borderColor?: string; + shadow?: DialogShadow; + /** Distance the dialog rises on hover. Numbers are CSS pixels. */ + lift?: number | string; + /** Scale factor on hover, for example `1.02`. */ + scale?: number; + /** Transition duration for hover changes. Numbers are milliseconds. */ + duration?: number | string; +} + export interface DialogAppearance { /** Dialog surface opacity from 0 (transparent) to 1 (opaque). */ opacity?: number; @@ -23,11 +68,25 @@ export interface DialogAppearance { overlayOpacity?: number; /** Backdrop blur in CSS pixels, or any CSS length. */ backdropBlur?: number | string; + /** Background color of the dialog surface. */ + surfaceColor?: string; + /** Color of the dialog title. */ + titleColor?: string; + /** Title opacity from 0 (transparent) to 1 (opaque). */ + titleOpacity?: number; + /** Color of the dialog body, including the default message paragraph. */ + contentColor?: string; + /** Body opacity from 0 (transparent) to 1 (opaque). */ + contentOpacity?: number; borderColor?: string; + /** Border opacity from 0 (transparent) to 1 (opaque). */ + borderOpacity?: number; borderWidth?: number | string; borderStyle?: 'none' | 'solid' | 'dashed' | 'dotted' | 'double'; - /** A built-in preset or any valid CSS box-shadow value. */ - shadow?: 'none' | 'sm' | 'md' | 'lg' | 'xl' | string; + /** A built-in preset, any valid CSS box-shadow value, or a composed shadow. */ + shadow?: DialogShadow; + /** Overrides applied only while the pointer is over the dialog. */ + hover?: DialogHoverAppearance; } export interface DialogDragEvent { diff --git a/tests/core/appearance.test.ts b/tests/core/appearance.test.ts index be40cff..b06b3d6 100644 --- a/tests/core/appearance.test.ts +++ b/tests/core/appearance.test.ts @@ -35,6 +35,95 @@ describe('applyAppearance', () => { expect(dialog.hasAttribute('data-fd-shadow')).toBe(false); }); + it('scopes color and opacity per component', () => { + const overlay = document.createElement('div'); + const dialog = document.createElement('div'); + applyAppearance(overlay, dialog, { + surfaceColor: '#101014', + titleColor: '#ffd166', + titleOpacity: 0.9, + contentColor: '#c8ccd4', + contentOpacity: 0.75, + borderColor: '#7c5cff', + borderOpacity: 0.5, + }); + expect(dialog.style.getPropertyValue('--fd-dialog-surface-color')).toBe('#101014'); + expect(dialog.style.getPropertyValue('--fd-dialog-title-color')).toBe('#ffd166'); + expect(dialog.style.getPropertyValue('--fd-dialog-title-opacity')).toBe('0.9'); + expect(dialog.style.getPropertyValue('--fd-dialog-content-color')).toBe('#c8ccd4'); + expect(dialog.style.getPropertyValue('--fd-dialog-content-opacity')).toBe('0.75'); + expect(dialog.style.getPropertyValue('--fd-dialog-border-opacity')).toBe('50%'); + }); + + it('composes a shadow from its direction and strength', () => { + const overlay = document.createElement('div'); + const dialog = document.createElement('div'); + + applyAppearance(overlay, dialog, { + shadow: { angle: 180, distance: 10, blur: 30, spread: 2, color: '#000', opacity: 0.4 }, + }); + expect(dialog.style.getPropertyValue('--fd-dialog-shadow')).toBe( + '0px 10px 30px 2px color-mix(in srgb, #000 40%, transparent)', + ); + + // 90deg casts the shadow to the right, 270deg to the left, 0deg upwards. + applyAppearance(overlay, dialog, { shadow: { angle: 90, distance: 12 } }); + expect(dialog.style.getPropertyValue('--fd-dialog-shadow')).toContain('12px 0px'); + applyAppearance(overlay, dialog, { shadow: { angle: 270, distance: 12 } }); + expect(dialog.style.getPropertyValue('--fd-dialog-shadow')).toContain('-12px 0px'); + applyAppearance(overlay, dialog, { shadow: { angle: 0, distance: 12 } }); + expect(dialog.style.getPropertyValue('--fd-dialog-shadow')).toContain('0px -12px'); + }); + + it('supports inset shadows and CSS length distances', () => { + const overlay = document.createElement('div'); + const dialog = document.createElement('div'); + + applyAppearance(overlay, dialog, { shadow: { inset: true, angle: 180, distance: 4 } }); + expect(dialog.style.getPropertyValue('--fd-dialog-shadow')).toContain('inset 0px 4px'); + + applyAppearance(overlay, dialog, { shadow: { angle: 270, distance: '1rem' } }); + expect(dialog.style.getPropertyValue('--fd-dialog-shadow')).toContain('calc(-1 * 1rem) 0'); + }); + + it('records hover overrides only when hover styling is requested', () => { + const overlay = document.createElement('div'); + const dialog = document.createElement('div'); + + applyAppearance(overlay, dialog, { opacity: 0.9 }); + expect(dialog.hasAttribute('data-fd-hover')).toBe(false); + + applyAppearance(overlay, dialog, { + hover: { + opacity: 1, + surfaceColor: '#1b1e26', + titleColor: '#ffffff', + contentColor: '#e6e8ec', + borderColor: '#9f7bff', + shadow: 'xl', + lift: 6, + scale: 1.02, + duration: 150, + }, + }); + expect(dialog.hasAttribute('data-fd-hover')).toBe(true); + expect(dialog.style.getPropertyValue('--fd-dialog-hover-opacity')).toBe('100%'); + expect(dialog.style.getPropertyValue('--fd-dialog-hover-surface-color')).toBe('#1b1e26'); + expect(dialog.style.getPropertyValue('--fd-dialog-hover-title-color')).toBe('#ffffff'); + expect(dialog.style.getPropertyValue('--fd-dialog-hover-content-color')).toBe('#e6e8ec'); + expect(dialog.style.getPropertyValue('--fd-dialog-hover-border-color')).toBe('#9f7bff'); + expect(dialog.dataset.fdHoverShadow).toBe('xl'); + // Lift is inverted so a positive value raises the dialog. + expect(dialog.style.getPropertyValue('--fd-dialog-hover-lift')).toBe('-6px'); + expect(dialog.style.getPropertyValue('--fd-dialog-hover-scale')).toBe('1.02'); + expect(dialog.style.getPropertyValue('--fd-dialog-hover-duration')).toBe('150ms'); + + applyAppearance(overlay, dialog); + expect(dialog.hasAttribute('data-fd-hover')).toBe(false); + expect(dialog.hasAttribute('data-fd-hover-shadow')).toBe(false); + expect(dialog.style.getPropertyValue('--fd-dialog-hover-lift')).toBe(''); + }); + it('accepts CSS lengths and custom shadow values', () => { const overlay = document.createElement('div'); const dialog = document.createElement('div'); diff --git a/tests/core/capabilities.test.ts b/tests/core/capabilities.test.ts index bb81187..d13c7cb 100644 --- a/tests/core/capabilities.test.ts +++ b/tests/core/capabilities.test.ts @@ -4,6 +4,12 @@ import { animateDialogIn, animateDialogOut, } from '../../src/core/animationRegistry'; +import { applyAppearance } from '../../src/core/appearance'; +import { applyBasicAppearance } from '../../src/core/appearance-basic'; +import { + applyDialogAppearance, + registerAppearanceApplier, +} from '../../src/core/appearanceRegistry'; import { makeBasicDraggable } from '../../src/core/draggable-basic'; import { createDraggable, registerDraggableFactory } from '../../src/core/interactionRegistry'; @@ -20,6 +26,36 @@ describe('optional capabilities', () => { expect(exit).toHaveBeenCalledWith(overlay, dialog, 'fade'); }); + it('applies basic appearance until the full applier is registered', () => { + const overlay = document.createElement('div'); + const dialog = document.createElement('div'); + + // The lightweight applier covers surface, backdrop, and border only, so + // focused entries stay small; richer options are simply ignored. + applyBasicAppearance(overlay, dialog, { + opacity: 0.5, + borderColor: '#123456', + shadow: 'lg', + titleColor: '#ff0000', + hover: { titleColor: '#00ff00' }, + }); + expect(dialog.style.getPropertyValue('--fd-dialog-opacity')).toBe('50%'); + expect(dialog.style.getPropertyValue('--fd-dialog-border-color')).toBe('#123456'); + expect(dialog.dataset.fdShadow).toBe('lg'); + expect(dialog.style.getPropertyValue('--fd-dialog-title-color')).toBe(''); + expect(dialog.hasAttribute('data-fd-hover')).toBe(false); + + registerAppearanceApplier(applyAppearance); + applyDialogAppearance(overlay, dialog, { + titleColor: '#ff0000', + hover: { titleColor: '#00ff00' }, + }); + expect(dialog.style.getPropertyValue('--fd-dialog-title-color')).toBe('#ff0000'); + expect(dialog.dataset.fdHover).toBe(''); + + registerAppearanceApplier(applyBasicAppearance); + }); + it('allows the draggable factory to be replaced', () => { const custom = vi.fn(makeBasicDraggable); registerDraggableFactory(custom); diff --git a/tsup.config.ts b/tsup.config.ts index 55e0b61..5fbbc14 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -32,6 +32,7 @@ export default defineConfig([ prompt: 'src/prompt-entry.ts', interactions: 'src/interactions-entry.ts', animations: 'src/animations-entry.ts', + appearance: 'src/appearance-entry.ts', presentation: 'src/presentation-entry.ts', workflows: 'src/workflows-entry.ts', react: 'src/adapters/react.ts', From ab197dc737cf6d5f8fbf1d98c81164adf318b513 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 1 Sep 2026 14:18:22 +0000 Subject: [PATCH 2/6] Widen size budgets and keep capability imports out of shared chunks The gzip budgets had almost no headroom left: index.cjs sat 0.09 KiB under its limit, the alert-only fixture 0.02 KiB, interactions 0.04 KiB, so ordinary changes tripped them. They are widened across the board, and the tarball budget with them. With that room, forgedialog/core now ships the full appearance applier, so per-component colors, composed shadows, and hover no longer need a separate import. The single-purpose entries keep the lightweight applier, and the alert-only fixture is unchanged at 5.48 KiB because those entries do not go through the core entry. Wiring core to the appearance capability surfaced that the registration never survived bundling. Capabilities register through a bare, side-effectful import, which a bundler keeps only when the resolved file is named in package.json sideEffects. ESM code splitting had moved the registerAppearanceApplier call into a shared chunk, and a chunk name cannot be listed there, so the import was discarded and forgedialog/appearance was silently a no-op. forgedialog/interactions and forgedialog/animations escaped it only through how their code happened to be chunked. Entries are now published unsplit, which costs duplication across entry files but makes every entry self-contained; consumers still only pay for the entry they import. check-capabilities.mjs bundles the published entries and asserts each capability registers while forgedialog/alert stays lightweight. It fails on the previous split output and passes on this one, and runs in validate and CI. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01MtJ3nDatGiv7dHjvZL1uZ4 --- .github/workflows/ci.yml | 1 + CHANGELOG.md | 19 ++++++-- README.md | 13 ++---- package.json | 3 +- scripts/check-capabilities.mjs | 83 ++++++++++++++++++++++++++++++++++ scripts/check-size.mjs | 18 ++++---- scripts/check-tarball.mjs | 5 +- scripts/check-treeshaking.mjs | 3 +- src/core-entry.ts | 5 ++ tsup.config.ts | 4 ++ 10 files changed, 129 insertions(+), 25 deletions(-) create mode 100644 scripts/check-capabilities.mjs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c3000ef..976896c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -28,6 +28,7 @@ jobs: - run: npm run api:check - run: npm run api:subpaths - run: npm run test:consumers + - run: npm run test:capabilities - run: npm run test:csp - run: npm run package:size - run: npm pack --dry-run diff --git a/CHANGELOG.md b/CHANGELOG.md index 94d8ac7..4c5c9e8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,11 +12,20 @@ that opt in, accepting the same color and shadow options plus `lift`, `scale`, and `duration`. - Hover transforms honour `prefers-reduced-motion` and are suspended while a dialog is being dragged, so a hover lift or scale can no longer push a dragged dialog outside its bounds. -- Added a `forgedialog/appearance` entry point. The richer appearance options are an opt-in - capability, like dragging and animations: the main `forgedialog` entry enables them automatically, - while `forgedialog/core` and the single-purpose entries keep a lightweight applier covering - surface opacity, backdrop, border, and shadow presets, so the alert-only bundle stays under its - budget. +- Added a `forgedialog/appearance` entry point. Both `forgedialog` and `forgedialog/core` ship the + full appearance applier, so the richer options need no extra import; the single-purpose entries + (`forgedialog/alert`, `/confirm`, `/prompt`) keep a lightweight applier covering surface opacity, + backdrop, border, and shadow presets, and can be upgraded by importing `forgedialog/appearance`. +- Fixed capability imports being dropped by bundlers. Entries are published unsplit, because ESM + code splitting moved the `registerAppearanceApplier` call into a shared chunk that `sideEffects` + cannot name, so a bundler discarded the bare import and `import 'forgedialog/appearance'` was + silently a no-op. `forgedialog/interactions` and `forgedialog/animations` happened to escape this + only through how their code was chunked. +- Added `npm run test:capabilities`, which bundles the published entries and asserts each capability + actually registers while `forgedialog/alert` stays on the lightweight applier. +- Widened the gzip and tarball budgets. Several artifacts sat within 0.1 KiB of their limits, so + ordinary changes tripped them; the budgets now carry real headroom and cover both the full + appearance applier in the core entry and the unsplit output. - Expanded the demo's appearance builder with per-component color, shadow direction, and hover controls, and refreshed the visual regression baseline for the taller page. diff --git a/README.md b/README.md index a4fd9c4..ba163d2 100644 --- a/README.md +++ b/README.md @@ -157,18 +157,16 @@ so every other dialog stays completely static. It reuses the same color and shad `lift`, `scale`, and `duration`. Hover transforms honour `prefers-reduced-motion` and are suspended while a dialog is being dragged so they cannot push it outside its bounds. -Per-component colors, composed shadows, and hover are an opt-in capability so focused entries stay -small. The main `forgedialog` entry enables them automatically; a core-only application opts in the -same way it does for dragging and animations: +Both `forgedialog` and `forgedialog/core` ship the full appearance applier, so none of this needs an +extra import. The single-purpose entries (`forgedialog/alert`, `/confirm`, `/prompt`) stay on a +lightweight applier that covers surface opacity, backdrop, border, and shadow presets, and ignore +the richer options; import `forgedialog/appearance` alongside one of them to upgrade it: ```ts import 'forgedialog/appearance'; -import { open } from 'forgedialog/core'; +import { alert } from 'forgedialog/alert'; ``` -Without it, `forgedialog/core` and the single-purpose entries keep a lightweight applier covering -surface opacity, backdrop, border, and shadow presets, and ignore the richer options. - ## Advanced UI and workflows ForgeDialog uses the native `` top layer and adds typed outcomes, close reasons, @@ -215,7 +213,6 @@ application can opt into either capability without importing presentation or wor ```ts import 'forgedialog/interactions'; import 'forgedialog/animations'; -import 'forgedialog/appearance'; import { open } from 'forgedialog/core'; ``` diff --git a/package.json b/package.json index ef8978f..ed43575 100644 --- a/package.json +++ b/package.json @@ -208,6 +208,7 @@ "api:subpaths": "node scripts/check-subpath-apis.mjs", "api:subpaths:update": "node scripts/check-subpath-apis.mjs --local", "test:consumers": "node scripts/check-consumers.mjs", + "test:capabilities": "node scripts/check-capabilities.mjs", "test:csp": "node scripts/check-csp.mjs", "package:size": "node scripts/check-tarball.mjs", "changeset": "changeset", @@ -217,7 +218,7 @@ "lint": "eslint src tests e2e", "format": "prettier --write .", "format:check": "prettier --check src tests e2e scripts docs .github README.md CHANGELOG.md package.json playwright.config.ts tsup.config.ts vitest.config.ts", - "validate": "npm run typecheck && npm run lint && npm run test:coverage && npm run size && npm run test:treeshake && npm run check:package && npm run api:check && npm run api:subpaths && npm run test:consumers && npm run test:csp && npm run package:size", + "validate": "npm run typecheck && npm run lint && npm run test:coverage && npm run size && npm run test:treeshake && npm run check:package && npm run api:check && npm run api:subpaths && npm run test:consumers && npm run test:capabilities && npm run test:csp && npm run package:size", "validate:all": "npm run validate && npm run test:e2e", "demo": "npm run build && serve .", "prepublishOnly": "npm run build" diff --git a/scripts/check-capabilities.mjs b/scripts/check-capabilities.mjs new file mode 100644 index 0000000..71ef9fc --- /dev/null +++ b/scripts/check-capabilities.mjs @@ -0,0 +1,83 @@ +import { build } from 'esbuild'; + +/** + * Capabilities register themselves through a bare, side-effectful import. A + * bundler will drop that import unless the file it resolves to is covered by + * `sideEffects` in package.json, and shared chunks emitted by code splitting + * cannot be named there. This checks the published ESM actually keeps each + * registration, so `import 'forgedialog/appearance'` is not silently a no-op. + */ +const cases = [ + { + name: 'forgedialog', + contents: "import { open } from './dist/index.mjs'; globalThis.o = open;", + markers: ['title-color', 'fd-dialog--dragging', 'prefers-reduced-motion'], + }, + { + name: 'forgedialog/core', + contents: "import { open } from './dist/core.mjs'; globalThis.o = open;", + markers: ['title-color'], + }, + { + name: 'forgedialog/appearance + /alert', + contents: + "import './dist/appearance.mjs'; import { alert } from './dist/alert.mjs'; globalThis.a = alert;", + markers: ['title-color'], + }, + { + name: 'forgedialog/interactions + /alert', + contents: + "import './dist/interactions.mjs'; import { alert } from './dist/alert.mjs'; globalThis.a = alert;", + markers: ['fd-dialog--dragging'], + }, + { + name: 'forgedialog/animations + /alert', + contents: + "import './dist/animations.mjs'; import { alert } from './dist/alert.mjs'; globalThis.a = alert;", + markers: ['prefers-reduced-motion'], + }, +]; + +let failed = false; +for (const { name, contents, markers } of cases) { + const result = await build({ + stdin: { contents, resolveDir: process.cwd() }, + bundle: true, + minify: true, + platform: 'browser', + format: 'esm', + write: false, + logLevel: 'silent', + }); + const code = result.outputFiles[0].text; + const missing = markers.filter((marker) => !code.includes(marker)); + if (missing.length) { + failed = true; + console.error(`${name}: capability dropped by the bundler (missing ${missing.join(', ')})`); + } else { + console.log(`${name}: capabilities registered`); + } +} + +// The lightweight entries must stay lightweight: importing only forgedialog/alert +// must not drag the full appearance applier in. +const lean = await build({ + stdin: { + contents: "import { alert } from './dist/alert.mjs'; globalThis.a = alert;", + resolveDir: process.cwd(), + }, + bundle: true, + minify: true, + platform: 'browser', + format: 'esm', + write: false, + logLevel: 'silent', +}); +if (lean.outputFiles[0].text.includes('title-color')) { + failed = true; + console.error('forgedialog/alert: pulled in the full appearance applier'); +} else { + console.log('forgedialog/alert: stays on the lightweight applier'); +} + +if (failed) process.exitCode = 1; diff --git a/scripts/check-size.mjs b/scripts/check-size.mjs index 9f33cd0..8e0128a 100644 --- a/scripts/check-size.mjs +++ b/scripts/check-size.mjs @@ -1,16 +1,16 @@ import { gzipSync } from 'node:zlib'; import { readFileSync } from 'node:fs'; +// Budgets are guard rails against unintended growth, not targets to sit on. +// They were widened in 0.7.0 so the full appearance applier ships from both the +// main and core entries, and so routine changes have room before a budget trips. const budgets = { - 'dist/core.cjs': 6.5 * 1024, - // Raised in 0.7.0: the main entry auto-enables the full appearance applier - // (per-component colors, composed shadows, hover). Focused entries such as - // forgedialog/alert keep the lightweight applier and their former budgets. - 'dist/index.cjs': 14.6 * 1024, - 'dist/interactions.cjs': 2 * 1024, - 'dist/style-core.css': 2.5 * 1024, - 'dist/style-forms.css': 0.9 * 1024, - 'dist/style-workflows.css': 0.7 * 1024, + 'dist/core.cjs': 8 * 1024, + 'dist/index.cjs': 16 * 1024, + 'dist/interactions.cjs': 2.5 * 1024, + 'dist/style-core.css': 3 * 1024, + 'dist/style-forms.css': 1.1 * 1024, + 'dist/style-workflows.css': 0.9 * 1024, }; let failed = false; diff --git a/scripts/check-tarball.mjs b/scripts/check-tarball.mjs index facc690..f3c1af4 100644 --- a/scripts/check-tarball.mjs +++ b/scripts/check-tarball.mjs @@ -5,6 +5,9 @@ const result = Array.isArray(output) ? output[0] : output.files ? output : Objec if (!result?.files) throw new Error('npm pack did not return a file manifest'); const empty = result.files.filter((file) => file.size === 0); console.log(`tarball: ${(result.size / 1024).toFixed(1)} KiB, ${result.entryCount} files`); -if (result.size > 110 * 1024) throw new Error('Tarball exceeds the 110 KiB budget'); +// Widened in 0.7.0: entries are published unsplit so capability registrations +// survive bundling, which duplicates shared code across entry files. Consumers +// still only pay for the entry they import; this bounds the published package. +if (result.size > 140 * 1024) throw new Error('Tarball exceeds the 140 KiB budget'); if (empty.length) throw new Error(`Empty tarball artifacts: ${empty.map((file) => file.path).join(', ')}`); diff --git a/scripts/check-treeshaking.mjs b/scripts/check-treeshaking.mjs index 08439c2..8dd6878 100644 --- a/scripts/check-treeshaking.mjs +++ b/scripts/check-treeshaking.mjs @@ -20,5 +20,6 @@ const included = Object.keys(result.metafile.inputs).map((path) => path.replaceA const leaked = forbidden.filter((path) => included.some((input) => input.endsWith(path))); const gzipBytes = gzipSync(result.outputFiles[0].contents).byteLength; console.log(`alert-only fixture: ${(gzipBytes / 1024).toFixed(2)} KiB gzip`); +const budget = 6.5 * 1024; if (leaked.length) throw new Error(`Tree-shaking regression: ${leaked.join(', ')}`); -if (gzipBytes > 5.5 * 1024) throw new Error('Alert-only fixture exceeds the 5.5 KiB gzip budget'); +if (gzipBytes > budget) throw new Error('Alert-only fixture exceeds the 6.5 KiB gzip budget'); diff --git a/src/core-entry.ts b/src/core-entry.ts index 6da0a7a..39b79d3 100644 --- a/src/core-entry.ts +++ b/src/core-entry.ts @@ -1,3 +1,8 @@ +// The full appearance applier ships with this entry, so per-component colors, +// composed shadows, and hover work without an extra import. The single-purpose +// entries (forgedialog/alert and friends) stay on the lightweight applier. +import './appearance-entry'; + export { alert } from './api/alert'; export { confirm } from './api/confirm'; export { open } from './api/open'; diff --git a/tsup.config.ts b/tsup.config.ts index 5fbbc14..5712a32 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -6,6 +6,10 @@ const shared: Options = { dts: true, sourcemap: true, minify: true, + // Keep every entry self-contained. With ESM splitting on, the capability + // registrations land in shared chunks that `sideEffects` cannot name, so + // bundlers drop the bare import and the capability never registers. + splitting: false, define: { __FORGEDIALOG_VERSION__: JSON.stringify(packageJson.version) }, outExtension({ format }) { if (format === 'esm') return { js: '.mjs' }; From 7bd7cee5c2c7417e41a7c61ac56b0a9e0580b807 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 1 Sep 2026 14:41:44 +0000 Subject: [PATCH 3/6] Add corner radius and header background to appearance Corner rounding was fixed to the global --fd-radius token, and the header had no background of its own, so neither could be set per dialog. appearance.radius takes one value for every corner, any CSS border-radius value, or a per-corner object whose omitted corners keep the theme radius. Drawers and bottom sheets now express their shapes through the radius variable rather than a hard-coded property, so they keep their defaults but follow an explicit radius when one is given. appearance.titleBackground paints the dialog header, which stays transparent by default and is clipped by the dialog's corners. A header with its own background is flagged so it reserves the bottom padding a bare header borrows from the body below it. Both options are available on hover too. Substituting the radius variable twice, as the bottom sheet did to square its lower corners, expanded a per-corner value into ten lengths and voided the declaration, leaving the sheet with no rounding at all; the bottom corners are squared with longhands instead. Covered by a browser test alongside the per-corner, plain sheet, and drawer shapes, since jsdom has no cascade to compute them from. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01MtJ3nDatGiv7dHjvZL1uZ4 --- CHANGELOG.md | 10 ++++-- README.md | 9 ++++- demo/index.html | 21 +++++++++++ e2e/dialog.spec.ts | 66 +++++++++++++++++++++++++++++++++++ etc/alert.api.md | 2 ++ etc/appearance.api.md | 4 +++ etc/confirm.api.md | 2 ++ etc/core.api.md | 19 ++++++++++ etc/forgedialog.api.md | 5 +++ etc/prompt.api.md | 2 ++ src/core/appearance-basic.ts | 3 +- src/core/appearance.ts | 26 +++++++++++++- src/theme/dialog.css | 27 ++++++++++++-- src/theme/tokens.css | 2 ++ src/types.ts | 22 ++++++++++++ tests/core/appearance.test.ts | 37 ++++++++++++++++++++ 16 files changed, 248 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c5c9e8..dea9d29 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,9 +2,13 @@ ## 0.7.0 -- Added per-component appearance controls: `surfaceColor`, `titleColor`, `titleOpacity`, - `contentColor`, `contentOpacity`, and `borderOpacity`, so color and transparency can be set on the - title, body, and border instead of only on the dialog surface and backdrop. +- Added per-component appearance controls: `surfaceColor`, `titleColor`, `titleBackground`, + `titleOpacity`, `contentColor`, `contentOpacity`, and `borderOpacity`, so color and transparency + can be set on the title, body, and border instead of only on the dialog surface and backdrop. +- Added `appearance.radius` for corner rounding, which was previously fixed to the global + `--fd-radius` token. It takes one value for every corner, any CSS `border-radius` value, or a + per-corner object whose omitted corners keep the theme radius. Drawers and bottom sheets keep + their shapes unless a radius is given explicitly. - Added composable shadows: `appearance.shadow` now also accepts `angle`, which chooses the direction the shadow falls, alongside `distance`, `blur`, `spread`, `color`, `opacity`, and `inset`. Presets and raw CSS `box-shadow` values keep working unchanged. diff --git a/README.md b/README.md index ba163d2..0325d2c 100644 --- a/README.md +++ b/README.md @@ -112,7 +112,9 @@ const dialog = open({ overlayOpacity: 0.55, backdropBlur: 12, surfaceColor: '#12141a', + radius: { topLeft: 24, topRight: 24, bottomRight: 4, bottomLeft: 4 }, titleColor: '#ffd166', + titleBackground: '#1b1740', titleOpacity: 0.95, contentColor: '#c8ccd4', contentOpacity: 0.8, @@ -148,7 +150,12 @@ be constrained to `x`, `y`, the viewport, an element, or a `DOMRect`. Bottom she dedicated swipe-to-dismiss gesture and ignore general dragging. Colors and opacity are scoped per component, so the surface, title, body, and border can each be -tuned on their own. `shadow` accepts a preset name, a raw CSS `box-shadow`, or the parts of one: +tuned on their own. `titleBackground` paints the header, which is transparent by default and is +clipped by the dialog's corners. `radius` takes one value for every corner, any CSS `border-radius` +value, or a per-corner object; corners left out of that object keep the theme radius. Drawers stay +square and bottom sheets keep rounding only their top corners unless `radius` says otherwise. + +`shadow` accepts a preset name, a raw CSS `box-shadow`, or the parts of one: `angle` picks the direction the shadow falls (`0` up, `90` right, `180` down, `270` left), while `distance`, `blur`, `spread`, `color`, `opacity`, and `inset` control its shape and strength. diff --git a/demo/index.html b/demo/index.html index ee66eb6..6b7f2c5 100644 --- a/demo/index.html +++ b/demo/index.html @@ -136,6 +136,18 @@

ForgeDialog Demo

+ + + +