ui

package
v0.13.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 28, 2025 License: MIT Imports: 53 Imported by: 0

Documentation

Index

Constants

View Source
const (
	SettingLogLevel              = "logLevel"
	SettingLogLevelDefault       = "warning"
	SettingSysTrayEnabled        = "settingSysTrayEnabled"
	SettingSysTrayEnabledDefault = false
	SettingTabsMainID            = "tabs-main-id"
	SettingWindowHeight          = "window-height"
	SettingWindowHeightDefault   = 600
	SettingWindowWidth           = "window-width"
	SettingWindowWidthDefault    = 1000
)

Exported settings

View Source
const (
	DefaultIconPixelSize = 64
	DefaultIconUnitSize  = 32
	MyFloatFormat        = "#,###.##"
)

Base UI constants

Variables

Titler converts a string into a title for english language.

Functions

func BoolIconResource added in v0.13.0

func BoolIconResource(ok bool) fyne.Resource

func EntityNameOrFallback added in v0.13.0

func EntityNameOrFallback[T int | int32 | int64](e *app.EntityShort[T], fallback string) string

func LogLevelName2Level added in v0.10.0

func LogLevelName2Level(s string) slog.Level

func LogLevelNames added in v0.10.0

func LogLevelNames() []string

func NewConfirmDialog added in v0.6.0

func NewConfirmDialog(title, message, confirm string, callback func(bool), parent fyne.Window) *dialog.ConfirmDialog

NewConfirmDialog returns a new pre-configured confirm dialog.

func NewCustomHyperlink(text string, onTapped func()) *widget.Hyperlink

NewCustomHyperlink returns a new hyperlink with a custom action.

func NewErrorDialog added in v0.6.0

func NewErrorDialog(message string, err error, parent fyne.Window) dialog.Dialog

NewErrorDialog returns a new custom error dialog.

func NewImageResourceAsync added in v0.13.0

func NewImageResourceAsync(placeholder fyne.Resource, minSize fyne.Size, loader func() (fyne.Resource, error)) *canvas.Image

NewImageResourceAsync shows a placeholder resource and refreshes it once the main resource is loaded asynchronously.

func RefreshImageResourceAsync added in v0.13.0

func RefreshImageResourceAsync(image *canvas.Image, loader func() (fyne.Resource, error))

RefreshImageResourceAsync refreshes the resource of an image asynchronously. This prevents fyne to wait with rendering an image until a resource is fully loaded from a web server.

func SettingKeys added in v0.4.0

func SettingKeys() []string

SettingKeys returns all setting keys. Mostly to know what to delete.

func ShowErrorDialog added in v0.13.0

func ShowErrorDialog(message string, err error, parent fyne.Window)

func SkillDisplayName added in v0.13.0

func SkillDisplayName[N int | int32 | int64 | uint | uint32 | uint64](name string, level N) string

Types

type AccountArea added in v0.13.0

type AccountArea struct {
	Content           fyne.CanvasObject
	OnSelectCharacter func()
	OnRefresh         func(characterCount int)
	// contains filtered or unexported fields
}

AccountArea is the UI area for managing of characters.

func (*AccountArea) Refresh added in v0.13.0

func (a *AccountArea) Refresh()

func (*AccountArea) SetWindow added in v0.13.0

func (a *AccountArea) SetWindow(w fyne.Window)

func (*AccountArea) ShowAddCharacterDialog added in v0.13.0

func (a *AccountArea) ShowAddCharacterDialog()

type AssetSearchArea added in v0.13.0

type AssetSearchArea struct {
	Content *fyne.Container
	// contains filtered or unexported fields
}

AssetSearchArea is the UI area that shows the skillqueue

func (*AssetSearchArea) Focus added in v0.13.0

func (a *AssetSearchArea) Focus()

func (*AssetSearchArea) Refresh added in v0.13.0

func (a *AssetSearchArea) Refresh()

type AssetsArea added in v0.13.0

type AssetsArea struct {
	Content        fyne.CanvasObject
	Locations      fyne.CanvasObject
	LocationAssets fyne.CanvasObject
	OnSelected     func()
	OnRedraw       func(string)
	// contains filtered or unexported fields
}

AssetsArea is the UI area that shows the skillqueue

func (*AssetsArea) Redraw added in v0.13.0

func (a *AssetsArea) Redraw()

type Attributes added in v0.13.0

type Attributes struct {
	Content fyne.CanvasObject
	// contains filtered or unexported fields
}

Attributes is the UI area that shows the skillqueue

func (*Attributes) Refresh added in v0.13.0

func (a *Attributes) Refresh()

type BaseUI added in v0.13.0

type BaseUI struct {
	CacheService       app.CacheService
	CharacterService   *character.CharacterService
	ESIStatusService   app.ESIStatusService
	EveImageService    app.EveImageService
	EveUniverseService *eveuniverse.EveUniverseService
	StatusCacheService app.StatusCacheService
	// Paths to user data (for information only)
	DataPaths map[string]string
	// Run the app in offline mode
	IsOffline bool
	// Whether to disable update tickers (useful for debugging)
	IsUpdateTickerDisabled bool

	OnAppFirstStarted  func()
	OnAppTerminated    func()
	OnInit             func(*app.Character)
	OnRefreshCharacter func(*app.Character)
	OnRefreshCross     func()
	OnSetCharacter     func(int32)
	OnRefreshStatus    func()
	OnShowAndRun       func()
	ShowMailIndicator  func()
	HideMailIndicator  func()

	// need to be implemented for each platform
	ShowTypeInfoWindow     func(typeID, characterID int32, selectTab TypeWindowTab)
	ShowLocationInfoWindow func(int64)

	FyneApp fyne.App
	DeskApp desktop.App
	Window  fyne.Window

	Snackbar *iwidget.Snackbar

	AccountArea           *AccountArea
	AssetsArea            *AssetsArea
	AssetSearchArea       *AssetSearchArea
	AttributesArea        *Attributes
	BiographyArea         *BiographyArea
	ColoniesArea          *ColoniesArea
	ContractsArea         *ContractsArea
	ImplantsArea          *ImplantsArea
	JumpClonesArea        *JumpClonesArea
	LocationsArea         *LocationsArea
	MailArea              *MailArea
	NotificationsArea     *NotificationsArea
	OverviewArea          *OverviewArea
	PlanetArea            *PlanetArea
	SettingsArea          *SettingsArea
	ShipsArea             *ShipsArea
	SkillCatalogueArea    *SkillCatalogueArea
	SkillqueueArea        *SkillqueueArea
	TrainingArea          *TrainingArea
	WalletJournalArea     *WalletJournalArea
	WalletTransactionArea *WalletTransactionArea
	WealthArea            *WealthArea
	// contains filtered or unexported fields
}

BaseUI represents the core UI logic and is used by both the desktop and mobile UI.

func NewBaseUI added in v0.13.0

func NewBaseUI(fyneApp fyne.App) *BaseUI

NewBaseUI constructs and returns a new BaseUI.

Note:Types embedding BaseUI should define callbacks instead of overwriting methods.

func (*BaseUI) AppName added in v0.13.0

func (u *BaseUI) AppName() string

func (*BaseUI) AvailableUpdate added in v0.13.0

func (u *BaseUI) AvailableUpdate() (github.VersionInfo, error)

func (*BaseUI) CharacterID added in v0.13.0

func (u *BaseUI) CharacterID() int32

CharacterID returns the ID of the current character or 0 if non it set.

func (*BaseUI) CurrentCharacter added in v0.13.0

func (u *BaseUI) CurrentCharacter() *app.Character

func (*BaseUI) HasCharacter added in v0.13.0

func (u *BaseUI) HasCharacter() bool

func (*BaseUI) Init added in v0.13.0

func (u *BaseUI) Init()

Init initialized the app. It is meant for initialization logic that requires all services to be initialized and available. It should be called directly after the app was created and before the Fyne loop is started.

func (*BaseUI) IsDesktop added in v0.13.0

func (u *BaseUI) IsDesktop() bool

func (*BaseUI) IsMobile added in v0.13.0

func (u *BaseUI) IsMobile() bool

func (*BaseUI) LoadCharacter added in v0.13.0

func (u *BaseUI) LoadCharacter(id int32) error

func (*BaseUI) MakeAboutPage added in v0.13.0

func (u *BaseUI) MakeAboutPage() fyne.CanvasObject

func (*BaseUI) MakeCharacterSwitchMenu added in v0.13.0

func (u *BaseUI) MakeCharacterSwitchMenu(refresh func()) []*fyne.MenuItem

func (*BaseUI) MakeSendMailPage added in v0.13.0

func (u *BaseUI) MakeSendMailPage(
	character *app.Character,
	mode SendMailMode,
	mail *app.CharacterMail,
	w fyne.Window,
) (fyne.CanvasObject, fyne.Resource, func() bool)

func (*BaseUI) MakeWindowTitle added in v0.13.0

func (u *BaseUI) MakeWindowTitle(subTitle string) string

func (*BaseUI) NewAccountArea added in v0.13.0

func (u *BaseUI) NewAccountArea() *AccountArea

func (*BaseUI) NewAssetSearchArea added in v0.13.0

func (u *BaseUI) NewAssetSearchArea() *AssetSearchArea

func (*BaseUI) NewAssetsArea added in v0.13.0

func (u *BaseUI) NewAssetsArea() *AssetsArea

func (*BaseUI) NewAttributes added in v0.13.0

func (u *BaseUI) NewAttributes() *Attributes

func (*BaseUI) NewBiographyArea added in v0.13.0

func (u *BaseUI) NewBiographyArea() *BiographyArea

func (*BaseUI) NewColoniesArea added in v0.13.0

func (u *BaseUI) NewColoniesArea() *ColoniesArea

func (*BaseUI) NewContractsArea added in v0.13.0

func (u *BaseUI) NewContractsArea() *ContractsArea

func (*BaseUI) NewImplantsArea added in v0.13.0

func (u *BaseUI) NewImplantsArea() *ImplantsArea

func (*BaseUI) NewItemInfoArea added in v0.13.0

func (u *BaseUI) NewItemInfoArea(typeID, characterID int32, locationID int64, selectTab TypeWindowTab) (*ItemInfoArea, error)

func (*BaseUI) NewJumpClonesArea added in v0.13.0

func (u *BaseUI) NewJumpClonesArea() *JumpClonesArea

func (*BaseUI) NewLocationsArea added in v0.13.0

func (u *BaseUI) NewLocationsArea() *LocationsArea

func (*BaseUI) NewMailArea added in v0.13.0

func (u *BaseUI) NewMailArea() *MailArea

func (*BaseUI) NewNotificationsArea added in v0.13.0

func (u *BaseUI) NewNotificationsArea() *NotificationsArea

func (*BaseUI) NewOverviewArea added in v0.13.0

func (u *BaseUI) NewOverviewArea() *OverviewArea

func (*BaseUI) NewPlanetArea added in v0.13.0

func (u *BaseUI) NewPlanetArea() *PlanetArea

func (*BaseUI) NewSettingsArea added in v0.13.0

func (u *BaseUI) NewSettingsArea() *SettingsArea

func (*BaseUI) NewSkillCatalogueArea added in v0.13.0

func (u *BaseUI) NewSkillCatalogueArea() *SkillCatalogueArea

func (*BaseUI) NewSkillqueueArea added in v0.13.0

func (u *BaseUI) NewSkillqueueArea() *SkillqueueArea

func (*BaseUI) NewTrainingArea added in v0.13.0

func (u *BaseUI) NewTrainingArea() *TrainingArea

func (*BaseUI) NewUpdateStatusArea added in v0.13.0

func (u *BaseUI) NewUpdateStatusArea() *UpdateStatusArea

func (*BaseUI) NewWalletJournalArea added in v0.13.0

func (u *BaseUI) NewWalletJournalArea() *WalletJournalArea

func (*BaseUI) NewWalletTransactionArea added in v0.13.0

func (u *BaseUI) NewWalletTransactionArea() *WalletTransactionArea

func (*BaseUI) NewWealthArea added in v0.13.0

func (u *BaseUI) NewWealthArea() *WealthArea

func (*BaseUI) RefreshCharacter added in v0.13.0

func (u *BaseUI) RefreshCharacter()

RefreshCharacter refreshes all pages for the current character.

func (*BaseUI) RefreshCrossPages added in v0.13.0

func (u *BaseUI) RefreshCrossPages()

RefreshCrossPages refreshed all pages that contain information about multiple characters.

func (*BaseUI) RefreshStatus added in v0.13.0

func (u *BaseUI) RefreshStatus()

RefreshStatus refreshed all status information pages.

func (*BaseUI) ResetCharacter added in v0.13.0

func (u *BaseUI) ResetCharacter()

func (*BaseUI) SetAnyCharacter added in v0.13.0

func (u *BaseUI) SetAnyCharacter() error

func (*BaseUI) SetCharacter added in v0.13.0

func (u *BaseUI) SetCharacter(c *app.Character)

func (*BaseUI) ShowAndRun added in v0.13.0

func (u *BaseUI) ShowAndRun()

ShowAndRun shows the UI and runs the Fyne loop (blocking),

func (*BaseUI) ShowUpdateStatusWindow added in v0.13.0

func (u *BaseUI) ShowUpdateStatusWindow()

func (*BaseUI) UpdateAvatar added in v0.13.0

func (u *BaseUI) UpdateAvatar(id int32, setIcon func(fyne.Resource))

func (*BaseUI) UpdateCharacterAndRefreshIfNeeded added in v0.13.0

func (u *BaseUI) UpdateCharacterAndRefreshIfNeeded(ctx context.Context, characterID int32, forceUpdate bool)

UpdateCharacterAndRefreshIfNeeded runs update for all sections of a character if needed and refreshes the UI accordingly.

func (*BaseUI) UpdateCharacterSectionAndRefreshIfNeeded added in v0.13.0

func (u *BaseUI) UpdateCharacterSectionAndRefreshIfNeeded(ctx context.Context, characterID int32, s app.CharacterSection, forceUpdate bool)

UpdateCharacterSectionAndRefreshIfNeeded runs update for a character section if needed and refreshes the UI accordingly.

All UI areas showing data based on character sections needs to be included to make sure they are refreshed when data changes.

func (*BaseUI) UpdateGeneralSectionAndRefreshIfNeeded added in v0.13.0

func (u *BaseUI) UpdateGeneralSectionAndRefreshIfNeeded(ctx context.Context, section app.GeneralSection, forceUpdate bool)

func (*BaseUI) UpdateGeneralSectionsAndRefreshIfNeeded added in v0.13.0

func (u *BaseUI) UpdateGeneralSectionsAndRefreshIfNeeded(forceUpdate bool)

func (*BaseUI) UpdateMailIndicator added in v0.13.0

func (u *BaseUI) UpdateMailIndicator()

func (*BaseUI) WebsiteRootURL added in v0.13.0

func (u *BaseUI) WebsiteRootURL() *url.URL

type BiographyArea added in v0.13.0

type BiographyArea struct {
	Content fyne.CanvasObject
	// contains filtered or unexported fields
}

BiographyArea is the UI area that shows the skillqueue

func (*BiographyArea) Refresh added in v0.13.0

func (a *BiographyArea) Refresh()

type ColoniesArea added in v0.13.0

type ColoniesArea struct {
	Content   fyne.CanvasObject
	OnRefresh func(top string)
	// contains filtered or unexported fields
}

ColoniesArea is the UI area that shows the skillqueue

func (*ColoniesArea) Refresh added in v0.13.0

func (a *ColoniesArea) Refresh()

type ContractsArea added in v0.13.0

type ContractsArea struct {
	Content *fyne.Container
	// contains filtered or unexported fields
}

ContractsArea is the UI area that shows the skillqueue

func (*ContractsArea) Refresh added in v0.13.0

func (a *ContractsArea) Refresh()

type FolderNode added in v0.13.0

type FolderNode struct {
	Category    folderNodeCategory
	CharacterID int32
	IsLeaf      bool
	Type        folderNodeType
	Name        string
	ObjID       int32
	UnreadCount int
}

A FolderNode in the folder tree, e.g. the inbox

func (FolderNode) IsEmpty added in v0.13.0

func (f FolderNode) IsEmpty() bool

func (FolderNode) UID added in v0.13.0

func (f FolderNode) UID() widget.TreeNodeID

type ImplantsArea added in v0.13.0

type ImplantsArea struct {
	Content *fyne.Container
	// contains filtered or unexported fields
}

ImplantsArea is the UI area that shows the skillqueue

func (*ImplantsArea) Refresh added in v0.13.0

func (a *ImplantsArea) Refresh()

type ItemInfoArea added in v0.13.0

type ItemInfoArea struct {
	Content fyne.CanvasObject
	Window  fyne.Window // defaults to main window
	// contains filtered or unexported fields
}

ItemInfoArea represents a UI component to display information about Eve Online items; similar to the info window in the game client.

func (*ItemInfoArea) MakeTitle added in v0.13.0

func (a *ItemInfoArea) MakeTitle(suffix string) string

type JumpClonesArea added in v0.13.0

type JumpClonesArea struct {
	Content  *fyne.Container
	OnReDraw func(clonesCount int)
	// contains filtered or unexported fields
}

JumpClonesArea is the UI area that shows the skillqueue

func (*JumpClonesArea) Redraw added in v0.13.0

func (a *JumpClonesArea) Redraw()

type LocationsArea added in v0.13.0

type LocationsArea struct {
	Content fyne.CanvasObject
	// contains filtered or unexported fields
}

LocationsArea is the UI area that shows an overview of all the user's characters.

It generates output which is customized for either desktop or mobile.

func (*LocationsArea) Refresh added in v0.13.0

func (a *LocationsArea) Refresh()

type MailArea added in v0.13.0

type MailArea struct {
	Content       fyne.CanvasObject
	CurrentFolder optional.Optional[FolderNode]
	Detail        fyne.CanvasObject
	Headers       fyne.CanvasObject
	OnSelected    func()
	OnRefresh     func(count int)
	OnSendMessage func(character *app.Character, mode SendMailMode, mail *app.CharacterMail)
	// contains filtered or unexported fields
}

MailArea is the UI area showing the mail folders.

func (*MailArea) Folders added in v0.13.0

func (a *MailArea) Folders() []FolderNode

func (*MailArea) MakeComposeMessageAction added in v0.13.0

func (a *MailArea) MakeComposeMessageAction() (fyne.Resource, func())

func (*MailArea) MakeDeleteAction added in v0.13.0

func (a *MailArea) MakeDeleteAction(onSuccess func()) (fyne.Resource, func())

func (*MailArea) MakeForwardAction added in v0.13.0

func (a *MailArea) MakeForwardAction() (fyne.Resource, func())

func (*MailArea) MakeReplyAction added in v0.13.0

func (a *MailArea) MakeReplyAction() (fyne.Resource, func())

func (*MailArea) MakeReplyAllAction added in v0.13.0

func (a *MailArea) MakeReplyAllAction() (fyne.Resource, func())

func (*MailArea) Redraw added in v0.13.0

func (a *MailArea) Redraw()

func (*MailArea) Refresh added in v0.13.0

func (a *MailArea) Refresh()

func (*MailArea) ResetFolders added in v0.13.0

func (a *MailArea) ResetFolders()

func (*MailArea) SetFolder added in v0.13.0

func (a *MailArea) SetFolder(folder FolderNode)

type NotificationGroup added in v0.13.0

type NotificationGroup struct {
	Group       evenotification.Group
	Name        string
	UnreadCount int
}

type NotificationsArea added in v0.13.0

type NotificationsArea struct {
	Content       fyne.CanvasObject
	Detail        *fyne.Container
	Notifications fyne.CanvasObject
	Toolbar       *widget.Toolbar
	OnSelected    func()
	OnRefresh     func(count int)

	Groups []NotificationGroup
	// contains filtered or unexported fields
}

NotificationsArea is the UI area that shows the skillqueue

func (*NotificationsArea) Refresh added in v0.13.0

func (a *NotificationsArea) Refresh()

func (*NotificationsArea) ResetGroups added in v0.13.0

func (a *NotificationsArea) ResetGroups()

func (*NotificationsArea) SetGroup added in v0.13.0

func (a *NotificationsArea) SetGroup(nc evenotification.Group)

type OverviewArea added in v0.13.0

type OverviewArea struct {
	Content fyne.CanvasObject
	// contains filtered or unexported fields
}

OverviewArea is the UI area that shows an overview of all the user's characters.

func (*OverviewArea) Refresh added in v0.13.0

func (a *OverviewArea) Refresh()

type PlanetArea added in v0.13.0

type PlanetArea struct {
	Content *fyne.Container

	OnRefresh func(total, expired int)
	// contains filtered or unexported fields
}

PlanetArea is the UI area that shows the skillqueue

func (*PlanetArea) Refresh added in v0.13.0

func (a *PlanetArea) Refresh()

type SendMailMode added in v0.13.0

type SendMailMode uint
const (
	SendMailNew SendMailMode = iota + 1
	SendMailReply
	SendMailReplyAll
	SendMailForward
)

type SettingAction added in v0.13.0

type SettingAction struct {
	Label  string
	Action func()
}

type SettingsArea added in v0.13.0

type SettingsArea struct {
	Content                      fyne.CanvasObject
	NotificationActions          []SettingAction
	NotificationSettings         fyne.CanvasObject
	GeneralActions               []SettingAction
	GeneralContent               fyne.CanvasObject
	CommunicationGroupContent    fyne.CanvasObject
	OnCommunicationGroupSelected func(title string, content fyne.CanvasObject, actions []SettingAction)
	// contains filtered or unexported fields
}

func (*SettingsArea) SetWindow added in v0.13.0

func (a *SettingsArea) SetWindow(w fyne.Window)

type ShipsArea added in v0.13.0

type ShipsArea struct {
	Content *fyne.Container
	// contains filtered or unexported fields
}

ShipsArea is the UI area that shows the skillqueue

func (*ShipsArea) Refresh added in v0.13.0

func (a *ShipsArea) Refresh()

type SkillCatalogueArea added in v0.13.0

type SkillCatalogueArea struct {
	Content fyne.CanvasObject
	// contains filtered or unexported fields
}

SkillCatalogueArea is the UI area that shows the skill catalogue

func (*SkillCatalogueArea) Redraw added in v0.13.0

func (a *SkillCatalogueArea) Redraw()

func (*SkillCatalogueArea) Refresh added in v0.13.0

func (a *SkillCatalogueArea) Refresh()

type SkillqueueArea added in v0.13.0

type SkillqueueArea struct {
	Content *fyne.Container

	OnRefresh func(statusShort, statusLong string)
	// contains filtered or unexported fields
}

SkillqueueArea is the UI area that shows the skillqueue

func (*SkillqueueArea) Refresh added in v0.13.0

func (a *SkillqueueArea) Refresh()

type TrainingArea added in v0.13.0

type TrainingArea struct {
	Content *fyne.Container
	// contains filtered or unexported fields
}

TrainingArea is the UI area that shows an overview of all the user's characters.

func (*TrainingArea) Refresh added in v0.13.0

func (a *TrainingArea) Refresh()

type TypeWindowTab added in v0.13.0

type TypeWindowTab uint
const (
	DescriptionTab TypeWindowTab = iota + 1
	RequirementsTab
)

type UpdateStatusArea added in v0.13.0

type UpdateStatusArea struct {
	Content fyne.CanvasObject
	// contains filtered or unexported fields
}

func (*UpdateStatusArea) MakeUpdateAllAction added in v0.13.0

func (a *UpdateStatusArea) MakeUpdateAllAction() func()

func (*UpdateStatusArea) Refresh added in v0.13.0

func (a *UpdateStatusArea) Refresh()

func (*UpdateStatusArea) StartTicker added in v0.13.0

func (a *UpdateStatusArea) StartTicker(ctx context.Context)

type WalletJournalArea added in v0.13.0

type WalletJournalArea struct {
	Content *fyne.Container

	OnRefresh func(balance string)
	// contains filtered or unexported fields
}

WalletJournalArea is the UI area that shows the skillqueue

func (*WalletJournalArea) Refresh added in v0.13.0

func (a *WalletJournalArea) Refresh()

type WalletTransactionArea added in v0.13.0

type WalletTransactionArea struct {
	Content fyne.CanvasObject
	// contains filtered or unexported fields
}

WalletTransactionArea is the UI area that shows the skillqueue

func (*WalletTransactionArea) Refresh added in v0.13.0

func (a *WalletTransactionArea) Refresh()

type WealthArea added in v0.13.0

type WealthArea struct {
	Content   fyne.CanvasObject
	OnRefresh func(total string)
	// contains filtered or unexported fields
}

func (*WealthArea) Refresh added in v0.13.0

func (a *WealthArea) Refresh()

Directories

Path Synopsis
Package desktop contains the code for rendering the desktop UI.
Package desktop contains the code for rendering the desktop UI.
Package mobile contains the code for rendering the mobile UI.
Package mobile contains the code for rendering the mobile UI.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL