diff --git a/package.json b/package.json
index 85836a1df..5ce083c10 100644
--- a/package.json
+++ b/package.json
@@ -106,6 +106,10 @@
"prepare": "npm run panda",
"panda": "panda codegen",
"panda:watch": "panda codegen --watch",
+ "dev:link-ui": "rm -rf node_modules/@microbit/ui && ln -s ../../../ui/packages/ui node_modules/@microbit/ui && rm -rf styled-system && npm run panda",
+ "dev:link-ui-patterns": "rm -rf node_modules/@microbit/ui-patterns && ln -s ../../../ui/packages/ui-patterns node_modules/@microbit/ui-patterns && rm -rf styled-system && npm run panda",
+ "dev:link-theme": "npm --prefix ../python-editor-v3-microbit run build && mkdir -p node_modules/@microbit-foundation && rm -rf node_modules/@microbit-foundation/python-editor-v3-microbit && ln -s ../../../python-editor-v3-microbit node_modules/@microbit-foundation/python-editor-v3-microbit && rm -rf styled-system && npm run panda",
+ "dev:unlink-theme": "rm -rf node_modules/@microbit-foundation/python-editor-v3-microbit && rm -rf styled-system && npm run panda",
"serve": "npx serve --no-clipboard -l 3000 -- build/",
"prestart": "npm run panda",
"start": "vite dev",
diff --git a/src/common/GenericDialog.tsx b/src/common/GenericDialog.tsx
index fc4310ceb..febea7a64 100644
--- a/src/common/GenericDialog.tsx
+++ b/src/common/GenericDialog.tsx
@@ -78,7 +78,7 @@ export const GenericDialogFooter = ({
variant="link"
size="lg"
onPress={onCloseDontShowAgain}
- css={{ color: "brand.500", mr: "auto" }}
+ css={{ color: "fg.link", mr: "auto" }}
>
diff --git a/src/common/PostSaveDialog.tsx b/src/common/PostSaveDialog.tsx
index 53cdc2127..f2494438e 100644
--- a/src/common/PostSaveDialog.tsx
+++ b/src/common/PostSaveDialog.tsx
@@ -125,7 +125,7 @@ const PostSaveDialogBody = ({
values={{
link: (chunks: ReactNode) => (
{
+ expect(unknownSemanticTokens(appPreset, { introduces })).toEqual([]);
+});
+
+// A flat override of a { base, _onDark } token merges wholesale and
+// silently drops the dark-surface flip — the same failure, one door over.
+it("app preset keeps every condition the base preset's tokens carry", () => {
+ expect(droppedConditionTokens(appPreset)).toEqual([]);
+});
+
+// The private brand preset is optional — present only when linked
+// (`npm run dev:link-theme`) or installed in a brand build, exactly as
+// panda.config.ts treats it. Checked here rather than in its own repo so
+// that repo stays free of a dependency on this library, and because the
+// merge this guards against happens on this side.
+const require = createRequire(import.meta.url);
+let brandPreset: unknown;
+try {
+ brandPreset = (
+ require("@microbit-foundation/python-editor-v3-microbit/panda-preset") as {
+ default: unknown;
+ }
+ ).default;
+} catch {
+ brandPreset = undefined;
+}
+
+describe.skipIf(!brandPreset)("private brand preset", () => {
+ it("overrides only semantic tokens @microbit/ui defines", () => {
+ expect(unknownSemanticTokens(brandPreset, { introduces })).toEqual([]);
+ });
+
+ it("keeps every condition the base preset's tokens carry", () => {
+ expect(droppedConditionTokens(brandPreset)).toEqual([]);
+ });
+});
diff --git a/src/documentation/api/ApiDocumentation.tsx b/src/documentation/api/ApiDocumentation.tsx
index 32f0d10ea..feddadf13 100644
--- a/src/documentation/api/ApiDocumentation.tsx
+++ b/src/documentation/api/ApiDocumentation.tsx
@@ -105,7 +105,7 @@ const ActiveLevel = ({
id="api-description"
values={{
link: (chunks: ReactNode) => (
-
+
{chunks}
),
diff --git a/src/documentation/common/DocumentationContent.tsx b/src/documentation/common/DocumentationContent.tsx
index df5984499..573354231 100644
--- a/src/documentation/common/DocumentationContent.tsx
+++ b/src/documentation/common/DocumentationContent.tsx
@@ -73,7 +73,7 @@ const DocumentationApiLinkMark = (
const [, setState] = useRouterState();
return (
{
e.preventDefault();
setState({
@@ -93,7 +93,7 @@ const DocumentationInternalLinkMark = (
const [state, setState] = useRouterState();
return (
{
e.preventDefault();
setState(
@@ -118,7 +118,7 @@ const DocumentationExternalLinkMark = (
) => {
return (
(
{
link: (chunks: ReactNode) => (
diff --git a/src/workbench/connect-dialogs/FirmwareDialog.tsx b/src/workbench/connect-dialogs/FirmwareDialog.tsx
index 17f501726..03208e61c 100644
--- a/src/workbench/connect-dialogs/FirmwareDialog.tsx
+++ b/src/workbench/connect-dialogs/FirmwareDialog.tsx
@@ -69,7 +69,7 @@ const FirmwareDialogBody = () => {
values={{
link: (chunks: ReactNode) => (
{
(
-
+
{chunks}
),
@@ -109,7 +105,7 @@ const NotFoundDialogBody = ({
values={{
link: (chunks: ReactNode) => (