diff --git a/web/apps/labelstudio/src/pages/CreateProject/Import/Import.jsx b/web/apps/labelstudio/src/pages/CreateProject/Import/Import.jsx
index 3dc9c7450f57..97737eb9be70 100644
--- a/web/apps/labelstudio/src/pages/CreateProject/Import/Import.jsx
+++ b/web/apps/labelstudio/src/pages/CreateProject/Import/Import.jsx
@@ -493,19 +493,28 @@ export const ImportPage = ({
{ff.isFF(ff.FF_JSON_PREVIEW) && (
{projectConfigured ? (
-
+
{sampleConfig.data ? (
-
+
+
+
) : sampleConfig.isLoading ? (
) : sampleConfig.isError ? (
- Unable to load sample data
+
+ Something went wrong, the sample data could not be loaded.
+
) : null}
) : (
diff --git a/web/apps/labelstudio/src/pages/CreateProject/Import/Import.scss b/web/apps/labelstudio/src/pages/CreateProject/Import/Import.scss
index fff29f709ac0..7c91b43498fb 100644
--- a/web/apps/labelstudio/src/pages/CreateProject/Import/Import.scss
+++ b/web/apps/labelstudio/src/pages/CreateProject/Import/Import.scss
@@ -1,3 +1,34 @@
+// Custom scrollbar styling mixin
+@mixin custom-scrollbar {
+ scrollbar-color: var(--color-neutral-border-bold) transparent;
+ scrollbar-width: thin;
+
+ &::-webkit-scrollbar {
+ width: 6px;
+ height: 6px;
+ background-color: var(--color-neutral-surface);
+ }
+
+ &::-webkit-scrollbar-track {
+ background: var(--color-neutral-surface);
+ border-radius: 3px;
+ }
+
+ &::-webkit-scrollbar-thumb {
+ background: var(--color-neutral-border-bold);
+ border-radius: 3px;
+ transition: background-color 0.2s ease;
+
+ &:hover {
+ background: var(--color-neutral-border-boldest);
+ }
+ }
+
+ &::-webkit-scrollbar-corner {
+ background: var(--color-neutral-surface);
+ }
+}
+
.upload_page {
flex: 1;
min-height: 0;
@@ -75,6 +106,8 @@
}
& > main {
+ @include custom-scrollbar;
+
flex: 1;
overflow-y: auto;
background: linear-gradient(var(--color-neutral-background) 30%, rgb(255 255 255 / 0%)), linear-gradient(rgb(0 0 0 / 10%), var(--color-neutral-background) 100%);
@@ -123,6 +156,22 @@
background: rgb(255 255 255 / 50%);
}
+ &__code-wrapper {
+ padding: 0 var(--spacing-base) var(--spacing-base);
+ height: calc(100% - var(--spacing-tight));
+
+ & > div {
+ @include custom-scrollbar;
+
+ height: 100%;
+ overflow-y: auto;
+ font-size: var(--font-size-14);
+ color: var(--color-neutral-content-subtle);
+ box-shadow: inset 0 2px 8px rgba(var(--color-neutral-shadow-raw) / 12%);
+ border: 1px solid var(--color-neutral-border);
+ }
+ }
+
&__upload-button {
display: flex;
align-items: center;
@@ -186,7 +235,8 @@
.dropzone {
padding: 0 32px 32px;
margin: 0;
- min-height: 100%;
+ min-height: 600px;
+ height: 100%;
position: relative;
display: flex;
diff --git a/web/libs/ui/src/lib/code-block/code-block.tsx b/web/libs/ui/src/lib/code-block/code-block.tsx
index abe75b36b75b..a0a92e3aba3c 100644
--- a/web/libs/ui/src/lib/code-block/code-block.tsx
+++ b/web/libs/ui/src/lib/code-block/code-block.tsx
@@ -1,5 +1,6 @@
export function CodeBlock({
code,
+ className,
}: {
title?: string;
description?: string;
@@ -7,6 +8,8 @@ export function CodeBlock({
className?: string;
}) {
return (
- {code.trim()}
+
+ {code.trim()}
+
);
}
diff --git a/web/libs/ui/src/lib/simple-card/index.tsx b/web/libs/ui/src/lib/simple-card/index.tsx
index f7df2c3e211a..92099096776f 100644
--- a/web/libs/ui/src/lib/simple-card/index.tsx
+++ b/web/libs/ui/src/lib/simple-card/index.tsx
@@ -6,21 +6,34 @@ export function SimpleCard({
children,
title,
description,
+ flushContent = false,
+ flushHeader = false,
+ headerClassName,
+ contentClassName,
className: cls,
...rest
}: PropsWithChildren<
{
title: ReactNode;
description?: ReactNode;
+ flushContent?: boolean;
+ flushHeader?: boolean;
+ headerClassName?: string;
+ contentClassName?: string;
} & Omit, "title">
>) {
const className = cn("bg-transparent", cls);
const hasHeaderContent = Boolean(title || description);
- const contentClass = cn("p-4", { "pt-0": hasHeaderContent });
+ const headerClass = cn(flushHeader ? "p-0" : "p-4 pb-2", headerClassName);
+ const contentClass = cn(
+ flushContent ? "p-0" : "p-4",
+ { "pt-0": hasHeaderContent && !flushContent },
+ contentClassName,
+ );
return (
{hasHeaderContent && (
-
+
{title && {title}}
{description && {description}}