# Chapters 31–43 ## T31a Project · Tasks — `src/project` - [x] PriorityIndicator - [x] IssueIdBadge - [x] StatusSelect - [x] AssigneePicker - [x] DueDatePicker → `forms::DatePicker` - [x] TaskItem — check, priority, due date, assignee - [x] TaskList - [x] SubtaskList → `documents::Checklist`, which gains a field to add one ## T31b Project · Issues and boards - [x] IssueCard - [x] LabelManager - [x] KanbanBoard / KanbanColumn / KanbanCard - [x] Sprint Board → `project::KanbanBoard` - [x] TaskDetailPanel ## T31c Project · Plans - [x] GanttChart / TimelineView → `charts::GanttChart` - [x] Roadmap - [x] Burndown Chart → `charts::BurndownChart`, on the charts' scales and paint - [x] MilestoneProgress - [x] WorkloadView ## T31d Project · Time and databases - [x] TimeTracker - [x] Pomodoro Timer - [x] DatabaseView (from T21c) — table, board, gallery, calendar, timeline ## T32a Canvas · Plane — `src/canvas` - [x] InfiniteCanvas - [x] CanvasGrid / Guides - [x] Ruler - [x] ZoomControls / ZoomIndicator - [x] MiniMap - [x] ArtboardFrame ## T32b Canvas · Tools - [x] SelectionBox - [x] TransformHandles - [x] SnapIndicator - [x] ToolPalette - [x] ShapeTools — rect, ellipse, polygon, line, arrow - [x] PenTool / PathEditor - [x] TextTool - [x] BrushTool / BrushSettings - [x] HistoryPanel ## T32c Canvas · Panels - [x] LayerPanel - [x] AssetPanel - [x] InspectorPanel - [x] AlignmentToolbar - [x] ColorPanel - [x] GradientPanel → `forms::GradientEditor` - [x] ShadowEditor - [x] BorderEditor - [x] TypographyPanel - [x] ConstraintsEditor - [x] AutoLayoutControls - [x] ExportPanel ## T32d Canvas · Graphs and boards - [x] NodeEditor / NodeGraph - [x] Node / Port / Edge / Connection - [x] FlowChart / DiagramEditor - [x] MindMap - [x] Whiteboard - [x] StickyNote - [x] Connector Line ## T33a DB & Dev Tools · Databases — `src/devtools` - [x] ConnectionManager - [x] ConnectionForm - [x] SchemaTree - [x] QueryEditor → `editor::CodeEditor` - [x] QueryResultGrid → `tables::DataGrid` - [x] QueryHistory - [x] QueryPlanViewer - [x] TableStructureEditor - [x] ERDiagram - [x] IndexManager - [x] RedisKeyBrowser ## T33b DB & Dev Tools · Data formats - [x] DocumentViewer (MongoDB / JSON) → `devtools::JsonViewer` - [x] JsonViewer / JsonTree - [x] JsonEditor - [x] YamlViewer - [x] XmlViewer ## T33c DB & Dev Tools · APIs - [x] ApiRequestBuilder - [x] ResponseViewer - [x] HeadersTable - [x] QueryParamsEditor → `forms::KeyValueInput` - [x] EnvironmentSelector - [x] CollectionTree - [x] WebSocketConsole - [x] GraphQLExplorer ## T33d DB & Dev Tools · Tools and machines - [x] RegexTester - [x] Base64 / Encoder - [x] ColorContrastChecker - [x] ContainerList - [x] PodList - [x] ResourceMonitor ## T34 Dashboard — `src/dashboard` - [x] Dashboard Grid - [x] Widget / DashboardCard - [x] StatCard → `data_display::Statistic` - [x] MetricsChart → `charts::LineChart` - [x] AlertList - [x] IncidentCard - [x] UptimeBar - [x] ServiceStatus - [x] HealthCheck Indicator - [x] LogStream → `terminal::LogViewer` - [x] TraceWaterfall → `debug::TimelineProfiler` - [x] EventStream - [x] ResourceGauge → `data_display::Gauge` - [x] SystemMonitor → `devtools::ResourceMonitor` - [x] ProcessTable → `terminal::ProcessList` - [x] NetworkGraph (throughput) → `charts::RealtimeChart` - [x] MapView / GeoHeatmap → `maps::MapView`, `maps::GeoHeatmap` (T41a, T41b) - [x] WorldMap → `maps::WorldMap` (T41c) - [x] RefreshIntervalSelector - [x] DashboardFilterBar ## T35 Settings — `src/settings` - [x] SettingsLayout - [x] SettingsSection - [x] SettingsRow - [x] SettingsSearch - [x] ThemeSelector (T39's ThemeSwitcher points here) - [x] AccentColorPicker - [x] FontSizeControl - [x] FontFamilySelect → `forms::FontPicker` - [x] DensitySelector - [x] LanguageSelector → `forms::Combobox::languages` (T06f) - [x] KeyboardShortcutsList - [x] ShortcutEditor → `editor::KeybindingsEditor` - [x] ProxySettings - [x] StorageSettings / CacheClear - [x] PrivacySettings - [x] NotificationSettings - [x] StartupSettings - [x] ImportExportSettings - [x] ResetToDefault - [x] AdvancedSettings / FeatureFlags - [x] DeveloperMode Toggle ## T36a Account · Sign in — `src/account` - [x] LoginForm - [x] SignupForm - [x] OAuthButtons - [x] MagicLinkForm - [x] TwoFactorInput - [x] ForgotPassword ## T36b Account · Profile and access - [x] ProfileCard - [x] ProfileEditor - [x] AccountSwitcher - [x] WorkspaceSwitcher / OrgSwitcher - [x] UserMenu - [x] SessionList - [x] ApiKeyManager ## T36c Account · Billing and team - [x] SubscriptionCard / PlanBadge - [x] UsageQuota - [x] BillingHistory - [x] PaymentMethodForm - [x] UpgradePrompt / Paywall - [x] TeamMemberTable - [x] RoleSelector - [x] InvitationList ## T37a Onboarding · Flows and highlights — `src/onboarding` - [x] OnboardingWizard — on `navigation::Wizard` without its numbered steps - [x] WelcomeTour → `overlays::Tour` (T09b) - [x] Coachmark / Hotspot — Coachmark → `overlays::Spotlight`; Hotspot here - [x] FeatureHighlight / NewBadge — NewBadge → `data_display::Badge` with `Tone::Accent`, which FeatureHighlight wears - [x] Checklist (first-run tasks) → `onboarding::SetupChecklist`; a to-do list ticked by hand is `documents::Checklist` ## T37b Onboarding · Help - [x] HelpTooltip → `primitives::HelpTooltip`, the mark FormLabel's help shows - [x] HelpPanel / DocsSidebar - [x] KeyboardShortcutCheatsheet — `settings::KeyboardShortcutsList` in an `overlays::Dialog` - [x] WhatsNewDialog — `data_display::Changelog` in an `overlays::Dialog` - [x] FeedbackWidget - [x] ContactSupport - [x] InlineHelp - [x] EmptyStateWithAction → `feedback::EmptyState`, whose `action` adds its buttons ## T38a Interaction · Pointer — `src/interaction` - [x] Draggable — native `on_drag` - [x] Droppable / DropTarget — native `on_drop`, `drag_over`, `can_drop` - [x] DragOverlay / DragPreview — native drag view - [x] DragGhost → DragPreview (native) - [x] Sortable / SortableContext → `motion::Reorder` - [x] Resizable - [x] Rotatable — an svg: gpui 0.2.2 turns no other element - [x] Selectable / SelectionArea - [x] RubberBandSelection → `interaction::SelectionArea` - [x] LongPress → `primitives::Pressable` - [x] DoubleClick — native `ClickEvent::click_count` - [x] Gesture — prove: wheel zoom through `layout::Viewport`, two-finger swipe through `lists::SwipeableListItem`; pinch blocked, gpui 0.2.2 forwards no magnify event - [x] PanZoom → `layout::Viewport` ## T38b Interaction · Keys, scroll and focus - [x] Hotkeys / KeyBinding — native `actions!`, `bind_keys`, `key_context` - [x] KeyChord — native multi-keystroke bindings; `window.pending_input_keystrokes()` shows the first stroke - [x] Undo / Redo Manager → `forms::History`, made public - [x] InfiniteScroll Trigger → `lists::InfiniteList` - [x] VirtualScroller — native `list()` / `uniform_list()` - [x] ScrollSync - [x] Autofocus — native `window.focus()` - [x] RovingTabIndex → `interaction::RovingFocus` - [x] TypeAhead → `lists::SelectableList`, whose letters move its cursor - [x] FocusVisible → `primitives::FocusRing` ## T39a Theme · Editing — `src/theme` - [x] ThemeProvider (T00) - [x] ThemeSwitcher → `settings::ThemeSelector` (T35) - [x] ColorTokens / DesignTokens (T00) - [x] ThemeEditor → `settings::ThemeEditor`; `Theme::set_palette` takes the owner's colors per mode - [x] DensityProvider (T00) — `Theme::density`, laid open in `settings::ThemeEditor` - [x] RadiusProvider (T00) — `Theme::radius_scale`, laid open in `settings::ThemeEditor` - [x] FontProvider (T00) — `Theme::font_scale`, laid open in `settings::ThemeEditor` - [x] HighContrastMode (T00) — `Theme::set_high_contrast`, laid open in `settings::ThemeEditor` - [x] ReducedMotionProvider (T00) — `Theme::reduced_motion`, laid open in `settings::ThemeEditor` - [x] Elevation / Shadow (T00) ## T39b Theme · Importing - [x] ThemeImporter — VS Code theme JSON → `settings::ThemeImporter` on `settings::read_vscode_theme` - [x] SyntaxThemes → `theme::syntax_themes`, chosen through `settings::SyntaxThemePicker` ## T39c Theme · Platform - [x] IconThemeProvider → `primitives::IconTheme`, an owner's rules by name and extension over `file_icon` - [x] Platform Style → `theme::Platform`, the theme's `platform`: the window buttons Ely draws, the title bar, key caps - [x] VibrancyBackground / Acrylic → `shell::Vibrancy` in a window opened `WindowBackgroundAppearance::Blurred` - [ ] Mica — blocked: gpui 0.2.2's one blur, `Blurred`, is acrylic on Windows ## T40a i18n — `src/i18n` - [x] I18nProvider → `i18n::I18n`, a gpui global: the shown locale and one catalog per locale - [x] Trans / LocalizedText → `I18n::text`, a message with its `{name}` arguments filled - [x] LocaleNumber / LocaleDate → `Locale::number` and `Locale::date`, CLDR's separators, right-to-left sign and short dates - [x] RTL layout — proven: `Direction::row` mirrors a stack and `Direction::align` sets its text's side; a right-to-left line stays one `Ellipsis`, since gpui wraps glyphs in drawn order; Ely's other components stay left to right ## T40b a11y — `src/i18n` - [ ] LiveRegion / Announcer — blocked: gpui 0.2.2 has no accessibility tree; AppKit's announcement request needs none, but no process here is trusted to observe VoiceOver take it - [x] SkipLink → `i18n::SkipLink`: a Tab stop in flow that shows only while focused, raised over the page, and hands focus to its target - [ ] AccessibleIcon — blocked: no accessibility tree - [ ] AriaLabel helper — blocked: no accessibility tree - [x] KeyboardNavigationHelper → `interaction::RovingFocus` - [ ] ScreenReaderOnly — blocked: no accessibility tree - [x] ColorBlindSafe Palette → `Theme::set_color_blind_safe`: chart hues fitted to stay apart under Machado's simulated protanopia, deuteranopia and tritanopia, each 3:1 on its page ## T41a Maps · View — `src/maps` - [x] MapView — host tiles → `maps::MapView`: the host's tile for each zoom, column and row, the nearest cut scaled past its zooms; a drag, the wheel or the arrows pan, Command-wheel, + and - or its buttons zoom - [x] MapMarker → `maps::MapMarker`, a pin keyed by its place's name, a Tab stop and pressable while in view when the map hears it; a focused pin keeps focus as it leaves the view - [x] MapPopup → `maps::MapPopup`, over or under its point toward the larger half, held inside the map, its body scrolling past the room; it takes focus when it shows and hands it back when it goes - [x] LocationPicker → `maps::LocationPicker`, the place under a center crosshair - [x] CoordinateDisplay → `maps::CoordinateDisplay`, degrees or degrees, minutes and seconds, copyable ## T41b Maps · Layers - [x] MapCluster → `MapView::cluster_markers`: pins gathered by squares of the world, so a pan keeps each group; a cluster's press shows its members whole - [x] RouteLine → `maps::RouteLine`, a layer that crosses the date line the short way - [x] GeoJSON Layer → `maps::read_geojson` reads RFC 7946 to features; `maps::GeoJsonLayer` washes areas with their holes open, strokes lines, dots points - [x] GeoHeatmap (from T34) → `maps::GeoHeatmap`, weighted places as heat scaled to the densest spot in view ## T41c Maps · World - [x] ChoroplethMap → `maps::ChoroplethMap` on a `ChoroplethLayer`: areas washed by value on one hue's scale, keyed by id or a property, with a legend; an area without a value reads as no data, a value without an area is logged once - [x] WorldMap (from T34) → `maps::WorldMap`, Natural Earth's 110m countries bundled and washed by ISO 3166 alpha-2 code; a key that is no code fails ## T42a Misc · Time — `src/misc` - [x] Clock / WorldClock → `misc::Clock`, a face over its digits ticking each second; `misc::WorldClock`, places in rows by day and offset against home - [x] Stopwatch → `misc::Stopwatch`, on the executor's clock: Start or Pause on one button, Lap on another that reads Reset once paused, laps newest first ## T42b Misc · Numbers - [x] Calculator → `misc::Calculator`: digits, the four operations in precedence through `forms::evaluate`, sign, delete and clear; a result goes on at its whole value and shows twelve significant digits; keys type too, and Enter gives the result while the calculator itself has focus - [x] UnitConverter → `misc::UnitConverter`: length, area, volume, mass, temperature, speed and data, each on a starting pair, with a swap; six significant digits, wrapped when long ## T42c Misc · Codes and checks - [x] QRCodeScanner — proven: `rqrr` 0.11 reads the host's frames off the main thread → `misc::QrCodeScanner`, a camera's view with a square to aim at; each code goes to the owner once - [x] BarcodeDisplay → `data_display::Barcode` - [x] Captcha → `misc::Captcha`: the owner's picture and verdict over an answer field that empties and keeps focus with each answer, with a refresh - [x] Signature → `forms::SignaturePad` - [x] Rating Widget → `forms::Rating` ## T42d Misc · Asking and learning - [x] Poll / Survey → `misc::Poll`: one vote, then each option's share with the vote marked, and Change vote on Vote's stop; `misc::Survey`: questions on one page answered by an option, several, or words; Submit asks for what is missing, then sends, and thanks in its place and focus - [x] Quiz / Flashcard → `misc::Quiz`: a question at a time, Check shows the right answer, then Next and the score, one button on one stop; `misc::Flashcards`: a press turns the card, Previous and Next go round the deck ## T42e Misc · Terms and notices - [ ] ChangeLog Viewer → `data_display::Changelog` - [ ] LicenseViewer - [ ] Terms / Consent Dialog - [ ] CookieBanner ## T42f Misc · Web - [ ] WebView — prove: `wry` - [ ] IframeEmbed / EmbedCard - [ ] HTMLPreview → `misc::WebView` - [ ] PrintButton — blocked: gpui 0.2.2 has no print API - [ ] ShareSheet ## T42g Misc · Export and import - [ ] ExportDialog — PDF, PNG, CSV, JSON - [ ] ImportDialog — field mapping - [ ] CSVImporter ## T43 Library Tooling — `src/tooling` - [ ] ComponentGallery / Storybook - [ ] PlaygroundPanel - [ ] InspectorOverlay - [ ] FPSMeter / PerfOverlay - [ ] RenderCounter - [ ] EventLogger - [ ] DesignTokenViewer - [ ] IconBrowser - [ ] A11yChecker — contrast audit - [ ] ScreenshotTest Harness — self-capture; scripted input since T01