diff --git a/apps/builder/app/builder/features/components/components.tsx b/apps/builder/app/builder/features/components/components.tsx
index 362ce3f21cf6..21051ca1a801 100644
--- a/apps/builder/app/builder/features/components/components.tsx
+++ b/apps/builder/app/builder/features/components/components.tsx
@@ -55,6 +55,7 @@ type Meta = {
label: string;
description: undefined | string;
icon?: string;
+ firstInstance: { component: string; tag?: string };
};
const $metas = computed(
@@ -87,6 +88,7 @@ const $metas = computed(
order: componentMeta.order,
label: getInstanceLabel({ component: name }, componentMeta),
description: componentMeta.description,
+ firstInstance: { component: name },
});
}
for (const [name, templateMeta] of templates) {
@@ -103,6 +105,7 @@ const $metas = computed(
continue;
}
+ availableComponents.add(name);
metas.push({
name,
category: templateMeta.category ?? "hidden",
@@ -113,6 +116,7 @@ const $metas = computed(
getInstanceLabel({ component: name }, templateMeta),
description: templateMeta.description,
icon: templateMeta.icon,
+ firstInstance: templateMeta.template.instances[0],
});
}
const metasByCategory = mapGroupBy(metas, (meta) => meta.category);
@@ -339,7 +343,7 @@ export const ComponentsPanel = ({
icon={
diff --git a/apps/builder/app/builder/features/settings-panel/controls/tag-control.tsx b/apps/builder/app/builder/features/settings-panel/controls/tag-control.tsx
index 993f0e47e37e..2e9acf45b79f 100644
--- a/apps/builder/app/builder/features/settings-panel/controls/tag-control.tsx
+++ b/apps/builder/app/builder/features/settings-panel/controls/tag-control.tsx
@@ -79,15 +79,15 @@ export const TagControl = ({ meta, prop }: ControlProps<"tag">) => {
>
{options.length > 10 ? (
- defaultHighlightedIndex={0}
getItems={() => options}
+ itemToString={(item) => item ?? options[0]}
+ value={value ?? computedTag}
+ selectedItem={computedTag}
+ onChange={(value) => setValue(value ?? undefined)}
onItemSelect={(item) => {
updateTag(item);
setValue(undefined);
}}
- itemToString={(item) => item ?? options[0]}
- value={value ?? computedTag}
- onChange={(value) => setValue(value ?? undefined)}
getDescription={(item) => (
{elementsByTag[item ?? ""]?.description}
diff --git a/apps/builder/app/builder/features/settings-panel/controls/text-content.tsx b/apps/builder/app/builder/features/settings-panel/controls/text-content.tsx
index be27c01278ae..ae96f3241aa8 100644
--- a/apps/builder/app/builder/features/settings-panel/controls/text-content.tsx
+++ b/apps/builder/app/builder/features/settings-panel/controls/text-content.tsx
@@ -1,7 +1,15 @@
-import { useId, useMemo } from "react";
+import { useMemo } from "react";
import { useStore } from "@nanostores/react";
import { computed } from "nanostores";
-import { Flex, rawTheme, Text, TextArea } from "@webstudio-is/design-system";
+import {
+ DialogClose,
+ DialogMaximize,
+ DialogTitle,
+ DialogTitleActions,
+ Flex,
+ rawTheme,
+ Text,
+} from "@webstudio-is/design-system";
import type { Instance } from "@webstudio-is/sdk";
import { AlertIcon } from "@webstudio-is/icons";
import { $instances } from "~/shared/nano-states";
@@ -10,6 +18,7 @@ import {
BindingPopover,
} from "~/builder/shared/binding-popover";
import { updateWebstudioData } from "~/shared/instance-utils";
+import { CodeEditor } from "~/builder/shared/code-editor";
import {
type ControlProps,
useLocalValue,
@@ -55,7 +64,6 @@ export const TextContent = ({
updateChildren(instanceId, "text", value);
}
});
- const id = useId();
const { scope, aliases } = useStore($selectedInstanceScope);
let expression: undefined | string;
@@ -107,15 +115,24 @@ export const TextContent = ({
}
>
-