flock-core 0.5.0b28__py3-none-any.whl → 0.5.0b51__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of flock-core might be problematic. Click here for more details.
- flock/__init__.py +12 -217
- flock/agent.py +678 -0
- flock/api/themes.py +71 -0
- flock/artifacts.py +79 -0
- flock/cli.py +75 -0
- flock/components.py +173 -0
- flock/dashboard/__init__.py +28 -0
- flock/dashboard/collector.py +283 -0
- flock/dashboard/events.py +182 -0
- flock/dashboard/launcher.py +230 -0
- flock/dashboard/service.py +537 -0
- flock/dashboard/websocket.py +235 -0
- flock/engines/__init__.py +6 -0
- flock/engines/dspy_engine.py +856 -0
- flock/examples.py +128 -0
- flock/frontend/README.md +678 -0
- flock/frontend/docs/DESIGN_SYSTEM.md +1980 -0
- flock/frontend/index.html +12 -0
- flock/frontend/package-lock.json +4347 -0
- flock/frontend/package.json +48 -0
- flock/frontend/src/App.tsx +79 -0
- flock/frontend/src/__tests__/e2e/critical-scenarios.test.tsx +587 -0
- flock/frontend/src/__tests__/integration/filtering-e2e.test.tsx +387 -0
- flock/frontend/src/__tests__/integration/graph-rendering.test.tsx +640 -0
- flock/frontend/src/__tests__/integration/indexeddb-persistence.test.tsx +699 -0
- flock/frontend/src/components/common/BuildInfo.tsx +39 -0
- flock/frontend/src/components/common/EmptyState.module.css +115 -0
- flock/frontend/src/components/common/EmptyState.tsx +128 -0
- flock/frontend/src/components/common/ErrorBoundary.module.css +169 -0
- flock/frontend/src/components/common/ErrorBoundary.tsx +118 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.css +251 -0
- flock/frontend/src/components/common/KeyboardShortcutsDialog.tsx +151 -0
- flock/frontend/src/components/common/LoadingSpinner.module.css +97 -0
- flock/frontend/src/components/common/LoadingSpinner.tsx +29 -0
- flock/frontend/src/components/controls/PublishControl.css +547 -0
- flock/frontend/src/components/controls/PublishControl.test.tsx +543 -0
- flock/frontend/src/components/controls/PublishControl.tsx +432 -0
- flock/frontend/src/components/details/DetailWindowContainer.tsx +62 -0
- flock/frontend/src/components/details/LiveOutputTab.test.tsx +792 -0
- flock/frontend/src/components/details/LiveOutputTab.tsx +220 -0
- flock/frontend/src/components/details/MessageHistoryTab.tsx +299 -0
- flock/frontend/src/components/details/NodeDetailWindow.test.tsx +501 -0
- flock/frontend/src/components/details/NodeDetailWindow.tsx +218 -0
- flock/frontend/src/components/details/RunStatusTab.tsx +307 -0
- flock/frontend/src/components/details/tabs.test.tsx +1015 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.module.css +102 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.test.tsx +197 -0
- flock/frontend/src/components/filters/CorrelationIDFilter.tsx +121 -0
- flock/frontend/src/components/filters/FilterBar.module.css +29 -0
- flock/frontend/src/components/filters/FilterBar.test.tsx +133 -0
- flock/frontend/src/components/filters/FilterBar.tsx +33 -0
- flock/frontend/src/components/filters/FilterPills.module.css +79 -0
- flock/frontend/src/components/filters/FilterPills.test.tsx +173 -0
- flock/frontend/src/components/filters/FilterPills.tsx +67 -0
- flock/frontend/src/components/filters/TimeRangeFilter.module.css +91 -0
- flock/frontend/src/components/filters/TimeRangeFilter.test.tsx +154 -0
- flock/frontend/src/components/filters/TimeRangeFilter.tsx +105 -0
- flock/frontend/src/components/graph/AgentNode.test.tsx +75 -0
- flock/frontend/src/components/graph/AgentNode.tsx +322 -0
- flock/frontend/src/components/graph/GraphCanvas.tsx +406 -0
- flock/frontend/src/components/graph/MessageFlowEdge.tsx +128 -0
- flock/frontend/src/components/graph/MessageNode.test.tsx +62 -0
- flock/frontend/src/components/graph/MessageNode.tsx +116 -0
- flock/frontend/src/components/graph/MiniMap.tsx +47 -0
- flock/frontend/src/components/graph/TransformEdge.tsx +123 -0
- flock/frontend/src/components/layout/DashboardLayout.css +407 -0
- flock/frontend/src/components/layout/DashboardLayout.tsx +300 -0
- flock/frontend/src/components/layout/Header.module.css +88 -0
- flock/frontend/src/components/layout/Header.tsx +52 -0
- flock/frontend/src/components/modules/EventLogModule.test.tsx +401 -0
- flock/frontend/src/components/modules/EventLogModule.tsx +396 -0
- flock/frontend/src/components/modules/EventLogModuleWrapper.tsx +17 -0
- flock/frontend/src/components/modules/ModuleRegistry.test.ts +333 -0
- flock/frontend/src/components/modules/ModuleRegistry.ts +85 -0
- flock/frontend/src/components/modules/ModuleWindow.tsx +155 -0
- flock/frontend/src/components/modules/registerModules.ts +20 -0
- flock/frontend/src/components/settings/AdvancedSettings.tsx +175 -0
- flock/frontend/src/components/settings/AppearanceSettings.tsx +185 -0
- flock/frontend/src/components/settings/GraphSettings.tsx +110 -0
- flock/frontend/src/components/settings/SettingsPanel.css +327 -0
- flock/frontend/src/components/settings/SettingsPanel.tsx +131 -0
- flock/frontend/src/components/settings/ThemeSelector.tsx +298 -0
- flock/frontend/src/hooks/useKeyboardShortcuts.ts +148 -0
- flock/frontend/src/hooks/useModulePersistence.test.ts +442 -0
- flock/frontend/src/hooks/useModulePersistence.ts +154 -0
- flock/frontend/src/hooks/useModules.ts +139 -0
- flock/frontend/src/hooks/usePersistence.ts +139 -0
- flock/frontend/src/main.tsx +13 -0
- flock/frontend/src/services/api.ts +213 -0
- flock/frontend/src/services/indexeddb.test.ts +793 -0
- flock/frontend/src/services/indexeddb.ts +794 -0
- flock/frontend/src/services/layout.test.ts +437 -0
- flock/frontend/src/services/layout.ts +146 -0
- flock/frontend/src/services/themeApplicator.ts +140 -0
- flock/frontend/src/services/themeService.ts +77 -0
- flock/frontend/src/services/websocket.test.ts +595 -0
- flock/frontend/src/services/websocket.ts +685 -0
- flock/frontend/src/store/filterStore.test.ts +242 -0
- flock/frontend/src/store/filterStore.ts +103 -0
- flock/frontend/src/store/graphStore.test.ts +186 -0
- flock/frontend/src/store/graphStore.ts +414 -0
- flock/frontend/src/store/moduleStore.test.ts +253 -0
- flock/frontend/src/store/moduleStore.ts +57 -0
- flock/frontend/src/store/settingsStore.ts +188 -0
- flock/frontend/src/store/streamStore.ts +68 -0
- flock/frontend/src/store/uiStore.test.ts +54 -0
- flock/frontend/src/store/uiStore.ts +110 -0
- flock/frontend/src/store/wsStore.ts +34 -0
- flock/frontend/src/styles/index.css +15 -0
- flock/frontend/src/styles/scrollbar.css +47 -0
- flock/frontend/src/styles/variables.css +488 -0
- flock/frontend/src/test/setup.ts +1 -0
- flock/frontend/src/types/filters.ts +14 -0
- flock/frontend/src/types/graph.ts +55 -0
- flock/frontend/src/types/modules.ts +7 -0
- flock/frontend/src/types/theme.ts +55 -0
- flock/frontend/src/utils/mockData.ts +85 -0
- flock/frontend/src/utils/performance.ts +16 -0
- flock/frontend/src/utils/transforms.test.ts +860 -0
- flock/frontend/src/utils/transforms.ts +323 -0
- flock/frontend/src/vite-env.d.ts +17 -0
- flock/frontend/tsconfig.json +27 -0
- flock/frontend/tsconfig.node.json +11 -0
- flock/frontend/vite.config.ts +25 -0
- flock/frontend/vitest.config.ts +11 -0
- flock/{core/util → helper}/cli_helper.py +4 -3
- flock/{core/logging → logging}/__init__.py +2 -3
- flock/{core/logging → logging}/formatters/enum_builder.py +3 -4
- flock/{core/logging → logging}/formatters/theme_builder.py +19 -44
- flock/{core/logging → logging}/formatters/themed_formatter.py +69 -115
- flock/{core/logging → logging}/logging.py +77 -61
- flock/{core/logging → logging}/telemetry.py +20 -26
- flock/{core/logging → logging}/telemetry_exporter/base_exporter.py +2 -2
- flock/{core/logging → logging}/telemetry_exporter/file_exporter.py +6 -9
- flock/{core/logging → logging}/telemetry_exporter/sqlite_exporter.py +2 -3
- flock/{core/logging → logging}/trace_and_logged.py +20 -24
- flock/mcp/__init__.py +91 -0
- flock/{core/mcp/mcp_client.py → mcp/client.py} +103 -154
- flock/{core/mcp/mcp_config.py → mcp/config.py} +62 -117
- flock/mcp/manager.py +255 -0
- flock/mcp/servers/sse/__init__.py +1 -1
- flock/mcp/servers/sse/flock_sse_server.py +11 -53
- flock/mcp/servers/stdio/__init__.py +1 -1
- flock/mcp/servers/stdio/flock_stdio_server.py +8 -48
- flock/mcp/servers/streamable_http/flock_streamable_http_server.py +17 -62
- flock/mcp/servers/websockets/flock_websocket_server.py +7 -40
- flock/{core/mcp/flock_mcp_tool.py → mcp/tool.py} +16 -26
- flock/mcp/types/__init__.py +42 -0
- flock/{core/mcp → mcp}/types/callbacks.py +9 -15
- flock/{core/mcp → mcp}/types/factories.py +7 -6
- flock/{core/mcp → mcp}/types/handlers.py +13 -18
- flock/{core/mcp → mcp}/types/types.py +70 -74
- flock/{core/mcp → mcp}/util/helpers.py +1 -1
- flock/orchestrator.py +645 -0
- flock/registry.py +148 -0
- flock/runtime.py +262 -0
- flock/service.py +140 -0
- flock/store.py +69 -0
- flock/subscription.py +111 -0
- flock/themes/andromeda.toml +1 -1
- flock/themes/apple-system-colors.toml +1 -1
- flock/themes/arcoiris.toml +1 -1
- flock/themes/atomonelight.toml +1 -1
- flock/themes/ayu copy.toml +1 -1
- flock/themes/ayu-light.toml +1 -1
- flock/themes/belafonte-day.toml +1 -1
- flock/themes/belafonte-night.toml +1 -1
- flock/themes/blulocodark.toml +1 -1
- flock/themes/breeze.toml +1 -1
- flock/themes/broadcast.toml +1 -1
- flock/themes/brogrammer.toml +1 -1
- flock/themes/builtin-dark.toml +1 -1
- flock/themes/builtin-pastel-dark.toml +1 -1
- flock/themes/catppuccin-latte.toml +1 -1
- flock/themes/catppuccin-macchiato.toml +1 -1
- flock/themes/catppuccin-mocha.toml +1 -1
- flock/themes/cga.toml +1 -1
- flock/themes/chalk.toml +1 -1
- flock/themes/ciapre.toml +1 -1
- flock/themes/coffee-theme.toml +1 -1
- flock/themes/cyberpunkscarletprotocol.toml +1 -1
- flock/themes/dark+.toml +1 -1
- flock/themes/darkermatrix.toml +1 -1
- flock/themes/darkside.toml +1 -1
- flock/themes/desert.toml +1 -1
- flock/themes/django.toml +1 -1
- flock/themes/djangosmooth.toml +1 -1
- flock/themes/doomone.toml +1 -1
- flock/themes/dotgov.toml +1 -1
- flock/themes/dracula+.toml +1 -1
- flock/themes/duckbones.toml +1 -1
- flock/themes/encom.toml +1 -1
- flock/themes/espresso.toml +1 -1
- flock/themes/everblush.toml +1 -1
- flock/themes/fairyfloss.toml +1 -1
- flock/themes/fideloper.toml +1 -1
- flock/themes/fishtank.toml +1 -1
- flock/themes/flexoki-light.toml +1 -1
- flock/themes/floraverse.toml +1 -1
- flock/themes/framer.toml +1 -1
- flock/themes/galizur.toml +1 -1
- flock/themes/github.toml +1 -1
- flock/themes/grass.toml +1 -1
- flock/themes/grey-green.toml +1 -1
- flock/themes/gruvboxlight.toml +1 -1
- flock/themes/guezwhoz.toml +1 -1
- flock/themes/harper.toml +1 -1
- flock/themes/hax0r-blue.toml +1 -1
- flock/themes/hopscotch.256.toml +1 -1
- flock/themes/ic-green-ppl.toml +1 -1
- flock/themes/iceberg-dark.toml +1 -1
- flock/themes/japanesque.toml +1 -1
- flock/themes/jubi.toml +1 -1
- flock/themes/kibble.toml +1 -1
- flock/themes/kolorit.toml +1 -1
- flock/themes/kurokula.toml +1 -1
- flock/themes/materialdesigncolors.toml +1 -1
- flock/themes/matrix.toml +1 -1
- flock/themes/mellifluous.toml +1 -1
- flock/themes/midnight-in-mojave.toml +1 -1
- flock/themes/monokai-remastered.toml +1 -1
- flock/themes/monokai-soda.toml +1 -1
- flock/themes/neon.toml +1 -1
- flock/themes/neopolitan.toml +1 -1
- flock/themes/nord-light.toml +1 -1
- flock/themes/ocean.toml +1 -1
- flock/themes/onehalfdark.toml +1 -1
- flock/themes/onehalflight.toml +1 -1
- flock/themes/palenighthc.toml +1 -1
- flock/themes/paulmillr.toml +1 -1
- flock/themes/pencildark.toml +1 -1
- flock/themes/pnevma.toml +1 -1
- flock/themes/purple-rain.toml +1 -1
- flock/themes/purplepeter.toml +1 -1
- flock/themes/raycast-dark.toml +1 -1
- flock/themes/red-sands.toml +1 -1
- flock/themes/relaxed.toml +1 -1
- flock/themes/retro.toml +1 -1
- flock/themes/rose-pine.toml +1 -1
- flock/themes/royal.toml +1 -1
- flock/themes/ryuuko.toml +1 -1
- flock/themes/sakura.toml +1 -1
- flock/themes/scarlet-protocol.toml +1 -1
- flock/themes/seoulbones-dark.toml +1 -1
- flock/themes/shades-of-purple.toml +1 -1
- flock/themes/smyck.toml +1 -1
- flock/themes/softserver.toml +1 -1
- flock/themes/solarized-darcula.toml +1 -1
- flock/themes/square.toml +1 -1
- flock/themes/sugarplum.toml +1 -1
- flock/themes/thayer-bright.toml +1 -1
- flock/themes/tokyonight.toml +1 -1
- flock/themes/tomorrow.toml +1 -1
- flock/themes/ubuntu.toml +1 -1
- flock/themes/ultradark.toml +1 -1
- flock/themes/ultraviolent.toml +1 -1
- flock/themes/unikitty.toml +1 -1
- flock/themes/urple.toml +1 -1
- flock/themes/vesper.toml +1 -1
- flock/themes/vimbones.toml +1 -1
- flock/themes/wildcherry.toml +1 -1
- flock/themes/wilmersdorf.toml +1 -1
- flock/themes/wryan.toml +1 -1
- flock/themes/xcodedarkhc.toml +1 -1
- flock/themes/xcodelight.toml +1 -1
- flock/themes/zenbones-light.toml +1 -1
- flock/themes/zenwritten-dark.toml +1 -1
- flock/utilities.py +301 -0
- flock/{components/utility → utility}/output_utility_component.py +68 -53
- flock/visibility.py +107 -0
- flock_core-0.5.0b51.dist-info/METADATA +747 -0
- flock_core-0.5.0b51.dist-info/RECORD +508 -0
- flock_core-0.5.0b51.dist-info/entry_points.txt +2 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.0b51.dist-info}/licenses/LICENSE +1 -1
- flock/adapter/__init__.py +0 -14
- flock/adapter/azure_adapter.py +0 -68
- flock/adapter/chroma_adapter.py +0 -73
- flock/adapter/faiss_adapter.py +0 -97
- flock/adapter/pinecone_adapter.py +0 -51
- flock/adapter/vector_base.py +0 -47
- flock/cli/assets/release_notes.md +0 -140
- flock/cli/config.py +0 -8
- flock/cli/constants.py +0 -36
- flock/cli/create_agent.py +0 -1
- flock/cli/create_flock.py +0 -280
- flock/cli/execute_flock.py +0 -620
- flock/cli/load_agent.py +0 -1
- flock/cli/load_examples.py +0 -1
- flock/cli/load_flock.py +0 -192
- flock/cli/load_release_notes.py +0 -20
- flock/cli/loaded_flock_cli.py +0 -254
- flock/cli/manage_agents.py +0 -459
- flock/cli/registry_management.py +0 -889
- flock/cli/runner.py +0 -41
- flock/cli/settings.py +0 -857
- flock/cli/utils.py +0 -135
- flock/cli/view_results.py +0 -29
- flock/cli/yaml_editor.py +0 -396
- flock/components/__init__.py +0 -30
- flock/components/evaluation/__init__.py +0 -9
- flock/components/evaluation/declarative_evaluation_component.py +0 -606
- flock/components/routing/__init__.py +0 -15
- flock/components/routing/conditional_routing_component.py +0 -494
- flock/components/routing/default_routing_component.py +0 -103
- flock/components/routing/llm_routing_component.py +0 -206
- flock/components/utility/__init__.py +0 -22
- flock/components/utility/example_utility_component.py +0 -250
- flock/components/utility/feedback_utility_component.py +0 -206
- flock/components/utility/memory_utility_component.py +0 -550
- flock/components/utility/metrics_utility_component.py +0 -700
- flock/config.py +0 -61
- flock/core/__init__.py +0 -110
- flock/core/agent/__init__.py +0 -16
- flock/core/agent/default_agent.py +0 -216
- flock/core/agent/flock_agent_components.py +0 -104
- flock/core/agent/flock_agent_execution.py +0 -101
- flock/core/agent/flock_agent_integration.py +0 -260
- flock/core/agent/flock_agent_lifecycle.py +0 -186
- flock/core/agent/flock_agent_serialization.py +0 -381
- flock/core/api/__init__.py +0 -10
- flock/core/api/custom_endpoint.py +0 -45
- flock/core/api/endpoints.py +0 -254
- flock/core/api/main.py +0 -162
- flock/core/api/models.py +0 -97
- flock/core/api/run_store.py +0 -224
- flock/core/api/runner.py +0 -44
- flock/core/api/service.py +0 -214
- flock/core/component/__init__.py +0 -15
- flock/core/component/agent_component_base.py +0 -309
- flock/core/component/evaluation_component.py +0 -62
- flock/core/component/routing_component.py +0 -74
- flock/core/component/utility_component.py +0 -69
- flock/core/config/flock_agent_config.py +0 -58
- flock/core/config/scheduled_agent_config.py +0 -40
- flock/core/context/context.py +0 -213
- flock/core/context/context_manager.py +0 -37
- flock/core/context/context_vars.py +0 -10
- flock/core/evaluation/utils.py +0 -396
- flock/core/execution/batch_executor.py +0 -369
- flock/core/execution/evaluation_executor.py +0 -438
- flock/core/execution/local_executor.py +0 -31
- flock/core/execution/opik_executor.py +0 -103
- flock/core/execution/temporal_executor.py +0 -164
- flock/core/flock.py +0 -634
- flock/core/flock_agent.py +0 -336
- flock/core/flock_factory.py +0 -613
- flock/core/flock_scheduler.py +0 -166
- flock/core/flock_server_manager.py +0 -136
- flock/core/interpreter/python_interpreter.py +0 -689
- flock/core/mcp/__init__.py +0 -1
- flock/core/mcp/flock_mcp_server.py +0 -680
- flock/core/mcp/mcp_client_manager.py +0 -201
- flock/core/mcp/types/__init__.py +0 -1
- flock/core/mixin/dspy_integration.py +0 -403
- flock/core/mixin/prompt_parser.py +0 -125
- flock/core/orchestration/__init__.py +0 -15
- flock/core/orchestration/flock_batch_processor.py +0 -94
- flock/core/orchestration/flock_evaluator.py +0 -113
- flock/core/orchestration/flock_execution.py +0 -295
- flock/core/orchestration/flock_initialization.py +0 -149
- flock/core/orchestration/flock_server_manager.py +0 -67
- flock/core/orchestration/flock_web_server.py +0 -117
- flock/core/registry/__init__.py +0 -45
- flock/core/registry/agent_registry.py +0 -69
- flock/core/registry/callable_registry.py +0 -139
- flock/core/registry/component_discovery.py +0 -142
- flock/core/registry/component_registry.py +0 -64
- flock/core/registry/config_mapping.py +0 -64
- flock/core/registry/decorators.py +0 -137
- flock/core/registry/registry_hub.py +0 -205
- flock/core/registry/server_registry.py +0 -57
- flock/core/registry/type_registry.py +0 -86
- flock/core/serialization/__init__.py +0 -13
- flock/core/serialization/callable_registry.py +0 -52
- flock/core/serialization/flock_serializer.py +0 -832
- flock/core/serialization/json_encoder.py +0 -41
- flock/core/serialization/secure_serializer.py +0 -175
- flock/core/serialization/serializable.py +0 -342
- flock/core/serialization/serialization_utils.py +0 -412
- flock/core/util/file_path_utils.py +0 -223
- flock/core/util/hydrator.py +0 -309
- flock/core/util/input_resolver.py +0 -164
- flock/core/util/loader.py +0 -59
- flock/core/util/splitter.py +0 -219
- flock/di.py +0 -27
- flock/platform/docker_tools.py +0 -49
- flock/platform/jaeger_install.py +0 -86
- flock/webapp/__init__.py +0 -1
- flock/webapp/app/__init__.py +0 -0
- flock/webapp/app/api/__init__.py +0 -0
- flock/webapp/app/api/agent_management.py +0 -241
- flock/webapp/app/api/execution.py +0 -709
- flock/webapp/app/api/flock_management.py +0 -129
- flock/webapp/app/api/registry_viewer.py +0 -30
- flock/webapp/app/chat.py +0 -665
- flock/webapp/app/config.py +0 -104
- flock/webapp/app/dependencies.py +0 -117
- flock/webapp/app/main.py +0 -1070
- flock/webapp/app/middleware.py +0 -113
- flock/webapp/app/models_ui.py +0 -7
- flock/webapp/app/services/__init__.py +0 -0
- flock/webapp/app/services/feedback_file_service.py +0 -363
- flock/webapp/app/services/flock_service.py +0 -337
- flock/webapp/app/services/sharing_models.py +0 -81
- flock/webapp/app/services/sharing_store.py +0 -762
- flock/webapp/app/templates/theme_mapper.html +0 -326
- flock/webapp/app/theme_mapper.py +0 -812
- flock/webapp/app/utils.py +0 -85
- flock/webapp/run.py +0 -215
- flock/webapp/static/css/chat.css +0 -301
- flock/webapp/static/css/components.css +0 -167
- flock/webapp/static/css/header.css +0 -39
- flock/webapp/static/css/layout.css +0 -46
- flock/webapp/static/css/sidebar.css +0 -127
- flock/webapp/static/css/two-pane.css +0 -48
- flock/webapp/templates/base.html +0 -200
- flock/webapp/templates/chat.html +0 -152
- flock/webapp/templates/chat_settings.html +0 -19
- flock/webapp/templates/flock_editor.html +0 -16
- flock/webapp/templates/index.html +0 -12
- flock/webapp/templates/partials/_agent_detail_form.html +0 -93
- flock/webapp/templates/partials/_agent_list.html +0 -18
- flock/webapp/templates/partials/_agent_manager_view.html +0 -51
- flock/webapp/templates/partials/_agent_tools_checklist.html +0 -14
- flock/webapp/templates/partials/_chat_container.html +0 -15
- flock/webapp/templates/partials/_chat_messages.html +0 -57
- flock/webapp/templates/partials/_chat_settings_form.html +0 -85
- flock/webapp/templates/partials/_create_flock_form.html +0 -50
- flock/webapp/templates/partials/_dashboard_flock_detail.html +0 -17
- flock/webapp/templates/partials/_dashboard_flock_file_list.html +0 -16
- flock/webapp/templates/partials/_dashboard_flock_properties_preview.html +0 -28
- flock/webapp/templates/partials/_dashboard_upload_flock_form.html +0 -16
- flock/webapp/templates/partials/_dynamic_input_form_content.html +0 -22
- flock/webapp/templates/partials/_env_vars_table.html +0 -23
- flock/webapp/templates/partials/_execution_form.html +0 -118
- flock/webapp/templates/partials/_execution_view_container.html +0 -28
- flock/webapp/templates/partials/_flock_file_list.html +0 -23
- flock/webapp/templates/partials/_flock_properties_form.html +0 -52
- flock/webapp/templates/partials/_flock_upload_form.html +0 -16
- flock/webapp/templates/partials/_header_flock_status.html +0 -5
- flock/webapp/templates/partials/_load_manager_view.html +0 -49
- flock/webapp/templates/partials/_registry_table.html +0 -25
- flock/webapp/templates/partials/_registry_viewer_content.html +0 -70
- flock/webapp/templates/partials/_results_display.html +0 -78
- flock/webapp/templates/partials/_settings_env_content.html +0 -9
- flock/webapp/templates/partials/_settings_theme_content.html +0 -14
- flock/webapp/templates/partials/_settings_view.html +0 -36
- flock/webapp/templates/partials/_share_chat_link_snippet.html +0 -11
- flock/webapp/templates/partials/_share_link_snippet.html +0 -35
- flock/webapp/templates/partials/_sidebar.html +0 -74
- flock/webapp/templates/partials/_streaming_results_container.html +0 -195
- flock/webapp/templates/partials/_structured_data_view.html +0 -40
- flock/webapp/templates/partials/_theme_preview.html +0 -36
- flock/webapp/templates/registry_viewer.html +0 -84
- flock/webapp/templates/shared_run_page.html +0 -140
- flock/workflow/__init__.py +0 -0
- flock/workflow/activities.py +0 -196
- flock/workflow/agent_activities.py +0 -24
- flock/workflow/agent_execution_activity.py +0 -202
- flock/workflow/flock_workflow.py +0 -214
- flock/workflow/temporal_config.py +0 -96
- flock/workflow/temporal_setup.py +0 -68
- flock_core-0.5.0b28.dist-info/METADATA +0 -274
- flock_core-0.5.0b28.dist-info/RECORD +0 -561
- flock_core-0.5.0b28.dist-info/entry_points.txt +0 -2
- /flock/{core/logging → logging}/formatters/themes.py +0 -0
- /flock/{core/logging → logging}/span_middleware/baggage_span_processor.py +0 -0
- /flock/{core/mcp → mcp}/util/__init__.py +0 -0
- {flock_core-0.5.0b28.dist-info → flock_core-0.5.0b51.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,1980 @@
|
|
|
1
|
+
# Flock Flow Dashboard Design System
|
|
2
|
+
|
|
3
|
+
**Version:** 1.0.0
|
|
4
|
+
**Last Updated:** October 2025
|
|
5
|
+
**Inspired by:** AutoGen Studio, Flowise AI, and 2025 dark-themed dashboard best practices
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Table of Contents
|
|
10
|
+
|
|
11
|
+
1. [Design Principles](#design-principles)
|
|
12
|
+
2. [Color System](#color-system)
|
|
13
|
+
3. [Typography](#typography)
|
|
14
|
+
4. [Spacing System](#spacing-system)
|
|
15
|
+
5. [Shadows & Elevation](#shadows--elevation)
|
|
16
|
+
6. [Border & Radius](#border--radius)
|
|
17
|
+
7. [Motion & Transitions](#motion--transitions)
|
|
18
|
+
8. [Component Specifications](#component-specifications)
|
|
19
|
+
9. [Graph-Specific Design](#graph-specific-design)
|
|
20
|
+
10. [Usage Guidelines](#usage-guidelines)
|
|
21
|
+
11. [Code Examples](#code-examples)
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Design Principles
|
|
26
|
+
|
|
27
|
+
### Core Values
|
|
28
|
+
1. **Dark-First Design**: Optimized for extended viewing sessions with reduced eye strain
|
|
29
|
+
2. **Information Hierarchy**: Critical data accessible within 5 seconds
|
|
30
|
+
3. **Premium Aesthetic**: Modern, sleek, professional appearance
|
|
31
|
+
4. **Depth & Dimension**: Glassmorphism and elevation for spatial clarity
|
|
32
|
+
5. **Purposeful Motion**: Smooth, meaningful animations that enhance UX
|
|
33
|
+
6. **Developer-Focused**: Clear visual feedback for complex AI workflows
|
|
34
|
+
|
|
35
|
+
### Visual Philosophy
|
|
36
|
+
- Use depth (shadows, blur) to establish hierarchy
|
|
37
|
+
- Limit color to convey meaning (status, type, interaction)
|
|
38
|
+
- Embrace negative space for breathing room
|
|
39
|
+
- Maintain consistent rhythm through spacing
|
|
40
|
+
- Prioritize readability over decoration
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Color System
|
|
45
|
+
|
|
46
|
+
### Foundation Colors
|
|
47
|
+
|
|
48
|
+
#### Background Layers
|
|
49
|
+
```css
|
|
50
|
+
--color-bg-base: #0a0a0b; /* App background - deepest layer */
|
|
51
|
+
--color-bg-elevated: #121214; /* Canvas, main content areas */
|
|
52
|
+
--color-bg-surface: #1a1a1e; /* Cards, panels, raised surfaces */
|
|
53
|
+
--color-bg-overlay: #232329; /* Modals, popovers, tooltips */
|
|
54
|
+
--color-bg-float: #2a2a32; /* Floating windows, dropdowns */
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
#### Primary Brand Colors
|
|
58
|
+
```css
|
|
59
|
+
--color-primary-50: #eef2ff;
|
|
60
|
+
--color-primary-100: #e0e7ff;
|
|
61
|
+
--color-primary-200: #c7d2fe;
|
|
62
|
+
--color-primary-300: #a5b4fc;
|
|
63
|
+
--color-primary-400: #818cf8;
|
|
64
|
+
--color-primary-500: #6366f1; /* Primary brand - accent actions */
|
|
65
|
+
--color-primary-600: #4f46e5; /* Primary hover */
|
|
66
|
+
--color-primary-700: #4338ca;
|
|
67
|
+
--color-primary-800: #3730a3;
|
|
68
|
+
--color-primary-900: #312e81;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
#### Secondary/Accent Colors
|
|
72
|
+
```css
|
|
73
|
+
--color-secondary-50: #fdf4ff;
|
|
74
|
+
--color-secondary-100: #fae8ff;
|
|
75
|
+
--color-secondary-200: #f5d0fe;
|
|
76
|
+
--color-secondary-300: #f0abfc;
|
|
77
|
+
--color-secondary-400: #e879f9;
|
|
78
|
+
--color-secondary-500: #d946ef; /* Secondary accent */
|
|
79
|
+
--color-secondary-600: #c026d3; /* Secondary hover */
|
|
80
|
+
--color-secondary-700: #a21caf;
|
|
81
|
+
--color-secondary-800: #86198f;
|
|
82
|
+
--color-secondary-900: #701a75;
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
#### Tertiary/Utility Colors
|
|
86
|
+
```css
|
|
87
|
+
--color-tertiary-50: #ecfeff;
|
|
88
|
+
--color-tertiary-100: #cffafe;
|
|
89
|
+
--color-tertiary-200: #a5f3fc;
|
|
90
|
+
--color-tertiary-300: #67e8f9;
|
|
91
|
+
--color-tertiary-400: #22d3ee;
|
|
92
|
+
--color-tertiary-500: #06b6d4; /* Tertiary accent - info states */
|
|
93
|
+
--color-tertiary-600: #0891b2;
|
|
94
|
+
--color-tertiary-700: #0e7490;
|
|
95
|
+
--color-tertiary-800: #155e75;
|
|
96
|
+
--color-tertiary-900: #164e63;
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Semantic Colors
|
|
100
|
+
|
|
101
|
+
#### Status Colors
|
|
102
|
+
```css
|
|
103
|
+
/* Success */
|
|
104
|
+
--color-success-light: #6ee7b7;
|
|
105
|
+
--color-success: #10b981;
|
|
106
|
+
--color-success-dark: #047857;
|
|
107
|
+
--color-success-bg: rgba(16, 185, 129, 0.1);
|
|
108
|
+
--color-success-border: rgba(16, 185, 129, 0.3);
|
|
109
|
+
|
|
110
|
+
/* Warning */
|
|
111
|
+
--color-warning-light: #fbbf24;
|
|
112
|
+
--color-warning: #f59e0b;
|
|
113
|
+
--color-warning-dark: #d97706;
|
|
114
|
+
--color-warning-bg: rgba(245, 158, 11, 0.1);
|
|
115
|
+
--color-warning-border: rgba(245, 158, 11, 0.3);
|
|
116
|
+
|
|
117
|
+
/* Error */
|
|
118
|
+
--color-error-light: #f87171;
|
|
119
|
+
--color-error: #ef4444;
|
|
120
|
+
--color-error-dark: #dc2626;
|
|
121
|
+
--color-error-bg: rgba(239, 68, 68, 0.1);
|
|
122
|
+
--color-error-border: rgba(239, 68, 68, 0.3);
|
|
123
|
+
|
|
124
|
+
/* Info */
|
|
125
|
+
--color-info-light: #60a5fa;
|
|
126
|
+
--color-info: #3b82f6;
|
|
127
|
+
--color-info-dark: #2563eb;
|
|
128
|
+
--color-info-bg: rgba(59, 130, 246, 0.1);
|
|
129
|
+
--color-info-border: rgba(59, 130, 246, 0.3);
|
|
130
|
+
|
|
131
|
+
/* Running/Active */
|
|
132
|
+
--color-active-light: #818cf8;
|
|
133
|
+
--color-active: #6366f1;
|
|
134
|
+
--color-active-dark: #4f46e5;
|
|
135
|
+
--color-active-bg: rgba(99, 102, 241, 0.1);
|
|
136
|
+
--color-active-border: rgba(99, 102, 241, 0.3);
|
|
137
|
+
|
|
138
|
+
/* Idle/Neutral */
|
|
139
|
+
--color-idle-light: #94a3b8;
|
|
140
|
+
--color-idle: #64748b;
|
|
141
|
+
--color-idle-dark: #475569;
|
|
142
|
+
--color-idle-bg: rgba(100, 116, 139, 0.1);
|
|
143
|
+
--color-idle-border: rgba(100, 116, 139, 0.3);
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Text Colors
|
|
147
|
+
|
|
148
|
+
```css
|
|
149
|
+
--color-text-primary: #f8fafc; /* Primary content, headings */
|
|
150
|
+
--color-text-secondary: #cbd5e1; /* Secondary content, labels */
|
|
151
|
+
--color-text-tertiary: #94a3b8; /* Tertiary content, metadata */
|
|
152
|
+
--color-text-muted: #64748b; /* Muted text, placeholders */
|
|
153
|
+
--color-text-disabled: #475569; /* Disabled states */
|
|
154
|
+
--color-text-on-primary: #ffffff; /* Text on primary color bg */
|
|
155
|
+
--color-text-on-dark: #0f172a; /* Text on light backgrounds */
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
### Border & Divider Colors
|
|
159
|
+
|
|
160
|
+
```css
|
|
161
|
+
--color-border-subtle: #1e293b; /* Subtle borders, minimal contrast */
|
|
162
|
+
--color-border-default: #334155; /* Default borders */
|
|
163
|
+
--color-border-strong: #475569; /* Emphasized borders */
|
|
164
|
+
--color-border-focus: #6366f1; /* Focus states */
|
|
165
|
+
--color-border-error: #ef4444; /* Error states */
|
|
166
|
+
--color-divider: rgba(148, 163, 184, 0.1); /* Section dividers */
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### Graph-Specific Colors
|
|
170
|
+
|
|
171
|
+
#### Agent Node Colors
|
|
172
|
+
```css
|
|
173
|
+
--color-node-agent-bg: #1e293b;
|
|
174
|
+
--color-node-agent-border: #3b82f6;
|
|
175
|
+
--color-node-agent-border-selected: #6366f1;
|
|
176
|
+
--color-node-agent-text: #f8fafc;
|
|
177
|
+
--color-node-agent-badge: #334155;
|
|
178
|
+
--color-node-agent-badge-text: #94a3b8;
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
#### Message Node Colors
|
|
182
|
+
```css
|
|
183
|
+
--color-node-message-bg: #422006;
|
|
184
|
+
--color-node-message-border: #f59e0b;
|
|
185
|
+
--color-node-message-border-selected: #d946ef;
|
|
186
|
+
--color-node-message-text: #fef3c7;
|
|
187
|
+
--color-node-message-metadata: #a16207;
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### Edge Colors
|
|
191
|
+
```css
|
|
192
|
+
--color-edge-default: #475569;
|
|
193
|
+
--color-edge-active: #6366f1;
|
|
194
|
+
--color-edge-message: #f59e0b;
|
|
195
|
+
--color-edge-error: #ef4444;
|
|
196
|
+
--color-edge-label-bg: rgba(26, 26, 30, 0.95);
|
|
197
|
+
--color-edge-label-text: #cbd5e1;
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Overlay & Glassmorphism Colors
|
|
201
|
+
|
|
202
|
+
```css
|
|
203
|
+
--color-glass-bg: rgba(26, 26, 30, 0.8);
|
|
204
|
+
--color-glass-border: rgba(148, 163, 184, 0.1);
|
|
205
|
+
--color-overlay-backdrop: rgba(10, 10, 11, 0.7);
|
|
206
|
+
--color-modal-backdrop: rgba(10, 10, 11, 0.85);
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### Accessibility Compliance
|
|
210
|
+
|
|
211
|
+
All color combinations meet WCAG 2.1 AA standards:
|
|
212
|
+
- **Normal text (16px+)**: Minimum 4.5:1 contrast ratio
|
|
213
|
+
- **Large text (24px+)**: Minimum 3:1 contrast ratio
|
|
214
|
+
- **Interactive elements**: Minimum 3:1 contrast ratio
|
|
215
|
+
- **Focus indicators**: Minimum 3:1 contrast ratio
|
|
216
|
+
|
|
217
|
+
**Tested Combinations:**
|
|
218
|
+
- `--color-text-primary` on `--color-bg-base`: 14.2:1 ✓
|
|
219
|
+
- `--color-text-secondary` on `--color-bg-elevated`: 9.8:1 ✓
|
|
220
|
+
- `--color-primary-500` on `--color-bg-surface`: 4.6:1 ✓
|
|
221
|
+
- `--color-text-on-primary` on `--color-primary-500`: 7.1:1 ✓
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Typography
|
|
226
|
+
|
|
227
|
+
### Font Families
|
|
228
|
+
|
|
229
|
+
```css
|
|
230
|
+
--font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI',
|
|
231
|
+
'Roboto', 'Helvetica Neue', Arial, sans-serif;
|
|
232
|
+
--font-family-mono: 'JetBrains Mono', 'Fira Code', 'Consolas', 'Monaco',
|
|
233
|
+
'Courier New', monospace;
|
|
234
|
+
--font-family-display: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Recommended Web Fonts:**
|
|
238
|
+
```html
|
|
239
|
+
<!-- Include in index.html -->
|
|
240
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
241
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
242
|
+
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Font Sizes
|
|
246
|
+
|
|
247
|
+
```css
|
|
248
|
+
/* Display Sizes (hero sections, large headings) */
|
|
249
|
+
--font-size-display-2xl: 72px; /* 4.5rem */
|
|
250
|
+
--font-size-display-xl: 60px; /* 3.75rem */
|
|
251
|
+
--font-size-display-lg: 48px; /* 3rem */
|
|
252
|
+
--font-size-display-md: 36px; /* 2.25rem */
|
|
253
|
+
|
|
254
|
+
/* Heading Sizes */
|
|
255
|
+
--font-size-h1: 32px; /* 2rem */
|
|
256
|
+
--font-size-h2: 24px; /* 1.5rem */
|
|
257
|
+
--font-size-h3: 20px; /* 1.25rem */
|
|
258
|
+
--font-size-h4: 18px; /* 1.125rem */
|
|
259
|
+
--font-size-h5: 16px; /* 1rem */
|
|
260
|
+
--font-size-h6: 14px; /* 0.875rem */
|
|
261
|
+
|
|
262
|
+
/* Body Sizes */
|
|
263
|
+
--font-size-body-xl: 20px; /* 1.25rem */
|
|
264
|
+
--font-size-body-lg: 18px; /* 1.125rem */
|
|
265
|
+
--font-size-body: 16px; /* 1rem - Base size */
|
|
266
|
+
--font-size-body-sm: 14px; /* 0.875rem */
|
|
267
|
+
--font-size-body-xs: 12px; /* 0.75rem */
|
|
268
|
+
|
|
269
|
+
/* Utility Sizes */
|
|
270
|
+
--font-size-caption: 12px; /* 0.75rem */
|
|
271
|
+
--font-size-overline: 10px; /* 0.625rem */
|
|
272
|
+
--font-size-tiny: 10px; /* 0.625rem */
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Font Weights
|
|
276
|
+
|
|
277
|
+
```css
|
|
278
|
+
--font-weight-light: 300;
|
|
279
|
+
--font-weight-regular: 400;
|
|
280
|
+
--font-weight-medium: 500;
|
|
281
|
+
--font-weight-semibold: 600;
|
|
282
|
+
--font-weight-bold: 700;
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### Line Heights
|
|
286
|
+
|
|
287
|
+
```css
|
|
288
|
+
/* Tight (for headings) */
|
|
289
|
+
--line-height-tight: 1.1;
|
|
290
|
+
|
|
291
|
+
/* Snug (for large body text) */
|
|
292
|
+
--line-height-snug: 1.375;
|
|
293
|
+
|
|
294
|
+
/* Normal (default for body text) */
|
|
295
|
+
--line-height-normal: 1.5;
|
|
296
|
+
|
|
297
|
+
/* Relaxed (for long-form content) */
|
|
298
|
+
--line-height-relaxed: 1.625;
|
|
299
|
+
|
|
300
|
+
/* Loose (for improved readability) */
|
|
301
|
+
--line-height-loose: 2;
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### Letter Spacing
|
|
305
|
+
|
|
306
|
+
```css
|
|
307
|
+
--letter-spacing-tight: -0.02em; /* Headings, display text */
|
|
308
|
+
--letter-spacing-normal: 0; /* Body text */
|
|
309
|
+
--letter-spacing-wide: 0.025em; /* Small text, labels */
|
|
310
|
+
--letter-spacing-wider: 0.05em; /* Overlines, uppercase labels */
|
|
311
|
+
--letter-spacing-widest: 0.1em; /* Extra emphasis */
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
### Typography Scale Application
|
|
315
|
+
|
|
316
|
+
#### Headings
|
|
317
|
+
```css
|
|
318
|
+
h1 {
|
|
319
|
+
font-size: var(--font-size-h1);
|
|
320
|
+
font-weight: var(--font-weight-bold);
|
|
321
|
+
line-height: var(--line-height-tight);
|
|
322
|
+
letter-spacing: var(--letter-spacing-tight);
|
|
323
|
+
color: var(--color-text-primary);
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
h2 {
|
|
327
|
+
font-size: var(--font-size-h2);
|
|
328
|
+
font-weight: var(--font-weight-semibold);
|
|
329
|
+
line-height: var(--line-height-tight);
|
|
330
|
+
letter-spacing: var(--letter-spacing-tight);
|
|
331
|
+
color: var(--color-text-primary);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
h3 {
|
|
335
|
+
font-size: var(--font-size-h3);
|
|
336
|
+
font-weight: var(--font-weight-semibold);
|
|
337
|
+
line-height: var(--line-height-snug);
|
|
338
|
+
color: var(--color-text-primary);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
h4 {
|
|
342
|
+
font-size: var(--font-size-h4);
|
|
343
|
+
font-weight: var(--font-weight-medium);
|
|
344
|
+
line-height: var(--line-height-snug);
|
|
345
|
+
color: var(--color-text-primary);
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
h5, h6 {
|
|
349
|
+
font-size: var(--font-size-h5);
|
|
350
|
+
font-weight: var(--font-weight-medium);
|
|
351
|
+
line-height: var(--line-height-normal);
|
|
352
|
+
color: var(--color-text-secondary);
|
|
353
|
+
}
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
#### Body Text
|
|
357
|
+
```css
|
|
358
|
+
body {
|
|
359
|
+
font-family: var(--font-family-sans);
|
|
360
|
+
font-size: var(--font-size-body);
|
|
361
|
+
font-weight: var(--font-weight-regular);
|
|
362
|
+
line-height: var(--line-height-normal);
|
|
363
|
+
color: var(--color-text-primary);
|
|
364
|
+
}
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
#### Code & Monospace
|
|
368
|
+
```css
|
|
369
|
+
code, pre {
|
|
370
|
+
font-family: var(--font-family-mono);
|
|
371
|
+
font-size: 0.9em;
|
|
372
|
+
line-height: var(--line-height-relaxed);
|
|
373
|
+
}
|
|
374
|
+
```
|
|
375
|
+
|
|
376
|
+
---
|
|
377
|
+
|
|
378
|
+
## Spacing System
|
|
379
|
+
|
|
380
|
+
### Base Scale (8px grid)
|
|
381
|
+
|
|
382
|
+
```css
|
|
383
|
+
--spacing-0: 0;
|
|
384
|
+
--spacing-0-5: 2px; /* 0.125rem - Hairline spacing */
|
|
385
|
+
--spacing-1: 4px; /* 0.25rem */
|
|
386
|
+
--spacing-1-5: 6px; /* 0.375rem */
|
|
387
|
+
--spacing-2: 8px; /* 0.5rem */
|
|
388
|
+
--spacing-3: 12px; /* 0.75rem */
|
|
389
|
+
--spacing-4: 16px; /* 1rem - Base unit */
|
|
390
|
+
--spacing-5: 20px; /* 1.25rem */
|
|
391
|
+
--spacing-6: 24px; /* 1.5rem */
|
|
392
|
+
--spacing-8: 32px; /* 2rem */
|
|
393
|
+
--spacing-10: 40px; /* 2.5rem */
|
|
394
|
+
--spacing-12: 48px; /* 3rem */
|
|
395
|
+
--spacing-16: 64px; /* 4rem */
|
|
396
|
+
--spacing-20: 80px; /* 5rem */
|
|
397
|
+
--spacing-24: 96px; /* 6rem */
|
|
398
|
+
--spacing-32: 128px; /* 8rem */
|
|
399
|
+
--spacing-40: 160px; /* 10rem */
|
|
400
|
+
--spacing-48: 192px; /* 12rem */
|
|
401
|
+
--spacing-56: 224px; /* 14rem */
|
|
402
|
+
--spacing-64: 256px; /* 16rem */
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Semantic Spacing Tokens
|
|
406
|
+
|
|
407
|
+
```css
|
|
408
|
+
/* Component Internal Spacing */
|
|
409
|
+
--space-component-xs: var(--spacing-2); /* 8px - Tight internal spacing */
|
|
410
|
+
--space-component-sm: var(--spacing-3); /* 12px - Small components */
|
|
411
|
+
--space-component-md: var(--spacing-4); /* 16px - Default component padding */
|
|
412
|
+
--space-component-lg: var(--spacing-6); /* 24px - Large components */
|
|
413
|
+
--space-component-xl: var(--spacing-8); /* 32px - Extra large components */
|
|
414
|
+
|
|
415
|
+
/* Layout Spacing */
|
|
416
|
+
--space-layout-xs: var(--spacing-4); /* 16px - Minimal section spacing */
|
|
417
|
+
--space-layout-sm: var(--spacing-6); /* 24px - Small section spacing */
|
|
418
|
+
--space-layout-md: var(--spacing-8); /* 32px - Default section spacing */
|
|
419
|
+
--space-layout-lg: var(--spacing-12); /* 48px - Large section spacing */
|
|
420
|
+
--space-layout-xl: var(--spacing-16); /* 64px - Extra large section spacing */
|
|
421
|
+
--space-layout-2xl: var(--spacing-24); /* 96px - Maximum section spacing */
|
|
422
|
+
|
|
423
|
+
/* Gap Spacing (for flexbox/grid) */
|
|
424
|
+
--gap-xs: var(--spacing-1); /* 4px */
|
|
425
|
+
--gap-sm: var(--spacing-2); /* 8px */
|
|
426
|
+
--gap-md: var(--spacing-3); /* 12px */
|
|
427
|
+
--gap-lg: var(--spacing-4); /* 16px */
|
|
428
|
+
--gap-xl: var(--spacing-6); /* 24px */
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Usage Guidelines
|
|
432
|
+
|
|
433
|
+
- Use 8px base grid for all spacing decisions
|
|
434
|
+
- Prefer semantic tokens over raw values
|
|
435
|
+
- Maintain consistent rhythm vertically and horizontally
|
|
436
|
+
- Use larger spacing for separation, smaller for grouping
|
|
437
|
+
- Desktop layouts: favor `--space-layout-md` and above
|
|
438
|
+
- Mobile layouts: favor `--space-component-*` tokens
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Shadows & Elevation
|
|
443
|
+
|
|
444
|
+
### Shadow Scale
|
|
445
|
+
|
|
446
|
+
```css
|
|
447
|
+
/* Subtle shadows for minimal elevation */
|
|
448
|
+
--shadow-xs: 0 1px 2px 0 rgba(0, 0, 0, 0.4);
|
|
449
|
+
|
|
450
|
+
/* Small elevation - buttons, cards at rest */
|
|
451
|
+
--shadow-sm: 0 2px 4px -1px rgba(0, 0, 0, 0.5),
|
|
452
|
+
0 1px 2px -1px rgba(0, 0, 0, 0.3);
|
|
453
|
+
|
|
454
|
+
/* Medium elevation - dropdowns, popovers */
|
|
455
|
+
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.6),
|
|
456
|
+
0 2px 4px -1px rgba(0, 0, 0, 0.4);
|
|
457
|
+
|
|
458
|
+
/* Large elevation - modals, floating panels */
|
|
459
|
+
--shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.7),
|
|
460
|
+
0 4px 6px -2px rgba(0, 0, 0, 0.5);
|
|
461
|
+
|
|
462
|
+
/* Extra large elevation - important overlays */
|
|
463
|
+
--shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.8),
|
|
464
|
+
0 10px 10px -5px rgba(0, 0, 0, 0.6);
|
|
465
|
+
|
|
466
|
+
/* 2XL elevation - critical modals, focus states */
|
|
467
|
+
--shadow-2xl: 0 25px 50px -12px rgba(0, 0, 0, 0.9);
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
### Glow Effects (for focus, active states)
|
|
471
|
+
|
|
472
|
+
```css
|
|
473
|
+
--shadow-glow-primary: 0 0 0 3px rgba(99, 102, 241, 0.3);
|
|
474
|
+
--shadow-glow-secondary: 0 0 0 3px rgba(217, 70, 239, 0.3);
|
|
475
|
+
--shadow-glow-success: 0 0 0 3px rgba(16, 185, 129, 0.3);
|
|
476
|
+
--shadow-glow-error: 0 0 0 3px rgba(239, 68, 68, 0.3);
|
|
477
|
+
--shadow-glow-warning: 0 0 0 3px rgba(245, 158, 11, 0.3);
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Inner Shadows (for inset, pressed states)
|
|
481
|
+
|
|
482
|
+
```css
|
|
483
|
+
--shadow-inner: inset 0 2px 4px 0 rgba(0, 0, 0, 0.5);
|
|
484
|
+
--shadow-inner-lg: inset 0 4px 8px 0 rgba(0, 0, 0, 0.6);
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
### Elevation Levels
|
|
488
|
+
|
|
489
|
+
Use elevation to establish visual hierarchy:
|
|
490
|
+
|
|
491
|
+
1. **Level 0** (Baseline): Background, canvas - no shadow
|
|
492
|
+
2. **Level 1** (Subtle): `--shadow-xs` - Cards at rest, subtle separation
|
|
493
|
+
3. **Level 2** (Raised): `--shadow-sm` - Buttons, interactive elements
|
|
494
|
+
4. **Level 3** (Floating): `--shadow-md` - Dropdowns, tooltips, suggestions
|
|
495
|
+
5. **Level 4** (Overlay): `--shadow-lg` - Modals, sheets, detail windows
|
|
496
|
+
6. **Level 5** (Priority): `--shadow-xl` - Critical dialogs, important notifications
|
|
497
|
+
7. **Level 6** (Maximum): `--shadow-2xl` - Alerts requiring immediate attention
|
|
498
|
+
|
|
499
|
+
---
|
|
500
|
+
|
|
501
|
+
## Border & Radius
|
|
502
|
+
|
|
503
|
+
### Border Widths
|
|
504
|
+
|
|
505
|
+
```css
|
|
506
|
+
--border-width-0: 0;
|
|
507
|
+
--border-width-1: 1px; /* Default border */
|
|
508
|
+
--border-width-2: 2px; /* Emphasized border */
|
|
509
|
+
--border-width-3: 3px; /* Strong border */
|
|
510
|
+
--border-width-4: 4px; /* Extra strong border */
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### Border Radius
|
|
514
|
+
|
|
515
|
+
```css
|
|
516
|
+
--radius-none: 0;
|
|
517
|
+
--radius-sm: 4px; /* Subtle rounding - badges, pills */
|
|
518
|
+
--radius-md: 6px; /* Default rounding - buttons, inputs */
|
|
519
|
+
--radius-lg: 8px; /* Large rounding - cards, panels */
|
|
520
|
+
--radius-xl: 12px; /* Extra large rounding - modals */
|
|
521
|
+
--radius-2xl: 16px; /* 2XL rounding - feature cards */
|
|
522
|
+
--radius-3xl: 24px; /* 3XL rounding - hero elements */
|
|
523
|
+
--radius-full: 9999px; /* Pill shape - badges, avatars */
|
|
524
|
+
--radius-circle: 50%; /* Perfect circle - status indicators */
|
|
525
|
+
```
|
|
526
|
+
|
|
527
|
+
### Border Styles
|
|
528
|
+
|
|
529
|
+
```css
|
|
530
|
+
--border-style-solid: solid;
|
|
531
|
+
--border-style-dashed: dashed;
|
|
532
|
+
--border-style-dotted: dotted;
|
|
533
|
+
```
|
|
534
|
+
|
|
535
|
+
### Common Border Combinations
|
|
536
|
+
|
|
537
|
+
```css
|
|
538
|
+
/* Subtle border */
|
|
539
|
+
--border-subtle: var(--border-width-1) solid var(--color-border-subtle);
|
|
540
|
+
|
|
541
|
+
/* Default border */
|
|
542
|
+
--border-default: var(--border-width-1) solid var(--color-border-default);
|
|
543
|
+
|
|
544
|
+
/* Strong border */
|
|
545
|
+
--border-strong: var(--border-width-2) solid var(--color-border-strong);
|
|
546
|
+
|
|
547
|
+
/* Focus border */
|
|
548
|
+
--border-focus: var(--border-width-2) solid var(--color-border-focus);
|
|
549
|
+
|
|
550
|
+
/* Error border */
|
|
551
|
+
--border-error: var(--border-width-2) solid var(--color-border-error);
|
|
552
|
+
```
|
|
553
|
+
|
|
554
|
+
---
|
|
555
|
+
|
|
556
|
+
## Motion & Transitions
|
|
557
|
+
|
|
558
|
+
### Duration
|
|
559
|
+
|
|
560
|
+
```css
|
|
561
|
+
--duration-instant: 0ms;
|
|
562
|
+
--duration-fast: 100ms; /* Micro-interactions, hovers */
|
|
563
|
+
--duration-normal: 200ms; /* Default transitions */
|
|
564
|
+
--duration-slow: 300ms; /* Complex state changes */
|
|
565
|
+
--duration-slower: 400ms; /* Page transitions, reveals */
|
|
566
|
+
--duration-slowest: 500ms; /* Dramatic effects */
|
|
567
|
+
```
|
|
568
|
+
|
|
569
|
+
### Easing Functions
|
|
570
|
+
|
|
571
|
+
```css
|
|
572
|
+
/* Standard ease curves */
|
|
573
|
+
--ease-linear: linear;
|
|
574
|
+
--ease-in: cubic-bezier(0.4, 0, 1, 1);
|
|
575
|
+
--ease-out: cubic-bezier(0, 0, 0.2, 1);
|
|
576
|
+
--ease-in-out: cubic-bezier(0.4, 0, 0.2, 1);
|
|
577
|
+
|
|
578
|
+
/* Custom curves for premium feel */
|
|
579
|
+
--ease-smooth: cubic-bezier(0.4, 0, 0.6, 1); /* Smooth, natural */
|
|
580
|
+
--ease-bounce: cubic-bezier(0.68, -0.55, 0.265, 1.55); /* Playful bounce */
|
|
581
|
+
--ease-elastic: cubic-bezier(0.175, 0.885, 0.32, 1.275); /* Elastic snap */
|
|
582
|
+
--ease-sharp: cubic-bezier(0.4, 0, 0.6, 1); /* Sharp, decisive */
|
|
583
|
+
```
|
|
584
|
+
|
|
585
|
+
### Common Transitions
|
|
586
|
+
|
|
587
|
+
```css
|
|
588
|
+
--transition-colors: color var(--duration-fast) var(--ease-smooth),
|
|
589
|
+
background-color var(--duration-fast) var(--ease-smooth),
|
|
590
|
+
border-color var(--duration-fast) var(--ease-smooth);
|
|
591
|
+
|
|
592
|
+
--transition-opacity: opacity var(--duration-normal) var(--ease-out);
|
|
593
|
+
|
|
594
|
+
--transition-transform: transform var(--duration-normal) var(--ease-smooth);
|
|
595
|
+
|
|
596
|
+
--transition-shadow: box-shadow var(--duration-normal) var(--ease-out);
|
|
597
|
+
|
|
598
|
+
--transition-all: all var(--duration-normal) var(--ease-smooth);
|
|
599
|
+
|
|
600
|
+
--transition-base: var(--duration-normal) var(--ease-smooth);
|
|
601
|
+
```
|
|
602
|
+
|
|
603
|
+
### Animation Guidelines
|
|
604
|
+
|
|
605
|
+
1. **Hover States**: Use `--duration-fast` with `--ease-smooth`
|
|
606
|
+
2. **Focus States**: Use `--duration-normal` with `--ease-out`
|
|
607
|
+
3. **Loading States**: Use `--duration-slow` with `--ease-linear`
|
|
608
|
+
4. **Page Transitions**: Use `--duration-slower` with `--ease-in-out`
|
|
609
|
+
5. **Micro-interactions**: Keep under 200ms for responsiveness
|
|
610
|
+
6. **Respect prefers-reduced-motion**: Disable animations for accessibility
|
|
611
|
+
|
|
612
|
+
```css
|
|
613
|
+
@media (prefers-reduced-motion: reduce) {
|
|
614
|
+
* {
|
|
615
|
+
animation-duration: 0.01ms !important;
|
|
616
|
+
animation-iteration-count: 1 !important;
|
|
617
|
+
transition-duration: 0.01ms !important;
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
```
|
|
621
|
+
|
|
622
|
+
---
|
|
623
|
+
|
|
624
|
+
## Component Specifications
|
|
625
|
+
|
|
626
|
+
### Buttons
|
|
627
|
+
|
|
628
|
+
#### Primary Button
|
|
629
|
+
```css
|
|
630
|
+
.button-primary {
|
|
631
|
+
/* Layout */
|
|
632
|
+
padding: var(--space-component-sm) var(--space-component-lg);
|
|
633
|
+
border-radius: var(--radius-md);
|
|
634
|
+
|
|
635
|
+
/* Typography */
|
|
636
|
+
font-family: var(--font-family-sans);
|
|
637
|
+
font-size: var(--font-size-body-sm);
|
|
638
|
+
font-weight: var(--font-weight-semibold);
|
|
639
|
+
line-height: var(--line-height-normal);
|
|
640
|
+
|
|
641
|
+
/* Colors */
|
|
642
|
+
background: var(--color-primary-500);
|
|
643
|
+
color: var(--color-text-on-primary);
|
|
644
|
+
border: var(--border-width-0);
|
|
645
|
+
|
|
646
|
+
/* Effects */
|
|
647
|
+
box-shadow: var(--shadow-sm);
|
|
648
|
+
transition: var(--transition-colors), var(--transition-shadow);
|
|
649
|
+
cursor: pointer;
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
.button-primary:hover {
|
|
653
|
+
background: var(--color-primary-600);
|
|
654
|
+
box-shadow: var(--shadow-md);
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
.button-primary:active {
|
|
658
|
+
background: var(--color-primary-700);
|
|
659
|
+
box-shadow: var(--shadow-xs);
|
|
660
|
+
transform: translateY(1px);
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
.button-primary:focus-visible {
|
|
664
|
+
outline: none;
|
|
665
|
+
box-shadow: var(--shadow-glow-primary);
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
.button-primary:disabled {
|
|
669
|
+
background: var(--color-bg-surface);
|
|
670
|
+
color: var(--color-text-disabled);
|
|
671
|
+
cursor: not-allowed;
|
|
672
|
+
box-shadow: none;
|
|
673
|
+
}
|
|
674
|
+
```
|
|
675
|
+
|
|
676
|
+
#### Secondary Button
|
|
677
|
+
```css
|
|
678
|
+
.button-secondary {
|
|
679
|
+
/* Layout */
|
|
680
|
+
padding: var(--space-component-sm) var(--space-component-lg);
|
|
681
|
+
border-radius: var(--radius-md);
|
|
682
|
+
|
|
683
|
+
/* Typography */
|
|
684
|
+
font-family: var(--font-family-sans);
|
|
685
|
+
font-size: var(--font-size-body-sm);
|
|
686
|
+
font-weight: var(--font-weight-semibold);
|
|
687
|
+
|
|
688
|
+
/* Colors */
|
|
689
|
+
background: transparent;
|
|
690
|
+
color: var(--color-text-secondary);
|
|
691
|
+
border: var(--border-default);
|
|
692
|
+
|
|
693
|
+
/* Effects */
|
|
694
|
+
transition: var(--transition-colors), var(--transition-shadow);
|
|
695
|
+
cursor: pointer;
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
.button-secondary:hover {
|
|
699
|
+
background: var(--color-bg-surface);
|
|
700
|
+
color: var(--color-text-primary);
|
|
701
|
+
border-color: var(--color-border-strong);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
.button-secondary:active {
|
|
705
|
+
background: var(--color-bg-elevated);
|
|
706
|
+
}
|
|
707
|
+
```
|
|
708
|
+
|
|
709
|
+
#### Ghost Button
|
|
710
|
+
```css
|
|
711
|
+
.button-ghost {
|
|
712
|
+
/* Layout */
|
|
713
|
+
padding: var(--space-component-sm) var(--space-component-md);
|
|
714
|
+
border-radius: var(--radius-md);
|
|
715
|
+
|
|
716
|
+
/* Typography */
|
|
717
|
+
font-size: var(--font-size-body-sm);
|
|
718
|
+
font-weight: var(--font-weight-medium);
|
|
719
|
+
|
|
720
|
+
/* Colors */
|
|
721
|
+
background: transparent;
|
|
722
|
+
color: var(--color-text-secondary);
|
|
723
|
+
border: none;
|
|
724
|
+
|
|
725
|
+
/* Effects */
|
|
726
|
+
transition: var(--transition-colors);
|
|
727
|
+
cursor: pointer;
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
.button-ghost:hover {
|
|
731
|
+
background: var(--color-bg-surface);
|
|
732
|
+
color: var(--color-text-primary);
|
|
733
|
+
}
|
|
734
|
+
```
|
|
735
|
+
|
|
736
|
+
#### Danger Button
|
|
737
|
+
```css
|
|
738
|
+
.button-danger {
|
|
739
|
+
/* Same as primary but with error colors */
|
|
740
|
+
background: var(--color-error);
|
|
741
|
+
color: var(--color-text-on-primary);
|
|
742
|
+
/* ... rest same as primary */
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
.button-danger:hover {
|
|
746
|
+
background: var(--color-error-dark);
|
|
747
|
+
}
|
|
748
|
+
```
|
|
749
|
+
|
|
750
|
+
#### Icon Button
|
|
751
|
+
```css
|
|
752
|
+
.button-icon {
|
|
753
|
+
/* Layout */
|
|
754
|
+
width: 32px;
|
|
755
|
+
height: 32px;
|
|
756
|
+
padding: var(--spacing-2);
|
|
757
|
+
border-radius: var(--radius-md);
|
|
758
|
+
|
|
759
|
+
/* Display */
|
|
760
|
+
display: inline-flex;
|
|
761
|
+
align-items: center;
|
|
762
|
+
justify-content: center;
|
|
763
|
+
|
|
764
|
+
/* Colors */
|
|
765
|
+
background: transparent;
|
|
766
|
+
color: var(--color-text-secondary);
|
|
767
|
+
border: none;
|
|
768
|
+
|
|
769
|
+
/* Effects */
|
|
770
|
+
transition: var(--transition-colors);
|
|
771
|
+
cursor: pointer;
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
.button-icon:hover {
|
|
775
|
+
background: var(--color-bg-surface);
|
|
776
|
+
color: var(--color-text-primary);
|
|
777
|
+
}
|
|
778
|
+
```
|
|
779
|
+
|
|
780
|
+
### Input Fields
|
|
781
|
+
|
|
782
|
+
```css
|
|
783
|
+
.input {
|
|
784
|
+
/* Layout */
|
|
785
|
+
width: 100%;
|
|
786
|
+
padding: var(--space-component-sm) var(--space-component-md);
|
|
787
|
+
border-radius: var(--radius-md);
|
|
788
|
+
|
|
789
|
+
/* Typography */
|
|
790
|
+
font-family: var(--font-family-sans);
|
|
791
|
+
font-size: var(--font-size-body-sm);
|
|
792
|
+
line-height: var(--line-height-normal);
|
|
793
|
+
|
|
794
|
+
/* Colors */
|
|
795
|
+
background: var(--color-bg-elevated);
|
|
796
|
+
color: var(--color-text-primary);
|
|
797
|
+
border: var(--border-default);
|
|
798
|
+
|
|
799
|
+
/* Effects */
|
|
800
|
+
transition: var(--transition-colors), var(--transition-shadow);
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
.input::placeholder {
|
|
804
|
+
color: var(--color-text-muted);
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
.input:hover {
|
|
808
|
+
border-color: var(--color-border-strong);
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
.input:focus {
|
|
812
|
+
outline: none;
|
|
813
|
+
border-color: var(--color-border-focus);
|
|
814
|
+
box-shadow: var(--shadow-glow-primary);
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
.input:disabled {
|
|
818
|
+
background: var(--color-bg-base);
|
|
819
|
+
color: var(--color-text-disabled);
|
|
820
|
+
cursor: not-allowed;
|
|
821
|
+
}
|
|
822
|
+
|
|
823
|
+
.input.error {
|
|
824
|
+
border-color: var(--color-border-error);
|
|
825
|
+
box-shadow: var(--shadow-glow-error);
|
|
826
|
+
}
|
|
827
|
+
```
|
|
828
|
+
|
|
829
|
+
### Dropdown/Select
|
|
830
|
+
|
|
831
|
+
```css
|
|
832
|
+
.select {
|
|
833
|
+
/* Layout */
|
|
834
|
+
width: 100%;
|
|
835
|
+
padding: var(--space-component-sm) var(--space-component-md);
|
|
836
|
+
padding-right: var(--spacing-8); /* Room for arrow */
|
|
837
|
+
border-radius: var(--radius-md);
|
|
838
|
+
|
|
839
|
+
/* Typography */
|
|
840
|
+
font-size: var(--font-size-body-sm);
|
|
841
|
+
|
|
842
|
+
/* Colors */
|
|
843
|
+
background: var(--color-bg-elevated);
|
|
844
|
+
color: var(--color-text-primary);
|
|
845
|
+
border: var(--border-default);
|
|
846
|
+
|
|
847
|
+
/* Effects */
|
|
848
|
+
cursor: pointer;
|
|
849
|
+
appearance: none;
|
|
850
|
+
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2394a3b8' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
|
|
851
|
+
background-repeat: no-repeat;
|
|
852
|
+
background-position: right var(--spacing-3) center;
|
|
853
|
+
transition: var(--transition-colors), var(--transition-shadow);
|
|
854
|
+
}
|
|
855
|
+
|
|
856
|
+
.select:hover {
|
|
857
|
+
border-color: var(--color-border-strong);
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
.select:focus {
|
|
861
|
+
outline: none;
|
|
862
|
+
border-color: var(--color-border-focus);
|
|
863
|
+
box-shadow: var(--shadow-glow-primary);
|
|
864
|
+
}
|
|
865
|
+
```
|
|
866
|
+
|
|
867
|
+
### Cards
|
|
868
|
+
|
|
869
|
+
```css
|
|
870
|
+
.card {
|
|
871
|
+
/* Layout */
|
|
872
|
+
padding: var(--space-component-lg);
|
|
873
|
+
border-radius: var(--radius-lg);
|
|
874
|
+
|
|
875
|
+
/* Colors */
|
|
876
|
+
background: var(--color-bg-surface);
|
|
877
|
+
border: var(--border-subtle);
|
|
878
|
+
|
|
879
|
+
/* Effects */
|
|
880
|
+
box-shadow: var(--shadow-xs);
|
|
881
|
+
transition: var(--transition-shadow);
|
|
882
|
+
}
|
|
883
|
+
|
|
884
|
+
.card:hover {
|
|
885
|
+
box-shadow: var(--shadow-sm);
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
.card-interactive {
|
|
889
|
+
cursor: pointer;
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
.card-interactive:hover {
|
|
893
|
+
box-shadow: var(--shadow-md);
|
|
894
|
+
border-color: var(--color-border-default);
|
|
895
|
+
}
|
|
896
|
+
```
|
|
897
|
+
|
|
898
|
+
### Modals & Floating Windows
|
|
899
|
+
|
|
900
|
+
```css
|
|
901
|
+
.modal-backdrop {
|
|
902
|
+
/* Overlay */
|
|
903
|
+
position: fixed;
|
|
904
|
+
inset: 0;
|
|
905
|
+
background: var(--color-modal-backdrop);
|
|
906
|
+
backdrop-filter: blur(4px);
|
|
907
|
+
z-index: 1000;
|
|
908
|
+
|
|
909
|
+
/* Animation */
|
|
910
|
+
animation: fadeIn var(--duration-normal) var(--ease-out);
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
.modal {
|
|
914
|
+
/* Layout */
|
|
915
|
+
position: fixed;
|
|
916
|
+
top: 50%;
|
|
917
|
+
left: 50%;
|
|
918
|
+
transform: translate(-50%, -50%);
|
|
919
|
+
width: 90%;
|
|
920
|
+
max-width: 600px;
|
|
921
|
+
max-height: 80vh;
|
|
922
|
+
padding: var(--space-layout-md);
|
|
923
|
+
border-radius: var(--radius-xl);
|
|
924
|
+
|
|
925
|
+
/* Colors - Glassmorphism */
|
|
926
|
+
background: var(--color-glass-bg);
|
|
927
|
+
border: var(--border-width-1) solid var(--color-glass-border);
|
|
928
|
+
backdrop-filter: blur(16px);
|
|
929
|
+
-webkit-backdrop-filter: blur(16px);
|
|
930
|
+
|
|
931
|
+
/* Effects */
|
|
932
|
+
box-shadow: var(--shadow-2xl);
|
|
933
|
+
z-index: 1001;
|
|
934
|
+
|
|
935
|
+
/* Animation */
|
|
936
|
+
animation: scaleIn var(--duration-slow) var(--ease-smooth);
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
.modal-header {
|
|
940
|
+
/* Layout */
|
|
941
|
+
padding-bottom: var(--space-component-lg);
|
|
942
|
+
margin-bottom: var(--space-component-lg);
|
|
943
|
+
border-bottom: var(--border-width-1) solid var(--color-divider);
|
|
944
|
+
|
|
945
|
+
/* Display */
|
|
946
|
+
display: flex;
|
|
947
|
+
align-items: center;
|
|
948
|
+
justify-content: space-between;
|
|
949
|
+
}
|
|
950
|
+
|
|
951
|
+
.modal-title {
|
|
952
|
+
font-size: var(--font-size-h3);
|
|
953
|
+
font-weight: var(--font-weight-semibold);
|
|
954
|
+
color: var(--color-text-primary);
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
.modal-body {
|
|
958
|
+
overflow-y: auto;
|
|
959
|
+
max-height: calc(80vh - 160px);
|
|
960
|
+
}
|
|
961
|
+
|
|
962
|
+
.modal-footer {
|
|
963
|
+
/* Layout */
|
|
964
|
+
padding-top: var(--space-component-lg);
|
|
965
|
+
margin-top: var(--space-component-lg);
|
|
966
|
+
border-top: var(--border-width-1) solid var(--color-divider);
|
|
967
|
+
|
|
968
|
+
/* Display */
|
|
969
|
+
display: flex;
|
|
970
|
+
gap: var(--gap-md);
|
|
971
|
+
justify-content: flex-end;
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
@keyframes fadeIn {
|
|
975
|
+
from { opacity: 0; }
|
|
976
|
+
to { opacity: 1; }
|
|
977
|
+
}
|
|
978
|
+
|
|
979
|
+
@keyframes scaleIn {
|
|
980
|
+
from {
|
|
981
|
+
opacity: 0;
|
|
982
|
+
transform: translate(-50%, -50%) scale(0.95);
|
|
983
|
+
}
|
|
984
|
+
to {
|
|
985
|
+
opacity: 1;
|
|
986
|
+
transform: translate(-50%, -50%) scale(1);
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
```
|
|
990
|
+
|
|
991
|
+
### Badges & Pills
|
|
992
|
+
|
|
993
|
+
```css
|
|
994
|
+
.badge {
|
|
995
|
+
/* Layout */
|
|
996
|
+
display: inline-flex;
|
|
997
|
+
align-items: center;
|
|
998
|
+
padding: var(--spacing-1) var(--spacing-2);
|
|
999
|
+
border-radius: var(--radius-sm);
|
|
1000
|
+
|
|
1001
|
+
/* Typography */
|
|
1002
|
+
font-size: var(--font-size-caption);
|
|
1003
|
+
font-weight: var(--font-weight-medium);
|
|
1004
|
+
line-height: 1;
|
|
1005
|
+
|
|
1006
|
+
/* Colors */
|
|
1007
|
+
background: var(--color-bg-overlay);
|
|
1008
|
+
color: var(--color-text-secondary);
|
|
1009
|
+
border: var(--border-subtle);
|
|
1010
|
+
}
|
|
1011
|
+
|
|
1012
|
+
/* Badge variants */
|
|
1013
|
+
.badge-primary {
|
|
1014
|
+
background: var(--color-primary-bg);
|
|
1015
|
+
color: var(--color-primary-500);
|
|
1016
|
+
border-color: var(--color-primary-border);
|
|
1017
|
+
}
|
|
1018
|
+
|
|
1019
|
+
.badge-success {
|
|
1020
|
+
background: var(--color-success-bg);
|
|
1021
|
+
color: var(--color-success);
|
|
1022
|
+
border-color: var(--color-success-border);
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
.badge-warning {
|
|
1026
|
+
background: var(--color-warning-bg);
|
|
1027
|
+
color: var(--color-warning);
|
|
1028
|
+
border-color: var(--color-warning-border);
|
|
1029
|
+
}
|
|
1030
|
+
|
|
1031
|
+
.badge-error {
|
|
1032
|
+
background: var(--color-error-bg);
|
|
1033
|
+
color: var(--color-error);
|
|
1034
|
+
border-color: var(--color-error-border);
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
.badge-pill {
|
|
1038
|
+
border-radius: var(--radius-full);
|
|
1039
|
+
padding: var(--spacing-1) var(--spacing-3);
|
|
1040
|
+
}
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
### Tabs
|
|
1044
|
+
|
|
1045
|
+
```css
|
|
1046
|
+
.tabs-container {
|
|
1047
|
+
/* Layout */
|
|
1048
|
+
display: flex;
|
|
1049
|
+
gap: var(--gap-sm);
|
|
1050
|
+
padding: var(--space-component-sm) var(--space-component-md);
|
|
1051
|
+
border-bottom: var(--border-subtle);
|
|
1052
|
+
}
|
|
1053
|
+
|
|
1054
|
+
.tab {
|
|
1055
|
+
/* Layout */
|
|
1056
|
+
position: relative;
|
|
1057
|
+
padding: var(--space-component-sm) var(--space-component-md);
|
|
1058
|
+
border-radius: var(--radius-md) var(--radius-md) 0 0;
|
|
1059
|
+
|
|
1060
|
+
/* Typography */
|
|
1061
|
+
font-size: var(--font-size-body-sm);
|
|
1062
|
+
font-weight: var(--font-weight-medium);
|
|
1063
|
+
|
|
1064
|
+
/* Colors */
|
|
1065
|
+
background: transparent;
|
|
1066
|
+
color: var(--color-text-muted);
|
|
1067
|
+
border: none;
|
|
1068
|
+
|
|
1069
|
+
/* Effects */
|
|
1070
|
+
cursor: pointer;
|
|
1071
|
+
transition: var(--transition-colors);
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
.tab:hover {
|
|
1075
|
+
color: var(--color-text-secondary);
|
|
1076
|
+
background: var(--color-bg-surface);
|
|
1077
|
+
}
|
|
1078
|
+
|
|
1079
|
+
.tab-active {
|
|
1080
|
+
color: var(--color-text-primary);
|
|
1081
|
+
background: var(--color-bg-surface);
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
.tab-active::after {
|
|
1085
|
+
content: '';
|
|
1086
|
+
position: absolute;
|
|
1087
|
+
bottom: -1px;
|
|
1088
|
+
left: 0;
|
|
1089
|
+
right: 0;
|
|
1090
|
+
height: 2px;
|
|
1091
|
+
background: var(--color-primary-500);
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
.tab-content {
|
|
1095
|
+
padding: var(--space-component-lg);
|
|
1096
|
+
}
|
|
1097
|
+
```
|
|
1098
|
+
|
|
1099
|
+
### Tooltips
|
|
1100
|
+
|
|
1101
|
+
```css
|
|
1102
|
+
.tooltip {
|
|
1103
|
+
/* Layout */
|
|
1104
|
+
position: absolute;
|
|
1105
|
+
padding: var(--spacing-2) var(--spacing-3);
|
|
1106
|
+
border-radius: var(--radius-md);
|
|
1107
|
+
max-width: 240px;
|
|
1108
|
+
|
|
1109
|
+
/* Typography */
|
|
1110
|
+
font-size: var(--font-size-caption);
|
|
1111
|
+
line-height: var(--line-height-normal);
|
|
1112
|
+
|
|
1113
|
+
/* Colors */
|
|
1114
|
+
background: var(--color-bg-float);
|
|
1115
|
+
color: var(--color-text-secondary);
|
|
1116
|
+
border: var(--border-subtle);
|
|
1117
|
+
|
|
1118
|
+
/* Effects */
|
|
1119
|
+
box-shadow: var(--shadow-md);
|
|
1120
|
+
z-index: 2000;
|
|
1121
|
+
pointer-events: none;
|
|
1122
|
+
|
|
1123
|
+
/* Animation */
|
|
1124
|
+
opacity: 0;
|
|
1125
|
+
transform: translateY(-4px);
|
|
1126
|
+
transition: opacity var(--duration-fast) var(--ease-out),
|
|
1127
|
+
transform var(--duration-fast) var(--ease-out);
|
|
1128
|
+
}
|
|
1129
|
+
|
|
1130
|
+
.tooltip.visible {
|
|
1131
|
+
opacity: 1;
|
|
1132
|
+
transform: translateY(0);
|
|
1133
|
+
}
|
|
1134
|
+
```
|
|
1135
|
+
|
|
1136
|
+
### Loading States
|
|
1137
|
+
|
|
1138
|
+
```css
|
|
1139
|
+
.spinner {
|
|
1140
|
+
width: 20px;
|
|
1141
|
+
height: 20px;
|
|
1142
|
+
border: 2px solid var(--color-border-subtle);
|
|
1143
|
+
border-top-color: var(--color-primary-500);
|
|
1144
|
+
border-radius: 50%;
|
|
1145
|
+
animation: spin var(--duration-slowest) linear infinite;
|
|
1146
|
+
}
|
|
1147
|
+
|
|
1148
|
+
@keyframes spin {
|
|
1149
|
+
to { transform: rotate(360deg); }
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
.skeleton {
|
|
1153
|
+
background: linear-gradient(
|
|
1154
|
+
90deg,
|
|
1155
|
+
var(--color-bg-surface) 0%,
|
|
1156
|
+
var(--color-bg-overlay) 50%,
|
|
1157
|
+
var(--color-bg-surface) 100%
|
|
1158
|
+
);
|
|
1159
|
+
background-size: 200% 100%;
|
|
1160
|
+
animation: shimmer 1.5s ease-in-out infinite;
|
|
1161
|
+
border-radius: var(--radius-md);
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
@keyframes shimmer {
|
|
1165
|
+
0% { background-position: 200% 0; }
|
|
1166
|
+
100% { background-position: -200% 0; }
|
|
1167
|
+
}
|
|
1168
|
+
```
|
|
1169
|
+
|
|
1170
|
+
---
|
|
1171
|
+
|
|
1172
|
+
## Graph-Specific Design
|
|
1173
|
+
|
|
1174
|
+
### Agent Node Styling
|
|
1175
|
+
|
|
1176
|
+
```css
|
|
1177
|
+
.agent-node {
|
|
1178
|
+
/* Layout */
|
|
1179
|
+
min-width: 180px;
|
|
1180
|
+
max-width: 240px;
|
|
1181
|
+
padding: var(--space-component-md);
|
|
1182
|
+
border-radius: var(--radius-lg);
|
|
1183
|
+
|
|
1184
|
+
/* Colors */
|
|
1185
|
+
background: var(--color-node-agent-bg);
|
|
1186
|
+
border: var(--border-width-2) solid var(--color-node-agent-border);
|
|
1187
|
+
|
|
1188
|
+
/* Effects */
|
|
1189
|
+
box-shadow: var(--shadow-sm);
|
|
1190
|
+
cursor: pointer;
|
|
1191
|
+
transition: var(--transition-shadow), var(--transition-colors);
|
|
1192
|
+
}
|
|
1193
|
+
|
|
1194
|
+
.agent-node:hover {
|
|
1195
|
+
box-shadow: var(--shadow-md);
|
|
1196
|
+
border-color: var(--color-primary-400);
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
.agent-node.selected {
|
|
1200
|
+
border-color: var(--color-node-agent-border-selected);
|
|
1201
|
+
box-shadow: var(--shadow-lg), var(--shadow-glow-primary);
|
|
1202
|
+
}
|
|
1203
|
+
|
|
1204
|
+
.agent-node-header {
|
|
1205
|
+
display: flex;
|
|
1206
|
+
justify-content: space-between;
|
|
1207
|
+
align-items: center;
|
|
1208
|
+
margin-bottom: var(--spacing-2);
|
|
1209
|
+
}
|
|
1210
|
+
|
|
1211
|
+
.agent-node-title {
|
|
1212
|
+
font-size: var(--font-size-body-sm);
|
|
1213
|
+
font-weight: var(--font-weight-semibold);
|
|
1214
|
+
color: var(--color-text-primary);
|
|
1215
|
+
}
|
|
1216
|
+
|
|
1217
|
+
.agent-node-status {
|
|
1218
|
+
width: 12px;
|
|
1219
|
+
height: 12px;
|
|
1220
|
+
border-radius: var(--radius-circle);
|
|
1221
|
+
flex-shrink: 0;
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
.agent-node-status.running {
|
|
1225
|
+
background: var(--color-active);
|
|
1226
|
+
box-shadow: 0 0 8px var(--color-active);
|
|
1227
|
+
animation: pulse 2s ease-in-out infinite;
|
|
1228
|
+
}
|
|
1229
|
+
|
|
1230
|
+
.agent-node-status.idle {
|
|
1231
|
+
background: var(--color-idle);
|
|
1232
|
+
}
|
|
1233
|
+
|
|
1234
|
+
.agent-node-status.error {
|
|
1235
|
+
background: var(--color-error);
|
|
1236
|
+
box-shadow: 0 0 8px var(--color-error);
|
|
1237
|
+
}
|
|
1238
|
+
|
|
1239
|
+
@keyframes pulse {
|
|
1240
|
+
0%, 100% { opacity: 1; }
|
|
1241
|
+
50% { opacity: 0.6; }
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
.agent-node-subscriptions {
|
|
1245
|
+
display: flex;
|
|
1246
|
+
flex-wrap: wrap;
|
|
1247
|
+
gap: var(--gap-xs);
|
|
1248
|
+
margin-bottom: var(--spacing-2);
|
|
1249
|
+
}
|
|
1250
|
+
|
|
1251
|
+
.agent-node-subscription-badge {
|
|
1252
|
+
padding: var(--spacing-0-5) var(--spacing-1-5);
|
|
1253
|
+
background: var(--color-node-agent-badge);
|
|
1254
|
+
color: var(--color-node-agent-badge-text);
|
|
1255
|
+
font-size: var(--font-size-overline);
|
|
1256
|
+
font-weight: var(--font-weight-medium);
|
|
1257
|
+
border-radius: var(--radius-sm);
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
.agent-node-stats {
|
|
1261
|
+
display: flex;
|
|
1262
|
+
gap: var(--gap-md);
|
|
1263
|
+
font-size: var(--font-size-caption);
|
|
1264
|
+
color: var(--color-text-tertiary);
|
|
1265
|
+
}
|
|
1266
|
+
|
|
1267
|
+
.agent-node-stat {
|
|
1268
|
+
display: flex;
|
|
1269
|
+
align-items: center;
|
|
1270
|
+
gap: var(--gap-xs);
|
|
1271
|
+
}
|
|
1272
|
+
```
|
|
1273
|
+
|
|
1274
|
+
### Message Node Styling
|
|
1275
|
+
|
|
1276
|
+
```css
|
|
1277
|
+
.message-node {
|
|
1278
|
+
/* Layout */
|
|
1279
|
+
min-width: 160px;
|
|
1280
|
+
max-width: 200px;
|
|
1281
|
+
padding: var(--space-component-sm);
|
|
1282
|
+
border-radius: var(--radius-md);
|
|
1283
|
+
|
|
1284
|
+
/* Colors */
|
|
1285
|
+
background: var(--color-node-message-bg);
|
|
1286
|
+
border: var(--border-width-2) solid var(--color-node-message-border);
|
|
1287
|
+
|
|
1288
|
+
/* Effects */
|
|
1289
|
+
box-shadow: var(--shadow-sm);
|
|
1290
|
+
cursor: pointer;
|
|
1291
|
+
transition: var(--transition-shadow), var(--transition-colors);
|
|
1292
|
+
}
|
|
1293
|
+
|
|
1294
|
+
.message-node:hover {
|
|
1295
|
+
box-shadow: var(--shadow-md);
|
|
1296
|
+
border-color: var(--color-warning-light);
|
|
1297
|
+
}
|
|
1298
|
+
|
|
1299
|
+
.message-node.selected {
|
|
1300
|
+
border-color: var(--color-node-message-border-selected);
|
|
1301
|
+
box-shadow: var(--shadow-lg), var(--shadow-glow-secondary);
|
|
1302
|
+
}
|
|
1303
|
+
|
|
1304
|
+
.message-node-type {
|
|
1305
|
+
font-size: var(--font-size-caption);
|
|
1306
|
+
font-weight: var(--font-weight-semibold);
|
|
1307
|
+
color: var(--color-node-message-text);
|
|
1308
|
+
margin-bottom: var(--spacing-1-5);
|
|
1309
|
+
}
|
|
1310
|
+
|
|
1311
|
+
.message-node-preview {
|
|
1312
|
+
font-size: var(--font-size-overline);
|
|
1313
|
+
color: var(--color-node-message-metadata);
|
|
1314
|
+
margin-bottom: var(--spacing-1-5);
|
|
1315
|
+
overflow: hidden;
|
|
1316
|
+
text-overflow: ellipsis;
|
|
1317
|
+
white-space: nowrap;
|
|
1318
|
+
}
|
|
1319
|
+
|
|
1320
|
+
.message-node-metadata {
|
|
1321
|
+
font-size: var(--font-size-tiny);
|
|
1322
|
+
color: var(--color-text-muted);
|
|
1323
|
+
opacity: 0.7;
|
|
1324
|
+
}
|
|
1325
|
+
```
|
|
1326
|
+
|
|
1327
|
+
### Edge Styling
|
|
1328
|
+
|
|
1329
|
+
```css
|
|
1330
|
+
.react-flow__edge-path {
|
|
1331
|
+
stroke: var(--color-edge-default);
|
|
1332
|
+
stroke-width: 2;
|
|
1333
|
+
transition: stroke var(--duration-fast);
|
|
1334
|
+
}
|
|
1335
|
+
|
|
1336
|
+
.react-flow__edge:hover .react-flow__edge-path {
|
|
1337
|
+
stroke: var(--color-edge-active);
|
|
1338
|
+
stroke-width: 3;
|
|
1339
|
+
}
|
|
1340
|
+
|
|
1341
|
+
.react-flow__edge.selected .react-flow__edge-path {
|
|
1342
|
+
stroke: var(--color-edge-active);
|
|
1343
|
+
stroke-width: 3;
|
|
1344
|
+
}
|
|
1345
|
+
|
|
1346
|
+
.react-flow__edge.message-edge .react-flow__edge-path {
|
|
1347
|
+
stroke: var(--color-edge-message);
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
.react-flow__edge.error-edge .react-flow__edge-path {
|
|
1351
|
+
stroke: var(--color-edge-error);
|
|
1352
|
+
}
|
|
1353
|
+
|
|
1354
|
+
.react-flow__edge-text {
|
|
1355
|
+
font-size: var(--font-size-overline);
|
|
1356
|
+
font-weight: var(--font-weight-medium);
|
|
1357
|
+
fill: var(--color-edge-label-text);
|
|
1358
|
+
}
|
|
1359
|
+
|
|
1360
|
+
.react-flow__edge-textbg {
|
|
1361
|
+
fill: var(--color-edge-label-bg);
|
|
1362
|
+
rx: var(--radius-sm);
|
|
1363
|
+
}
|
|
1364
|
+
|
|
1365
|
+
/* Animated flow for active edges */
|
|
1366
|
+
.react-flow__edge.animated .react-flow__edge-path {
|
|
1367
|
+
stroke-dasharray: 5;
|
|
1368
|
+
animation: dashdraw 0.5s linear infinite;
|
|
1369
|
+
}
|
|
1370
|
+
|
|
1371
|
+
@keyframes dashdraw {
|
|
1372
|
+
to { stroke-dashoffset: -10; }
|
|
1373
|
+
}
|
|
1374
|
+
```
|
|
1375
|
+
|
|
1376
|
+
### Graph Canvas & Background
|
|
1377
|
+
|
|
1378
|
+
```css
|
|
1379
|
+
.react-flow__renderer {
|
|
1380
|
+
background: var(--color-bg-elevated);
|
|
1381
|
+
}
|
|
1382
|
+
|
|
1383
|
+
/* Dot pattern background */
|
|
1384
|
+
.react-flow__background {
|
|
1385
|
+
background-color: var(--color-bg-elevated);
|
|
1386
|
+
background-image: radial-gradient(
|
|
1387
|
+
circle,
|
|
1388
|
+
var(--color-border-subtle) 1px,
|
|
1389
|
+
transparent 1px
|
|
1390
|
+
);
|
|
1391
|
+
background-size: 20px 20px;
|
|
1392
|
+
}
|
|
1393
|
+
|
|
1394
|
+
/* Alternative: Grid pattern */
|
|
1395
|
+
.react-flow__background.grid {
|
|
1396
|
+
background-image:
|
|
1397
|
+
linear-gradient(var(--color-border-subtle) 1px, transparent 1px),
|
|
1398
|
+
linear-gradient(90deg, var(--color-border-subtle) 1px, transparent 1px);
|
|
1399
|
+
background-size: 20px 20px;
|
|
1400
|
+
}
|
|
1401
|
+
```
|
|
1402
|
+
|
|
1403
|
+
### MiniMap Styling
|
|
1404
|
+
|
|
1405
|
+
```css
|
|
1406
|
+
.react-flow__minimap {
|
|
1407
|
+
background: var(--color-bg-surface);
|
|
1408
|
+
border: var(--border-default);
|
|
1409
|
+
border-radius: var(--radius-lg);
|
|
1410
|
+
box-shadow: var(--shadow-md);
|
|
1411
|
+
}
|
|
1412
|
+
|
|
1413
|
+
.react-flow__minimap-mask {
|
|
1414
|
+
fill: var(--color-primary-500);
|
|
1415
|
+
fill-opacity: 0.1;
|
|
1416
|
+
stroke: var(--color-primary-500);
|
|
1417
|
+
stroke-width: 2;
|
|
1418
|
+
}
|
|
1419
|
+
|
|
1420
|
+
.react-flow__minimap-node {
|
|
1421
|
+
fill: var(--color-bg-overlay);
|
|
1422
|
+
stroke: var(--color-border-default);
|
|
1423
|
+
stroke-width: 1;
|
|
1424
|
+
}
|
|
1425
|
+
```
|
|
1426
|
+
|
|
1427
|
+
### Controls & Panels
|
|
1428
|
+
|
|
1429
|
+
```css
|
|
1430
|
+
.react-flow__controls {
|
|
1431
|
+
background: var(--color-bg-surface);
|
|
1432
|
+
border: var(--border-subtle);
|
|
1433
|
+
border-radius: var(--radius-lg);
|
|
1434
|
+
box-shadow: var(--shadow-md);
|
|
1435
|
+
}
|
|
1436
|
+
|
|
1437
|
+
.react-flow__controls-button {
|
|
1438
|
+
background: transparent;
|
|
1439
|
+
border-bottom: var(--border-subtle);
|
|
1440
|
+
color: var(--color-text-secondary);
|
|
1441
|
+
transition: var(--transition-colors);
|
|
1442
|
+
}
|
|
1443
|
+
|
|
1444
|
+
.react-flow__controls-button:hover {
|
|
1445
|
+
background: var(--color-bg-overlay);
|
|
1446
|
+
color: var(--color-text-primary);
|
|
1447
|
+
}
|
|
1448
|
+
|
|
1449
|
+
.react-flow__controls-button:last-child {
|
|
1450
|
+
border-bottom: none;
|
|
1451
|
+
}
|
|
1452
|
+
```
|
|
1453
|
+
|
|
1454
|
+
---
|
|
1455
|
+
|
|
1456
|
+
## Usage Guidelines
|
|
1457
|
+
|
|
1458
|
+
### Color Usage
|
|
1459
|
+
|
|
1460
|
+
1. **Backgrounds**
|
|
1461
|
+
- Use `--color-bg-base` for app shell and canvas
|
|
1462
|
+
- Use `--color-bg-elevated` for main content areas
|
|
1463
|
+
- Use `--color-bg-surface` for cards and panels
|
|
1464
|
+
- Use `--color-bg-overlay` for modals and floating elements
|
|
1465
|
+
|
|
1466
|
+
2. **Text**
|
|
1467
|
+
- Use `--color-text-primary` for headings and important content
|
|
1468
|
+
- Use `--color-text-secondary` for body text and labels
|
|
1469
|
+
- Use `--color-text-tertiary` for captions and metadata
|
|
1470
|
+
- Use `--color-text-muted` for placeholders and disabled states
|
|
1471
|
+
|
|
1472
|
+
3. **Interactive Elements**
|
|
1473
|
+
- Use `--color-primary-*` for primary actions (CTAs, selections)
|
|
1474
|
+
- Use `--color-secondary-*` for secondary actions
|
|
1475
|
+
- Use semantic colors (`success`, `error`, `warning`, `info`) for status
|
|
1476
|
+
|
|
1477
|
+
4. **Borders**
|
|
1478
|
+
- Use `--color-border-subtle` for minimal separation
|
|
1479
|
+
- Use `--color-border-default` for standard borders
|
|
1480
|
+
- Use `--color-border-strong` for emphasized boundaries
|
|
1481
|
+
|
|
1482
|
+
### Typography Usage
|
|
1483
|
+
|
|
1484
|
+
1. **Hierarchy**
|
|
1485
|
+
- Use `h1` for page titles (rare, one per page)
|
|
1486
|
+
- Use `h2` for section headings
|
|
1487
|
+
- Use `h3` for subsection headings
|
|
1488
|
+
- Use `h4-h6` for nested content hierarchy
|
|
1489
|
+
|
|
1490
|
+
2. **Body Text**
|
|
1491
|
+
- Use `--font-size-body` (16px) for main content
|
|
1492
|
+
- Use `--font-size-body-sm` (14px) for UI elements
|
|
1493
|
+
- Use `--font-size-caption` (12px) for metadata
|
|
1494
|
+
|
|
1495
|
+
3. **Monospace**
|
|
1496
|
+
- Use for code blocks, file paths, technical data
|
|
1497
|
+
- Maintain readability with adequate line-height
|
|
1498
|
+
|
|
1499
|
+
### Spacing Usage
|
|
1500
|
+
|
|
1501
|
+
1. **Component Spacing**
|
|
1502
|
+
- Use `--space-component-*` tokens for padding within components
|
|
1503
|
+
- Maintain consistent internal rhythm
|
|
1504
|
+
|
|
1505
|
+
2. **Layout Spacing**
|
|
1506
|
+
- Use `--space-layout-*` tokens for margins between sections
|
|
1507
|
+
- Larger spacing creates stronger separation
|
|
1508
|
+
|
|
1509
|
+
3. **Gap Spacing**
|
|
1510
|
+
- Use `--gap-*` tokens for flexbox/grid gaps
|
|
1511
|
+
- Smaller gaps for related items, larger for distinct groups
|
|
1512
|
+
|
|
1513
|
+
### Accessibility Best Practices
|
|
1514
|
+
|
|
1515
|
+
1. **Color Contrast**
|
|
1516
|
+
- All text meets WCAG AA standards (4.5:1 minimum)
|
|
1517
|
+
- Interactive elements have 3:1 contrast with background
|
|
1518
|
+
|
|
1519
|
+
2. **Focus States**
|
|
1520
|
+
- Always provide visible focus indicators
|
|
1521
|
+
- Use `--shadow-glow-*` for focus shadows
|
|
1522
|
+
- Never remove outlines without replacement
|
|
1523
|
+
|
|
1524
|
+
3. **Motion**
|
|
1525
|
+
- Respect `prefers-reduced-motion` media query
|
|
1526
|
+
- Keep animations purposeful and brief
|
|
1527
|
+
- Avoid flashing or rapid motion
|
|
1528
|
+
|
|
1529
|
+
4. **Touch Targets**
|
|
1530
|
+
- Minimum 44x44px for interactive elements
|
|
1531
|
+
- Provide adequate spacing between touch targets
|
|
1532
|
+
|
|
1533
|
+
5. **Semantic HTML**
|
|
1534
|
+
- Use proper heading hierarchy
|
|
1535
|
+
- Use buttons for actions, links for navigation
|
|
1536
|
+
- Provide ARIA labels where needed
|
|
1537
|
+
|
|
1538
|
+
---
|
|
1539
|
+
|
|
1540
|
+
## Code Examples
|
|
1541
|
+
|
|
1542
|
+
### Setting Up CSS Variables
|
|
1543
|
+
|
|
1544
|
+
```css
|
|
1545
|
+
/* styles/tokens.css */
|
|
1546
|
+
:root {
|
|
1547
|
+
/* Import all design tokens */
|
|
1548
|
+
|
|
1549
|
+
/* Colors */
|
|
1550
|
+
--color-bg-base: #0a0a0b;
|
|
1551
|
+
--color-bg-elevated: #121214;
|
|
1552
|
+
--color-bg-surface: #1a1a1e;
|
|
1553
|
+
|
|
1554
|
+
--color-text-primary: #f8fafc;
|
|
1555
|
+
--color-text-secondary: #cbd5e1;
|
|
1556
|
+
|
|
1557
|
+
--color-primary-500: #6366f1;
|
|
1558
|
+
--color-primary-600: #4f46e5;
|
|
1559
|
+
|
|
1560
|
+
/* ... all other tokens ... */
|
|
1561
|
+
|
|
1562
|
+
/* Typography */
|
|
1563
|
+
--font-family-sans: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
|
|
1564
|
+
--font-size-body: 16px;
|
|
1565
|
+
--font-weight-regular: 400;
|
|
1566
|
+
--line-height-normal: 1.5;
|
|
1567
|
+
|
|
1568
|
+
/* Spacing */
|
|
1569
|
+
--spacing-2: 8px;
|
|
1570
|
+
--spacing-4: 16px;
|
|
1571
|
+
--spacing-6: 24px;
|
|
1572
|
+
|
|
1573
|
+
/* Shadows */
|
|
1574
|
+
--shadow-sm: 0 2px 4px -1px rgba(0, 0, 0, 0.5);
|
|
1575
|
+
--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.6);
|
|
1576
|
+
|
|
1577
|
+
/* Transitions */
|
|
1578
|
+
--duration-fast: 100ms;
|
|
1579
|
+
--duration-normal: 200ms;
|
|
1580
|
+
--ease-smooth: cubic-bezier(0.4, 0, 0.6, 1);
|
|
1581
|
+
}
|
|
1582
|
+
```
|
|
1583
|
+
|
|
1584
|
+
### Applying to Components (React/TypeScript)
|
|
1585
|
+
|
|
1586
|
+
```typescript
|
|
1587
|
+
// components/Button.tsx
|
|
1588
|
+
import React from 'react';
|
|
1589
|
+
import './Button.css';
|
|
1590
|
+
|
|
1591
|
+
interface ButtonProps {
|
|
1592
|
+
variant?: 'primary' | 'secondary' | 'ghost' | 'danger';
|
|
1593
|
+
size?: 'sm' | 'md' | 'lg';
|
|
1594
|
+
children: React.ReactNode;
|
|
1595
|
+
onClick?: () => void;
|
|
1596
|
+
disabled?: boolean;
|
|
1597
|
+
}
|
|
1598
|
+
|
|
1599
|
+
export const Button: React.FC<ButtonProps> = ({
|
|
1600
|
+
variant = 'primary',
|
|
1601
|
+
size = 'md',
|
|
1602
|
+
children,
|
|
1603
|
+
onClick,
|
|
1604
|
+
disabled,
|
|
1605
|
+
}) => {
|
|
1606
|
+
return (
|
|
1607
|
+
<button
|
|
1608
|
+
className={`button button-${variant} button-${size}`}
|
|
1609
|
+
onClick={onClick}
|
|
1610
|
+
disabled={disabled}
|
|
1611
|
+
>
|
|
1612
|
+
{children}
|
|
1613
|
+
</button>
|
|
1614
|
+
);
|
|
1615
|
+
};
|
|
1616
|
+
```
|
|
1617
|
+
|
|
1618
|
+
```css
|
|
1619
|
+
/* components/Button.css */
|
|
1620
|
+
.button {
|
|
1621
|
+
/* Base styles using design tokens */
|
|
1622
|
+
font-family: var(--font-family-sans);
|
|
1623
|
+
font-weight: var(--font-weight-semibold);
|
|
1624
|
+
border-radius: var(--radius-md);
|
|
1625
|
+
border: none;
|
|
1626
|
+
cursor: pointer;
|
|
1627
|
+
transition: var(--transition-colors), var(--transition-shadow);
|
|
1628
|
+
|
|
1629
|
+
/* Prevent text selection */
|
|
1630
|
+
user-select: none;
|
|
1631
|
+
}
|
|
1632
|
+
|
|
1633
|
+
/* Size variants */
|
|
1634
|
+
.button-sm {
|
|
1635
|
+
padding: var(--spacing-1-5) var(--spacing-3);
|
|
1636
|
+
font-size: var(--font-size-caption);
|
|
1637
|
+
}
|
|
1638
|
+
|
|
1639
|
+
.button-md {
|
|
1640
|
+
padding: var(--space-component-sm) var(--space-component-lg);
|
|
1641
|
+
font-size: var(--font-size-body-sm);
|
|
1642
|
+
}
|
|
1643
|
+
|
|
1644
|
+
.button-lg {
|
|
1645
|
+
padding: var(--space-component-md) var(--space-component-xl);
|
|
1646
|
+
font-size: var(--font-size-body);
|
|
1647
|
+
}
|
|
1648
|
+
|
|
1649
|
+
/* Variant styles */
|
|
1650
|
+
.button-primary {
|
|
1651
|
+
background: var(--color-primary-500);
|
|
1652
|
+
color: var(--color-text-on-primary);
|
|
1653
|
+
box-shadow: var(--shadow-sm);
|
|
1654
|
+
}
|
|
1655
|
+
|
|
1656
|
+
.button-primary:hover:not(:disabled) {
|
|
1657
|
+
background: var(--color-primary-600);
|
|
1658
|
+
box-shadow: var(--shadow-md);
|
|
1659
|
+
}
|
|
1660
|
+
|
|
1661
|
+
.button-primary:active:not(:disabled) {
|
|
1662
|
+
background: var(--color-primary-700);
|
|
1663
|
+
transform: translateY(1px);
|
|
1664
|
+
}
|
|
1665
|
+
|
|
1666
|
+
.button-primary:focus-visible {
|
|
1667
|
+
outline: none;
|
|
1668
|
+
box-shadow: var(--shadow-glow-primary);
|
|
1669
|
+
}
|
|
1670
|
+
|
|
1671
|
+
.button:disabled {
|
|
1672
|
+
opacity: 0.5;
|
|
1673
|
+
cursor: not-allowed;
|
|
1674
|
+
}
|
|
1675
|
+
```
|
|
1676
|
+
|
|
1677
|
+
### Using with Inline Styles (Current Approach)
|
|
1678
|
+
|
|
1679
|
+
```typescript
|
|
1680
|
+
// For components that currently use inline styles
|
|
1681
|
+
const AgentNode: React.FC<NodeProps> = ({ data, selected }) => {
|
|
1682
|
+
return (
|
|
1683
|
+
<div
|
|
1684
|
+
style={{
|
|
1685
|
+
// Use CSS variables in inline styles
|
|
1686
|
+
padding: 'var(--space-component-md)',
|
|
1687
|
+
border: `var(--border-width-2) solid ${
|
|
1688
|
+
selected
|
|
1689
|
+
? 'var(--color-node-agent-border-selected)'
|
|
1690
|
+
: 'var(--color-node-agent-border)'
|
|
1691
|
+
}`,
|
|
1692
|
+
borderRadius: 'var(--radius-lg)',
|
|
1693
|
+
backgroundColor: 'var(--color-node-agent-bg)',
|
|
1694
|
+
minWidth: '180px',
|
|
1695
|
+
boxShadow: selected
|
|
1696
|
+
? 'var(--shadow-lg)'
|
|
1697
|
+
: 'var(--shadow-sm)',
|
|
1698
|
+
cursor: 'pointer',
|
|
1699
|
+
transition: 'var(--transition-shadow), var(--transition-colors)',
|
|
1700
|
+
}}
|
|
1701
|
+
>
|
|
1702
|
+
{/* Content */}
|
|
1703
|
+
</div>
|
|
1704
|
+
);
|
|
1705
|
+
};
|
|
1706
|
+
```
|
|
1707
|
+
|
|
1708
|
+
### Graph Component Example
|
|
1709
|
+
|
|
1710
|
+
```typescript
|
|
1711
|
+
// components/graph/GraphCanvas.tsx
|
|
1712
|
+
import { ReactFlow, Background, Controls, MiniMap } from '@xyflow/react';
|
|
1713
|
+
import '@xyflow/react/dist/style.css';
|
|
1714
|
+
import './GraphCanvas.css';
|
|
1715
|
+
|
|
1716
|
+
export const GraphCanvas = () => {
|
|
1717
|
+
return (
|
|
1718
|
+
<div className="graph-container">
|
|
1719
|
+
<ReactFlow
|
|
1720
|
+
/* ... props ... */
|
|
1721
|
+
>
|
|
1722
|
+
<Background
|
|
1723
|
+
variant="dots"
|
|
1724
|
+
gap={20}
|
|
1725
|
+
size={1}
|
|
1726
|
+
color="var(--color-border-subtle)"
|
|
1727
|
+
/>
|
|
1728
|
+
<Controls />
|
|
1729
|
+
<MiniMap
|
|
1730
|
+
nodeColor={(node) => {
|
|
1731
|
+
if (node.type === 'agent') return 'var(--color-node-agent-border)';
|
|
1732
|
+
if (node.type === 'message') return 'var(--color-node-message-border)';
|
|
1733
|
+
return 'var(--color-border-default)';
|
|
1734
|
+
}}
|
|
1735
|
+
/>
|
|
1736
|
+
</ReactFlow>
|
|
1737
|
+
</div>
|
|
1738
|
+
);
|
|
1739
|
+
};
|
|
1740
|
+
```
|
|
1741
|
+
|
|
1742
|
+
```css
|
|
1743
|
+
/* components/graph/GraphCanvas.css */
|
|
1744
|
+
.graph-container {
|
|
1745
|
+
width: 100%;
|
|
1746
|
+
height: 100%;
|
|
1747
|
+
background: var(--color-bg-elevated);
|
|
1748
|
+
}
|
|
1749
|
+
|
|
1750
|
+
/* Override ReactFlow defaults with our design tokens */
|
|
1751
|
+
.react-flow {
|
|
1752
|
+
background: var(--color-bg-elevated);
|
|
1753
|
+
}
|
|
1754
|
+
|
|
1755
|
+
.react-flow__node {
|
|
1756
|
+
font-family: var(--font-family-sans);
|
|
1757
|
+
}
|
|
1758
|
+
|
|
1759
|
+
.react-flow__edge-path {
|
|
1760
|
+
stroke: var(--color-edge-default);
|
|
1761
|
+
stroke-width: 2;
|
|
1762
|
+
transition: stroke var(--duration-fast) var(--ease-smooth);
|
|
1763
|
+
}
|
|
1764
|
+
|
|
1765
|
+
.react-flow__edge:hover .react-flow__edge-path {
|
|
1766
|
+
stroke: var(--color-edge-active);
|
|
1767
|
+
}
|
|
1768
|
+
|
|
1769
|
+
.react-flow__handle {
|
|
1770
|
+
width: 8px;
|
|
1771
|
+
height: 8px;
|
|
1772
|
+
background: var(--color-primary-500);
|
|
1773
|
+
border: 2px solid var(--color-bg-elevated);
|
|
1774
|
+
}
|
|
1775
|
+
|
|
1776
|
+
.react-flow__handle:hover {
|
|
1777
|
+
background: var(--color-primary-400);
|
|
1778
|
+
}
|
|
1779
|
+
```
|
|
1780
|
+
|
|
1781
|
+
### Modal Example with Glassmorphism
|
|
1782
|
+
|
|
1783
|
+
```typescript
|
|
1784
|
+
// components/Modal.tsx
|
|
1785
|
+
import React from 'react';
|
|
1786
|
+
import './Modal.css';
|
|
1787
|
+
|
|
1788
|
+
interface ModalProps {
|
|
1789
|
+
isOpen: boolean;
|
|
1790
|
+
onClose: () => void;
|
|
1791
|
+
title: string;
|
|
1792
|
+
children: React.ReactNode;
|
|
1793
|
+
}
|
|
1794
|
+
|
|
1795
|
+
export const Modal: React.FC<ModalProps> = ({
|
|
1796
|
+
isOpen,
|
|
1797
|
+
onClose,
|
|
1798
|
+
title,
|
|
1799
|
+
children
|
|
1800
|
+
}) => {
|
|
1801
|
+
if (!isOpen) return null;
|
|
1802
|
+
|
|
1803
|
+
return (
|
|
1804
|
+
<div className="modal-backdrop" onClick={onClose}>
|
|
1805
|
+
<div className="modal" onClick={(e) => e.stopPropagation()}>
|
|
1806
|
+
<div className="modal-header">
|
|
1807
|
+
<h3 className="modal-title">{title}</h3>
|
|
1808
|
+
<button className="modal-close" onClick={onClose}>
|
|
1809
|
+
×
|
|
1810
|
+
</button>
|
|
1811
|
+
</div>
|
|
1812
|
+
<div className="modal-body">
|
|
1813
|
+
{children}
|
|
1814
|
+
</div>
|
|
1815
|
+
</div>
|
|
1816
|
+
</div>
|
|
1817
|
+
);
|
|
1818
|
+
};
|
|
1819
|
+
```
|
|
1820
|
+
|
|
1821
|
+
```css
|
|
1822
|
+
/* components/Modal.css */
|
|
1823
|
+
.modal-backdrop {
|
|
1824
|
+
position: fixed;
|
|
1825
|
+
inset: 0;
|
|
1826
|
+
background: var(--color-modal-backdrop);
|
|
1827
|
+
backdrop-filter: blur(4px);
|
|
1828
|
+
display: flex;
|
|
1829
|
+
align-items: center;
|
|
1830
|
+
justify-content: center;
|
|
1831
|
+
z-index: 1000;
|
|
1832
|
+
animation: fadeIn var(--duration-normal) var(--ease-out);
|
|
1833
|
+
}
|
|
1834
|
+
|
|
1835
|
+
.modal {
|
|
1836
|
+
width: 90%;
|
|
1837
|
+
max-width: 600px;
|
|
1838
|
+
max-height: 80vh;
|
|
1839
|
+
padding: var(--space-layout-md);
|
|
1840
|
+
border-radius: var(--radius-xl);
|
|
1841
|
+
|
|
1842
|
+
/* Glassmorphism effect */
|
|
1843
|
+
background: var(--color-glass-bg);
|
|
1844
|
+
border: var(--border-width-1) solid var(--color-glass-border);
|
|
1845
|
+
backdrop-filter: blur(16px);
|
|
1846
|
+
-webkit-backdrop-filter: blur(16px);
|
|
1847
|
+
|
|
1848
|
+
box-shadow: var(--shadow-2xl);
|
|
1849
|
+
animation: scaleIn var(--duration-slow) var(--ease-smooth);
|
|
1850
|
+
}
|
|
1851
|
+
|
|
1852
|
+
.modal-header {
|
|
1853
|
+
display: flex;
|
|
1854
|
+
align-items: center;
|
|
1855
|
+
justify-content: space-between;
|
|
1856
|
+
padding-bottom: var(--space-component-lg);
|
|
1857
|
+
margin-bottom: var(--space-component-lg);
|
|
1858
|
+
border-bottom: var(--border-width-1) solid var(--color-divider);
|
|
1859
|
+
}
|
|
1860
|
+
|
|
1861
|
+
.modal-title {
|
|
1862
|
+
font-size: var(--font-size-h3);
|
|
1863
|
+
font-weight: var(--font-weight-semibold);
|
|
1864
|
+
color: var(--color-text-primary);
|
|
1865
|
+
margin: 0;
|
|
1866
|
+
}
|
|
1867
|
+
|
|
1868
|
+
.modal-close {
|
|
1869
|
+
background: transparent;
|
|
1870
|
+
border: none;
|
|
1871
|
+
color: var(--color-text-secondary);
|
|
1872
|
+
font-size: var(--font-size-h2);
|
|
1873
|
+
cursor: pointer;
|
|
1874
|
+
padding: var(--spacing-1);
|
|
1875
|
+
line-height: 1;
|
|
1876
|
+
transition: var(--transition-colors);
|
|
1877
|
+
}
|
|
1878
|
+
|
|
1879
|
+
.modal-close:hover {
|
|
1880
|
+
color: var(--color-error);
|
|
1881
|
+
}
|
|
1882
|
+
|
|
1883
|
+
.modal-body {
|
|
1884
|
+
overflow-y: auto;
|
|
1885
|
+
max-height: calc(80vh - 120px);
|
|
1886
|
+
color: var(--color-text-secondary);
|
|
1887
|
+
}
|
|
1888
|
+
|
|
1889
|
+
@keyframes fadeIn {
|
|
1890
|
+
from { opacity: 0; }
|
|
1891
|
+
to { opacity: 1; }
|
|
1892
|
+
}
|
|
1893
|
+
|
|
1894
|
+
@keyframes scaleIn {
|
|
1895
|
+
from {
|
|
1896
|
+
opacity: 0;
|
|
1897
|
+
transform: scale(0.95);
|
|
1898
|
+
}
|
|
1899
|
+
to {
|
|
1900
|
+
opacity: 1;
|
|
1901
|
+
transform: scale(1);
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
```
|
|
1905
|
+
|
|
1906
|
+
---
|
|
1907
|
+
|
|
1908
|
+
## Implementation Roadmap
|
|
1909
|
+
|
|
1910
|
+
### Phase 1: Foundation Setup
|
|
1911
|
+
1. Create `styles/tokens.css` with all CSS variables
|
|
1912
|
+
2. Import tokens in main `index.css`
|
|
1913
|
+
3. Add web font imports to `index.html`
|
|
1914
|
+
4. Set up base styles (body, headings, etc.)
|
|
1915
|
+
|
|
1916
|
+
### Phase 2: Component Conversion
|
|
1917
|
+
1. Convert existing inline styles to use CSS variables
|
|
1918
|
+
2. Create reusable component CSS classes
|
|
1919
|
+
3. Update AgentNode and MessageNode components
|
|
1920
|
+
4. Update DetailWindow and modal components
|
|
1921
|
+
|
|
1922
|
+
### Phase 3: Graph Styling
|
|
1923
|
+
1. Apply design tokens to ReactFlow components
|
|
1924
|
+
2. Implement node hover and selection states
|
|
1925
|
+
3. Style edges with consistent colors
|
|
1926
|
+
4. Update MiniMap and Controls
|
|
1927
|
+
|
|
1928
|
+
### Phase 4: Polish & Refinement
|
|
1929
|
+
1. Add smooth transitions and animations
|
|
1930
|
+
2. Implement glassmorphism effects
|
|
1931
|
+
3. Test accessibility compliance
|
|
1932
|
+
4. Optimize for performance
|
|
1933
|
+
5. Create component documentation
|
|
1934
|
+
|
|
1935
|
+
---
|
|
1936
|
+
|
|
1937
|
+
## Design System Maintenance
|
|
1938
|
+
|
|
1939
|
+
### Version Control
|
|
1940
|
+
- Document all changes to design tokens
|
|
1941
|
+
- Maintain backwards compatibility where possible
|
|
1942
|
+
- Use semantic versioning for major changes
|
|
1943
|
+
|
|
1944
|
+
### Adding New Tokens
|
|
1945
|
+
1. Follow existing naming conventions
|
|
1946
|
+
2. Update this documentation
|
|
1947
|
+
3. Test across all components
|
|
1948
|
+
4. Consider accessibility implications
|
|
1949
|
+
|
|
1950
|
+
### Deprecating Tokens
|
|
1951
|
+
1. Mark as deprecated in documentation
|
|
1952
|
+
2. Provide migration path
|
|
1953
|
+
3. Maintain for at least one major version
|
|
1954
|
+
4. Remove with clear announcement
|
|
1955
|
+
|
|
1956
|
+
---
|
|
1957
|
+
|
|
1958
|
+
## Resources & References
|
|
1959
|
+
|
|
1960
|
+
### Inspiration Sources
|
|
1961
|
+
- **AutoGen Studio**: Clean, developer-focused UI with excellent information hierarchy
|
|
1962
|
+
- **Flowise AI**: Modern flow-based design with strong visual feedback
|
|
1963
|
+
- **VS Code Dark+**: Premium dark theme with great contrast ratios
|
|
1964
|
+
- **Vercel Design**: Minimalist, high-contrast, excellent typography
|
|
1965
|
+
|
|
1966
|
+
### Design Tools
|
|
1967
|
+
- **Figma**: For design mockups and prototypes
|
|
1968
|
+
- **Contrast Checker**: WebAIM for accessibility validation
|
|
1969
|
+
- **Color Palette Generator**: Coolors.co, Adobe Color
|
|
1970
|
+
|
|
1971
|
+
### Web Standards
|
|
1972
|
+
- **WCAG 2.1 AA**: Accessibility guidelines
|
|
1973
|
+
- **Web Content Accessibility Guidelines**: https://www.w3.org/WAI/WCAG21/quickref/
|
|
1974
|
+
- **MDN Web Docs**: CSS reference and best practices
|
|
1975
|
+
|
|
1976
|
+
---
|
|
1977
|
+
|
|
1978
|
+
**End of Design System Specification v1.0.0**
|
|
1979
|
+
|
|
1980
|
+
*This design system is a living document. Contributions, feedback, and improvements are welcome.*
|