Spaces:
Running
Running
| @tailwind base; | |
| @tailwind components; | |
| @tailwind utilities; | |
| @layer base { | |
| * { | |
| margin: 0; | |
| padding: 0; | |
| box-sizing: border-box; | |
| } | |
| body { | |
| font-family: 'Inter', system-ui, sans-serif; | |
| -webkit-font-smoothing: antialiased; | |
| -moz-osx-font-smoothing: grayscale; | |
| } | |
| ::-webkit-scrollbar { | |
| width: 6px; | |
| height: 6px; | |
| } | |
| ::-webkit-scrollbar-track { | |
| background: transparent; | |
| } | |
| ::-webkit-scrollbar-thumb { | |
| background: rgba(148, 163, 184, 0.3); | |
| border-radius: 3px; | |
| } | |
| ::-webkit-scrollbar-thumb:hover { | |
| background: rgba(148, 163, 184, 0.5); | |
| } | |
| } | |
| @layer components { | |
| .btn { | |
| @apply inline-flex items-center justify-center gap-2 px-4 py-2 rounded-lg font-medium text-sm | |
| transition-all duration-200 focus:outline-none focus:ring-2 focus:ring-offset-2 focus:ring-offset-surface-900 | |
| disabled:opacity-50 disabled:cursor-not-allowed; | |
| } | |
| .btn-primary { | |
| @apply btn bg-primary-600 hover:bg-primary-500 text-white focus:ring-primary-500; | |
| } | |
| .btn-secondary { | |
| @apply btn bg-surface-700 hover:bg-surface-600 text-surface-100 focus:ring-surface-500; | |
| } | |
| .btn-ghost { | |
| @apply btn bg-transparent hover:bg-surface-800 text-surface-300 hover:text-white; | |
| } | |
| .btn-danger { | |
| @apply btn bg-red-600 hover:bg-red-500 text-white focus:ring-red-500; | |
| } | |
| .input { | |
| @apply w-full px-3 py-2 bg-surface-800 border border-surface-700 rounded-lg text-white text-sm | |
| placeholder:text-surface-400 focus:outline-none focus:ring-2 focus:ring-primary-500 focus:border-transparent | |
| transition-all duration-200; | |
| } | |
| .card { | |
| @apply bg-surface-800 border border-surface-700 rounded-xl p-6; | |
| } | |
| .panel { | |
| @apply bg-surface-900 border-r border-surface-700; | |
| } | |
| .badge { | |
| @apply inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium; | |
| } | |
| .badge-web { @apply badge bg-blue-500/20 text-blue-300; } | |
| .badge-electron { @apply badge bg-cyan-500/20 text-cyan-300; } | |
| .badge-maui { @apply badge bg-purple-500/20 text-purple-300; } | |
| .badge-nodejs { @apply badge bg-green-500/20 text-green-300; } | |
| } | |
| @layer utilities { | |
| .text-gradient { | |
| @apply bg-clip-text text-transparent bg-gradient-to-r from-primary-400 to-purple-400; | |
| } | |
| .glass { | |
| @apply bg-surface-800/80 backdrop-blur-sm; | |
| } | |
| } | |
| /* Block node styles */ | |
| .block-node { | |
| position: relative; | |
| min-width: 160px; | |
| max-width: 260px; | |
| display: flex; | |
| flex-direction: column; | |
| cursor: pointer; | |
| font-family: 'Inter', system-ui, sans-serif; | |
| font-size: 12px; | |
| font-weight: 500; | |
| color: #fff; | |
| text-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); | |
| user-select: none; | |
| } | |
| .block-node:hover { | |
| filter: brightness(1.08); | |
| } | |
| .block-selected { | |
| filter: brightness(1.15) drop-shadow(0 0 8px rgba(255, 255, 255, 0.5)); | |
| } | |
| /* Hat block: rounded top with bump, flat-ish bottom */ | |
| .block-shape-hat { | |
| border-top-left-radius: 14px; | |
| border-top-right-radius: 14px; | |
| border-bottom-left-radius: 4px; | |
| border-bottom-right-radius: 4px; | |
| padding: 4px 0 8px 0; | |
| } | |
| .block-shape-hat::before { | |
| content: ''; | |
| position: absolute; | |
| top: -8px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 24px; | |
| height: 8px; | |
| background: var(--block-color, #6366f1); | |
| border-radius: 6px 6px 0 0; | |
| z-index: 0; | |
| } | |
| /* Stack block: notch on top, bump on bottom */ | |
| .block-shape-stack { | |
| border-radius: 4px; | |
| padding: 0; | |
| margin: 4px 0; | |
| } | |
| .block-shape-stack::before { | |
| content: ''; | |
| position: absolute; | |
| top: -1px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 16px; | |
| height: 4px; | |
| background: #0a0f1a; | |
| border-radius: 0 0 4px 4px; | |
| z-index: 2; | |
| } | |
| .block-shape-stack::after { | |
| content: ''; | |
| position: absolute; | |
| bottom: -1px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 16px; | |
| height: 4px; | |
| background: var(--block-color, #6366f1); | |
| border-radius: 0 0 4px 4px; | |
| z-index: 2; | |
| } | |
| /* Boolean block: hexagon/diamond shape */ | |
| .block-shape-boolean { | |
| clip-path: polygon(8px 0%, calc(100% - 8px) 0%, 100% 50%, calc(100% - 8px) 100%, 8px 100%, 0% 50%); | |
| padding: 4px 18px; | |
| min-width: 100px; | |
| max-width: 200px; | |
| } | |
| /* Reporter block: pill/oval shape */ | |
| .block-shape-reporter { | |
| border-radius: 999px; | |
| padding: 3px 4px; | |
| min-width: 80px; | |
| max-width: 200px; | |
| display: inline-flex; | |
| flex-direction: row; | |
| align-items: center; | |
| } | |
| /* C-block: stack shape with inner cavity */ | |
| .block-shape-cblock { | |
| border-radius: 4px 4px 4px 4px; | |
| padding: 0; | |
| margin: 4px 0; | |
| } | |
| .block-shape-cblock::before { | |
| content: ''; | |
| position: absolute; | |
| top: -1px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 16px; | |
| height: 4px; | |
| background: #0a0f1a; | |
| border-radius: 0 0 4px 4px; | |
| z-index: 2; | |
| } | |
| .block-shape-cblock::after { | |
| content: ''; | |
| position: absolute; | |
| bottom: -1px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 16px; | |
| height: 4px; | |
| background: var(--block-color, #6366f1); | |
| border-radius: 0 0 4px 4px; | |
| z-index: 2; | |
| } | |
| /* Cap block: flat top, rounded bottom */ | |
| .block-shape-cap { | |
| border-top-left-radius: 2px; | |
| border-top-right-radius: 2px; | |
| border-bottom-left-radius: 8px; | |
| border-bottom-right-radius: 8px; | |
| padding: 4px 0 2px 0; | |
| } | |
| .block-shape-cap::after { | |
| content: ''; | |
| position: absolute; | |
| bottom: -1px; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: 16px; | |
| height: 4px; | |
| background: var(--block-color, #6366f1); | |
| border-radius: 0 0 4px 4px; | |
| z-index: 2; | |
| } | |
| /* Block body (main content area) */ | |
| .block-body { | |
| display: flex; | |
| flex-direction: row; | |
| flex-wrap: wrap; | |
| align-items: center; | |
| gap: 3px; | |
| padding: 5px 8px; | |
| position: relative; | |
| z-index: 1; | |
| } | |
| .block-shape-hat .block-body { | |
| padding: 6px 10px 4px 10px; | |
| } | |
| .block-shape-cblock > .block-body { | |
| padding: 5px 8px 6px 8px; | |
| border-bottom: 1px solid rgba(0, 0, 0, 0.15); | |
| } | |
| .block-shape-cap .block-body { | |
| padding: 4px 10px 3px 10px; | |
| } | |
| .block-shape-reporter .block-body { | |
| padding: 3px 6px; | |
| gap: 4px; | |
| } | |
| /* Block label text */ | |
| .block-label { | |
| font-weight: 500; | |
| font-size: 11px; | |
| color: rgba(255, 255, 255, 0.95); | |
| white-space: nowrap; | |
| } | |
| /* Block icon */ | |
| .block-icon { | |
| font-size: 12px; | |
| margin-right: 2px; | |
| opacity: 0.9; | |
| } | |
| /* Input slot - default style (text input pill) */ | |
| .block-input { | |
| display: inline-flex; | |
| align-items: center; | |
| justify-content: center; | |
| padding: 2px 8px; | |
| min-height: 18px; | |
| min-width: 28px; | |
| background: rgba(255, 255, 255, 0.95); | |
| color: #1e293b; | |
| border-radius: 999px; | |
| font-size: 10px; | |
| font-weight: 600; | |
| text-shadow: none; | |
| border: 1px solid rgba(0, 0, 0, 0.15); | |
| box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.08); | |
| white-space: nowrap; | |
| cursor: text; | |
| } | |
| .block-input.text-input { | |
| min-width: 36px; | |
| } | |
| .block-input.number-input { | |
| min-width: 22px; | |
| border-radius: 50%; | |
| padding: 0 4px; | |
| font-size: 10px; | |
| } | |
| .block-input.select-input { | |
| background: rgba(255, 255, 255, 0.95); | |
| color: #1e293b; | |
| position: relative; | |
| padding-right: 16px; | |
| } | |
| .block-input.select-input::after { | |
| content: '▼'; | |
| position: absolute; | |
| right: 4px; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| font-size: 7px; | |
| color: #1e293b; | |
| } | |
| .block-input.boolean-input { | |
| background: rgba(255, 255, 255, 0.95); | |
| color: #1e293b; | |
| border-radius: 4px; | |
| min-width: 32px; | |
| } | |
| .block-input.color-input { | |
| padding: 0; | |
| width: 16px; | |
| height: 16px; | |
| min-width: 16px; | |
| border-radius: 50%; | |
| border: 1px solid rgba(0, 0, 0, 0.2); | |
| } | |
| .block-input.empty { | |
| background: rgba(255, 255, 255, 0.3); | |
| color: rgba(255, 255, 255, 0.6); | |
| border: 1px dashed rgba(255, 255, 255, 0.5); | |
| text-shadow: none; | |
| font-style: italic; | |
| font-weight: 400; | |
| } | |
| .block-input.boolean-slot { | |
| background: transparent; | |
| border: 1px dashed rgba(255, 255, 255, 0.7); | |
| color: rgba(255, 255, 255, 0.7); | |
| border-radius: 4px; | |
| text-shadow: none; | |
| font-style: italic; | |
| font-weight: 400; | |
| } | |
| .block-input.reporter-slot { | |
| background: transparent; | |
| border: 1px dashed rgba(255, 255, 255, 0.7); | |
| color: rgba(255, 255, 255, 0.7); | |
| border-radius: 999px; | |
| text-shadow: none; | |
| font-style: italic; | |
| font-weight: 400; | |
| } | |
| /* C-block inner cavity */ | |
| .block-cavity { | |
| min-height: 36px; | |
| margin: 0 8px 8px 8px; | |
| padding: 4px; | |
| background: rgba(0, 0, 0, 0.18); | |
| border-radius: 3px; | |
| position: relative; | |
| z-index: 1; | |
| border: 1px dashed rgba(255, 255, 255, 0.2); | |
| } | |
| .block-cavity-empty { | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| min-height: 32px; | |
| font-size: 10px; | |
| font-style: italic; | |
| color: rgba(255, 255, 255, 0.5); | |
| text-shadow: none; | |
| font-weight: 400; | |
| } | |
| /* React Flow overrides - hide default node chrome */ | |
| .react-flow__node-blockNode { | |
| padding: 0; | |
| border: none; | |
| background: transparent; | |
| width: auto; | |
| font-size: 0; | |
| } | |
| .react-flow__node-blockNode.selected { | |
| box-shadow: none; | |
| } | |
| .react-flow__handle { | |
| width: 0 ; | |
| height: 0 ; | |
| min-width: 0 ; | |
| min-height: 0 ; | |
| border: none ; | |
| background: transparent ; | |
| opacity: 0 ; | |
| pointer-events: none; | |
| } | |
| /* Snap highlight when dragging a block near another */ | |
| .block-snap-highlight { | |
| position: absolute; | |
| left: 50%; | |
| transform: translateX(-50%); | |
| width: calc(100% + 8px); | |
| height: 6px; | |
| background: rgba(255, 255, 255, 0.7); | |
| border-radius: 3px; | |
| box-shadow: 0 0 12px rgba(255, 255, 255, 0.8); | |
| pointer-events: none; | |
| z-index: 100; | |
| } | |
| .block-snap-highlight.top { | |
| top: -10px; | |
| } | |
| .block-snap-highlight.bottom { | |
| bottom: -10px; | |
| } | |
| /* Palette tab styles (Scratch-style colored circles) */ | |
| .palette-tabs { | |
| display: flex; | |
| flex-direction: column; | |
| width: 56px; | |
| flex-shrink: 0; | |
| background: #0f172a; | |
| border-right: 1px solid rgba(148, 163, 184, 0.15); | |
| overflow-y: auto; | |
| padding: 6px 0; | |
| align-items: center; | |
| } | |
| .palette-tab { | |
| width: 44px; | |
| height: 44px; | |
| margin: 2px 0; | |
| border-radius: 50%; | |
| display: flex; | |
| align-items: center; | |
| justify-content: center; | |
| cursor: pointer; | |
| font-size: 18px; | |
| transition: all 0.15s ease; | |
| border: 2px solid transparent; | |
| position: relative; | |
| color: #fff; | |
| } | |
| .palette-tab:hover { | |
| transform: scale(1.08); | |
| } | |
| .palette-tab-active { | |
| border-color: #fff; | |
| box-shadow: 0 0 0 2px rgba(0, 0, 0, 0.3), 0 4px 12px rgba(0, 0, 0, 0.4); | |
| } | |
| .palette-tab-label { | |
| display: none; | |
| position: absolute; | |
| left: 56px; | |
| top: 50%; | |
| transform: translateY(-50%); | |
| background: #1e293b; | |
| color: #f1f5f9; | |
| padding: 4px 10px; | |
| border-radius: 6px; | |
| font-size: 11px; | |
| white-space: nowrap; | |
| z-index: 50; | |
| border: 1px solid rgba(148, 163, 184, 0.2); | |
| pointer-events: none; | |
| font-weight: 500; | |
| } | |
| .palette-tab:hover .palette-tab-label { | |
| display: block; | |
| } | |
| .palette-block-list { | |
| width: 220px; | |
| flex-shrink: 0; | |
| background: #1a1f2e; | |
| border-right: 1px solid rgba(148, 163, 184, 0.15); | |
| overflow-y: auto; | |
| padding: 8px 6px; | |
| } | |
| .palette-category-header { | |
| font-size: 11px; | |
| font-weight: 700; | |
| text-transform: uppercase; | |
| letter-spacing: 0.05em; | |
| padding: 6px 4px 4px; | |
| margin-bottom: 4px; | |
| } | |
| .palette-block-item { | |
| display: block; | |
| margin: 4px 0; | |
| cursor: grab; | |
| transition: transform 0.1s ease, filter 0.1s ease; | |
| } | |
| .palette-block-item:hover { | |
| transform: translateX(2px); | |
| filter: brightness(1.1); | |
| } | |
| .palette-block-item:active { | |
| cursor: grabbing; | |
| transform: scale(0.97); | |
| } | |
| /* Compact palette block - smaller version of full block */ | |
| .palette-block-compact { | |
| position: relative; | |
| background: var(--block-color, #6366f1); | |
| color: #fff; | |
| font-size: 10px; | |
| font-weight: 500; | |
| padding: 4px 8px; | |
| border-radius: 4px; | |
| display: flex; | |
| align-items: center; | |
| gap: 4px; | |
| text-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); | |
| box-shadow: 0 2px 0 rgba(0, 0, 0, 0.2); | |
| white-space: nowrap; | |
| overflow: hidden; | |
| } | |
| .palette-block-compact.reporter { | |
| border-radius: 999px; | |
| padding: 3px 8px; | |
| } | |
| .palette-block-compact.boolean { | |
| clip-path: polygon(6px 0%, calc(100% - 6px) 0%, 100% 50%, calc(100% - 6px) 100%, 6px 100%, 0% 50%); | |
| padding: 3px 14px; | |
| text-align: center; | |
| } | |
| .palette-block-compact.hat { | |
| border-radius: 12px 12px 4px 4px; | |
| padding: 4px 8px 3px; | |
| } | |
| .palette-block-compact.cap { | |
| border-radius: 2px 2px 8px 8px; | |
| padding: 4px 8px 3px; | |
| } | |
| .palette-block-compact .palette-input { | |
| background: rgba(255, 255, 255, 0.95); | |
| color: #1e293b; | |
| border-radius: 999px; | |
| padding: 1px 6px; | |
| font-size: 9px; | |
| font-weight: 600; | |
| text-shadow: none; | |
| white-space: nowrap; | |
| max-width: 80px; | |
| overflow: hidden; | |
| text-overflow: ellipsis; | |
| } | |