Files
PaperClipAI/ui
dependabot[bot] 479554120d build(deps): bump i18next from 26.4.0 to 26.4.2 (#12973)
Bumps [i18next](https://github.com/i18next/i18next) from 26.4.0 to
26.4.2.
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/i18next/i18next/releases">i18next's
releases</a>.</em></p>
<blockquote>
<h2>v26.4.2</h2>
<ul>
<li>fix: <code>$&amp;</code>, <code>$`</code>, <code>$'</code> and
<code>$$</code> inside a nested value (<code>$t(key)</code>) now stay
literal. <code>nest()</code> handed the resolved value straight to
<code>String.replace</code> as the replacement argument, so those
sequences were read as replacement patterns: <code>$&amp;</code>
re-inserted the <code>$t(...)</code> match, <code>$`</code> /
<code>$'</code> inserted the text before / after it, and <code>$$</code>
collapsed to <code>$</code>. Through <code>t()</code> the
<code>$&amp;</code> case was worse than a wrong string: the nested
lookup resets the shared nesting regexp, so the re-inserted
<code>$t(...)</code> was matched again on every pass and
<code>t()</code> never returned — also under the default
<code>escapeValue: true</code> when the value arrives via a variable
forwarded through nesting options (<code>$t(key, { &quot;name&quot;:
&quot;{{name}}&quot; })</code> with a name containing
<code>$&amp;</code>). The value is now <code>$</code>-escaped at the
<code>String.replace</code> call, the same guard
<code>interpolate()</code> already has, and a non-string value returned
by a formatter in the nesting chain (<code>$t(key, myFormat)</code>) is
stringified before that. Nested values are still not HTML-escaped (<a
href="https://redirect.github.com/i18next/i18next/issues/854">#854</a>).
Thanks <a href="https://github.com/mahirhir"><code>@​mahirhir</code></a>
(<a
href="https://redirect.github.com/i18next/i18next/pull/2447">#2447</a>).</li>
</ul>
<h2>v26.4.1</h2>
<ul>
<li>fix(types): the selector-form <code>keyPrefix</code> overload of
<code>getFixedT()</code> is now available under <code>enableSelector:
'strict'</code>. Its constraint was gated on <code>true |
'optimize'</code> only, so under <code>'strict'</code> it collapsed to
<code>never</code>, the overload dropped out, and the returned
<code>t</code> silently lost its <code>keyPrefix</code> scope
(<code>t(($) =&gt; $.deep)</code> failed with <code>Property 'deep' does
not exist on type '{}'</code>). The same call already typechecked under
<code>true</code> and <code>'optimize'</code>. Thanks <a
href="https://github.com/hovelopin"><code>@​hovelopin</code></a> (<a
href="https://redirect.github.com/i18next/i18next/pull/2446">#2446</a>).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Changelog</summary>
<p><em>Sourced from <a
href="https://github.com/i18next/i18next/blob/master/CHANGELOG.md">i18next's
changelog</a>.</em></p>
<blockquote>
<h2>26.4.2</h2>
<ul>
<li>fix: <code>$&amp;</code>, <code>$`</code>, <code>$'</code> and
<code>$$</code> inside a nested value (<code>$t(key)</code>) now stay
literal. <code>nest()</code> handed the resolved value straight to
<code>String.replace</code> as the replacement argument, so those
sequences were read as replacement patterns: <code>$&amp;</code>
re-inserted the <code>$t(...)</code> match, <code>$`</code> /
<code>$'</code> inserted the text before / after it, and <code>$$</code>
collapsed to <code>$</code>. Through <code>t()</code> the
<code>$&amp;</code> case was worse than a wrong string: the nested
lookup resets the shared nesting regexp, so the re-inserted
<code>$t(...)</code> was matched again on every pass and
<code>t()</code> never returned — also under the default
<code>escapeValue: true</code> when the value arrives via a variable
forwarded through nesting options (<code>$t(key, { &quot;name&quot;:
&quot;{{name}}&quot; })</code> with a name containing
<code>$&amp;</code>). The value is now <code>$</code>-escaped at the
<code>String.replace</code> call, the same guard
<code>interpolate()</code> already has, and a non-string value returned
by a formatter in the nesting chain (<code>$t(key, myFormat)</code>) is
stringified before that. Nested values are still not HTML-escaped (<a
href="https://redirect.github.com/i18next/i18next/issues/854">#854</a>).
Thanks <a href="https://github.com/mahirhir"><code>@​mahirhir</code></a>
(<a
href="https://redirect.github.com/i18next/i18next/pull/2447">#2447</a>).</li>
</ul>
<h2>26.4.1</h2>
<ul>
<li>fix(types): the selector-form <code>keyPrefix</code> overload of
<code>getFixedT()</code> is now available under <code>enableSelector:
'strict'</code>. Its constraint was gated on <code>true |
'optimize'</code> only, so under <code>'strict'</code> it collapsed to
<code>never</code>, the overload dropped out, and the returned
<code>t</code> silently lost its <code>keyPrefix</code> scope
(<code>t(($) =&gt; $.deep)</code> failed with <code>Property 'deep' does
not exist on type '{}'</code>). The same call already typechecked under
<code>true</code> and <code>'optimize'</code>. Thanks <a
href="https://github.com/hovelopin"><code>@​hovelopin</code></a> (<a
href="https://redirect.github.com/i18next/i18next/pull/2446">#2446</a>).</li>
</ul>
</blockquote>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/i18next/i18next/commit/4dba50f20669c3678db0812255716eb7693ad2da"><code>4dba50f</code></a>
26.4.2</li>
<li><a
href="https://github.com/i18next/i18next/commit/e436b625a648e1a48ea27ecf5f2fba8020d67009"><code>e436b62</code></a>
build</li>
<li><a
href="https://github.com/i18next/i18next/commit/d955fb086e9f4ded1200f51ecbb21034dbad1d92"><code>d955fb0</code></a>
fix: stringify formatter results in nested values, changelog
v26.4.2</li>
<li><a
href="https://github.com/i18next/i18next/commit/dfafa3ca725e1415ef20e7fb5b1b3e4468f3c425"><code>dfafa3c</code></a>
fix: keep replacement patterns literal in nested values (<a
href="https://redirect.github.com/i18next/i18next/issues/2447">#2447</a>)</li>
<li><a
href="https://github.com/i18next/i18next/commit/3c9981e22dd471b6bca224aa1f60e04ba3f6153a"><code>3c9981e</code></a>
chore: keep dev-only and local files out of the npm package</li>
<li><a
href="https://github.com/i18next/i18next/commit/c057ee048c55a61c095acc017365e997e4f723f8"><code>c057ee0</code></a>
26.4.1</li>
<li><a
href="https://github.com/i18next/i18next/commit/02e3e1659b7cc9fedaaf53797597483ef8003df2"><code>02e3e16</code></a>
changelog v26.4.1</li>
<li><a
href="https://github.com/i18next/i18next/commit/6f198f2508ba8986d1bbf25a8b922d01afcf0751"><code>6f198f2</code></a>
fix(types): allow selector keyPrefix in getFixedT under enableSelector
'stric...</li>
<li>See full diff in <a
href="https://github.com/i18next/i18next/compare/v26.4.0...v26.4.2">compare
view</a></li>
</ul>
</details>
<br />

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-10-01 19:58:00 -07:00
..
…

@paperclipai/ui

Published static assets for the Paperclip board UI.

What gets published

The npm package contains the production build under dist/. It does not ship the UI source tree or workspace-only dependencies.

Storybook

Storybook config, stories, and fixtures live under ui/storybook/.

pnpm --filter @paperclipai/ui storybook
pnpm --filter @paperclipai/ui build-storybook

Typical use

Install the package, then serve or copy the built files from node_modules/@paperclipai/ui/dist.

Editor dependency identity

Keep the root and workspace overrides for @codemirror/state, @codemirror/view, and @lezer/common aligned. CodeMirror requires shared extension identity, while Lezer parsers and syntax highlighters require shared NodeProp IDs. Multiple Lezer copies can crash code-block highlighting with tags is not iterable. src/lib/codemirror-single-instance.test.ts checks the installed dependency graph and highlights sample code through the editor's real language dependencies. GitHub Actions owns regeneration of pnpm-lock.yaml.