@@ -1112,12 +1112,56 @@ export default function PlaygroundPage() {
11121112 >
11131113 < TbShare /> { shareCopied ? 'Link copied!' : 'Share' }
11141114 </ Button >
1115+ < Button size = "sm" variant = { showImport ? 'solid' : 'outline' } colorPalette = "purple"
1116+ onClick = { ( ) => setShowImport ( ! showImport ) } data-testid = "import-btn" aria-label = "Import AppHost code"
1117+ >
1118+ < TbUpload /> Import
1119+ </ Button >
11151120 < Button size = "sm" variant = "outline" colorPalette = "red" onClick = { reset } data-testid = "reset-btn" >
11161121 < TbRefresh /> Reset
11171122 </ Button >
11181123 </ Flex >
11191124 </ Flex >
11201125
1126+ { /* Import panel — shown below header when active */ }
1127+ { showImport && (
1128+ < Box mb = "4" p = "4" bg = "dark.surface" borderRadius = "md" border = "2px solid" borderColor = "aspire.600" >
1129+ < Flex justify = "space-between" align = "center" mb = "2" >
1130+ < Text { ...pixelFontProps } fontSize = "2xs" color = "aspire.accent" > 📋 Import AppHost Code</ Text >
1131+ < Button size = "xs" variant = "ghost" onClick = { ( ) => { setShowImport ( false ) ; setImportText ( '' ) ; } } > ✕</ Button >
1132+ </ Flex >
1133+ < Text fontSize = "xs" color = "dark.muted" mb = "2" >
1134+ Paste your C# AppHost Program.cs code below. All current resources will be replaced.
1135+ </ Text >
1136+ < Textarea
1137+ size = "sm" value = { importText }
1138+ onChange = { ( e ) => setImportText ( e . target . value ) }
1139+ placeholder = { "var builder = DistributedApplication.CreateBuilder(args);\nvar postgres = builder.AddPostgres(\"pg\");\nvar api = builder.AddProject<Projects.Api>(\"api\")\n .WithReference(postgres);\nbuilder.Build().Run();" }
1140+ rows = { 8 }
1141+ fontFamily = "mono" fontSize = "12px"
1142+ bg = "dark.bg" color = "dark.text"
1143+ borderColor = "dark.border"
1144+ aria-label = "AppHost code to import"
1145+ />
1146+ < Flex gap = "2" mt = "3" >
1147+ < Button size = "sm" colorPalette = "purple" onClick = { handleImport }
1148+ disabled = { ! importText . trim ( ) }
1149+ >
1150+ < TbUpload /> Import Resources
1151+ </ Button >
1152+ < Button size = "sm" variant = "ghost" onClick = { ( ) => { setShowImport ( false ) ; setImportText ( '' ) ; } } >
1153+ Cancel
1154+ </ Button >
1155+ </ Flex >
1156+ </ Box >
1157+ ) }
1158+
1159+ { importFeedback && (
1160+ < Box mb = "3" p = "2" bg = { importFeedback . startsWith ( 'No' ) ? 'red.950' : 'green.950' } borderRadius = "sm" border = "1px solid" borderColor = { importFeedback . startsWith ( 'No' ) ? 'red.700' : 'green.700' } >
1161+ < Text fontSize = "xs" color = { importFeedback . startsWith ( 'No' ) ? 'red.300' : 'green.300' } > { importFeedback } </ Text >
1162+ </ Box >
1163+ ) }
1164+
11211165 { /* Resource Palette */ }
11221166 < Card . Root variant = "outline" { ...retroCardProps } bg = "game.retroBg" mb = "6" data-testid = "resource-palette" role = "region" aria-label = "Resource palette" >
11231167 < Card . Body p = "5" >
@@ -1606,48 +1650,9 @@ export default function PlaygroundPage() {
16061650 >
16071651 < TbDownload /> Download
16081652 </ Button >
1609- < Button size = "xs" variant = { showImport ? 'solid' : 'outline' } colorPalette = "purple"
1610- onClick = { ( ) => setShowImport ( ! showImport ) } aria-label = "Import AppHost code"
1611- >
1612- < TbUpload /> Import
1613- </ Button >
16141653 </ Flex >
16151654 </ Flex >
16161655
1617- { /* Import panel */ }
1618- { showImport && (
1619- < Box mb = "4" p = "3" bg = "dark.surface" borderRadius = "sm" border = "1px solid" borderColor = "dark.border" >
1620- < Text fontSize = "xs" color = "dark.muted" mb = "2" >
1621- Paste C# AppHost code to import resources:
1622- </ Text >
1623- < Textarea
1624- size = "sm" value = { importText }
1625- onChange = { ( e ) => setImportText ( e . target . value ) }
1626- placeholder = "var builder = DistributedApplication.CreateBuilder(args); var postgres = builder.AddPostgres("pg"); ..."
1627- rows = { 6 }
1628- fontFamily = "mono" fontSize = "12px"
1629- bg = "#0D0B1A" color = "dark.text"
1630- aria-label = "AppHost code to import"
1631- />
1632- < Flex gap = "2" mt = "2" >
1633- < Button size = "xs" colorPalette = "purple" onClick = { handleImport }
1634- disabled = { ! importText . trim ( ) }
1635- >
1636- Import Resources
1637- </ Button >
1638- < Button size = "xs" variant = "ghost" onClick = { ( ) => { setShowImport ( false ) ; setImportText ( '' ) ; } } >
1639- Cancel
1640- </ Button >
1641- </ Flex >
1642- </ Box >
1643- ) }
1644-
1645- { importFeedback && (
1646- < Box mb = "3" p = "2" bg = { importFeedback . startsWith ( 'No' ) ? 'red.950' : 'green.950' } borderRadius = "sm" border = "1px solid" borderColor = { importFeedback . startsWith ( 'No' ) ? 'red.700' : 'green.700' } >
1647- < Text fontSize = "xs" color = { importFeedback . startsWith ( 'No' ) ? 'red.300' : 'green.300' } > { importFeedback } </ Text >
1648- </ Box >
1649- ) }
1650-
16511656 { /* Name warnings */ }
16521657 { nameWarnings . length > 0 && (
16531658 < Box mb = "3" p = "2" bg = "red.950" borderRadius = "sm" border = "1px solid" borderColor = "red.700" >
0 commit comments