Survey's Submit asks for any missing answer instead of resting, so no untick takes its focus handle out of the tree. Flashcards turn and go round, and a quiz pick clears its ask, through methods the tests reach; the poll's rows show which one holds the vote. forms::Radio's label wraps in its own block, as Checkbox's does, so a long one stays in a narrow box.
367 lines
14 KiB
Markdown
367 lines
14 KiB
Markdown
# 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
|