Repository: spectreconsole/spectre.console Branch: main Commit: e1c05b4402de Files: 797 Total size: 3.8 MB Directory structure: gitextract_rd6qn2_s/ ├── .editorconfig ├── .git-blame-ignore-revs ├── .gitattributes ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ └── feature_request.md │ ├── pull_request_template.md │ ├── renovate.json │ └── workflows/ │ ├── ci.yaml │ ├── publish.yaml │ └── top-issues-dashboard.yml ├── .gitignore ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE.md ├── NuGet.Config ├── README.fa.md ├── README.jp.md ├── README.md ├── README.pt-BR.md ├── README.zh.md ├── build.cs ├── dotnet-tools.json ├── global.json ├── resources/ │ ├── nuget/ │ │ ├── Spectre.Console.Ansi.md │ │ ├── Spectre.Console.ImageSharp.md │ │ ├── Spectre.Console.Json.md │ │ ├── Spectre.Console.Testing.md │ │ └── Spectre.Console.md │ ├── scripts/ │ │ ├── .gitignore │ │ ├── Generate-Colors.ps1 │ │ ├── Generate-Emoji.ps1 │ │ └── Generate-Spinners.ps1 │ ├── signclient.filter │ └── spectre.snk └── src/ ├── .editorconfig ├── Benchmarks/ │ ├── BenchmarkDotNet.Artifacts/ │ │ └── results/ │ │ ├── Benchmarks.AnsiBenchmarks-report-github.md │ │ └── Benchmarks.RenderBenchmarks-report-github.md │ ├── Benchmarks.csproj │ ├── EmojiBenchmarks.cs │ ├── MarkupBenchmarks.cs │ ├── ParagraphBenchmarks.cs │ └── Program.cs ├── Directory.Build.props ├── Directory.Packages.props ├── Extensions/ │ ├── Spectre.Console.ImageSharp/ │ │ ├── CanvasImage.cs │ │ ├── CanvasImageExtensions.cs │ │ └── Spectre.Console.ImageSharp.csproj │ └── Spectre.Console.Json/ │ ├── IJsonParser.cs │ ├── JsonBuilder.cs │ ├── JsonParser.cs │ ├── JsonText.cs │ ├── JsonTextStyles.cs │ ├── JsonToken.cs │ ├── JsonTokenReader.cs │ ├── JsonTokenType.cs │ ├── JsonTokenizer.cs │ ├── Properties/ │ │ └── Usings.cs │ ├── Spectre.Console.Json.csproj │ └── Syntax/ │ ├── JsonArray.cs │ ├── JsonBoolean.cs │ ├── JsonMember.cs │ ├── JsonNull.cs │ ├── JsonNumber.cs │ ├── JsonObject.cs │ ├── JsonString.cs │ ├── JsonSyntax.cs │ └── JsonSyntaxVisitor.cs ├── Spectre.Console/ │ ├── AnsiConsole.Exceptions.cs │ ├── AnsiConsole.Live.cs │ ├── AnsiConsole.Markup.cs │ ├── AnsiConsole.Progress.cs │ ├── AnsiConsole.Prompt.cs │ ├── AnsiConsole.Recording.cs │ ├── AnsiConsole.Screen.cs │ ├── AnsiConsole.State.cs │ ├── AnsiConsole.Write.cs │ ├── AnsiConsole.WriteLine.cs │ ├── AnsiConsole.cs │ ├── AnsiConsoleFactory.cs │ ├── AnsiConsoleOutput.cs │ ├── AnsiConsoleSettings.cs │ ├── BoxBorder.Known.cs │ ├── BoxBorder.cs │ ├── Capabilities.cs │ ├── CircularBuffer.cs │ ├── CursorDirection.cs │ ├── Data/ │ │ ├── emoji.json │ │ ├── spinners_default.json │ │ └── spinners_sindresorhus.json │ ├── Emoji.cs │ ├── Enrichment/ │ │ ├── CI/ │ │ │ ├── AppVeyorEnricher.cs │ │ │ ├── AzurePipelinesEnricher.cs │ │ │ ├── BambooEnricher.cs │ │ │ ├── BitbucketEnricher.cs │ │ │ ├── BitriseEnricher.cs │ │ │ ├── ContinuaEnricher.cs │ │ │ ├── GitHubEnricher.cs │ │ │ ├── GitLabEnricher.cs │ │ │ ├── GoCDEnricher.cs │ │ │ ├── JenkinsEnricher.cs │ │ │ ├── MyGetEnricher.cs │ │ │ ├── TeamCityEnricher.cs │ │ │ ├── TfsEnricher.cs │ │ │ └── TravisEnricher.cs │ │ ├── ProfileEnricher.cs │ │ └── ProfileEnrichment.cs │ ├── Extensions/ │ │ ├── AnsiConsoleExtensions.Ansi.cs │ │ ├── AnsiConsoleExtensions.Async.cs │ │ ├── AnsiConsoleExtensions.Exceptions.cs │ │ ├── AnsiConsoleExtensions.Exclusive.cs │ │ ├── AnsiConsoleExtensions.Input.cs │ │ ├── AnsiConsoleExtensions.Live.cs │ │ ├── AnsiConsoleExtensions.Markup.cs │ │ ├── AnsiConsoleExtensions.Progress.cs │ │ ├── AnsiConsoleExtensions.Prompt.cs │ │ ├── AnsiConsoleExtensions.Recording.cs │ │ ├── AnsiConsoleExtensions.Screen.cs │ │ ├── AnsiConsoleExtensions.Write.cs │ │ ├── AnsiConsoleExtensions.WriteLine.cs │ │ ├── AnsiConsoleExtensions.cs │ │ ├── AnsiWriterExtensions.cs │ │ └── Bcl/ │ │ ├── CharExtensions.cs │ │ ├── DayOfWeekExtensions.cs │ │ ├── DictionaryExtensions.cs │ │ ├── EnumerableExtensions.cs │ │ ├── ExceptionExtensions.cs │ │ ├── Int32Extensions.cs │ │ ├── ListExtensions.cs │ │ ├── StackExtensions.cs │ │ ├── StringBuilderExtensions.cs │ │ ├── StringExtensions.cs │ │ └── TextWriterExtensions.cs │ ├── Generated/ │ │ ├── Backport.System.Threading.Lock.SourceGenerator/ │ │ │ └── Backport.System.Threading.Lock.SourceGenerator.Generator/ │ │ │ ├── Backport.System.Threading.Lock.SourceGenerator.AssemblyInfo.cs │ │ │ ├── Backport.System.Threading.Lock.SourceGenerator.Lock.cs │ │ │ ├── Backport.System.Threading.Lock.SourceGenerator.LockFactory.cs │ │ │ └── Backport.System.Threading.Lock.SourceGenerator.ThreadAbortableLock.cs │ │ └── Spectre.Console.SourceGenerator/ │ │ ├── Spectre.Console.SourceGenerator.Colors.ColorGenerator/ │ │ │ ├── Color.Generated.g.cs │ │ │ ├── ColorPalette.Generated.g.cs │ │ │ └── ColorTable.Generated.g.cs │ │ ├── Spectre.Console.SourceGenerator.Emojis.EmojiGenerator/ │ │ │ └── Emoji.Generated.g.cs │ │ └── Spectre.Console.SourceGenerator.Spinners.SpinnerGenerator/ │ │ └── Spinner.Generated.g.cs │ ├── HorizontalAlignment.cs │ ├── IAlignable.cs │ ├── IAnsiConsole.cs │ ├── IAnsiConsoleCursor.cs │ ├── IAnsiConsoleInput.cs │ ├── IAnsiConsoleOutput.cs │ ├── IColumn.cs │ ├── IExclusivityMode.cs │ ├── IExpandable.cs │ ├── IHasBorder.cs │ ├── IHasBoxBorder.cs │ ├── IHasCulture.cs │ ├── IHasJustification.cs │ ├── IHasTableBorder.cs │ ├── IHasTreeNodes.cs │ ├── IHasVisibility.cs │ ├── IOverflowable.cs │ ├── IPaddable.cs │ ├── IProfileEnricher.cs │ ├── IReadOnlyCapabilities.cs │ ├── InteractionDetector.cs │ ├── InteractionSupport.cs │ ├── Internal/ │ │ ├── Aligner.cs │ │ ├── Backends/ │ │ │ ├── Ansi/ │ │ │ │ ├── AnsiConsoleBackend.cs │ │ │ │ ├── AnsiConsoleCursor.cs │ │ │ │ └── AnsiStringWriter.cs │ │ │ ├── AnsiConsoleFacade.cs │ │ │ ├── IAnsiConsoleBackend.cs │ │ │ └── Legacy/ │ │ │ ├── LegacyConsoleBackend.cs │ │ │ └── LegacyConsoleCursor.cs │ │ ├── Cell.cs │ │ ├── Collections/ │ │ │ └── ListWithCallback.cs │ │ ├── ConsoleHelper.cs │ │ ├── Constants.cs │ │ ├── DecorationTable.cs │ │ ├── DefaultExclusivityMode.cs │ │ ├── DefaultInput.cs │ │ ├── FileSize.cs │ │ ├── FileSizeBase.cs │ │ ├── FileSizePrefix.cs │ │ ├── IRatioResolvable.cs │ │ ├── Polyfill/ │ │ │ ├── CancellationToken.cs │ │ │ └── EnumHelpers.cs │ │ ├── Ratio.cs │ │ ├── ResourceReader.cs │ │ ├── Text/ │ │ │ ├── Encoding/ │ │ │ │ ├── EncoderCapabilities.cs │ │ │ │ ├── HtmlEncoder.cs │ │ │ │ └── TextEncoder.cs │ │ │ ├── StringBuffer.cs │ │ │ └── WhiteSpaceSegmentEnumerator.cs │ │ └── TypeConverterHelper.cs │ ├── Justify.cs │ ├── Live/ │ │ ├── LiveDisplay.cs │ │ ├── LiveDisplayContext.cs │ │ ├── LiveDisplayRenderer.cs │ │ ├── LiveRenderable.cs │ │ ├── Progress/ │ │ │ ├── Columns/ │ │ │ │ ├── DownloadedColumn.cs │ │ │ │ ├── ElapsedTimeColumn.cs │ │ │ │ ├── PercentageColumn.cs │ │ │ │ ├── ProgressBarColumn.cs │ │ │ │ ├── RemainingTimeColumn.cs │ │ │ │ ├── SpinnerColumn.cs │ │ │ │ ├── TaskDescriptionColumn.cs │ │ │ │ └── TransferSpeedColumn.cs │ │ │ ├── Progress.cs │ │ │ ├── ProgressColumn.cs │ │ │ ├── ProgressContext.cs │ │ │ ├── ProgressRefreshThread.cs │ │ │ ├── ProgressRenderer.cs │ │ │ ├── ProgressSample.cs │ │ │ ├── ProgressTask.cs │ │ │ ├── ProgressTaskSettings.cs │ │ │ ├── ProgressTaskState.cs │ │ │ ├── Renderers/ │ │ │ │ ├── DefaultProgressRenderer.cs │ │ │ │ ├── FallbackProgressRenderer.cs │ │ │ │ └── FallbackStatusRenderer.cs │ │ │ └── Spinner.cs │ │ └── Status/ │ │ ├── Status.cs │ │ └── StatusContext.cs │ ├── Overflow.cs │ ├── Padding.cs │ ├── Profile.cs │ ├── Prompts/ │ │ ├── ConfirmationPrompt.cs │ │ ├── DefaultPromptValue.cs │ │ ├── IMultiSelectionItem.cs │ │ ├── IPrompt.cs │ │ ├── ISelectionItem.cs │ │ ├── List/ │ │ │ ├── IListPromptStrategy.cs │ │ │ ├── ListPrompt.cs │ │ │ ├── ListPromptConstants.cs │ │ │ ├── ListPromptInputResult.cs │ │ │ ├── ListPromptItem.cs │ │ │ ├── ListPromptRenderHook.cs │ │ │ ├── ListPromptState.cs │ │ │ └── ListPromptTree.cs │ │ ├── MultiSelectionPrompt.cs │ │ ├── MultiSelectionPromptExtensions.cs │ │ ├── SelectionPrompt.cs │ │ ├── SelectionPromptExtensions.cs │ │ ├── SelectionType.cs │ │ ├── TextPrompt.cs │ │ └── TextPromptExtensions.cs │ ├── Properties/ │ │ └── Usings.cs │ ├── Recorder.cs │ ├── Region.cs │ ├── Rendering/ │ │ ├── Borders/ │ │ │ ├── BoxBorderPart.cs │ │ │ ├── Boxes/ │ │ │ │ ├── AsciiBoxBorder.cs │ │ │ │ ├── DoubleBoxBorder.cs │ │ │ │ ├── HeavyBoxBorder.cs │ │ │ │ ├── NoBoxBorder.cs │ │ │ │ ├── RoundedBoxBorder.cs │ │ │ │ └── SquareBoxBorder.cs │ │ │ ├── TableBorderPart.cs │ │ │ └── Tables/ │ │ │ ├── Ascii2TableBorder.cs │ │ │ ├── AsciiDoubleHeadTableBorder.cs │ │ │ ├── AsciiTableBorder.cs │ │ │ ├── DoubleEdgeTableBorder.cs │ │ │ ├── DoubleTableBorder.cs │ │ │ ├── HeavyEdgeTableBorder.cs │ │ │ ├── HeavyHeadTableBorder.cs │ │ │ ├── HeavyTableBorder.cs │ │ │ ├── HorizontalTableBorder.cs │ │ │ ├── MarkdownTableBorder.cs │ │ │ ├── MinimalDoubleHeadTableBorder.cs │ │ │ ├── MinimalHeavyHeadTableBorder.cs │ │ │ ├── MinimalTableBorder.cs │ │ │ ├── MinimalistTableBorder.cs │ │ │ ├── NoTableBorder.cs │ │ │ ├── RoundedTableBorder.cs │ │ │ ├── SimpleHeavyTableBorder.cs │ │ │ ├── SimpleTableBorder.cs │ │ │ └── SquareTableBorder.cs │ │ ├── IAnsiConsoleEncoder.cs │ │ ├── IHasDirtyState.cs │ │ ├── IRenderHook.cs │ │ ├── IRenderable.cs │ │ ├── JustInTimeRenderable.cs │ │ ├── Measurement.cs │ │ ├── RenderHookScope.cs │ │ ├── RenderOptions.cs │ │ ├── RenderPipeline.cs │ │ ├── Renderable.cs │ │ ├── Segment.cs │ │ ├── SegmentLine.cs │ │ ├── SegmentLineEnumerator.cs │ │ ├── SegmentLineIterator.cs │ │ ├── SegmentShape.cs │ │ ├── TablePart.cs │ │ ├── Tree/ │ │ │ ├── AsciiTreeGuide.cs │ │ │ ├── BoldLineTreeGuide.cs │ │ │ ├── DoubleLineTreeGuide.cs │ │ │ └── LineTreeGuide.cs │ │ └── TreeGuidePart.cs │ ├── Size.cs │ ├── Spectre.Console.csproj │ ├── TableBorder.Known.cs │ ├── TableBorder.cs │ ├── TreeGuide.Known.cs │ ├── TreeGuide.cs │ ├── ValidationResult.cs │ ├── VerticalAlignment.cs │ ├── VerticalOverflow.cs │ ├── VerticalOverflowCropping.cs │ └── Widgets/ │ ├── Align.cs │ ├── Calendar.cs │ ├── CalendarEvent.cs │ ├── Canvas.cs │ ├── Charts/ │ │ ├── BarChart.cs │ │ ├── BarChartItem.cs │ │ ├── BreakdownBar.cs │ │ ├── BreakdownChart.cs │ │ ├── BreakdownChartItem.cs │ │ ├── BreakdownTags.cs │ │ ├── IBarChartItem.cs │ │ └── IBreakdownChartItem.cs │ ├── CircularTreeException.cs │ ├── Columns.cs │ ├── ControlCode.cs │ ├── Exceptions/ │ │ ├── ExceptionFormat.cs │ │ ├── ExceptionFormatter.cs │ │ ├── ExceptionSettings.cs │ │ ├── ExceptionStyle.cs │ │ ├── StringUriExtensions.cs │ │ └── TypeNameHelper.cs │ ├── Figlet/ │ │ ├── FigletCharacter.cs │ │ ├── FigletFont.cs │ │ ├── FigletFontParser.cs │ │ ├── FigletHeader.cs │ │ ├── FigletText.cs │ │ └── Fonts/ │ │ └── Standard.flf │ ├── Grid.cs │ ├── GridColumn.cs │ ├── GridRow.cs │ ├── Layout/ │ │ ├── Layout.cs │ │ ├── LayoutPlaceholder.cs │ │ ├── LayoutRender.cs │ │ └── LayoutSplitter.cs │ ├── Markup.cs │ ├── Padder.cs │ ├── Panel.cs │ ├── PanelHeader.cs │ ├── Paragraph.cs │ ├── ProgressBar.cs │ ├── Rows.cs │ ├── Rule.cs │ ├── Table/ │ │ ├── Table.cs │ │ ├── TableAccessor.cs │ │ ├── TableCell.cs │ │ ├── TableColumn.cs │ │ ├── TableMeasurer.cs │ │ ├── TableRenderer.cs │ │ ├── TableRendererContext.cs │ │ ├── TableRow.cs │ │ ├── TableRowCollection.cs │ │ ├── TableRowEnumerator.cs │ │ └── TableTitle.cs │ ├── Text.cs │ ├── TextPath.cs │ ├── Tree.cs │ └── TreeNode.cs ├── Spectre.Console.Ansi/ │ ├── AnsiCapabilities.cs │ ├── AnsiDetector.cs │ ├── AnsiMarkup.cs │ ├── AnsiMarkupHighlighter.cs │ ├── AnsiMarkupTagParser.cs │ ├── AnsiSupport.cs │ ├── AnsiWriter.cs │ ├── AnsiWriterSettings.cs │ ├── Color.cs │ ├── ColorPalette.cs │ ├── ColorSystem.cs │ ├── ColorSystemDetector.cs │ ├── ColorSystemSupport.cs │ ├── ColorTable.cs │ ├── Constants.cs │ ├── Data/ │ │ └── colors.json │ ├── Decoration.cs │ ├── DecorationTable.cs │ ├── Generated/ │ │ ├── Backport.System.Threading.Lock.SourceGenerator/ │ │ │ └── Backport.System.Threading.Lock.SourceGenerator.Generator/ │ │ │ ├── Backport.System.Threading.Lock.SourceGenerator.AssemblyInfo.cs │ │ │ ├── Backport.System.Threading.Lock.SourceGenerator.Lock.cs │ │ │ ├── Backport.System.Threading.Lock.SourceGenerator.LockFactory.cs │ │ │ └── Backport.System.Threading.Lock.SourceGenerator.ThreadAbortableLock.cs │ │ └── Spectre.Console.SourceGenerator/ │ │ └── Spectre.Console.SourceGenerator.Colors.ColorGenerator/ │ │ ├── Color.Generated.g.cs │ │ ├── ColorPalette.Generated.g.cs │ │ └── ColorTable.Generated.g.cs │ ├── Link.cs │ ├── Properties/ │ │ └── Usings.cs │ ├── Spectre.Console.Ansi.csproj │ ├── Style.cs │ └── Utilities/ │ ├── ConsoleExtensions.cs │ ├── EnumHelpers.cs │ ├── EnumerableExtensions.cs │ ├── StringBuffer.cs │ ├── StringExtensions.cs │ └── TextWriterExtensions.cs ├── Spectre.Console.Ansi.Tests/ │ ├── AnsiMarkupTests.cs │ ├── AnsiWriterTests.cs │ ├── ColorSystemTests.cs │ ├── ColorTests.cs │ ├── Fixtures/ │ │ └── AnsiFixture.cs │ ├── Properties/ │ │ └── Usings.cs │ ├── Spectre.Console.Ansi.Tests.csproj │ └── StyleTests.cs ├── Spectre.Console.SourceGenerator/ │ ├── Colors/ │ │ ├── ColorEmitter.cs │ │ ├── ColorGenerator.cs │ │ └── ColorModel.cs │ ├── Emojis/ │ │ ├── EmojiEmitter.cs │ │ ├── EmojiGenerator.cs │ │ └── EmojiModel.cs │ ├── EquatableArray.cs │ ├── Spectre.Console.SourceGenerator.csproj │ └── Spinners/ │ ├── SpinnerEmitter.cs │ ├── SpinnerGenerator.cs │ └── SpinnerModel.cs ├── Spectre.Console.Testing/ │ ├── .editorconfig │ ├── Extensions/ │ │ ├── ShouldlyExtensions.cs │ │ ├── StringExtensions.cs │ │ ├── StyleExtensions.cs │ │ └── TestConsoleExtensions.cs │ ├── Internal/ │ │ ├── NoopCursor.cs │ │ └── NoopExclusivityMode.cs │ ├── Properties/ │ │ └── Usings.cs │ ├── Spectre.Console.Testing.csproj │ ├── TestCapabilities.cs │ ├── TestConsole.cs │ └── TestConsoleInput.cs ├── Spectre.Console.Tests/ │ ├── Data/ │ │ ├── Exceptions.cs │ │ ├── example.json │ │ ├── poison.flf │ │ └── starwars.flf │ ├── Expectations/ │ │ ├── AlternateScreen/ │ │ │ └── Show.Output.verified.txt │ │ ├── Cli/ │ │ │ ├── Arguments/ │ │ │ │ ├── ArgumentCannotContainOptions.Output.verified.txt │ │ │ │ ├── InvalidCharacterInOptionName.Output.verified.txt │ │ │ │ ├── InvalidCharacterInValueName.Output.verified.txt │ │ │ │ ├── LongOptionMustHaveMoreThanOneCharacter.Output.verified.txt │ │ │ │ ├── MissingLongAndShortName.Output.verified.txt │ │ │ │ ├── MultipleOptionValuesAreNotSupported.Output.verified.txt │ │ │ │ ├── MultipleValuesAreNotSupported.Output.verified.txt │ │ │ │ ├── OptionNamesCannotStartWithDigit.Output.verified.txt │ │ │ │ ├── OptionsMustHaveName.Output.verified.txt │ │ │ │ ├── ShortOptionMustOnlyBeOneCharacter.Output.verified.txt │ │ │ │ ├── UnexpectedCharacter.Output.verified.txt │ │ │ │ ├── UnterminatedValueName.Output.verified.txt │ │ │ │ └── ValuesMustHaveName.Output.verified.txt │ │ │ ├── Help/ │ │ │ │ ├── ArgumentOrder.Output.verified.txt │ │ │ │ ├── Command.Output.verified.txt │ │ │ │ ├── CommandExamples.Output.verified.txt │ │ │ │ ├── Default.Output.verified.txt │ │ │ │ ├── DefaultExamples.Output.verified.txt │ │ │ │ ├── Hidden_Command_Options.Output.verified.txt │ │ │ │ ├── Hidden_Commands.Output.verified.txt │ │ │ │ ├── Leaf.Output.verified.txt │ │ │ │ ├── NoDescription.Output.verified.txt │ │ │ │ ├── Root.Output.verified.txt │ │ │ │ ├── RootExamples.Output.verified.txt │ │ │ │ ├── RootExamples_Children.Output.verified.txt │ │ │ │ └── RootExamples_Leafs.Output.verified.txt │ │ │ ├── Parsing/ │ │ │ │ ├── CannotAssignValueToFlag/ │ │ │ │ │ ├── Test_1.Output.verified.txt │ │ │ │ │ └── Test_2.Output.verified.txt │ │ │ │ ├── InvalidShortOptionName/ │ │ │ │ │ └── Test_1.Output.verified.txt │ │ │ │ ├── LongOptionNameContainSymbol/ │ │ │ │ │ └── Test_1.Output.verified.txt │ │ │ │ ├── LongOptionNameIsMissing/ │ │ │ │ │ └── Test_1.Output.verified.txt │ │ │ │ ├── LongOptionNameIsOneCharacter/ │ │ │ │ │ └── Test_1.Output.verified.txt │ │ │ │ ├── LongOptionNameStartWithDigit/ │ │ │ │ │ └── Test_1.Output.verified.txt │ │ │ │ ├── NoMatchingArgument/ │ │ │ │ │ └── Test_1.Output.verified.txt │ │ │ │ ├── NoValueForOption/ │ │ │ │ │ ├── Test_1.Output.verified.txt │ │ │ │ │ └── Test_2.Output.verified.txt │ │ │ │ ├── OptionWithoutName/ │ │ │ │ │ ├── Test_1.Output.verified.txt │ │ │ │ │ ├── Test_2.Output.verified.txt │ │ │ │ │ ├── Test_3.Output.verified.txt │ │ │ │ │ ├── Test_4.Output.verified.txt │ │ │ │ │ └── Test_5.Output.verified.txt │ │ │ │ ├── UnexpectedOption/ │ │ │ │ │ ├── Test_1.Output.verified.txt │ │ │ │ │ └── Test_2.Output.verified.txt │ │ │ │ ├── UnknownCommand/ │ │ │ │ │ ├── Test_1.Output.verified.txt │ │ │ │ │ ├── Test_2.Output.verified.txt │ │ │ │ │ ├── Test_3.Output.verified.txt │ │ │ │ │ ├── Test_4.Output.verified.txt │ │ │ │ │ ├── Test_5.Output.verified.txt │ │ │ │ │ ├── Test_6.Output.verified.txt │ │ │ │ │ ├── Test_7.Output.verified.txt │ │ │ │ │ └── Test_8.Output.verified.txt │ │ │ │ └── UnknownOption/ │ │ │ │ ├── Test_1.Output.verified.txt │ │ │ │ └── Test_2.Output.verified.txt │ │ │ └── Xml/ │ │ │ ├── Hidden_Command_Options.Output.verified.txt │ │ │ ├── Test_1.Output.verified.txt │ │ │ ├── Test_2.Output.verified.txt │ │ │ ├── Test_3.Output.verified.txt │ │ │ ├── Test_4.Output.verified.txt │ │ │ ├── Test_5.Output.verified.txt │ │ │ └── Test_6.Output.verified.txt │ │ ├── Exception/ │ │ │ ├── CallSite.Output.verified.txt │ │ │ ├── Default.Output.verified.txt │ │ │ ├── GenericException.Output_exceptionFormats=Default.verified.txt │ │ │ ├── GenericException.Output_exceptionFormats=ShortenEverything.verified.txt │ │ │ ├── GenericException.Output_exceptionFormats=ShortenMethods.verified.txt │ │ │ ├── GenericException.Output_exceptionFormats=ShortenTypes.verified.txt │ │ │ ├── InnerException.Output.verified.txt │ │ │ ├── NoStackTrace.Output.verified.txt │ │ │ ├── OutParam.Output.verified.txt │ │ │ ├── ShortenedMethods.Output.verified.txt │ │ │ ├── ShortenedTypes.Output.verified.txt │ │ │ └── Tuple.Output.verified.txt │ │ ├── Live/ │ │ │ ├── Progress/ │ │ │ │ └── Render_ReduceWidth.Output.verified.txt │ │ │ └── Status/ │ │ │ └── Render.Output.verified.txt │ │ ├── Prompts/ │ │ │ └── Text/ │ │ │ ├── AcceptChoice.Output.verified.txt │ │ │ ├── AutoComplete_BestMatch.Output.verified.txt │ │ │ ├── AutoComplete_Empty.Output.verified.txt │ │ │ ├── AutoComplete_NextChoice.Output.verified.txt │ │ │ ├── AutoComplete_PreviousChoice.Output.verified.txt │ │ │ ├── ChoicesStyleNotSet.Output.verified.txt │ │ │ ├── ChoicesStyleSet.Output.verified.txt │ │ │ ├── ClearOnFinish.Output.verified.txt │ │ │ ├── ConversionError.Output.verified.txt │ │ │ ├── CustomConverter.Output.verified.txt │ │ │ ├── CustomValidation.Output.verified.txt │ │ │ ├── DefaultValue.Output.verified.txt │ │ │ ├── DefaultValueStyleNotSet.Output.verified.txt │ │ │ ├── DefaultValueStyleSet.Output.verified.txt │ │ │ ├── InvalidChoice.Output.verified.txt │ │ │ ├── InvalidDefaultChoice.Output.verified.txt │ │ │ ├── NoSuffix.Output.verified.txt │ │ │ ├── SecretDefaultValue.Output.verified.txt │ │ │ ├── SecretDefaultValueCustomMask.Output.verified.txt │ │ │ ├── SecretDefaultValueNullMask.Output.verified.txt │ │ │ └── SecretValueBackspaceNullMask.Output.verified.txt │ │ ├── Rendering/ │ │ │ └── Borders/ │ │ │ ├── Box/ │ │ │ │ ├── AsciiBorder.Output.verified.txt │ │ │ │ ├── DoubleBorder.Output.verified.txt │ │ │ │ ├── HeavyBorder.Output.verified.txt │ │ │ │ ├── NoBorder.Output.verified.txt │ │ │ │ ├── NoBorder_With_Header.Output.verified.txt │ │ │ │ ├── RoundedBorder.Output.verified.txt │ │ │ │ └── SquareBorder.Output.verified.txt │ │ │ └── Table/ │ │ │ ├── Ascii2Border.Output.verified.txt │ │ │ ├── AsciiBorder.Output.verified.txt │ │ │ ├── AsciiDoubleHeadBorder.Output.verified.txt │ │ │ ├── DoubleBorder.Output.verified.txt │ │ │ ├── DoubleEdgeBorder.Output.verified.txt │ │ │ ├── HeavyBorder.Output.verified.txt │ │ │ ├── HeavyEdgeBorder.Output.verified.txt │ │ │ ├── HeavyHeadBorder.Output.verified.txt │ │ │ ├── HorizontalBorder.Output.verified.txt │ │ │ ├── MarkdownBorder.Output.verified.txt │ │ │ ├── MarkdownBorder_Centered.Output.verified.txt │ │ │ ├── MarkdownBorder_LeftAligned.Output.verified.txt │ │ │ ├── MarkdownBorder_RightAligned.Output.verified.txt │ │ │ ├── MinimalBorder.Output.verified.txt │ │ │ ├── MinimalDoubleHeadBorder.Output.verified.txt │ │ │ ├── MinimalHeavyHeadBorder.Output.verified.txt │ │ │ ├── MinimalistBorder.Output.verified.txt │ │ │ ├── NoBorder.Output.verified.txt │ │ │ ├── RoundedBorder.Output.verified.txt │ │ │ ├── SimpleBorder.Output.verified.txt │ │ │ ├── SimpleHeavyBorder.Output.verified.txt │ │ │ └── SquareBorder.Output.verified.txt │ │ ├── TableRowCollectionTests.TheUpdateMethod.Should_Update_Row.verified.txt │ │ ├── TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_Renderable.verified.txt │ │ ├── TableRowCollectionTests.TheUpdateMethod.Should_Update_Row_With_String.verified.txt │ │ └── Widgets/ │ │ ├── Align/ │ │ │ ├── Center_Bottom.Output.verified.txt │ │ │ ├── Center_Middle.Output.verified.txt │ │ │ ├── Center_Top.Output.verified.txt │ │ │ ├── Left_Bottom.Output.verified.txt │ │ │ ├── Left_Middle.Output.verified.txt │ │ │ ├── Left_Top.Output.verified.txt │ │ │ ├── Right_Bottom.Output.verified.txt │ │ │ ├── Right_Middle.Output.verified.txt │ │ │ └── Right_Top.Output.verified.txt │ │ ├── BarChart/ │ │ │ ├── Fixed_Max_Value.Output.verified.txt │ │ │ ├── Render.Output.verified.txt │ │ │ └── Zero_Value.Output.verified.txt │ │ ├── BreakdownChart/ │ │ │ ├── Ansi.Output.verified.txt │ │ │ ├── Culture.Output.verified.txt │ │ │ ├── Default.Output.verified.txt │ │ │ ├── FullSize.Output.verified.txt │ │ │ ├── HideTagValues.Output.verified.txt │ │ │ ├── HideTags.Output.verified.txt │ │ │ ├── TagFormat.Output.verified.txt │ │ │ ├── ValueColor.Output.verified.txt │ │ │ └── Width.Output.verified.txt │ │ ├── Calendar/ │ │ │ ├── Centered.Output.verified.txt │ │ │ ├── Culture.Output.verified.txt │ │ │ ├── LeftAligned.Output.verified.txt │ │ │ ├── Render.Output.verified.txt │ │ │ └── RightAligned.Output.verified.txt │ │ ├── Canvas/ │ │ │ ├── Render.NonUnicode.verified.txt │ │ │ ├── Render.Unicode.verified.txt │ │ │ ├── Render_MaxWidth.NonUnicode.verified.txt │ │ │ ├── Render_MaxWidth.Unicode.verified.txt │ │ │ ├── Render_NarrowTerminal.NonUnicode.verified.txt │ │ │ ├── Render_NarrowTerminal.Unicode.verified.txt │ │ │ ├── Render_Nested.NonUnicode.verified.txt │ │ │ └── Render_Nested.Unicode.verified.txt │ │ ├── Columns/ │ │ │ └── Render.Output.verified.txt │ │ ├── Figlet/ │ │ │ ├── Load_Stream.Output_fontfile=poison.flf.verified.txt │ │ │ ├── Load_Stream.Output_fontfile=starwars.flf.verified.txt │ │ │ ├── Render.Output.verified.txt │ │ │ ├── Render_Centered.Output.verified.txt │ │ │ ├── Render_LeftAligned.Output.verified.txt │ │ │ ├── Render_RightAligned.Output.verified.txt │ │ │ └── Render_Wrapped.Output.verified.txt │ │ ├── Grid/ │ │ │ ├── AddEmptyRow/ │ │ │ │ └── Render.Output.verified.txt │ │ │ ├── Render.Output.verified.txt │ │ │ ├── Render_2.Output.verified.txt │ │ │ ├── Render_Alignment.Output.verified.txt │ │ │ ├── Render_Cell_Markup_Overflow.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_Crop.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_Ellipsis.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_Fold.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_With_NoWrap.Output.verified.txt │ │ │ ├── Render_ExplicitPadding.Output.verified.txt │ │ │ └── Render_Padding.Output.verified.txt │ │ ├── Json/ │ │ │ ├── Render_Compact_Json.Output.verified.txt │ │ │ └── Render_Json.Output.verified.txt │ │ ├── Layout/ │ │ │ ├── Render_Empty_Layout.Output.verified.txt │ │ │ ├── Render_Fallback_Layout.Output.verified.txt │ │ │ ├── Render_Layout.Output.verified.txt │ │ │ ├── Render_Layout_With_Columns.Output.verified.txt │ │ │ ├── Render_Layout_With_Nested_Columns.Output.verified.txt │ │ │ ├── Render_Layout_With_Nested_Rows.Output.verified.txt │ │ │ ├── Render_Layout_With_Nested_Rows_And_Columns.Output.verified.txt │ │ │ ├── Render_Layout_With_Nested_Three_Rows_In_One_Column.Output_17.verified.txt │ │ │ ├── Render_Layout_With_Nested_Three_Rows_In_One_Column.Output_20.verified.txt │ │ │ ├── Render_Layout_With_Nested_Three_Rows_In_One_Column.Output_23.verified.txt │ │ │ ├── Render_Layout_With_Nested_Three_Rows_In_One_Column.Output_28.verified.txt │ │ │ ├── Render_Layout_With_Nested_Three_Rows_In_One_Column.Output_30.verified.txt │ │ │ ├── Render_Layout_With_Nested_Three_Rows_In_One_Column.Output_31.verified.txt │ │ │ ├── Render_Layout_With_Respect_To_Minimum_Size.Output.verified.txt │ │ │ ├── Render_Layout_With_Respect_To_Ratio.Output.verified.txt │ │ │ ├── Render_Layout_With_Respect_To_Size.Output.verified.txt │ │ │ ├── Render_Layout_With_Rows.Output.verified.txt │ │ │ └── Render_Layout_Without_Invisible_Children.Output.verified.txt │ │ ├── Padder/ │ │ │ ├── Render.Output.verified.txt │ │ │ ├── Render_Expanded.Output.verified.txt │ │ │ └── Render_Nested.Output.verified.txt │ │ ├── Panel/ │ │ │ ├── Render.Output.verified.txt │ │ │ ├── Render_CJK.Output.verified.txt │ │ │ ├── Render_Child_Centered.Output.verified.txt │ │ │ ├── Render_Child_Panel.Output.verified.txt │ │ │ ├── Render_Child_RightAligned.Output.verified.txt │ │ │ ├── Render_Expand.Output.verified.txt │ │ │ ├── Render_Header.Output.verified.txt │ │ │ ├── Render_Header_Centered.Output.verified.txt │ │ │ ├── Render_Header_Collapse.Output.verified.txt │ │ │ ├── Render_Header_LeftAligned.Output.verified.txt │ │ │ ├── Render_Header_RightAligned.Output.verified.txt │ │ │ ├── Render_Height.Output.verified.txt │ │ │ ├── Render_LineEndings.Output.verified.txt │ │ │ ├── Render_Markup_Overflow_Ellipsis.Output.verified.txt │ │ │ ├── Render_Multiline.Output.verified.txt │ │ │ ├── Render_Nested_Panel_With_Overflow.Output.verified.txt │ │ │ ├── Render_Padding.Output.verified.txt │ │ │ ├── Render_Text_Overflow_Crop.Output.verified.txt │ │ │ ├── Render_Text_Overflow_Ellipsis.Output.verified.txt │ │ │ ├── Render_Text_Overflow_Fold.Output.verified.txt │ │ │ ├── Render_Text_Overflow_With_Padding.Output.verified.txt │ │ │ ├── Render_Unicode.Output.verified.txt │ │ │ ├── Render_Width.Output.verified.txt │ │ │ ├── Render_Width_Height.Output.verified.txt │ │ │ ├── Render_Width_MaxWidth.Output.verified.txt │ │ │ ├── Render_Wrap.Output.verified.txt │ │ │ └── Render_ZeroPadding.Output.verified.txt │ │ ├── ProgressBar/ │ │ │ ├── Formatted.Output.verified.txt │ │ │ └── Render.Output.verified.txt │ │ ├── Recorder/ │ │ │ ├── Html.Output.verified.txt │ │ │ └── Text.Output.verified.txt │ │ ├── Rows/ │ │ │ ├── GH-1188-Rows.Output.verified.txt │ │ │ ├── Render.Output.verified.txt │ │ │ ├── Render_Empty.Output.verified.txt │ │ │ ├── Render_Expanded_And_Nested.Output.verified.txt │ │ │ └── Render_Nested.Output.verified.txt │ │ ├── Rule/ │ │ │ ├── Render.Output.verified.txt │ │ │ ├── Render_Border_Header.Output.verified.txt │ │ │ ├── Render_Border_NoHeader.Output.verified.txt │ │ │ ├── Render_Header_DefaultAlignment.Output.verified.txt │ │ │ ├── Render_Header_LeftAligned.Output.verified.txt │ │ │ ├── Render_Header_RightAligned.Output.verified.txt │ │ │ ├── Render_Linebreaks.Output.verified.txt │ │ │ └── Render_Truncate.Output.verified.txt │ │ ├── Table/ │ │ │ ├── AddEmptyRow.Output.verified.txt │ │ │ ├── Render.Output.verified.txt │ │ │ ├── Render_CellPadding.Output.verified.txt │ │ │ ├── Render_Cell_Markup_Overflow.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_Crop.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_Ellipsis.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_Fold.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_Multiple_Rows.Output.verified.txt │ │ │ ├── Render_Cell_Overflow_With_NoWrap.Output.verified.txt │ │ │ ├── Render_Centered.Align_Widget.verified.txt │ │ │ ├── Render_Centered.Output.verified.txt │ │ │ ├── Render_ColumnJustification.Output.verified.txt │ │ │ ├── Render_ColumnSpan_2.Output.verified.txt │ │ │ ├── Render_ColumnSpan_3.Output.verified.txt │ │ │ ├── Render_ColumnSpan_All.Output.verified.txt │ │ │ ├── Render_ColumnSpan_LeftAligned.Output.verified.txt │ │ │ ├── Render_ColumnSpan_Multiline.Output.verified.txt │ │ │ ├── Render_ColumnSpan_Multiple.Output.verified.txt │ │ │ ├── Render_ColumnSpan_NoBorder.Output.verified.txt │ │ │ ├── Render_EA_Character.Output.verified.txt │ │ │ ├── Render_Empty_Column.Output.verified.txt │ │ │ ├── Render_Expand.Output.verified.txt │ │ │ ├── Render_Fold.Output.verified.txt │ │ │ ├── Render_Footers.Output.verified.txt │ │ │ ├── Render_Impossible.Output.verified.txt │ │ │ ├── Render_LeftAligned.Align_Widget.verified.txt │ │ │ ├── Render_LeftAligned.Output.verified.txt │ │ │ ├── Render_Multiline.Output.verified.txt │ │ │ ├── Render_Nested.Output.verified.txt │ │ │ ├── Render_NoRows.Output.verified.txt │ │ │ ├── Render_RightAligned.Align_Widget.verified.txt │ │ │ ├── Render_RightAligned.Output.verified.txt │ │ │ ├── Render_Row_Separators.Output.verified.txt │ │ │ ├── Render_Row_Separators_No_Header.Output.verified.txt │ │ │ ├── Render_Title_Caption.Output.verified.txt │ │ │ ├── Render_Title_Caption_Centered.Output.verified.txt │ │ │ ├── Render_Title_Caption_LeftAligned.Output.verified.txt │ │ │ ├── Render_Title_Caption_LowerCase.Output.verified.txt │ │ │ ├── Render_Title_Caption_RightAligned.Output.verified.txt │ │ │ └── Rows/ │ │ │ ├── Add.Output.verified.txt │ │ │ ├── Extensions/ │ │ │ │ ├── Add.Renderables.verified.txt │ │ │ │ ├── Add.Strings.verified.txt │ │ │ │ ├── Insert.Renderables.verified.txt │ │ │ │ ├── Insert.Strings.verified.txt │ │ │ │ └── Remove.Output.verified.txt │ │ │ ├── Insert.Output.verified.txt │ │ │ └── Remove.Output.verified.txt │ │ ├── TextPath/ │ │ │ └── GH-1307.Output.verified.txt │ │ └── Tree/ │ │ ├── Render.Output.verified.txt │ │ └── Render_NoChildren.Output.verified.txt │ ├── Extensions/ │ │ ├── ConsoleKeyExtensions.cs │ │ └── StreamExtensions.cs │ ├── Legacy/ │ │ ├── Color.Generated.cs │ │ ├── Emoji.Generated.cs │ │ └── Spinner.Generated.cs │ ├── Properties/ │ │ └── Usings.cs │ ├── Spectre.Console.Tests.csproj │ ├── Unit/ │ │ ├── AlternateScreenTests.cs │ │ ├── AnsiConsoleTests.Ansi.cs │ │ ├── AnsiConsoleTests.Colors.cs │ │ ├── AnsiConsoleTests.Cursor.cs │ │ ├── AnsiConsoleTests.Markup.cs │ │ ├── AnsiConsoleTests.MarkupInterpolated.cs │ │ ├── AnsiConsoleTests.Prompt.cs │ │ ├── AnsiConsoleTests.Style.cs │ │ ├── AnsiConsoleTests.cs │ │ ├── AnsiDetectorTests.cs │ │ ├── BackwardsCompatibilityTests.cs │ │ ├── EmojiTests.cs │ │ ├── ExceptionTests.cs │ │ ├── InteractionDetectorTests.cs │ │ ├── Internal/ │ │ │ ├── FileSizeTests.cs │ │ │ └── WhiteSpaceSegmentEnumeratorTests.cs │ │ ├── Live/ │ │ │ ├── Progress/ │ │ │ │ ├── DownloadedColumnTests.cs │ │ │ │ ├── ProgressColumnFixture.cs │ │ │ │ ├── ProgressTaskTests.cs │ │ │ │ └── ProgressTests.cs │ │ │ └── StatusTests.cs │ │ ├── Prompts/ │ │ │ ├── ListPromptStateTests.cs │ │ │ ├── MultiSelectionPromptTests.cs │ │ │ ├── SelectionPromptTests.cs │ │ │ └── TextPromptTests.cs │ │ ├── RecorderTests.cs │ │ ├── Rendering/ │ │ │ ├── Borders/ │ │ │ │ ├── BoxBorderTests.cs │ │ │ │ └── TableBorderTests.cs │ │ │ ├── RenderHookTests.cs │ │ │ ├── SegmentShapeTests.cs │ │ │ └── SegmentTests.cs │ │ └── Widgets/ │ │ ├── AlignTests.cs │ │ ├── BarChartTests.cs │ │ ├── BreakdownChartTests.cs │ │ ├── CalendarTests.cs │ │ ├── CanvasTests.cs │ │ ├── ColumnsTests.cs │ │ ├── FigletTests.cs │ │ ├── GridTests.cs │ │ ├── JsonTextTests.cs │ │ ├── LayoutTests.cs │ │ ├── MarkupTests.cs │ │ ├── PadderTests.cs │ │ ├── PanelTests.cs │ │ ├── ProgressBarTests.cs │ │ ├── RowsTests.cs │ │ ├── RuleTests.cs │ │ ├── Table/ │ │ │ ├── TableRowCollectionExtensionsTests.cs │ │ │ ├── TableRowCollectionTests.cs │ │ │ └── TableTests.cs │ │ ├── TextPathTests.cs │ │ ├── TextTests.cs │ │ └── TreeTests.cs │ ├── Utilities/ │ │ ├── EmbeddedResourceReader.cs │ │ ├── FakeTimeProvider.cs │ │ ├── GitHubIssueAttribute.cs │ │ ├── ModuleInitializerAttribute.cs │ │ └── TestConsoleExtensions.cs │ └── VerifyConfiguration.cs └── Spectre.Console.slnx ================================================ FILE CONTENTS ================================================ ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 end_of_line = LF indent_style = space indent_size = 4 insert_final_newline = false trim_trailing_whitespace = true [*.{sln,slnx}] indent_style = tab [*.{csproj,vbproj,vcxproj,vcxproj.filters}] indent_size = 2 [*.{xml,config,props,targets,nuspec,ruleset}] indent_size = 2 [*.{yml,yaml}] indent_size = 2 [*.json] indent_size = 2 [*.md] trim_trailing_whitespace = false ================================================ FILE: .git-blame-ignore-revs ================================================ # Use file scoped namespace declarations 7b2da0a4f63bf3ceab99d2c88535e74155f2b99c # fix line-endings e2ad4b1ea5555e701cda4fd400bb6592e318e1ff ================================================ FILE: .gitattributes ================================================ * text=auto *.cs text eol=lf *.md text eol=lf ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Create a report to help us improve title: '' labels: ["needs triage"] type: ["bug"] assignees: '' --- **Information** - OS: [eg Windows/Linux/MacOS] - Version: [e.g. 0.33.0] - Terminal: [e.g Windows Terminal] **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior. **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Additional context** Add any other context about the problem here. --- Please upvote :+1: this issue if you are interested in it. ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an idea for this project title: '' labels: ["needs triage"] type: ["feature"] assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. --- Please upvote :+1: this issue if you are interested in it. ================================================ FILE: .github/pull_request_template.md ================================================ Fixes # - [ ] I have read the [Contribution Guidelines](https://github.com/spectreconsole/spectre.console/blob/main/CONTRIBUTING.md) - [ ] I have checked that there isn't already another pull request that solves the above issue - [ ] All newly added code is adequately covered by tests - [ ] All existing tests are still running without errors ## Changes --- Please upvote :+1: this pull request if you are interested in it. ================================================ FILE: .github/renovate.json ================================================ { "$schema": "https://docs.renovatebot.com/renovate-schema.json", "extends": [ "config:base" ], "dependencyDashboard": false, "commitMessagePrefix": "chore:", "labels": ["dependencies"], "npm": { "ignorePaths": [ "**/node_modules/**", "**/bower_components/**" ] }, "ignorePaths": [ "resources/scripts/**" ] } ================================================ FILE: .github/workflows/ci.yaml ================================================ # yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json name: Pull Request on: pull_request env: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true DOTNET_CLI_TELEMETRY_OPTOUT: true jobs: ################################################### # BUILD ################################################### build: name: Build runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Setup .NET SDK (global.json) uses: actions/setup-dotnet@v5 - name: Build shell: bash run: | dotnet tool restore dotnet make - name: Upload Verify Test Results if: failure() uses: actions/upload-artifact@v7 with: name: verify-test-results path: | **/*.received.* ================================================ FILE: .github/workflows/publish.yaml ================================================ # yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json name: Publish on: push: tags: - '*' branches: - main permissions: id-token: write env: DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true DOTNET_CLI_TELEMETRY_OPTOUT: true jobs: ################################################### # PUBLISH ################################################### build: name: Publish NuGet Packages runs-on: windows-latest steps: - name: Checkout uses: actions/checkout@v6 with: fetch-depth: 0 - name: Azure login uses: azure/login@v3 with: client-id: ${{ secrets.AZURE_CLIENT_ID }} tenant-id: ${{ secrets.AZURE_TENANT_ID }} allow-no-subscriptions: true - name: Setup .NET SDK (global.json) uses: actions/setup-dotnet@v5 - name: Publish shell: bash run: | dotnet tool restore dotnet make publish --sign \ --nuget-key="${{secrets.NUGET_SIGNING_API_KEY}}" \ --keyvaultUrl="${{secrets.SIGN_KEYVAULT_URL}}" \ --keyvaultCertificate="${{secrets.SIGN_KEYVAULT_CERTIFICATE}}" ================================================ FILE: .github/workflows/top-issues-dashboard.yml ================================================ name: Top issues action. on: schedule: - cron: '0 0 */1 * *' jobs: ShowAndLabelTopIssues: name: Display and label top issues. runs-on: ubuntu-latest steps: - name: Top Issues action uses: rickstaa/top-issues-action@v1.3.101 env: github_token: ${{ secrets.GITHUB_TOKEN }} with: top_list_size: 10 label: true dashboard: true dashboard_show_total_reactions: true top_issues: true top_bugs: true top_features: true feature_label: feature top_pull_requests: true ================================================ FILE: .gitignore ================================================ # Misc folders [Bb]in/ [Oo]bj/ [Tt]emp/ [Pp]ackages/ /.artifacts/ /[Tt]ools/ .idea .DS_Store # Sign tool .sign # .NET Core CLI /.dotnet/ /.packages/ dotnet-install.sh* *.lock.json # Benchmarks **/BenchmarkDotNet.Artifacts/**/*.* !**/BenchmarkDotNet.Artifacts/**/*.md # Visual Studio .vs/ .vscode/ launchSettings.json *.sln.ide/ # Rider src/.idea/**/workspace.xml src/.idea/**/tasks.xml src/.idea/dictionaries src/.idea/**/dataSources/ src/.idea/**/dataSources.ids src/.idea/**/dataSources.xml src/.idea/**/dataSources.local.xml src/.idea/**/sqlDataSources.xml src/.idea/**/dynamic.xml src/.idea/**/uiDesigner.xml ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. # User-specific files *.suo *.user *.sln.docstates *.userprefs *.GhostDoc.xml *StyleCop.Cache # Build results [Dd]ebug/ [Rr]elease/ x64/ *_i.c *_p.c *.ilk *.meta *.obj *.pch *.pdb *.pgc *.pgd *.rsp *.sbr *.tlb *.tli *.tlh *.tmp *.log *.vspscc *.vssscc .builds # Visual Studio profiler *.psess *.vsp *.vspx # ReSharper is a .NET coding add-in _ReSharper* # NCrunch .*crunch*.local.xml _NCrunch_* # NuGet Packages Directory packages # Windows Thumbs.db *.received.* node_modules ================================================ FILE: CODE_OF_CONDUCT.md ================================================ # Contributor Covenant Code of Conduct ## Our Pledge We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. ## Our Standards Examples of behavior that contributes to a positive environment for our community include: * Demonstrating empathy and kindness toward other people * Being respectful of differing opinions, viewpoints, and experiences * Giving and gracefully accepting constructive feedback * Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience * Focusing on what is best not just for us as individuals, but for the overall community Examples of unacceptable behavior include: * The use of sexualized language or imagery, and sexual attention or advances of any kind * Trolling, insulting or derogatory comments, and personal or political attacks * Public or private harassment * Publishing others' private information, such as a physical or email address, without their explicit permission * Other conduct which could reasonably be considered inappropriate in a professional setting ## Enforcement Responsibilities Community leaders are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. Community leaders have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. ## Scope This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the community leaders responsible for enforcement at conduct@dotnetfoundation.org. All complaints will be reviewed and investigated promptly and fairly. All community leaders are obligated to respect the privacy and security of the reporter of any incident. ## Enforcement Guidelines Community leaders will follow these Community Impact Guidelines in determining the consequences for any action they deem in violation of this Code of Conduct: ### 1. Correction **Community Impact**: Use of inappropriate language or other behavior deemed unprofessional or unwelcome in the community. **Consequence**: A private, written warning from community leaders, providing clarity around the nature of the violation and an explanation of why the behavior was inappropriate. A public apology may be requested. ### 2. Warning **Community Impact**: A violation through a single incident or series of actions. **Consequence**: A warning with consequences for continued behavior. No interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, for a specified period of time. This includes avoiding interactions in community spaces as well as external channels like social media. Violating these terms may lead to a temporary or permanent ban. ### 3. Temporary Ban **Community Impact**: A serious violation of community standards, including sustained inappropriate behavior. **Consequence**: A temporary ban from any sort of interaction or public communication with the community for a specified period of time. No public or private interaction with the people involved, including unsolicited interaction with those enforcing the Code of Conduct, is allowed during this period. Violating these terms may lead to a permanent ban. ### 4. Permanent Ban **Community Impact**: Demonstrating a pattern of violation of community standards, including sustained inappropriate behavior, harassment of an individual, or aggression toward or disparagement of classes of individuals. **Consequence**: A permanent ban from any sort of public interaction within the community. ## Attribution This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. Community Impact Guidelines were inspired by [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. For answers to common questions about this code of conduct, see the FAQ at [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at [https://www.contributor-covenant.org/translations][translations]. [homepage]: https://www.contributor-covenant.org [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html [Mozilla CoC]: https://github.com/mozilla/diversity [FAQ]: https://www.contributor-covenant.org/faq [translations]: https://www.contributor-covenant.org/translations ================================================ FILE: CONTRIBUTING.md ================================================ # Contribution Guidelines * [Prerequisites](#prerequisites) * [Definition of trivial contributions](#definition-of-trivial-contributions) * [Code](#code) * [Code style](#code-style) * [Dependencies](#dependencies) * [Unit tests](#unit-tests) * [Contributing process](#contributing-process) * [Get buyoff or find open community issues or features](#get-buyoff-or-find-open-community-issues-or-features) * [Set up your environment](#Set-up-your-environment) * [Prepare commits](#prepare-commits) * [Submit pull request](#Submit-pull-request) * [Respond to feedback on pull request](#respond-to-feedback-on-pull-request) * [Other general information](#other-general-information) * [Acknowledgement](#acknowledgement) ## Prerequisites By contributing to Spectre.Console, you assert that: * The contribution is your own original work. * You have the right to assign the copyright for the work (it is not owned by your employer, or you have been given copyright assignment in writing). * You [license](https://github.com/spectreconsole/spectre.console/blob/main/LICENSE) the contribution under the terms applied to the rest of the Spectre.Console project. * You agree to follow the [code of conduct](https://github.com/spectreconsole/spectre.console/blob/main/CODE_OF_CONDUCT.md). ## Definition of trivial contributions It's hard to define what is a trivial contribution. Sometimes even a 1 character change can be considered significant. Unfortunately because it can be subjective, the decision on what is trivial comes from the maintainers of the project and not from folks contributing to the project. What is generally considered trivial: * Fixing a typo. * Documentation changes. ## Code ### Code style Normal .NET coding guidelines apply. See the [Framework Design Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/) for more information. ### Dependencies The assembly `Spectre.Console` should have no dependencies except the .NET BCL library. ### Unit tests Make sure to run all unit tests before creating a pull request. Any new code should also have reasonable unit test coverage. ## Contributing process ### Get buyoff or find open community issues or features * Through GitHub, or through the [GitHub discussions](https://github.com/spectreconsole/spectre.console/discussions) (preferred), you talk about a feature you would like to see (or a bug), and why it should be in Spectre.Console. * If approved through the GitHub discussions, ensure an accompanying GitHub issue is created with information and a link back to the discussion. * Once you get a nod from someone in the Spectre.Console Team, you can start on the feature. * Alternatively, if a feature is on the issues list with the [good first issue](https://github.com/spectreconsole/spectre.console/labels/good%20first%20issue) label, it is open for a community member (contributor) to patch. You should comment that you are signing up for it on the issue so someone else doesn't also sign up for the work. ### Set up your environment * You create, or update, a fork of `spectreconsole/spectre.console` under your GitHub account. * From there you create a branch named specific to the feature. * In the branch you do work specific to the feature. * Please also observe the following: * No reformatting * No changing files that are not specific to the feature. * More covered below in the **Prepare commits** section. * Test your changes and please help us out by updating and implementing some automated tests. It is recommended that all contributors spend some time looking over the tests in the source code. You can't go wrong emulating one of the existing tests and then changing it specific to the behavior you are testing. * Please do not update your branch from the main branch unless we ask you to. See the responding to feedback section below. ### Prepare commits This section serves to help you understand what makes a good commit. A commit should observe the following: * A commit is a small logical unit that represents a change. * Should include new or changed tests relevant to the changes you are making. * No unnecessary whitespace. Check for whitespace with `git diff --check` and `git diff --cached --check` before commit. * You can stage parts of a file for commit. ### Submit pull request Prerequisites: * You are making commits in a feature branch. * All code should compile without errors or warnings. * All tests should be passing. Submitting PR: * Once you feel it is ready, submit the pull request to the `spectreconsole/spectre.console` repository against the `main` branch unless specifically requested to submit it against another branch. * In the case of a larger change that is going to require more discussion, please submit a PR sooner. Waiting until you are ready may mean more changes than you are interested in if the changes are taking things in a direction the maintainers do not want to go. * In the pull request, outline what you did and point to specific conversations (as in URLs) and issues that you are resolving. This is a tremendous help for us in evaluation and acceptance. * Once the pull request is in, please do not delete the branch or close the pull request (unless something is wrong with it). * One of the Spectre.Console team members, or one of the maintainers, will evaluate it within a reasonable time period (which is to say usually within 1-3 weeks). Some things get evaluated faster or fast tracked. We are human and we have active lives outside of open source so don't fret if you haven't seen any activity on your pull request within a month or two. We don't have a Service Level Agreement (SLA) for pull requests. Just know that we will evaluate your pull request. ### Respond to feedback on pull request We may have feedback for you to fix or change some things. We generally like to see that pushed against the same topic branch (it will automatically update the Pull Request). You can also fix/squash/rebase commits and push the same topic branch with `--force` (it's generally acceptable to do this on topic branches not in the main repository, it is generally unacceptable and should be avoided at all costs against the main repository). If we have comments or questions when we do evaluate it and receive no response, it will probably lessen the chance of getting accepted. Eventually, this means it will be closed if it is not accepted. Please know this doesn't mean we don't value your contribution, just that things go stale. If in the future you want to pick it back up, feel free to address our concerns/questions/feedback and reopen the issue/open a new PR (referencing old one). Sometimes we may need you to rebase your commit against the latest code before we can review it further. If this happens, you can do the following: * `git fetch upstream` (upstream remote would be `spectreconsole/spectre.console`) * `git checkout main` * `git rebase upstream/main` * `git checkout your-branch` * `git rebase main` * Fix any merge conflicts * `git push origin your-branch` (origin would be your GitHub repo or `your-github-username/spectre.console` in this case). You may need to `git push origin your-branch --force` to get the commits pushed. This is generally acceptable with topic branches not in the mainstream repository. The only reasons a pull request should be closed and resubmitted are as follows: * When the pull request is targeting the wrong branch (this doesn't happen as often). * When there are updates made to the original by someone other than the original contributor. Then the old branch is closed with a note on the newer branch this supersedes #github_number. ## Other general information If you reformat code or hit core functionality without an approval from a person on the Spectre.Console Team, it's likely that no matter how awesome it looks afterwards, it will probably not get accepted. Reformatting code makes it harder for us to evaluate exactly what was changed. If you do these things, it will be make evaluation and acceptance easy. Now if you stray outside of the guidelines we have above, it doesn't mean we are going to ignore your pull request. It will just make things harder for us. Harder for us roughly translates to a longer SLA for your pull request. ## Acknowledgement This contribution guide was taken from the [Chocolatey project](https://chocolatey.org/) with permission and was edited to follow Spectre.Console's conventions and processes. ================================================ FILE: LICENSE.md ================================================ MIT License Copyright (c) 2020 Patrik Svensson, Phil Scott, Nils Andresen Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: NuGet.Config ================================================ ================================================ FILE: README.fa.md ================================================ # `Spectre.Console` _[![Spectre.Console NuGet Version](https://img.shields.io/nuget/v/spectre.console.svg?style=flat&label=NuGet%3A%20Spectre.Console)](https://www.nuget.org/packages/spectre.console)_
یک کتابخانه .NET. که ایجاد Console Applicationهای زیبا و cross platform را آسان‌تر می‌کند. از کتابخانه عالی [Rich](https://github.com/willmcgugan/rich) برای پایتون، بسیار الهام گرفته شده است. ## فهرست 1. [امکانات](#features) 2. [نصب](#installing) 3. [مستندات](#documentation) 4. [مثال‌ها](#examples) 5. [مجوز](#license)

امکانات

* با در نظر گرفتن تست واحد نوشته شده است. * جداول، چارچوب‌ها، پنل‌ها و یک زبان نشانه گذاری که از [rich](https://github.com/willmcgugan/rich) الهام گرفته شده است را پشتیبانی می‌کند. * از رایج ترین پارامترهای SGR در هنگام فرم دهی متن مانند پررنگ، کم نور، اریب، زیرخط، خط زدن و چشمک زدن پشتیبانی می‌کند. * پشتیبانی از رنگ‌های 28/8/4/3-بیت در ترمینال. این کتابخانه توانایی ترمینال فعلی را تشخیص داده و در صورت لزوم رنگ‌ها را کاهش می‌دهد. ![Example](resources/example.png)

نصب

سریع ترین راه برای شروع `Spectre.Console` نصب از طریق NuGet Package می‌باشد.
dotnet add package Spectre.Console

مستندات

مستندات `Spectre.Console` را در اینجا می‌توایند پیدا کنید:
https://spectreconsole.net/

مثال‌ها

To see `Spectre.Console` in action, please see the [examples repository](https://github.com/spectreconsole/examples).

مجوز

Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
همانطور که Spectre.Console تحت مجوز MIT ارائه شده است؛ برای کسب اطلاعات بیشتر به مجوز مراجعه کنید. * برای SixLabors.ImageSharp، مشاهده کنید: https://github.com/SixLabors/ImageSharp/blob/master/LICENSE
================================================ FILE: README.jp.md ================================================ # `Spectre.Console` _[![Spectre.Console NuGet Version](https://img.shields.io/nuget/v/spectre.console.svg?style=flat&label=NuGet%3A%20Spectre.Console)](https://www.nuget.org/packages/spectre.console)_ 綺麗なコンソールアプリケーションを簡単に作成するための.NETライブラリです。 Python用の素晴らしい[Rich ライブラリ](https://github.com/willmcgugan/rich)に強く影響を受けています。 ## 目次 1. [特徴](#特徴) 2. [例](#例) 3. [使用方法](#使用方法) 3.1. [Static APIの利用](#static-apiの利用) 3.2. [コンソールの作成](#コンソールの作成) 4. [例の実行](#例の実行) 5. [クイックスタート](#クイックスタート) 6. [マークアップ](#マークアップ) 7. [絵文字](#絵文字) 8. [テーブル](#テーブル) 9. [例外](#例外) ## 特徴 * ユニットテストを意識して書いています。 * table、grid、panel、マークアップ言語に影響を受けた [rich](https://github.com/willmcgugan/rich) に対応しています。 * 太字、薄字、斜字、下線、斜線、点滅などの一般的なSGR parameters に対応しています。 * ターミナルで 3/4/8/24ビットカラーに対応しています。 ライブラリは現在のターミナルの性能を検知し、必要なカラーにダウングレードします ## 例 ![Example](resources/example.png) ## 使用方法 `Spectre.Console` APIはステートフルで、スレッドセーフではありません。 異なるスレッドからコンソールに書く必要がある場合、通常の`System.Console` APIを使用するときと同様、適切な注意を払ってください。 現在の端末がANSIエスケープシーケンスに対応していない場合、 `Spectre.Console`は、`System.Console` APIの利用に切り替わります。 _メモ: このライブラリは現在開発中で、APIは1.0のリリースまでの間に変更されたり、 削除されたりする可能性があります。_ ### Static APIの利用 `System.Console` APIでするように、テキストを出力したいだけの時にはstatic APIが最適ですが、綺麗です。 ```csharp AnsiConsole.Foreground = Color.CornflowerBlue; AnsiConsole.Decoration = Decoration.Underline | Decoration.Bold; AnsiConsole.WriteLine("Hello World!"); AnsiConsole.Reset(); AnsiConsole.MarkupLine("[bold yellow on red]{0}[/] [underline]world[/]!", "Goodbye"); ``` もし、デフォルトの`IAnsiConsole`への参照を取得したい場合、 `AnsiConsole.Console`経由でアクセスできます。 ### コンソールの作成 単体テスト中にコードの実行環境を制御したい場合など、 特定の機能をもつコンソールを明示的に作成すると便利なことがあります。 単体テストの一部としてコードで `AnsiConsole`を使わないことを推奨します。 ```csharp IAnsiConsole console = AnsiConsole.Create( new AnsiConsoleSettings() { Ansi = AnsiSupport.Yes, ColorSystem = ColorSystemSupport.TrueColor, Out = new StringWriter(), }); ``` _メモ: 主導でコンソールを作成しているときに特定のカラーシステムを指定できたとしても、 ユーザーのターミナルでは使えないかもしれないことを覚えておいてください。 テスト用にIAnsiConsoleを作成していない限り、 常に`ColorSystemSupport.Detect` と `AnsiSupport.Detect`を使用してください。_ ## 例の実行 Spectre.Consoleでできることを見るために、 [dotnet-example](https://github.com/patriksvensson/dotnet-example)グローバルツールをインストールします。 ``` > dotnet tool restore ``` このリポジトリで提供している例が一覧表示されます ``` > dotnet example ╭────────────┬───────────────────────────────────────┬──────────────────────────────────────────────────────╮ │ Name │ Path │ Description │ ├────────────┼───────────────────────────────────────┼──────────────────────────────────────────────────────┤ │ Borders │ examples/Borders/Borders.csproj │ Demonstrates the different kind of borders. │ │ Calendars │ examples/Calendars/Calendars.csproj │ Demonstrates how to render calendars. │ │ Colors │ examples/Colors/Colors.csproj │ Demonstrates how to use colors in the console. │ │ Columns │ examples/Columns/Columns.csproj │ Demonstrates how to render data into columns. │ │ Emojis │ examples/Emojis/Emojis.csproj │ Demonstrates how to render emojis. │ │ Exceptions │ examples/Exceptions/Exceptions.csproj │ Demonstrates how to render formatted exceptions. │ │ Grids │ examples/Grids/Grids.csproj │ Demonstrates how to render grids in a console. │ │ Info │ examples/Info/Info.csproj │ Displays the capabilities of the current console. │ │ Links │ examples/Links/Links.csproj │ Demonstrates how to render links in a console. │ │ Panels │ examples/Panels/Panels.csproj │ Demonstrates how to render items in panels. │ │ Rules │ examples/Rules/Rules.csproj │ Demonstrates how to render horizontal rules (lines). │ │ Tables │ examples/Tables/Tables.csproj │ Demonstrates how to render tables in a console. │ │ Trees │ examples/Trees/Trees.csproj │ Demonstrates how to render trees in a console. │ ╰────────────┴───────────────────────────────────────┴──────────────────────────────────────────────────────╯ ``` そして、例を実行します ``` > dotnet example tables ┌──────────┬──────────┬────────┐ │ Foo │ Bar │ Baz │ ├──────────┼──────────┼────────┤ │ Hello │ World! │ │ │ Bonjour │ le │ monde! │ │ Hej │ Världen! │ │ └──────────┴──────────┴────────┘ ``` ## クイックスタート pectre.Consoleの利用を開始する最初の方法は、Nugetパッケージをインストールすることです。 ```shell > dotnet add package Spectre.Console ``` その後、`Spectre.Console`名前空間を参照する必要があります。一度参照したら、提供されている全ての機能を使用できます。 ```csharp using Spectre.Console public static class Program { public static void Main(string[] args) { AnsiConsole.Markup("[underline red]Hello[/] World!"); } } ``` ## マークアップ `Markup`クラスは、コンソールにリッチなテキストを出力することができます。 ### 文法 コンソールマークアップはbbcodeに影響を受けた文法を利用します。角括弧でスタイルを書いたら(スタイルを参照)、例えば、`[bold red]` は、`[/]`で閉じるまでスタイルが適用されます。 ```csharp AnsiConsole.Render(new Markup("[bold yellow]Hello[/] [red]World![/]")); ``` `Markup` クラスは`IRenderable`を実装しており、table、grid、Panelを使用できることを意味します。 `IRenderable`のレンダリングに対応している多くのクラスは、リッチテキストの描画を上書きます。 ```csharp var table = new Table(); table.AddColumn(new TableColumn(new Markup("[yellow]Foo[/]"))); table.AddColumn(new TableColumn("[blue]Bar[/]")); ``` ### 便利なメソッド `AnsiConsole`には、新しい`Markup`インスタンスをインスタンス化することなく、コンソールにマークアップテキストを書き込める便利なメソッドがあります。 ```csharp AnsiConsole.Markup("[underline green]Hello[/] "); AnsiConsole.MarkupLine("[bold]World[/]"); ``` ### エスケープ文字列 `[`を出力するために、 `[[`を利用し、`]`を出力するために`]]`を利用します。 ```csharp AnsiConsole.Markup("[[Hello]] "); // [Hello] AnsiConsole.Markup("[red][[World]][/]"); // [World] ``` `SafeMarkup`拡張メソッドを使用することもできます。 ```csharp AnsiConsole.Markup("[red]{0}[/]", "Hello [World]".SafeMarkup()); ``` ### カラー `new Style(foreground: Color.Maroon)`のようなコード、または、`AnsiConsole.Markup("[maroon on blue]Hello[/]")`のようなマークアップテキストで色を使用できます。 ### 背景色の設定 カラー指定の際に、`on`を付けることで、マークアップで背景色を設定できます。 ``` [bold yellow on blue]Hello[/] [default on blue]World[/] ``` ### 絵文字の描画 マークアップの一部として絵文字を出力するために、emojiショートコードが使用できます。 ```csharp AnsiConsole.MarkupLine("Hello :globe_showing_europe_africa:!"); ``` emojiのスタイルについては、付録の[Emoji](./appendix/emojis) を参照してください。 ### カラー 上の例では、全ての色は名前で参照されています。 しかし、16進数やRGB表現をマークダウンで色指定に使用できます。 ```csharp AnsiConsole.Markup("[red]Foo[/] "); AnsiConsole.Markup("[#ff0000]Bar[/] "); AnsiConsole.Markup("[rgb(255,0,0)]Baz[/] "); ``` ## 絵文字 どのような絵文字が使用できるかは、使用しているOSやターミナルに依存し、どのように表示されるかは保証されません。絵文字の幅計算は正確ではないため、表、パネル、グリッドで使用する場合は表示がずれるかもしれません。 完全な互換性を確保するために、Unicode 13.0 より以前の`Emoji_Presentation`カテゴリにあるものだけを使用することを検討してください。 公式の絵文字一覧 https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt ```csharp // Markup AnsiConsole.MarkupLine("Hello :globe_showing_europe_africa:!"); // Constant var hello = "Hello " + Emoji.Known.GlobeShowingEuropeAfrica; ``` テキスト内の絵文字を置き換えることができます。 ```csharp var phrase = "Mmmm :birthday_cake:"; var rendered ``` 既存の絵文字を別のものにしたり、完全に新しい物を追加したいことがあります。このために、`Emoji.Remap`メソッドを使用できます。 この方法は、マークアップ文字と`Emoji.Replace`の両方で動作します。 ```csharp // Remap the emoji Emoji.Remap("globe_showing_europe_africa", "😄"); // Render markup AnsiConsole.MarkupLine("Hello :globe_showing_europe_africa:!"); // Replace emojis in string var phrase = "Hello :globe_showing_europe_africa:!"; var rendered = Emoji.Replace(phrase); ``` ## テーブル テーブルはターミナルで表データを表示するのに完璧な方法です。 `Spectre.Console` は、テーブルの描画にとても優れていて、全てのカラムは中に合わせて調整してくれます。 `IRenderable`を実装しているものは、列ヘッダやセル、別のテーブルとして使用できます。 ### 使い方 テーブルを描画するために、`Table`インスタンスを作成し、必要な数の列を追加し、行を追加します。 テーブルをコンソールの`Render`メソッドに渡して終わりです。 ```csharp // テーブルの作成 var table = new Table(); // 列の追加 table.AddColumn("Foo"); table.AddColumn(new TableColumn("Bar").Centered()); // 行の追加 table.AddRow("Baz", "[green]Qux[/]"); table.AddRow(new Markup("[blue]Corgi[/]"), new Panel("Waldo")); // コンソールにテーブルの描画 AnsiConsole.Render(table); ``` ### 罫線 ```csharp // 罫線を設定します table.SetBorder(Border.None); table.SetBorder(Border.Ascii); table.SetBorder(Border.Square); table.SetBorder(Border.Rounded); ``` ### 拡大 / 縮小 ```csharp // テーブル幅を最大に設定します table.Expand(); // テーブル幅を最小に設定します table.Collapse(); ``` ### ヘッダーを隠す ```csharp // 全ての列のヘッダーを隠します table.HideHeaders(); ``` ### テーブル幅の設定 ```csharp // テーブル幅50セルに設定します table.SetWidth(50); ``` ### 整列(アライメント) ```csharp // 整列を明示的に設定する column.SetAlignment(Justify.Right); ``` ### パディング ```csharp // 左と右のパディングを設定する column.SetPadding(left: 3, right: 5); // 個別にパディングを設定する column.PadLeft(3); column.PadRight(5); ``` ### 列改行の無効化 ```csharp // 列改行の無効化 column.NoWrap(); ``` ### 列幅の設定 ```csharp // 列幅の設定(これはまだ柔軟な拡張メソッドがありません) column.Width = 15; ``` ## 例外 例外はターミナルで見たときに読みやすいとは限りません。 `WriteException`メソッドを使用することで、例外をもう少し読みやすくすることができます。 ```csharp AnsiConsole.WriteException(ex); ``` ### 例外の省略表示 例外の特定部分を短くして、さらに読みやすくしたり、パスをクリック可能なハイパーリンクにすることもできます。 ハイパーリンクがクリックできるかはターミナル次第です。 ```csharp AnsiConsole.WriteException(ex, ExceptionFormats.ShortenPaths | ExceptionFormats.ShortenTypes | ExceptionFormats.ShortenMethods | ExceptionFormats.ShowLinks); ``` ### 例外出力のカスタマイズ 例外の特定部分を短縮するだけでなく、デフォルトのスタイルを上書きすることもできます。 ```csharp AnsiConsole.WriteException(ex, new ExceptionSettings { Format = ExceptionFormats.ShortenEverything | ExceptionFormats.ShowLinks, Style = new ExceptionStyle { Exception = Style.WithForeground(Color.Grey), Message = Style.WithForeground(Color.White), NonEmphasized = Style.WithForeground(Color.Cornsilk1), Parenthesis = Style.WithForeground(Color.Cornsilk1), Method = Style.WithForeground(Color.Red), ParameterName = Style.WithForeground(Color.Cornsilk1), ParameterType = Style.WithForeground(Color.Red), Path = Style.WithForeground(Color.Red), LineNumber = Style.WithForeground(Color.Cornsilk1), } }); ``` ================================================ FILE: README.md ================================================ # `Spectre.Console` _[![Spectre.Console NuGet Version](https://img.shields.io/nuget/v/spectre.console.svg?style=flat&label=NuGet%3A%20Spectre.Console)](https://www.nuget.org/packages/spectre.console)_ [![Netlify Status](https://api.netlify.com/api/v1/badges/1eaf215a-eb9c-45e4-8c64-c90b62963149/deploy-status)](https://app.netlify.com/sites/spectreconsole/deploys) A .NET library that makes it easier to create beautiful, cross platform, console applications. It is heavily inspired by the excellent Python library, [Rich](https://github.com/willmcgugan/rich). Detailed instructions for using `Spectre.Console` are located on the project website, https://spectreconsole.net ## Table of Contents 1. [Features](#features) 1. [Installing](#installing) 1. [Documentation](#documentation) 1. [Examples](#examples) 1. [Code of Conduct](#code-of-conduct) 1. [.NET Foundation](#net-foundation) 1. [License](#license) ## Features * Supports tables, grids, panels, and a [Rich](https://github.com/willmcgugan/rich) inspired markup language. * Supports the most common SGR parameters when it comes to text styling such as bold, dim, italic, underline, strikethrough, and blinking text. * Supports 3/4/8/24-bit colors in the terminal. The library will detect the capabilities of the current terminal and downgrade colors as needed. * Written with unit testing in mind. ![Example](resources/example.png) ## Important Notices > [!IMPORTANT]\ > We use the [Top Issues Dashboard](https://github.com/spectreconsole/spectre.console/issues/1517) for tracking community demand. Please upvote :+1: the issues and pull requests you are interested in. ## Installing The fastest way of getting started using `Spectre.Console` is to install the NuGet package. ```csharp dotnet add package Spectre.Console ``` ## Documentation The documentation for `Spectre.Console` can be found at https://spectreconsole.net ## Examples To see `Spectre.Console` in action, please see the [examples repository](https://github.com/spectreconsole/examples). ## Code of Conduct This project has adopted the code of conduct defined by the Contributor Covenant to clarify expected behavior in our community. For more information see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). ## .NET Foundation This project is supported by the [.NET Foundation](https://dotnetfoundation.org). ## License Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray `Spectre.Console` is provided as-is under the MIT license. For more information see LICENSE. * SixLabors.ImageSharp, a library which `Spectre.Console` relies upon, is licensed under Apache 2.0 when distributed as part of `Spectre.Console`. The Six Labors Split License covers all other usage, see: https://github.com/SixLabors/ImageSharp/blob/master/LICENSE ================================================ FILE: README.pt-BR.md ================================================ # `Spectre.Console` _[![Spectre.Console NuGet Versão](https://img.shields.io/nuget/v/spectre.console.svg?style=flat&label=NuGet%3A%20Spectre.Console)](https://www.nuget.org/packages/spectre.console)_ Uma biblioteca .NET que torna mais fácil criar aplicativos de console bonitos e multiplataforma. É fortemente inspirada na excelente [biblioteca Rich](https://github.com/willmcgugan/rich) para Python. ## Índice de Conteúdo 1. [Funcionalidades](#funcionalidades) 1. [Instalação](#instalação) 1. [Documentação](#documentação) 1. [Exemplos](#exemplos) 1. [Licença](#licença) ## Funcionalidades * Desenvolvida com testes unitários em mente. * Suporta tabelas, grades, painéis, e uma linguagem de marcação inspirada em [rich](https://github.com/willmcgugan/rich). * Suporta os parâmetros SGR mais comuns quando se trata de estilo de texto, como negrito, esmaecido, itálico, sublinhado, tachado e texto piscando. * Suporta cores de 3/4/8/24 bits no terminal. A biblioteca detectará os recursos do terminal atual e reduz as cores conforme necessário. ![Exemplo](resources/example.png) ## Instalação A maneira mais rápida de começar a usar o `Spectre.Console` é instalar o pacote NuGet. ```csharp dotnet add package Spectre.Console ``` ## Documentação A documentação do `Spectre.Console` pode ser encontrada em https://spectreconsole.net/ ## Exemplos To see `Spectre.Console` in action, please see the [examples repository](https://github.com/spectreconsole/examples). ## Licença Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray Spectre.Console é fornecido no estado em que se encontra sob a licença do MIT. Para obter mais informações, consulte o arquivo [LICENSE](LICENSE.md). * Para SixLabors.ImageSharp, consulte https://github.com/SixLabors/ImageSharp/blob/master/LICENSE ================================================ FILE: README.zh.md ================================================ # `Spectre.Console` _[![Spectre.Console NuGet Version](https://img.shields.io/nuget/v/spectre.console.svg?style=flat&label=NuGet%3A%20Spectre.Console)](https://www.nuget.org/packages/spectre.console)_ `Spectre.Console`是一个 .NET 的库,可以更轻松地创建美观的跨平台控制台应用程序。 深受 [Rich](https://github.com/willmcgugan/rich) 这个Python优秀库的启发。 ## 目录 1. [功能](#功能) 1. [安装](#安装) 1. [文档](#文档) 1. [例子](#例子) 1. [开源许可](#开源许可) ## 功能 * 编写时考虑到了单元测试。 * 支持 tables、grid、panel 和 [rich](https://github.com/willmcgugan/rich) 所支持的标记语言。 * 支持大部分的 SGR 参数,包括粗体、暗淡字、斜体、下划线、删除线和闪烁文本。 * 支持终端显示 3/4/8/24 位色。自动检测终端类型,自适应颜色范围。 ![例子](resources/example.png) ## 安装 最快的安装方式,就是用NuGet包管理直接安装`Spectre.Console`。 ```csharp dotnet add package Spectre.Console ``` ## 文档 `Spectre.Console`的文档可以在这里查看 https://spectreconsole.net/ ## 例子 To see `Spectre.Console` in action, please see the [examples repository](https://github.com/spectreconsole/examples). ## 开源许可 版权所有 © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray Spectre.Console 基于 MIT 协议提供。查看 LICENSE 文件了解更多信息。 * SixLabors.ImageSharp 的协议请查看 https://github.com/SixLabors/ImageSharp/blob/master/LICENSE ================================================ FILE: build.cs ================================================ #:sdk Cake.Sdk@6.0.0 var solution = "./src/Spectre.Console.slnx"; //////////////////////////////////////////////////////////////// // Arguments var target = Argument("target", "Default"); var configuration = Argument("configuration", "Release"); var noLinting = HasArgument("no-lint"); //////////////////////////////////////////////////////////////// // Tasks Task("Clean") .Does(ctx => { ctx.CleanDirectory("./.artifacts"); }); Task("Lint") .Does(ctx => { ctx.DotNetFormatStyle(solution, new DotNetFormatSettings { VerifyNoChanges = true, }); }); Task("Build") .IsDependentOn("Clean") .Does(ctx => { ctx.DotNetBuild(solution, new DotNetBuildSettings { Configuration = configuration, Verbosity = DotNetVerbosity.Minimal, NoLogo = true, NoIncremental = ctx.HasArgument("rebuild"), MSBuildSettings = new DotNetMSBuildSettings() .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) }); }); Task("Test") .IsDependentOn("Build") .Does(ctx => { ctx.DotNetTest(solution, new DotNetTestSettings { Configuration = configuration, Verbosity = DotNetVerbosity.Minimal, NoLogo = true, NoRestore = true, NoBuild = true, }); }); Task("Package") .IsDependentOn("Test") .Does(ctx => { ctx.DotNetPack(solution, new DotNetPackSettings { Configuration = configuration, Verbosity = DotNetVerbosity.Minimal, NoLogo = true, NoRestore = true, NoBuild = true, OutputDirectory = "./.artifacts", MSBuildSettings = new DotNetMSBuildSettings() .TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error) }); }); Task("Sign-Binaries") .IsDependentOn("Package") .WithCriteria(ctx => ctx.HasArgument("sign"), "Not signing binaries") .Does(ctx => { // Ensure the sign tool is installed ctx.StartProcess("dotnet", new ProcessSettings { Arguments = "tool install --tool-path .sign --prerelease sign" }); var commandSettings = new CommandSettings { ToolExecutableNames = ["sign", "sign.exe"], ToolName = "sign", ToolPath = ResolveSignTool("sign.exe") ?? ResolveSignTool("sign") ?? throw new Exception("Failed to locate sign tool"), }; var files = ctx.GetFiles("./.artifacts/*.nupkg"); foreach (var file in files) { ctx.Information("Signing {0}...", file.FullPath); var arguments = new ProcessArgumentBuilder() .Append("code") .Append("azure-key-vault") .AppendQuoted(file.FullPath) .AppendSwitchQuoted("--file-list", ctx.MakeAbsolute(ctx.File("./resources/signclient.filter")).FullPath) .AppendSwitchQuoted("--publisher-name", "Spectre Console") .AppendSwitchQuoted("--description", "A .NET library that makes it easier to create beautiful console applications.") .AppendSwitchQuoted("--description-url", "https://spectreconsole.net") .AppendSwitchQuoted("--azure-credential-type", "azure-cli") .AppendSwitchQuotedSecret("--azure-key-vault-certificate", Argument("keyvaultCertificate")) .AppendSwitchQuotedSecret("--azure-key-vault-url", Argument("keyvaultUrl")); ctx.Command(commandSettings, arguments); ctx.Information("Done signing {0}.", file.FullPath); } FilePath? ResolveSignTool(string name) { var path = ctx.MakeAbsolute(ctx.Directory(".sign").Path.CombineWithFilePath(name)); return ctx.FileExists(path) ? path : null; } }); Task("Publish-NuGet") .WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions") .IsDependentOn("Sign-Binaries") .Does(ctx => { var apiKey = Argument("nuget-key", null); if (string.IsNullOrWhiteSpace(apiKey)) { throw new CakeException("No NuGet API key was provided."); } foreach (var file in ctx.GetFiles("./.artifacts/*.nupkg")) { ctx.Information("Publishing {0}...", file.GetFilename().FullPath); DotNetNuGetPush(file.FullPath, new DotNetNuGetPushSettings { Source = "https://api.nuget.org/v3/index.json", ApiKey = apiKey, }); } }); //////////////////////////////////////////////////////////////// // Targets Task("Publish") .IsDependentOn("Publish-NuGet"); Task("Default") .IsDependentOn("Package"); //////////////////////////////////////////////////////////////// // Execution RunTarget(target); ================================================ FILE: dotnet-tools.json ================================================ { "version": 1, "isRoot": true, "tools": { "verify.tool": { "version": "0.7.0", "commands": [ "dotnet-verify" ], "rollForward": false }, "make": { "version": "0.11.0", "commands": [ "dotnet-make" ], "rollForward": false } } } ================================================ FILE: global.json ================================================ { "$schema": "http://json.schemastore.org/global", "sdk": { "version": "10.0.201", "rollForward": "latestFeature" } } ================================================ FILE: resources/nuget/Spectre.Console.Ansi.md ================================================ # `Spectre.Console.Ansi` ================================================ FILE: resources/nuget/Spectre.Console.ImageSharp.md ================================================ # `Spectre.Console.ImageSharp` A .NET library that extends [Spectre.Console](https://github.com/spectreconsole/spectre.console) with ImageSharp superpowers. Detailed instructions for using `Spectre.Console.ImageSharp` are located on the project website, https://spectreconsole.net/widgets/canvas-image ================================================ FILE: resources/nuget/Spectre.Console.Json.md ================================================ # `Spectre.Console.Json` A .NET library that extends [Spectre.Console](https://github.com/spectreconsole/spectre.console) with JSON superpowers. Detailed instructions for using this library is located on the project website, https://spectreconsole.net/widgets/json ================================================ FILE: resources/nuget/Spectre.Console.Testing.md ================================================ # `Spectre.Console.Testing` A .NET library that makes it easier to write unit tests for [Spectre.Console](https://github.com/spectreconsole/spectre.console) applications. Detailed instructions for using this library is located on the project website, https://spectreconsole.net ================================================ FILE: resources/nuget/Spectre.Console.md ================================================ # `Spectre.Console` A .NET library that makes it easier to create beautiful, cross platform, console applications. It is heavily inspired by the excellent Python library, [Rich](https://github.com/willmcgugan/rich). Detailed instructions for using this library is located on the project website, https://spectreconsole.net ================================================ FILE: resources/scripts/.gitignore ================================================ Generated Temp ================================================ FILE: resources/scripts/Generate-Colors.ps1 ================================================ #!/usr/local/bin/pwsh ########################################################## # Script that generates known colors and lookup tables. ########################################################## $Output = Join-Path $PSScriptRoot "Temp" $Generator = Join-Path $PSScriptRoot "/../../src/Generator" $Source = Join-Path $PSScriptRoot "/../../src/Spectre.Console" if(!(Test-Path $Output -PathType Container)) { New-Item -ItemType Directory -Path $Output | Out-Null } # Generate the files Push-Location $Generator &dotnet run -- colors "$Output" if(!$?) { Pop-Location Throw "An error occured when generating code." } Pop-Location # Copy the files to the correct location Copy-Item (Join-Path "$Output" "Color.Generated.cs") -Destination "$Source/Color.Generated.cs" Copy-Item (Join-Path "$Output" "ColorPalette.Generated.cs") -Destination "$Source/Internal/Colors/ColorPalette.Generated.cs" Copy-Item (Join-Path "$Output" "ColorTable.Generated.cs") -Destination "$Source/Internal/Colors/ColorTable.Generated.cs" ================================================ FILE: resources/scripts/Generate-Emoji.ps1 ================================================ #!/usr/local/bin/pwsh ########################################################## # Script that generates the emoji lookup table. ########################################################## $Output = Join-Path $PSScriptRoot "Temp" $Generator = Join-Path $PSScriptRoot "/../../src/Generator" $Source = Join-Path $PSScriptRoot "/../../src/Spectre.Console" if(!(Test-Path $Output -PathType Container)) { New-Item -ItemType Directory -Path $Output | Out-Null } # Generate the files Push-Location $Generator &dotnet run -- emoji "$Output" --input $Output if(!$?) { Pop-Location Throw "An error occured when generating code." } Pop-Location # Copy the files to the correct location Copy-Item (Join-Path "$Output" "Emoji.Generated.cs") -Destination "$Source/Emoji.Generated.cs" ================================================ FILE: resources/scripts/Generate-Spinners.ps1 ================================================ #!/usr/local/bin/pwsh ########################################################## # Script that generates progress spinners. ########################################################## $Output = Join-Path $PSScriptRoot "Temp" $Generator = Join-Path $PSScriptRoot "/../../src/Generator" $Source = Join-Path $PSScriptRoot "/../../src/Spectre.Console" if(!(Test-Path $Output -PathType Container)) { New-Item -ItemType Directory -Path $Output | Out-Null } # Generate the files Push-Location $Generator &dotnet run -- spinners "$Output" if(!$?) { Pop-Location Throw "An error occured when generating code." } Pop-Location # Copy the files to the correct location Copy-Item (Join-Path "$Output" "Spinner.Generated.cs") -Destination "$Source/Live/Progress/Spinner.Generated.cs" ================================================ FILE: resources/signclient.filter ================================================ **/Spectre.Console* ================================================ FILE: src/.editorconfig ================================================ [*.cs] # Prefer file scoped namespace declarations csharp_style_namespace_declarations = file_scoped:warning # Sort using and Import directives with System.* appearing first dotnet_sort_system_directives_first = true dotnet_separate_import_directive_groups = false # Avoid "this." and "Me." if not necessary dotnet_style_qualification_for_field = false:refactoring dotnet_style_qualification_for_property = false:refactoring dotnet_style_qualification_for_method = false:refactoring dotnet_style_qualification_for_event = false:refactoring # Use language keywords instead of framework type names for type references dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion dotnet_style_predefined_type_for_member_access = true:suggestion # Suggest more modern language features when available dotnet_style_object_initializer = true:suggestion dotnet_style_collection_initializer = true:suggestion dotnet_style_coalesce_expression = true:suggestion dotnet_style_null_propagation = true:suggestion dotnet_style_explicit_tuple_names = true:suggestion # Non-private static fields are PascalCase dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.severity = suggestion dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.symbols = non_private_static_fields dotnet_naming_rule.non_private_static_fields_should_be_pascal_case.style = non_private_static_field_style dotnet_naming_symbols.non_private_static_fields.applicable_kinds = field dotnet_naming_symbols.non_private_static_fields.applicable_accessibilities = public, protected, internal, protected_internal, private_protected dotnet_naming_symbols.non_private_static_fields.required_modifiers = static dotnet_naming_style.non_private_static_field_style.capitalization = pascal_case # Non-private readonly fields are PascalCase dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.severity = suggestion dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.symbols = non_private_readonly_fields dotnet_naming_rule.non_private_readonly_fields_should_be_pascal_case.style = non_private_readonly_field_style dotnet_naming_symbols.non_private_readonly_fields.applicable_kinds = field dotnet_naming_symbols.non_private_readonly_fields.applicable_accessibilities = public, protected, internal, protected_internal, private_protected dotnet_naming_symbols.non_private_readonly_fields.required_modifiers = readonly dotnet_naming_style.non_private_readonly_field_style.capitalization = pascal_case # Constants are PascalCase dotnet_naming_rule.constants_should_be_pascal_case.severity = suggestion dotnet_naming_rule.constants_should_be_pascal_case.symbols = constants dotnet_naming_rule.constants_should_be_pascal_case.style = constant_style dotnet_naming_symbols.constants.applicable_kinds = field, local dotnet_naming_symbols.constants.required_modifiers = const dotnet_naming_style.constant_style.capitalization = pascal_case # Instance fields are camelCase and start with _ dotnet_naming_rule.instance_fields_should_be_camel_case.severity = suggestion dotnet_naming_rule.instance_fields_should_be_camel_case.symbols = instance_fields dotnet_naming_rule.instance_fields_should_be_camel_case.style = instance_field_style dotnet_naming_symbols.instance_fields.applicable_kinds = field dotnet_naming_style.instance_field_style.capitalization = camel_case dotnet_naming_style.instance_field_style.required_prefix = _ # Locals and parameters are camelCase dotnet_naming_rule.locals_should_be_camel_case.severity = suggestion dotnet_naming_rule.locals_should_be_camel_case.symbols = locals_and_parameters dotnet_naming_rule.locals_should_be_camel_case.style = camel_case_style dotnet_naming_symbols.locals_and_parameters.applicable_kinds = parameter, local dotnet_naming_style.camel_case_style.capitalization = camel_case # Local functions are PascalCase dotnet_naming_rule.local_functions_should_be_pascal_case.severity = suggestion dotnet_naming_rule.local_functions_should_be_pascal_case.symbols = local_functions dotnet_naming_rule.local_functions_should_be_pascal_case.style = local_function_style dotnet_naming_symbols.local_functions.applicable_kinds = local_function dotnet_naming_style.local_function_style.capitalization = pascal_case # By default, name items with PascalCase dotnet_naming_rule.members_should_be_pascal_case.severity = suggestion dotnet_naming_rule.members_should_be_pascal_case.symbols = all_members dotnet_naming_rule.members_should_be_pascal_case.style = pascal_case_style dotnet_naming_symbols.all_members.applicable_kinds = * dotnet_naming_style.pascal_case_style.capitalization = pascal_case # Newline settings csharp_new_line_before_open_brace = all csharp_new_line_before_else = true csharp_new_line_before_catch = true csharp_new_line_before_finally = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_anonymous_types = true csharp_new_line_between_query_expression_clauses = true # Indentation preferences csharp_indent_block_contents = true csharp_indent_braces = false csharp_indent_case_contents = true csharp_indent_case_contents_when_block = true csharp_indent_switch_labels = true csharp_indent_labels = flush_left # Prefer "var" everywhere csharp_style_var_for_built_in_types = true:suggestion csharp_style_var_when_type_is_apparent = true:suggestion csharp_style_var_elsewhere = true:suggestion # Prefer method-like constructs to have a block body csharp_style_expression_bodied_methods = false:none csharp_style_expression_bodied_constructors = false:none csharp_style_expression_bodied_operators = false:none # Prefer property-like constructs to have an expression-body csharp_style_expression_bodied_properties = true:none csharp_style_expression_bodied_indexers = true:none csharp_style_expression_bodied_accessors = true:none # Suggest more modern language features when available csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion csharp_style_pattern_matching_over_as_with_null_check = true:suggestion csharp_style_inlined_variable_declaration = true:suggestion csharp_style_throw_expression = true:suggestion csharp_style_conditional_delegate_call = true:suggestion # Space preferences csharp_space_after_cast = false csharp_space_after_colon_in_inheritance_clause = true csharp_space_after_comma = true csharp_space_after_dot = false csharp_space_after_keywords_in_control_flow_statements = true csharp_space_after_semicolon_in_for_statement = true csharp_space_around_binary_operators = before_and_after csharp_space_around_declaration_statements = do_not_ignore csharp_space_before_colon_in_inheritance_clause = true csharp_space_before_comma = false csharp_space_before_dot = false csharp_space_before_open_square_brackets = false csharp_space_before_semicolon_in_for_statement = false csharp_space_between_empty_square_brackets = false csharp_space_between_method_call_empty_parameter_list_parentheses = false csharp_space_between_method_call_name_and_opening_parenthesis = false csharp_space_between_method_call_parameter_list_parentheses = false csharp_space_between_method_declaration_empty_parameter_list_parentheses = false csharp_space_between_method_declaration_name_and_open_parenthesis = false csharp_space_between_method_declaration_parameter_list_parentheses = false csharp_space_between_parentheses = false csharp_space_between_square_brackets = false # Blocks are allowed csharp_prefer_braces = true:silent csharp_preserve_single_line_blocks = true csharp_preserve_single_line_statements = true # RS0037: PublicAPI.txt is missing '#nullable enable' dotnet_diagnostic.rs0037.severity = none # IDE0055: Fix formatting dotnet_diagnostic.ide0055.severity = warning # SA1101: Prefix local calls with this dotnet_diagnostic.sa1101.severity = none # SA1633: File should have header dotnet_diagnostic.sa1633.severity = none # SA1201: Elements should appear in the correct order dotnet_diagnostic.sa1201.severity = none # SA1202: Public members should come before private members dotnet_diagnostic.sa1202.severity = none # SA1309: Field names should not begin with underscore dotnet_diagnostic.sa1309.severity = none # SA1404: Code analysis suppressions should have justification dotnet_diagnostic.sa1404.severity = none # SA1516: Elements should be separated by a blank line dotnet_diagnostic.sa1516.severity = none # CA1303: Do not pass literals as localized parameters dotnet_diagnostic.ca1303.severity = none # CSA1204: Static members should appear before non-static members dotnet_diagnostic.sa1204.severity = none # IDE0052: Remove unread private members dotnet_diagnostic.ide0052.severity = warning # IDE0063: Use simple 'using' statement csharp_prefer_simple_using_statement = false:suggestion # IDE0018: Variable declaration can be inlined dotnet_diagnostic.ide0018.severity = warning # SA1625: Element documenation should not be copied and pasted dotnet_diagnostic.sa1625.severity = none # IDE0005: Using directive is unnecessary dotnet_diagnostic.ide0005.severity = warning # SA1117: Parameters should be on same line or separate lines dotnet_diagnostic.sa1117.severity = none # SA1404: Code analysis suppression should have justification dotnet_diagnostic.sa1404.severity = none # SA1101: Prefix local calls with this dotnet_diagnostic.sa1101.severity = none # SA1633: File should have header dotnet_diagnostic.sa1633.severity = none # SA1649: File name should match first type name dotnet_diagnostic.sa1649.severity = none # SA1402: File may only contain a single type dotnet_diagnostic.sa1402.severity = none # CA1814: Prefer jagged arrays over multidimensional dotnet_diagnostic.ca1814.severity = none # RCS1194: Implement exception constructors. dotnet_diagnostic.rcs1194.severity = none # CA1032: Implement standard exception constructors dotnet_diagnostic.ca1032.severity = none # CA1826: Do not use Enumerable methods on indexable collections. Instead use the collection directly dotnet_diagnostic.ca1826.severity = none # RCS1079: Throwing of new NotImplementedException. dotnet_diagnostic.rcs1079.severity = warning # RCS1057: Add empty line between declarations. dotnet_diagnostic.rcs1057.severity = none # RCS1057: Validate arguments correctly dotnet_diagnostic.rcs1227.severity = none # IDE0004: Remove Unnecessary Cast dotnet_diagnostic.ide0004.severity = warning # CA1810: Initialize reference type static fields inline dotnet_diagnostic.ca1810.severity = none # IDE0044: Add readonly modifier dotnet_diagnostic.ide0044.severity = warning # RCS1047: Non-asynchronous method name should not end with 'Async'. dotnet_diagnostic.rcs1047.severity = none # RCS1090: Call 'ConfigureAwait(false)'. dotnet_diagnostic.rcs1090.severity = warning # SA1633: The file header is missing or not located at the top of the file dotnet_diagnostic.sa1633.severity = none # CA2016: Forward the CancellationToken parameter to methods that take one dotnet_diagnostic.ca2016.severity = warning # ReSharper properties resharper_trailing_comma_in_multiline_lists = true resharper_wrap_object_and_collection_initializer_style = chop_always ================================================ FILE: src/Benchmarks/BenchmarkDotNet.Artifacts/results/Benchmarks.AnsiBenchmarks-report-github.md ================================================ ``` BenchmarkDotNet v0.15.8, macOS Tahoe 26.2 (25C56) [Darwin 25.2.0] Apple M3 Pro, 1 CPU, 11 logical and 11 physical cores .NET SDK 10.0.101 [Host] : .NET 10.0.1 (10.0.1, 10.0.125.57005), Arm64 RyuJIT armv8.0-a .NET 10.0 : .NET 10.0.1 (10.0.1, 10.0.125.57005), Arm64 RyuJIT armv8.0-a .NET 8.0 : .NET 8.0.17 (8.0.17, 8.0.1725.26602), Arm64 RyuJIT armv8.0-a .NET 9.0 : .NET 9.0.10 (9.0.10, 9.0.1025.47515), Arm64 RyuJIT armv8.0-a ``` | Method | Job | Runtime | Mean | Error | StdDev | Gen0 | Gen1 | Allocated | |----------------- |---------- |---------- |---------:|--------:|--------:|-------:|-------:|----------:| | RenderableToAnsi | .NET 10.0 | .NET 10.0 | 786.6 ns | 1.87 ns | 1.75 ns | 0.3662 | 0.0010 | 2.99 KB | | RenderableToAnsi | .NET 8.0 | .NET 8.0 | 897.3 ns | 2.21 ns | 1.96 ns | 0.3815 | 0.0010 | 3.12 KB | | RenderableToAnsi | .NET 9.0 | .NET 9.0 | 935.2 ns | 3.13 ns | 2.77 ns | 0.3700 | 0.0010 | 3.02 KB | ================================================ FILE: src/Benchmarks/BenchmarkDotNet.Artifacts/results/Benchmarks.RenderBenchmarks-report-github.md ================================================ ``` BenchmarkDotNet v0.15.8, macOS Tahoe 26.2 (25C56) [Darwin 25.2.0] Apple M3 Pro, 1 CPU, 11 logical and 11 physical cores .NET SDK 10.0.101 [Host] : .NET 10.0.1 (10.0.1, 10.0.125.57005), Arm64 RyuJIT armv8.0-a .NET 10.0 : .NET 10.0.1 (10.0.1, 10.0.125.57005), Arm64 RyuJIT armv8.0-a .NET 8.0 : .NET 8.0.17 (8.0.17, 8.0.1725.26602), Arm64 RyuJIT armv8.0-a .NET 9.0 : .NET 9.0.10 (9.0.10, 9.0.1025.47515), Arm64 RyuJIT armv8.0-a ``` | Method | Job | Runtime | Mean | Error | StdDev | Gen0 | Gen1 | Allocated | |------- |---------- |---------- |---------:|--------:|--------:|-------:|-------:|----------:| | Render | .NET 10.0 | .NET 10.0 | 723.8 ns | 4.00 ns | 3.74 ns | 0.2956 | 0.0124 | 2.42 KB | | Render | .NET 8.0 | .NET 8.0 | 842.7 ns | 9.63 ns | 8.54 ns | 0.3119 | 0.0124 | 2.55 KB | | Render | .NET 9.0 | .NET 9.0 | 859.7 ns | 6.40 ns | 4.99 ns | 0.3004 | 0.0124 | 2.46 KB | ================================================ FILE: src/Benchmarks/Benchmarks.csproj ================================================  Exe net10.0;net9.0;net8.0 true true false true false ================================================ FILE: src/Benchmarks/EmojiBenchmarks.cs ================================================ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; using Spectre.Console; namespace Benchmarks; [MemoryDiagnoser] [SimpleJob(RuntimeMoniker.Net10_0)] public class EmojiBenchmarks { [Benchmark] public void Replace_NoEmoji() { Emoji.Replace("Hello Spectre.Console!"); } [Benchmark] public void Replace_NoEmoji_ButColon() { Emoji.Replace("https://spectreconsole.net"); } [Benchmark] public void Replace_Emoji() { Emoji.Replace("Hello :ghost:.Console!"); } } ================================================ FILE: src/Benchmarks/MarkupBenchmarks.cs ================================================ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; using Spectre.Console; namespace Benchmarks; [MemoryDiagnoser] [SimpleJob(RuntimeMoniker.Net10_0)] public class MarkupBenchmarks { private const string Input = "[yellow]Hello [italic][link=https://spectreconsole.net]Spectre.Console Docs[/][/]![/]"; [Benchmark] public void Markup_Constructor() { _ = new Markup(Input); } [Benchmark] public void AnsiMarkup_Parse() { AnsiMarkup.Parse(Input); } } ================================================ FILE: src/Benchmarks/ParagraphBenchmarks.cs ================================================ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; using Spectre.Console; namespace Benchmarks; [MemoryDiagnoser] [SimpleJob(RuntimeMoniker.Net10_0)] public class ParagraphBenchmarks { private const string TextOneLine = "This string is all on one line."; private const string TextMultiLine = "This string\nhas multiple\nlines."; public static IEnumerable Arguments => [ [TextOneLine], [TextMultiLine], ]; [Benchmark] [ArgumentsSource(nameof(Arguments))] public void Append(string text) { new Paragraph().Append(text); } } ================================================ FILE: src/Benchmarks/Program.cs ================================================ using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Jobs; using BenchmarkDotNet.Running; using Spectre.Console; using Spectre.Console.Rendering; namespace Benchmarks; public static class Program { public static int Main(string[] args) { BenchmarkRunner.Run(typeof(Program).Assembly); return 0; } } [MemoryDiagnoser] [SimpleJob(RuntimeMoniker.Net80)] [SimpleJob(RuntimeMoniker.Net90)] [SimpleJob(RuntimeMoniker.Net10_0)] public class RenderBenchmarks { private IAnsiConsole _console = null!; private IRenderable _renderable = null!; [GlobalSetup] public void Setup() { _console = AnsiConsole.Create(new AnsiConsoleSettings { Ansi = AnsiSupport.Detect, ColorSystem = ColorSystemSupport.TrueColor, Out = new AnsiConsoleOutput(new StringWriter()), Interactive = InteractionSupport.No, EnvironmentVariables = null }); _renderable = new Markup("[yellow]Hello[/] [blue]World[/]"); } [Benchmark] public void Render() => _console.Write(_renderable); } [MemoryDiagnoser] [SimpleJob(RuntimeMoniker.Net80)] [SimpleJob(RuntimeMoniker.Net90)] [SimpleJob(RuntimeMoniker.Net10_0)] public class AnsiBenchmarks { private IAnsiConsole _console = null!; private IRenderable _renderable = null!; [GlobalSetup] public void Setup() { _console = AnsiConsole.Create(new AnsiConsoleSettings { Ansi = AnsiSupport.Detect, ColorSystem = ColorSystemSupport.TrueColor, Out = new AnsiConsoleOutput(new StringWriter()), Interactive = InteractionSupport.No, EnvironmentVariables = null }); _renderable = new Markup("[yellow]Hello[/] [blue]World[/]"); } [Benchmark] public void RenderableToAnsi() => _console.ToAnsi(_renderable); } ================================================ FILE: src/Directory.Build.props ================================================  true 14 true embedded true true true true false enable $(NoWarn);SA1633 true $(MSBuildThisFileDirectory)\..\resources\spectre.snk 00240000048000009400000006020000002400005253413100040000010001006146d3789d31477cf4a3b508dcf772ff9ccad8613f6bd6b17b9c4a960a7a7b551ecd22e4f4119ced70ee8bbdf3ca0a117c99fd6248c16255ea9033110c2233d42e74e81bf4f3f7eb09bfe8b53ad399d957514f427171a86f5fe9fe0014be121d571c80c4a0cfc3531bdbf5a2900d936d93f2c94171b9134f7644a1ac3612a0d0 true disable $(NoWarn);CS8632 true true \ Properties/Package/Logo.png true \README.md Properties/Package/README.md A library that makes it easier to create beautiful console applications. Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray git https://github.com/spectreconsole/spectre.console logo.png README.md True https://github.com/spectreconsole/spectre.console MIT https://github.com/spectreconsole/spectre.console/releases All ================================================ FILE: src/Directory.Packages.props ================================================ true all runtime; build; native; contentfiles; analyzers; buildtransitive ================================================ FILE: src/Extensions/Spectre.Console.ImageSharp/CanvasImage.cs ================================================ using System; using System.Collections.Generic; using System.IO; using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using SixLabors.ImageSharp.Processing.Processors.Transforms; using Spectre.Console.Rendering; namespace Spectre.Console; /// /// Represents a renderable image. /// public sealed class CanvasImage : Renderable { private static readonly IResampler _defaultResampler = KnownResamplers.Bicubic; /// /// Gets the image width. /// public int Width => Image.Width; /// /// Gets the image height. /// public int Height => Image.Height; /// /// Gets or sets the render width of the canvas. /// public int? MaxWidth { get; set; } /// /// Gets or sets the render width of the canvas. /// [Obsolete("Not used anymore. Will be removed in future update.")] public int PixelWidth { get; set; } = 2; /// /// Gets or sets the that should /// be used when scaling the image. Defaults to bicubic sampling. /// public IResampler? Resampler { get; set; } internal SixLabors.ImageSharp.Image Image { get; } /// /// Initializes a new instance of the class. /// /// The image filename. public CanvasImage(string filename) { Image = SixLabors.ImageSharp.Image.Load(filename); } /// /// Initializes a new instance of the class. /// /// Buffer containing an image. public CanvasImage(ReadOnlySpan data) { Image = SixLabors.ImageSharp.Image.Load(data); } /// /// Initializes a new instance of the class. /// /// Stream containing an image. public CanvasImage(Stream data) { Image = SixLabors.ImageSharp.Image.Load(data); } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { var pixelWidth = options.Unicode ? 1 : 2; var width = MaxWidth ?? Width; if (maxWidth < width * pixelWidth) { return new Measurement(maxWidth, maxWidth); } return new Measurement(width * pixelWidth, width * pixelWidth); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var image = Image; var width = Width; var height = Height; var pixelWidth = options.Unicode ? 1 : 2; // Got a max width? if (MaxWidth != null) { height = (int)(height * ((float)MaxWidth.Value) / Width); width = MaxWidth.Value; } // Exceed the max width when we take pixel width into account? if (width * pixelWidth > maxWidth) { height = (int)(height * (maxWidth / (float)(width * pixelWidth))); width = maxWidth / pixelWidth; } // Need to rescale the pixel buffer? if (width != Width || height != Height) { var resampler = Resampler ?? _defaultResampler; image = image.Clone(); // Clone the original image image.Mutate(i => i.Resize(width, height, resampler)); } var canvas = new Canvas(width, height) { MaxWidth = MaxWidth, Scale = false, }; for (var y = 0; y < image.Height; y++) { for (var x = 0; x < image.Width; x++) { if (image[x, y].A == 0) { continue; } canvas.SetPixel(x, y, new Color( image[x, y].R, image[x, y].G, image[x, y].B)); } } return ((IRenderable)canvas).Render(options, maxWidth); } } ================================================ FILE: src/Extensions/Spectre.Console.ImageSharp/CanvasImageExtensions.cs ================================================ using System; using SixLabors.ImageSharp.Processing; namespace Spectre.Console; /// /// Contains extension methods for . /// public static class CanvasImageExtensions { /// /// Sets the maximum width of the rendered image. /// /// The canvas image. /// The maximum width. /// The same instance so that multiple calls can be chained. public static CanvasImage MaxWidth(this CanvasImage image, int? maxWidth) { ArgumentNullException.ThrowIfNull(image); image.MaxWidth = maxWidth; return image; } /// /// Disables the maximum width of the rendered image. /// /// The canvas image. /// The same instance so that multiple calls can be chained. public static CanvasImage NoMaxWidth(this CanvasImage image) { ArgumentNullException.ThrowIfNull(image); image.MaxWidth = null; return image; } /// /// Sets the pixel width. /// /// The canvas image. /// The pixel width. /// The same instance so that multiple calls can be chained. [Obsolete("Not used anymore. Will be removed in future update.")] public static CanvasImage PixelWidth(this CanvasImage image, int width) { ArgumentNullException.ThrowIfNull(image); image.PixelWidth = width; return image; } /// /// Mutates the underlying image. /// /// The canvas image. /// The action that mutates the underlying image. /// The same instance so that multiple calls can be chained. public static CanvasImage Mutate(this CanvasImage image, Action action) { ArgumentNullException.ThrowIfNull(image); ArgumentNullException.ThrowIfNull(action); image.Image.Mutate(action); return image; } /// /// Uses a bicubic sampler that implements the bicubic kernel algorithm W(x). /// /// The canvas image. /// The same instance so that multiple calls can be chained. public static CanvasImage BicubicResampler(this CanvasImage image) { ArgumentNullException.ThrowIfNull(image); image.Resampler = KnownResamplers.Bicubic; return image; } /// /// Uses a bilinear sampler. This interpolation algorithm /// can be used where perfect image transformation with pixel matching is impossible, /// so that one can calculate and assign appropriate intensity values to pixels. /// /// The canvas image. /// The same instance so that multiple calls can be chained. public static CanvasImage BilinearResampler(this CanvasImage image) { ArgumentNullException.ThrowIfNull(image); image.Resampler = KnownResamplers.Triangle; return image; } /// /// Uses a Nearest-Neighbour sampler that implements the nearest neighbor algorithm. /// This uses a very fast, unscaled filter which will select the closest pixel to /// the new pixels position. /// /// The canvas image. /// The same instance so that multiple calls can be chained. public static CanvasImage NearestNeighborResampler(this CanvasImage image) { ArgumentNullException.ThrowIfNull(image); image.Resampler = KnownResamplers.NearestNeighbor; return image; } } ================================================ FILE: src/Extensions/Spectre.Console.ImageSharp/Spectre.Console.ImageSharp.csproj ================================================ net10.0;net9.0;net8.0 true A library that extends Spectre.Console with ImageSharp superpowers. true true ================================================ FILE: src/Extensions/Spectre.Console.Json/IJsonParser.cs ================================================ namespace Spectre.Console.Json; /// /// Represents a JSON parser. /// public interface IJsonParser { /// /// Parses the provided JSON into an abstract syntax tree. /// /// The JSON to parse. /// An instance. JsonSyntax Parse(string json); } ================================================ FILE: src/Extensions/Spectre.Console.Json/JsonBuilder.cs ================================================ namespace Spectre.Console.Json; internal sealed class JsonBuilderContext { public Paragraph Paragraph { get; } public int Level { get; set; } public string Indentation { get; set; } public JsonTextStyles Styling { get; } public JsonBuilderContext( JsonTextStyles styling, string indentation) { Paragraph = new Paragraph(); Styling = styling; Indentation = indentation; } public void InsertIndentation() { for (var level = 0; level < Level; level++) { Paragraph.Append(Indentation); } } } internal sealed class JsonBuilder : JsonSyntaxVisitor { public static JsonBuilder Shared { get; } = new JsonBuilder(); public override void VisitObject(JsonObject syntax, JsonBuilderContext context) { context.Paragraph.Append("{", context.Styling.BracesStyle); context.Paragraph.Append("\n"); context.Level++; foreach (var (_, _, last, property) in syntax.Members.Enumerate()) { context.InsertIndentation(); property.Accept(this, context); if (!last) { context.Paragraph.Append(",", context.Styling.CommaStyle); } context.Paragraph.Append("\n"); } context.Level--; context.InsertIndentation(); context.Paragraph.Append("}", context.Styling.BracesStyle); } public override void VisitArray(JsonArray syntax, JsonBuilderContext context) { context.Paragraph.Append("[", context.Styling.BracketsStyle); context.Paragraph.Append("\n"); context.Level++; foreach (var (_, _, last, item) in syntax.Items.Enumerate()) { context.InsertIndentation(); item.Accept(this, context); if (!last) { context.Paragraph.Append(",", context.Styling.CommaStyle); } context.Paragraph.Append("\n"); } context.Level--; context.InsertIndentation(); context.Paragraph.Append("]", context.Styling.BracketsStyle); } public override void VisitMember(JsonMember syntax, JsonBuilderContext context) { context.Paragraph.Append(syntax.Name, context.Styling.MemberStyle); context.Paragraph.Append(":", context.Styling.ColonStyle); context.Paragraph.Append(" "); syntax.Value.Accept(this, context); } public override void VisitNumber(JsonNumber syntax, JsonBuilderContext context) { context.Paragraph.Append(syntax.Lexeme, context.Styling.NumberStyle); } public override void VisitString(JsonString syntax, JsonBuilderContext context) { context.Paragraph.Append(syntax.Lexeme, context.Styling.StringStyle); } public override void VisitBoolean(JsonBoolean syntax, JsonBuilderContext context) { context.Paragraph.Append(syntax.Lexeme, context.Styling.BooleanStyle); } public override void VisitNull(JsonNull syntax, JsonBuilderContext context) { context.Paragraph.Append(syntax.Lexeme, context.Styling.NullStyle); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/JsonParser.cs ================================================ namespace Spectre.Console.Json; internal sealed class JsonParser : IJsonParser { public static JsonParser Shared { get; } = new JsonParser(); public JsonSyntax Parse(string json) { try { var tokens = JsonTokenizer.Tokenize(json); var reader = new JsonTokenReader(tokens); return ParseElement(reader); } catch { throw new InvalidOperationException("Invalid JSON"); } } private static JsonSyntax ParseElement(JsonTokenReader reader) { return ParseValue(reader); } private static List ParseElements(JsonTokenReader reader) { var members = new List(); while (!reader.Eof) { members.Add(ParseElement(reader)); if (reader.Peek()?.Type != JsonTokenType.Comma) { break; } reader.Consume(JsonTokenType.Comma); } return members; } private static JsonSyntax ParseValue(JsonTokenReader reader) { var current = reader.Peek(); if (current == null) { throw new InvalidOperationException("Could not parse value (EOF)"); } if (current.Type == JsonTokenType.LeftBrace) { return ParseObject(reader); } if (current.Type == JsonTokenType.LeftBracket) { return ParseArray(reader); } if (current.Type == JsonTokenType.Number) { reader.Consume(JsonTokenType.Number); return new JsonNumber(current.Lexeme); } if (current.Type == JsonTokenType.String) { reader.Consume(JsonTokenType.String); return new JsonString(current.Lexeme); } if (current.Type == JsonTokenType.Boolean) { reader.Consume(JsonTokenType.Boolean); return new JsonBoolean(current.Lexeme); } if (current.Type == JsonTokenType.Null) { reader.Consume(JsonTokenType.Null); return new JsonNull(current.Lexeme); } throw new InvalidOperationException($"Unknown value token: {current.Type}"); } private static JsonSyntax ParseObject(JsonTokenReader reader) { reader.Consume(JsonTokenType.LeftBrace); var result = new JsonObject(); if (reader.Peek()?.Type != JsonTokenType.RightBrace) { result.Members.AddRange(ParseMembers(reader)); } reader.Consume(JsonTokenType.RightBrace); return result; } private static JsonSyntax ParseArray(JsonTokenReader reader) { reader.Consume(JsonTokenType.LeftBracket); var result = new JsonArray(); if (reader.Peek()?.Type != JsonTokenType.RightBracket) { result.Items.AddRange(ParseElements(reader)); } reader.Consume(JsonTokenType.RightBracket); return result; } private static List ParseMembers(JsonTokenReader reader) { var members = new List(); while (!reader.Eof) { members.Add(ParseMember(reader)); if (reader.Peek()?.Type != JsonTokenType.Comma) { break; } reader.Consume(JsonTokenType.Comma); } return members; } private static JsonMember ParseMember(JsonTokenReader reader) { var name = reader.Consume(JsonTokenType.String); reader.Consume(JsonTokenType.Colon); var value = ParseElement(reader); return new JsonMember(name.Lexeme, value); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/JsonText.cs ================================================ namespace Spectre.Console.Json; /// /// A renderable piece of JSON text. /// public sealed class JsonText : JustInTimeRenderable { private readonly string _json; private JsonSyntax? _syntax; /// /// Gets or sets the style used for braces. /// public Style? BracesStyle { get; set; } /// /// Gets or sets the style used for brackets. /// public Style? BracketsStyle { get; set; } /// /// Gets or sets the style used for member names. /// public Style? MemberStyle { get; set; } /// /// Gets or sets the style used for colons. /// public Style? ColonStyle { get; set; } /// /// Gets or sets the style used for commas. /// public Style? CommaStyle { get; set; } /// /// Gets or sets the style used for string literals. /// public Style? StringStyle { get; set; } /// /// Gets or sets the style used for number literals. /// public Style? NumberStyle { get; set; } /// /// Gets or sets the style used for boolean literals. /// public Style? BooleanStyle { get; set; } /// /// Gets or sets the style used for null literals. /// public Style? NullStyle { get; set; } /// /// Gets or sets the indentation. /// Defaults to three spaces. /// public string Indentation { get; set; } = " "; /// /// Gets or sets the JSON parser. /// public IJsonParser? Parser { get; set { _syntax = null; field = value; } } /// /// Initializes a new instance of the class. /// /// The JSON to render. public JsonText(string json) { _json = json ?? throw new ArgumentNullException(nameof(json)); } /// protected override IRenderable Build() { _syntax ??= (Parser ?? JsonParser.Shared).Parse(_json); var context = new JsonBuilderContext( new JsonTextStyles { BracesStyle = BracesStyle ?? Color.Grey, BracketsStyle = BracketsStyle ?? Color.Grey, MemberStyle = MemberStyle ?? Color.Blue, ColonStyle = ColonStyle ?? Color.Yellow, CommaStyle = CommaStyle ?? Color.Grey, StringStyle = StringStyle ?? Color.Red, NumberStyle = NumberStyle ?? Color.Green, BooleanStyle = BooleanStyle ?? Color.Green, NullStyle = NullStyle ?? Color.Grey, }, Indentation); _syntax.Accept(JsonBuilder.Shared, context); return context.Paragraph; } } /// /// Contains extension methods for . /// public static class JsonTextExtensions { /// /// Sets the style used for braces. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText BracesStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.BracesStyle = style; return text; } /// /// Sets the style used for brackets. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText BracketStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.BracketsStyle = style; return text; } /// /// Sets the style used for member names. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText MemberStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.MemberStyle = style; return text; } /// /// Sets the style used for colons. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText ColonStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.ColonStyle = style; return text; } /// /// Sets the style used for commas. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText CommaStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.CommaStyle = style; return text; } /// /// Sets the style used for string literals. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText StringStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.StringStyle = style; return text; } /// /// Sets the style used for number literals. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText NumberStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.NumberStyle = style; return text; } /// /// Sets the style used for boolean literals. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText BooleanStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.BooleanStyle = style; return text; } /// /// Sets the style used for null literals. /// /// The JSON text instance. /// The style to set. /// The same instance so that multiple calls can be chained. public static JsonText NullStyle(this JsonText text, Style? style) { ArgumentNullException.ThrowIfNull(text); text.NullStyle = style; return text; } /// /// Sets the color used for braces. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText BracesColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.BracesStyle = new Style(color); return text; } /// /// Sets the color used for brackets. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText BracketColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.BracketsStyle = new Style(color); return text; } /// /// Sets the color used for member names. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText MemberColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.MemberStyle = new Style(color); return text; } /// /// Sets the color used for colons. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText ColonColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.ColonStyle = new Style(color); return text; } /// /// Sets the color used for commas. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText CommaColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.CommaStyle = new Style(color); return text; } /// /// Sets the color used for string literals. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText StringColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.StringStyle = new Style(color); return text; } /// /// Sets the color used for number literals. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText NumberColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.NumberStyle = new Style(color); return text; } /// /// Sets the color used for boolean literals. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText BooleanColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.BooleanStyle = new Style(color); return text; } /// /// Sets the color used for null literals. /// /// The JSON text instance. /// The color to set. /// The same instance so that multiple calls can be chained. public static JsonText NullColor(this JsonText text, Color color) { ArgumentNullException.ThrowIfNull(text); text.NullStyle = new Style(color); return text; } /// /// Sets the indentation. /// /// The JSON text instance. /// The indentation. /// The same instance so that multiple calls can be chained. public static JsonText Indentation(this JsonText text, string indentation = " ") { ArgumentNullException.ThrowIfNull(text); text.Indentation = indentation; return text; } } ================================================ FILE: src/Extensions/Spectre.Console.Json/JsonTextStyles.cs ================================================ namespace Spectre.Console.Json; internal sealed class JsonTextStyles { public Style? BracesStyle { get; set; } public Style? BracketsStyle { get; set; } public Style? MemberStyle { get; set; } public Style? ColonStyle { get; set; } public Style? CommaStyle { get; set; } public Style? StringStyle { get; set; } public Style? NumberStyle { get; set; } public Style? BooleanStyle { get; set; } public Style? NullStyle { get; set; } } ================================================ FILE: src/Extensions/Spectre.Console.Json/JsonToken.cs ================================================ namespace Spectre.Console.Json; internal sealed class JsonToken { public JsonTokenType Type { get; } public string Lexeme { get; } public JsonToken(JsonTokenType type, string lexeme) { Type = type; Lexeme = lexeme ?? throw new ArgumentNullException(nameof(lexeme)); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/JsonTokenReader.cs ================================================ namespace Spectre.Console.Json; internal sealed class JsonTokenReader { private readonly List _reader; private readonly int _length; public int Position { get; private set; } public bool Eof => Position >= _length; public JsonTokenReader(List tokens) { _reader = tokens; _length = tokens.Count; Position = 0; } public JsonToken Consume(JsonTokenType type) { var read = Read(); if (read == null) { throw new InvalidOperationException("Could not read token"); } if (read.Type != type) { throw new InvalidOperationException($"Expected '{type}' token, but found '{read.Type}'"); } return read; } public JsonToken? Peek() { if (Eof) { return null; } return _reader[Position]; } public JsonToken? Read() { if (Eof) { return null; } Position++; return _reader[Position - 1]; } } ================================================ FILE: src/Extensions/Spectre.Console.Json/JsonTokenType.cs ================================================ namespace Spectre.Console.Json; internal enum JsonTokenType { LeftBrace, RightBrace, LeftBracket, RightBracket, Colon, Comma, String, Number, Boolean, Null, } ================================================ FILE: src/Extensions/Spectre.Console.Json/JsonTokenizer.cs ================================================ namespace Spectre.Console.Json; internal static class JsonTokenizer { private static readonly Dictionary _typeLookup; private static readonly Dictionary _keywords; private static readonly HashSet _allowedEscapedChars; static JsonTokenizer() { _typeLookup = new Dictionary { { '{', JsonTokenType.LeftBrace }, { '}', JsonTokenType.RightBrace }, { '[', JsonTokenType.LeftBracket }, { ']', JsonTokenType.RightBracket }, { ':', JsonTokenType.Colon }, { ',', JsonTokenType.Comma }, }; _keywords = new Dictionary { { "true", JsonTokenType.Boolean }, { "false", JsonTokenType.Boolean }, { "null", JsonTokenType.Null }, }; _allowedEscapedChars = [ '\"', '\\', '/', 'b', 'f', 'n', 'r', 't', 'u' ]; } public static List Tokenize(string text) { var result = new List(); var buffer = new StringBuffer(text); while (!buffer.Eof) { var current = buffer.Peek(); if (_typeLookup.TryGetValue(current, out var tokenType)) { buffer.Read(); // Consume result.Add(new JsonToken(tokenType, current.ToString())); continue; } else if (current == '\"') { result.Add(ReadString(buffer)); } else if (current == '-' || current.IsDigit()) { result.Add(ReadNumber(buffer)); } else if (current is ' ' or '\n' or '\r' or '\t') { buffer.Read(); // Consume } else if (char.IsLetter(current)) { var accumulator = new StringBuilder(); while (!buffer.Eof) { current = buffer.Peek(); if (!char.IsLetter(current)) { break; } buffer.Read(); // Consume accumulator.Append(current); } if (!_keywords.TryGetValue(accumulator.ToString(), out var keyword)) { throw new InvalidOperationException($"Encountered invalid keyword '{keyword}'"); } result.Add(new JsonToken(keyword, accumulator.ToString())); } else { throw new InvalidOperationException("Invalid token"); } } return result; } private static JsonToken ReadString(StringBuffer buffer) { var accumulator = new StringBuilder(); accumulator.Append(buffer.Expect('\"')); while (!buffer.Eof) { var current = buffer.Peek(); if (current == '\"') { break; } else if (current == '\\') { buffer.Expect('\\'); if (buffer.Eof) { break; } current = buffer.Read(); if (!_allowedEscapedChars.Contains(current)) { throw new InvalidOperationException("Invalid escape encountered"); } accumulator.Append('\\').Append(current); } else { accumulator.Append(current); buffer.Read(); } } if (buffer.Eof) { throw new InvalidOperationException("Unterminated string literal"); } accumulator.Append(buffer.Expect('\"')); return new JsonToken(JsonTokenType.String, accumulator.ToString()); } private static JsonToken ReadNumber(StringBuffer buffer) { var accumulator = new StringBuilder(); // Minus? if (buffer.Peek() == '-') { buffer.Read(); accumulator.Append("-"); } // Digits var current = buffer.Peek(); if (current.IsDigit(min: 1)) { ReadDigits(buffer, accumulator, min: 1); } else if (current == '0') { accumulator.Append(buffer.Expect('0')); } else { throw new InvalidOperationException("Invalid number"); } // Fractions current = buffer.Peek(); if (current == '.') { accumulator.Append(buffer.Expect('.')); ReadDigits(buffer, accumulator); } // Exponent current = buffer.Peek(); if (current is 'e' or 'E') { accumulator.Append(buffer.Read()); current = buffer.Peek(); if (current is '+' or '-') { accumulator.Append(buffer.Read()); } ReadDigits(buffer, accumulator); } return new JsonToken(JsonTokenType.Number, accumulator.ToString()); } private static void ReadDigits(StringBuffer buffer, StringBuilder accumulator, int min = 0) { while (!buffer.Eof) { var current = buffer.Peek(); if (!current.IsDigit(min)) { break; } buffer.Read(); // Consume accumulator.Append(current); } } } ================================================ FILE: src/Extensions/Spectre.Console.Json/Properties/Usings.cs ================================================ global using System.Text; global using Spectre.Console.Json.Syntax; global using Spectre.Console.Rendering; ================================================ FILE: src/Extensions/Spectre.Console.Json/Spectre.Console.Json.csproj ================================================ net10.0;net9.0;net8.0;netstandard2.0 true true A library that extends Spectre.Console with JSON superpowers. true true ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonArray.cs ================================================ namespace Spectre.Console.Json.Syntax; /// /// Represents an array in the JSON abstract syntax tree. /// public sealed class JsonArray : JsonSyntax { /// /// Gets the array items. /// public List Items { get; } /// /// Initializes a new instance of the class. /// public JsonArray() { Items = []; } internal override void Accept(JsonSyntaxVisitor visitor, T context) { visitor.VisitArray(this, context); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonBoolean.cs ================================================ namespace Spectre.Console.Json.Syntax; /// /// Represents a boolean literal in the JSON abstract syntax tree. /// public sealed class JsonBoolean : JsonSyntax { /// /// Gets the lexeme. /// public string Lexeme { get; } /// /// Initializes a new instance of the class. /// /// The lexeme. public JsonBoolean(string lexeme) { Lexeme = lexeme; } internal override void Accept(JsonSyntaxVisitor visitor, T context) { visitor.VisitBoolean(this, context); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonMember.cs ================================================ namespace Spectre.Console.Json.Syntax; /// /// Represents a member in the JSON abstract syntax tree. /// public sealed class JsonMember : JsonSyntax { /// /// Gets the member name. /// public string Name { get; } /// /// Gets the member value. /// public JsonSyntax Value { get; } /// /// Initializes a new instance of the class. /// /// The name. /// The value. public JsonMember(string name, JsonSyntax value) { Name = name; Value = value; } internal override void Accept(JsonSyntaxVisitor visitor, T context) { visitor.VisitMember(this, context); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonNull.cs ================================================ namespace Spectre.Console.Json.Syntax; /// /// Represents a null literal in the JSON abstract syntax tree. /// public sealed class JsonNull : JsonSyntax { /// /// Gets the lexeme. /// public string Lexeme { get; } /// /// Initializes a new instance of the class. /// /// The lexeme. public JsonNull(string lexeme) { Lexeme = lexeme; } internal override void Accept(JsonSyntaxVisitor visitor, T context) { visitor.VisitNull(this, context); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonNumber.cs ================================================ namespace Spectre.Console.Json.Syntax; internal sealed class JsonNumber : JsonSyntax { public string Lexeme { get; } public JsonNumber(string lexeme) { Lexeme = lexeme; } internal override void Accept(JsonSyntaxVisitor visitor, T context) { visitor.VisitNumber(this, context); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonObject.cs ================================================ namespace Spectre.Console.Json.Syntax; /// /// Represents an object in the JSON abstract syntax tree. /// public sealed class JsonObject : JsonSyntax { /// /// Gets the object's members. /// public List Members { get; } /// /// Initializes a new instance of the class. /// public JsonObject() { Members = []; } internal override void Accept(JsonSyntaxVisitor visitor, T context) { visitor.VisitObject(this, context); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonString.cs ================================================ namespace Spectre.Console.Json.Syntax; /// /// Represents a string literal in the JSON abstract syntax tree. /// public sealed class JsonString : JsonSyntax { /// /// Gets the lexeme. /// public string Lexeme { get; } /// /// Initializes a new instance of the class. /// /// The lexeme. public JsonString(string lexeme) { Lexeme = lexeme; } internal override void Accept(JsonSyntaxVisitor visitor, T context) { visitor.VisitString(this, context); } } ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonSyntax.cs ================================================ namespace Spectre.Console.Json.Syntax; /// /// Represents a syntax node in the JSON abstract syntax tree. /// public abstract class JsonSyntax { internal abstract void Accept(JsonSyntaxVisitor visitor, T context); } ================================================ FILE: src/Extensions/Spectre.Console.Json/Syntax/JsonSyntaxVisitor.cs ================================================ namespace Spectre.Console.Json.Syntax; internal abstract class JsonSyntaxVisitor { public abstract void VisitObject(JsonObject syntax, T context); public abstract void VisitArray(JsonArray syntax, T context); public abstract void VisitMember(JsonMember syntax, T context); public abstract void VisitNumber(JsonNumber syntax, T context); public abstract void VisitString(JsonString syntax, T context); public abstract void VisitBoolean(JsonBoolean syntax, T context); public abstract void VisitNull(JsonNull syntax, T context); } ================================================ FILE: src/Spectre.Console/AnsiConsole.Exceptions.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Writes an exception to the console. /// /// The exception to write to the console. /// The exception format options. [RequiresDynamicCode(ExceptionFormatter.AotWarning)] public static void WriteException(Exception exception, ExceptionFormats format = ExceptionFormats.Default) { Console.WriteException(exception, format); } /// /// Writes an exception to the console. /// /// The exception to write to the console. /// The exception settings. [RequiresDynamicCode(ExceptionFormatter.AotWarning)] public static void WriteException(Exception exception, ExceptionSettings settings) { Console.WriteException(exception, settings); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.Live.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Creates a new instance. /// /// The target renderable to update. /// A instance. public static LiveDisplay Live(IRenderable target) { return Console.Live(target); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.Markup.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Writes the specified markup to the console. /// /// The value to write. public static void Markup(string value) { Console.Markup(value); } /// /// Writes the specified markup to the console. /// /// A composite format string. /// An array of objects to write. public static void Markup(string format, params object[] args) { Console.Markup(format, args); } /// /// Writes the specified markup to the console. /// /// All interpolation holes which contain a string are automatically escaped. /// /// /// /// string input = args[0]; /// string output = Process(input); /// AnsiConsole.MarkupInterpolated($"[blue]{input}[/] -> [green]{output}[/]"); /// /// /// The interpolated string value to write. public static void MarkupInterpolated(FormattableString value) { Console.MarkupInterpolated(value); } /// /// Writes the specified markup to the console. /// /// An object that supplies culture-specific formatting information. /// A composite format string. /// An array of objects to write. public static void Markup(IFormatProvider provider, string format, params object[] args) { Console.Markup(provider, format, args); } /// /// Writes the specified markup to the console. /// /// All interpolation holes which contain a string are automatically escaped. /// /// /// /// string input = args[0]; /// string output = Process(input); /// AnsiConsole.MarkupInterpolated(CultureInfo.InvariantCulture, $"[blue]{input}[/] -> [green]{output}[/]"); /// /// /// An object that supplies culture-specific formatting information. /// The interpolated string value to write. public static void MarkupInterpolated(IFormatProvider provider, FormattableString value) { Console.MarkupInterpolated(provider, value); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// The value to write. public static void MarkupLine(string value) { Console.MarkupLine(value); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// A composite format string. /// An array of objects to write. public static void MarkupLine(string format, params object[] args) { Console.MarkupLine(format, args); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// All interpolation holes which contain a string are automatically escaped. /// /// /// /// string input = args[0]; /// string output = Process(input); /// AnsiConsole.MarkupLineInterpolated($"[blue]{input}[/] -> [green]{output}[/]"); /// /// /// The interpolated string value to write. public static void MarkupLineInterpolated(FormattableString value) { Console.MarkupLineInterpolated(value); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// A composite format string. /// An array of objects to write. public static void MarkupLine(IFormatProvider provider, string format, params object[] args) { Console.MarkupLine(provider, format, args); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// All interpolation holes which contain a string are automatically escaped. /// /// /// /// string input = args[0]; /// string output = Process(input); /// AnsiConsole.MarkupLineInterpolated(CultureInfo.InvariantCulture, $"[blue]{input}[/] -> [green]{output}[/]"); /// /// /// An object that supplies culture-specific formatting information. /// The interpolated string value to write. public static void MarkupLineInterpolated(IFormatProvider provider, FormattableString value) { Console.MarkupLineInterpolated(provider, value); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.Progress.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Creates a new instance. /// /// A instance. public static Progress Progress() { return Console.Progress(); } /// /// Creates a new instance. /// /// A instance. public static Status Status() { return Console.Status(); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.Prompt.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Displays a prompt to the user. /// /// The prompt result type. /// The prompt to display. /// The prompt input result. public static T Prompt(IPrompt prompt) { ArgumentNullException.ThrowIfNull(prompt); return prompt.Show(Console); } /// /// Displays a prompt to the user. /// /// The prompt result type. /// The prompt to display. /// The token to monitor for cancellation requests. /// The prompt input result. public static Task PromptAsync(IPrompt prompt, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(prompt); return prompt.ShowAsync(Console, cancellationToken); } /// /// Displays a prompt to the user. /// /// The prompt result type. /// The prompt markup text. /// The prompt input result. public static T Ask(string prompt) { return new TextPrompt(prompt).Show(Console); } /// /// Displays a prompt to the user. /// /// The prompt result type. /// The prompt markup text. /// The token to monitor for cancellation requests. /// The prompt input result. public static Task AskAsync(string prompt, CancellationToken cancellationToken = default) { return new TextPrompt(prompt).ShowAsync(Console, cancellationToken); } /// /// Displays a prompt to the user with a given default. /// /// The prompt result type. /// The prompt markup text. /// The default value. /// The prompt input result. public static T Ask(string prompt, T defaultValue) { return new TextPrompt(prompt) .DefaultValue(defaultValue) .Show(Console); } /// /// Displays a prompt to the user with a given default. /// /// The prompt result type. /// The prompt markup text. /// The default value. /// The token to monitor for cancellation requests. /// The prompt input result. public static Task AskAsync(string prompt, T defaultValue, CancellationToken cancellationToken = default) { return new TextPrompt(prompt) .DefaultValue(defaultValue) .ShowAsync(Console, cancellationToken); } /// /// Displays a prompt with two choices, yes or no. /// /// The prompt markup text. /// Specifies the default answer. /// true if the user selected "yes", otherwise false. public static bool Confirm(string prompt, bool defaultValue = true) { return new ConfirmationPrompt(prompt) { DefaultValue = defaultValue, } .Show(Console); } /// /// Displays a prompt with two choices, yes or no. /// /// The prompt markup text. /// Specifies the default answer. /// The token to monitor for cancellation requests. /// true if the user selected "yes", otherwise false. public static Task ConfirmAsync(string prompt, bool defaultValue = true, CancellationToken cancellationToken = default) { return new ConfirmationPrompt(prompt) { DefaultValue = defaultValue, } .ShowAsync(Console, cancellationToken); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.Recording.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Starts recording the console output. /// public static void Record() { if (_recorder == null) { _recorder = new Recorder(Console); } } /// /// Exports all recorded console output as text. /// /// The recorded output as text. public static string ExportText() { if (_recorder == null) { throw new InvalidOperationException("Cannot export text since a recording hasn't been started."); } return _recorder.ExportText(); } /// /// Exports all recorded console output as HTML text. /// /// The recorded output as HTML text. public static string ExportHtml() { if (_recorder == null) { throw new InvalidOperationException("Cannot export HTML since a recording hasn't been started."); } return _recorder.ExportHtml(); } /// /// Exports all recorded console output using a custom encoder. /// /// The encoder to use. /// The recorded output. public static string ExportCustom(IAnsiConsoleEncoder encoder) { if (_recorder == null) { throw new InvalidOperationException("Cannot export HTML since a recording hasn't been started."); } ArgumentNullException.ThrowIfNull(encoder); return _recorder.Export(encoder); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.Screen.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Switches to an alternate screen buffer if the terminal supports it. /// /// The action to execute within the alternate screen buffer. public static void AlternateScreen(Action action) { Console.AlternateScreen(action); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.State.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { internal static Style CurrentStyle { get; private set; } = Style.Plain; internal static bool Created { get; private set; } /// /// Gets or sets the foreground color. /// public static Color Foreground { get => CurrentStyle.Foreground; set => CurrentStyle = CurrentStyle.Foreground(value); } /// /// Gets or sets the background color. /// public static Color Background { get => CurrentStyle.Background; set => CurrentStyle = CurrentStyle.Background(value); } /// /// Gets or sets the text decoration. /// public static Decoration Decoration { get => CurrentStyle.Decoration; set => CurrentStyle = CurrentStyle.Decoration(value); } /// /// Resets colors and text decorations. /// public static void Reset() { ResetColors(); ResetDecoration(); } /// /// Resets the current applied text decorations. /// public static void ResetDecoration() { Decoration = Decoration.None; } /// /// Resets the current applied foreground and background colors. /// public static void ResetColors() { CurrentStyle = Style.Plain; } } ================================================ FILE: src/Spectre.Console/AnsiConsole.Write.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Renders the specified to the console. /// /// The object to render. public static void Write(IRenderable renderable) { ArgumentNullException.ThrowIfNull(renderable); Console.Write(renderable); } /// /// Writes the specified string value to the console. /// /// The value to write. public static void Write(string value) { Write(value, CurrentStyle); } /// /// Writes the text representation of the specified 32-bit /// signed integer value to the console. /// /// The value to write. public static void Write(int value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified 32-bit /// signed integer value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, int value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified 32-bit /// unsigned integer value to the console. /// /// The value to write. public static void Write(uint value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified 32-bit /// unsigned integer value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, uint value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified 64-bit /// signed integer value to the console. /// /// The value to write. public static void Write(long value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified 64-bit /// signed integer value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, long value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified 64-bit /// unsigned integer value to the console. /// /// The value to write. public static void Write(ulong value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified 64-bit /// unsigned integer value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, ulong value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified single-precision /// floating-point value to the console. /// /// The value to write. public static void Write(float value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified single-precision /// floating-point value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, float value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified double-precision /// floating-point value to the console. /// /// The value to write. public static void Write(double value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified double-precision /// floating-point value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, double value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified decimal value, to the console. /// /// The value to write. public static void Write(decimal value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified decimal value, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, decimal value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified boolean value to the console. /// /// The value to write. public static void Write(bool value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified boolean value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, bool value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the specified Unicode character to the console. /// /// The value to write. public static void Write(char value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the specified Unicode character to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, char value) { Console.Write(value.ToString(provider), CurrentStyle); } /// /// Writes the specified array of Unicode characters to the console. /// /// The value to write. public static void Write(char[] value) { Write(CultureInfo.CurrentCulture, value); } /// /// Writes the specified array of Unicode characters to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void Write(IFormatProvider provider, char[] value) { ArgumentNullException.ThrowIfNull(value); for (var index = 0; index < value.Length; index++) { Console.Write(value[index].ToString(provider), CurrentStyle); } } /// /// Writes the text representation of the specified array of objects, /// to the console using the specified format information. /// /// A composite format string. /// An array of objects to write. public static void Write(string format, params object[] args) { Write(CultureInfo.CurrentCulture, format, args); } /// /// Writes the text representation of the specified array of objects, /// to the console using the specified format information. /// /// An object that supplies culture-specific formatting information. /// A composite format string. /// An array of objects to write. public static void Write(IFormatProvider provider, string format, params object[] args) { Console.Write(string.Format(provider, format, args), CurrentStyle); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.WriteLine.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { /// /// Writes an empty line to the console. /// public static void WriteLine() { Console.WriteLine(); } /// /// Writes the specified string value, followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(string value) { Console.WriteLine(value, CurrentStyle); } /// /// Writes the text representation of the specified 32-bit signed integer value, /// followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(int value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified 32-bit signed integer value, /// followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, int value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified 32-bit unsigned integer value, /// followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(uint value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified 32-bit unsigned integer value, /// followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, uint value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified 64-bit signed integer value, /// followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(long value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified 64-bit signed integer value, /// followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, long value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified 64-bit unsigned integer value, /// followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(ulong value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified 64-bit unsigned integer value, /// followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, ulong value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified single-precision floating-point /// value, followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(float value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified single-precision floating-point /// value, followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, float value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified double-precision floating-point /// value, followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(double value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified double-precision floating-point /// value, followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, double value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified decimal value, /// followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(decimal value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified decimal value, /// followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, decimal value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the text representation of the specified boolean value, /// followed by the current line terminator, to the console. /// /// The value to write. public static void WriteLine(bool value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the text representation of the specified boolean value, /// followed by the current line terminator, to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, bool value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the specified Unicode character, followed by the current /// line terminator, value to the console. /// /// The value to write. public static void WriteLine(char value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the specified Unicode character, followed by the current /// line terminator, value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, char value) { Console.WriteLine(value.ToString(provider), CurrentStyle); } /// /// Writes the specified array of Unicode characters, followed by the current /// line terminator, value to the console. /// /// The value to write. public static void WriteLine(char[] value) { WriteLine(CultureInfo.CurrentCulture, value); } /// /// Writes the specified array of Unicode characters, followed by the current /// line terminator, value to the console. /// /// An object that supplies culture-specific formatting information. /// The value to write. public static void WriteLine(IFormatProvider provider, char[] value) { ArgumentNullException.ThrowIfNull(value); for (var index = 0; index < value.Length; index++) { Console.Write(value[index].ToString(provider), CurrentStyle); } Console.WriteLine(); } /// /// Writes the text representation of the specified array of objects, /// followed by the current line terminator, to the console /// using the specified format information. /// /// A composite format string. /// An array of objects to write. public static void WriteLine(string format, params object[] args) { WriteLine(CultureInfo.CurrentCulture, format, args); } /// /// Writes the text representation of the specified array of objects, /// followed by the current line terminator, to the console /// using the specified format information. /// /// An object that supplies culture-specific formatting information. /// A composite format string. /// An array of objects to write. public static void WriteLine(IFormatProvider provider, string format, params object[] args) { Console.WriteLine(string.Format(provider, format, args), CurrentStyle); } } ================================================ FILE: src/Spectre.Console/AnsiConsole.cs ================================================ namespace Spectre.Console; /// /// A console capable of writing ANSI escape sequences. /// public static partial class AnsiConsole { private static Recorder? _recorder; private static Lazy _console = new Lazy( () => { var console = Create(new AnsiConsoleSettings { Ansi = AnsiSupport.Detect, ColorSystem = ColorSystemSupport.Detect, Out = new AnsiConsoleOutput(System.Console.Out), }); Created = true; return console; }); /// /// Gets or sets the underlying . /// public static IAnsiConsole Console { get { return _recorder ?? _console.Value; } set { _console = new Lazy(() => value); if (_recorder != null) { // Recreate the recorder _recorder = _recorder.Clone(value); } Created = true; } } /// /// Gets the . /// public static IAnsiConsoleCursor Cursor => _recorder?.Cursor ?? _console.Value.Cursor; /// /// Gets the console profile. /// public static Profile Profile => Console.Profile; /// /// Creates a new instance /// from the provided settings. /// /// The settings to use. /// An instance. public static IAnsiConsole Create(AnsiConsoleSettings settings) { return AnsiConsoleFactory.Create(settings); } /// /// Clears the console. /// public static void Clear() { Console.Clear(); } } ================================================ FILE: src/Spectre.Console/AnsiConsoleFactory.cs ================================================ namespace Spectre.Console; /// /// Factory for creating an ANSI console. /// internal sealed class AnsiConsoleFactory { public static IAnsiConsole Create(AnsiConsoleSettings settings) { ArgumentNullException.ThrowIfNull(settings); var output = settings.Out ?? new AnsiConsoleOutput(System.Console.Out); if (output.Writer == null) { throw new InvalidOperationException("Output writer was null"); } // Get the capabilities of the terminal var caps = Capabilities.Create(output.Writer, settings, out var encoding); // Create a profile using the capabilities and enrich it var profile = new Profile(output, caps, encoding); ProfileEnricher.Enrich( profile, settings.Enrichment, settings.EnvironmentVariables); return new AnsiConsoleFacade( profile, settings.ExclusivityMode ?? new DefaultExclusivityMode()); } } ================================================ FILE: src/Spectre.Console/AnsiConsoleOutput.cs ================================================ namespace Spectre.Console; /// /// Represents console output. /// public sealed class AnsiConsoleOutput : IAnsiConsoleOutput { /// public TextWriter Writer { get; } /// public bool IsTerminal { get { if (Writer.IsStandardOut()) { return !System.Console.IsOutputRedirected; } if (Writer.IsStandardError()) { return !System.Console.IsErrorRedirected; } return false; } } /// public int Width => ConsoleHelper.GetSafeWidth(); /// public int Height => ConsoleHelper.GetSafeHeight(); /// /// Initializes a new instance of the class. /// /// The output writer. public AnsiConsoleOutput(TextWriter writer) { Writer = writer ?? throw new ArgumentNullException(nameof(writer)); } /// public void SetEncoding(Encoding encoding) { if (Writer.IsStandardOut() || Writer.IsStandardError()) { System.Console.OutputEncoding = encoding; } } } ================================================ FILE: src/Spectre.Console/AnsiConsoleSettings.cs ================================================ namespace Spectre.Console; /// /// Settings used when building a . /// public sealed class AnsiConsoleSettings { /// /// Gets or sets a value indicating whether or /// not ANSI escape sequences are supported. /// public AnsiSupport Ansi { get; set; } /// /// Gets or sets the color system to use. /// public ColorSystemSupport ColorSystem { get; set; } = ColorSystemSupport.Detect; /// /// Gets or sets the out buffer. /// public IAnsiConsoleOutput? Out { get; set; } /// /// Gets or sets a value indicating whether or not the /// terminal is interactive or not. /// public InteractionSupport Interactive { get; set; } /// /// Gets or sets the exclusivity mode. /// public IExclusivityMode? ExclusivityMode { get; set; } /// /// Gets or sets the profile enrichments settings. /// public ProfileEnrichment Enrichment { get; set; } /// /// Gets or sets the environment variables. /// If not value is provided the default environment variables will be used. /// public Dictionary? EnvironmentVariables { get; set; } /// /// Initializes a new instance of the class. /// public AnsiConsoleSettings() { Enrichment = new ProfileEnrichment(); } } ================================================ FILE: src/Spectre.Console/BoxBorder.Known.cs ================================================ namespace Spectre.Console; /// /// Represents a border. /// public abstract partial class BoxBorder { /// /// Gets an invisible border. /// public static BoxBorder None { get; } = new NoBoxBorder(); /// /// Gets an ASCII border. /// public static BoxBorder Ascii { get; } = new AsciiBoxBorder(); /// /// Gets a double border. /// [SuppressMessage("Naming", "CA1720:Identifier contains type name")] public static BoxBorder Double { get; } = new DoubleBoxBorder(); /// /// Gets a heavy border. /// public static BoxBorder Heavy { get; } = new HeavyBoxBorder(); /// /// Gets a rounded border. /// public static BoxBorder Rounded { get; } = new RoundedBoxBorder(); /// /// Gets a square border. /// public static BoxBorder Square { get; } = new SquareBoxBorder(); } ================================================ FILE: src/Spectre.Console/BoxBorder.cs ================================================ namespace Spectre.Console; /// /// Represents a border. /// public abstract partial class BoxBorder { /// /// Gets the safe border for this border or null if none exist. /// public virtual BoxBorder? SafeBorder { get; } /// /// Gets the string representation of the specified border part. /// /// The part to get the character representation for. /// A character representation of the specified border part. public abstract string GetPart(BoxBorderPart part); } /// /// Contains extension methods for . /// public static class BoxExtensions { /// /// Gets the safe border for a border. /// /// The border to get the safe border for. /// Whether or not to return the safe border. /// The safe border if one exist, otherwise the original border. public static BoxBorder GetSafeBorder(this BoxBorder border, bool safe) { ArgumentNullException.ThrowIfNull(border); if (safe && border.SafeBorder != null) { border = border.SafeBorder; } return border; } } ================================================ FILE: src/Spectre.Console/Capabilities.cs ================================================ namespace Spectre.Console; /// /// Represents terminal capabilities. /// public sealed class Capabilities : AnsiCapabilities, IReadOnlyCapabilities { /// /// Gets or sets a value indicating whether or not /// this is a legacy console (cmd.exe) on an OS /// prior to Windows 10. /// /// /// Only relevant when running on Microsoft Windows. /// [Obsolete("This property will be removed in a future version")] public bool Legacy { get; set; } /// /// Gets or sets a value indicating whether /// or not the console supports interaction. /// public bool Interactive { get; set; } /// /// Gets or sets a value indicating whether /// or not the console supports Unicode. /// public bool Unicode { get; set; } /// /// Creates a instance from the provided arguments. /// /// The text writer to use. /// The settings to use. /// The detected encoding. /// A instance. public static Capabilities Create(TextWriter writer, AnsiConsoleSettings settings, out Encoding encoding) { ArgumentNullException.ThrowIfNull(writer); var ansiCaps = AnsiCapabilities.Create(writer, new AnsiWriterSettings { Ansi = settings.Ansi, ColorSystem = settings.ColorSystem, }); // Use console encoding or fall back to provided encoding encoding = writer.IsStandardOut() || writer.IsStandardError() ? System.Console.OutputEncoding : writer.Encoding; return new Capabilities { ColorSystem = ansiCaps.ColorSystem, Ansi = ansiCaps.Ansi, Links = ansiCaps.Links, #pragma warning disable CS0618 // Type or member is obsolete Legacy = false, #pragma warning restore CS0618 // Type or member is obsolete Interactive = InteractionDetector.IsInteractive(settings.Interactive), Unicode = encoding.EncodingName.ContainsExact("Unicode"), AlternateBuffer = ansiCaps.AlternateBuffer, }; } } ================================================ FILE: src/Spectre.Console/CircularBuffer.cs ================================================ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // As this file is copied from dotnet/aspire we don't want to style it in our format to make diffing easier in the future #pragma warning disable SA1512 // Single-line comments should not be followed by blank line #pragma warning disable SA1513 // Closing brace should be followed by blank line #pragma warning disable SA1515 // Single-line comment should be preceded by blank line #pragma warning disable SA1028 // Code should not contain trailing whitespace #pragma warning disable SA1401 // Field should be private #pragma warning disable SA1503 // Braces should not be omitted #pragma warning disable CS1591 // Missing XML comment for publicly visible type or member #pragma warning disable SA1507 // Code should not contain multiple blank lines in a row #pragma warning disable SA1618 // Generic type parameters should be documented #pragma warning disable SA1623 // Property summary documentation should match accessors #pragma warning disable SA1600 // Elements should be documented #pragma warning disable SA1128 // Put constructor initializers on their own line #pragma warning disable RCS1079 // Implement the functionality instead of throwing new NotImplementedException #pragma warning disable IDE0005 // Using directive is unnecessary // This was taken from https://github.com/dotnet/aspire/blob/a99edf17f50cbd2717f708706448e33a53825476/src/Shared/CircularBuffer.cs its license is also MIT. This is the same exact circularbuffer that VS uses in Microsoft.VisualStudio.Utilities (at least a cursory decompiling shows it to be such): https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualstudio.utilities.circularbuffer-1?view=visualstudiosdk-2022. Minor fix for .netstandard 2.0 using System.Runtime.InteropServices; namespace Spectre.Console; /// /// The circular buffer starts with an empty list and grows to a maximum size. /// When the buffer is full, adding or inserting a new item removes the first item in the buffer. /// [DebuggerDisplay("Count = {Count}")] [DebuggerTypeProxy(typeof(CircularBuffer<>.CircularBufferDebugView))] public sealed class CircularBuffer : IList, ICollection, IEnumerable, IEnumerable { // Internal for testing. internal readonly List _buffer; internal int _start; internal int _end; public event Action? ItemRemovedForCapacity; public CircularBuffer(int capacity) : this(new List(), capacity, start: 0, end: 0) { } internal CircularBuffer(List buffer, int capacity, int start, int end) { if (capacity < 1) { throw new ArgumentException("Circular buffer must have a capacity greater than 0.", nameof(capacity)); } _buffer = buffer; Capacity = capacity; _start = start; _end = end; UniqueRemovedCheck = !typeof(T).IsValueType; } /// /// We have some debug.asserts to make sure items removed do not still appear in the buffer, but valuetypes can have equal items (or you may want to insert multiple copies of the same instance. This is automatically set to false for valuetypes but you can override. /// public bool UniqueRemovedCheck { get; set; } = true; public int Capacity { get; } public bool IsFull => Count == Capacity; public bool IsEmpty => Count == 0; public int Count => _buffer.Count; public bool IsReadOnly { get; } public bool IsFixedSize { get; } = true; public object SyncRoot { get; } = new object(); public bool IsSynchronized { get; } public int IndexOf(T item) { for (var index = 0; index < Count; ++index) { if (Equals(this[index], item)) { return index; } } return -1; } public void Insert(int index, T item) { // TODO: There are a lot of branches in this method. Look into simplifying it. if (index == Count) { Add(item); return; } ValidateIndexInRange(index); if (IsFull) { if (index == 0) { // When full, the item inserted at 0 is always the "last" in the buffer and is removed. ItemRemovedForCapacity?.Invoke(item); return; } var removedItem = this[0]; var internalIndex = InternalIndex(index); #if !NETSTANDARD2_0 var data = CollectionsMarshal.AsSpan(_buffer); #else var data = _buffer.ToArray().AsSpan(); #endif // Shift data to make remove for insert. if (internalIndex == 0) { data.Slice(0, _end).CopyTo(data.Slice(1)); } else if (internalIndex > _end) { // Data is shifted forward so save the last item to copy to the front. var overflowItem = data[data.Length - 1]; var shiftLength = data.Length - internalIndex - 1; data.Slice(internalIndex, shiftLength).CopyTo(data.Slice(internalIndex + 1)); if (shiftLength > 0 || internalIndex == _buffer.Count - 1) { data.Slice(0, _end).CopyTo(data.Slice(1)); } data[0] = overflowItem; } else if (internalIndex < _end && _end < _buffer.Count - 1) { data.Slice(internalIndex, _end - internalIndex).CopyTo(data.Slice(internalIndex + 1)); } else { data.Slice(internalIndex, data.Length - internalIndex - 1).CopyTo(data.Slice(internalIndex + 1)); } // Set the actual item. data[internalIndex] = item; Increment(ref _end); _start = _end; if (UniqueRemovedCheck) { Debug.Assert(!_buffer.Contains(removedItem), "Item was not correctly removed."); } ItemRemovedForCapacity?.Invoke(removedItem); } else { var internalIndex = index + _start; if (internalIndex > _buffer.Count) { internalIndex = internalIndex % _buffer.Count; } _buffer.Insert(internalIndex, item); if (internalIndex < _end) { Increment(ref _end); if (_end != _buffer.Count) { _start = _end; } } } } public void RemoveAt(int index) { ValidateIndexInRange(index); var internalIndex = InternalIndex(index); _buffer.RemoveAt(internalIndex); if (internalIndex < _end) { Decrement(ref _end); if (_start > 0) { _start = _end; } } } private void ValidateIndexInRange(int index) { if (index >= Count) { throw new InvalidOperationException($"Cannot access index {index}. Buffer size is {Count}"); } } public bool Remove(T item) => throw new NotImplementedException(); public T this[int index] { get { ValidateIndexInRange(index); return _buffer[InternalIndex(index)]; } set { ValidateIndexInRange(index); _buffer[InternalIndex(index)] = value; } } public void Add(T item) { if (IsFull) { var removedItem = this[0]; _buffer[_end] = item; Increment(ref _end); _start = _end; if (UniqueRemovedCheck) { Debug.Assert(!_buffer.Contains(removedItem), "Item was not correctly removed."); } ItemRemovedForCapacity?.Invoke(removedItem); } else { _buffer.Insert(_end, item); Increment(ref _end); if (_end != _buffer.Count) { _start = _end; } } } public void Clear() { _start = 0; _end = 0; _buffer.Clear(); } public bool Contains(T item) => IndexOf(item) != -1; public void CopyTo(T[] array, int arrayIndex) { if (array.Length - arrayIndex < Count) { throw new ArgumentException("Array does not contain enough space for items"); } for (var index = 0; index < Count; ++index) { array[index + arrayIndex] = this[index]; } } public T[] ToArray() { if (IsEmpty) { return Array.Empty(); } var array = new T[Count]; for (var index = 0; index < Count; ++index) { array[index] = this[index]; } return array; } public IEnumerator GetEnumerator() { for (var i = 0; i < Count; ++i) { yield return this[i]; } } IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); private int InternalIndex(int index) { return (_start + index) % _buffer.Count; } private void Increment(ref int index) { if (++index < Capacity) { return; } index = 0; } private void Decrement(ref int index) { index = (index <= 0) ? Capacity - 1 : index - 1; } public CircularBuffer Clone() { var buffer = new CircularBuffer(_buffer.ToList(), Capacity, _start, _end); buffer.ItemRemovedForCapacity = ItemRemovedForCapacity; return buffer; } private sealed class CircularBufferDebugView(CircularBuffer collection) { private readonly CircularBuffer _collection = collection; public T[] Items => _collection.ToArray(); public int Start => _collection._start; public int End => _collection._end; public int Capacity => _collection.Capacity; } } #pragma warning restore SA1512 // Single-line comments should not be followed by blank line #pragma warning restore SA1513 // Closing brace should be followed by blank line #pragma warning restore SA1515 // Single-line comment should be preceded by blank line #pragma warning restore SA1028 // Code should not contain trailing whitespace #pragma warning restore SA1401 // Field should be private #pragma warning restore SA1503 // Braces should not be omitted #pragma warning restore CS1591 // Missing XML comment for publicly visible type or member #pragma warning restore SA1507 // Code should not contain multiple blank lines in a row #pragma warning restore SA1618 // Generic type parameters should be documented #pragma warning restore SA1623 // Property summary documentation should match accessors #pragma warning restore SA1600 // Elements should be documented #pragma warning restore SA1128 // Put constructor initializers on their own line #pragma warning restore RCS1079 // Implement the functionality instead of throwing new NotImplementedException #pragma warning disable IDE0005 // Using directive is unnecessary ================================================ FILE: src/Spectre.Console/CursorDirection.cs ================================================ namespace Spectre.Console; /// /// Represents cursor direction. /// public enum CursorDirection { /// /// Moves cursor up. /// Up, /// /// Moves cursor down. /// Down, /// /// Moves cursor left. /// Left, /// /// Moves cursor right. /// Right, } ================================================ FILE: src/Spectre.Console/Data/emoji.json ================================================ [ { "label": "regional indicator A", "hexcode": "1F1E6", "emoji": "🇦", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator B", "hexcode": "1F1E7", "emoji": "🇧", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator C", "hexcode": "1F1E8", "emoji": "🇨", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator D", "hexcode": "1F1E9", "emoji": "🇩", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator E", "hexcode": "1F1EA", "emoji": "🇪", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator F", "hexcode": "1F1EB", "emoji": "🇫", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator G", "hexcode": "1F1EC", "emoji": "🇬", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator H", "hexcode": "1F1ED", "emoji": "🇭", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator I", "hexcode": "1F1EE", "emoji": "🇮", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator J", "hexcode": "1F1EF", "emoji": "🇯", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator K", "hexcode": "1F1F0", "emoji": "🇰", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator L", "hexcode": "1F1F1", "emoji": "🇱", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator M", "hexcode": "1F1F2", "emoji": "🇲", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator N", "hexcode": "1F1F3", "emoji": "🇳", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator O", "hexcode": "1F1F4", "emoji": "🇴", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator P", "hexcode": "1F1F5", "emoji": "🇵", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator Q", "hexcode": "1F1F6", "emoji": "🇶", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator R", "hexcode": "1F1F7", "emoji": "🇷", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator S", "hexcode": "1F1F8", "emoji": "🇸", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator T", "hexcode": "1F1F9", "emoji": "🇹", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator U", "hexcode": "1F1FA", "emoji": "🇺", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator V", "hexcode": "1F1FB", "emoji": "🇻", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator W", "hexcode": "1F1FC", "emoji": "🇼", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator X", "hexcode": "1F1FD", "emoji": "🇽", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator Y", "hexcode": "1F1FE", "emoji": "🇾", "text": "", "type": 1, "version": 0 }, { "label": "regional indicator Z", "hexcode": "1F1FF", "emoji": "🇿", "text": "", "type": 1, "version": 0 }, { "label": "grinning face", "hexcode": "1F600", "tags": [ "cheerful", "cheery", "face", "grin", "grinning", "happy", "laugh", "nice", "smile", "smiling", "teeth" ], "emoji": "😀", "text": "", "type": 1, "order": 1, "group": 0, "subgroup": 0, "version": 1 }, { "label": "grinning face with big eyes", "hexcode": "1F603", "tags": [ "awesome", "big", "eyes", "face", "grin", "grinning", "happy", "mouth", "open", "smile", "smiling", "teeth", "yay" ], "emoji": "😃", "text": "", "type": 1, "order": 2, "group": 0, "subgroup": 0, "version": 0.6 }, { "label": "grinning face with smiling eyes", "hexcode": "1F604", "tags": [ "eye", "eyes", "face", "grin", "grinning", "happy", "laugh", "lol", "mouth", "open", "smile", "smiling" ], "emoji": "😄", "text": "", "type": 1, "order": 3, "group": 0, "subgroup": 0, "version": 0.6, "emoticon": ":D" }, { "label": "beaming face with smiling eyes", "hexcode": "1F601", "tags": [ "beaming", "eye", "eyes", "face", "grin", "grinning", "happy", "nice", "smile", "smiling", "teeth" ], "emoji": "😁", "text": "", "type": 1, "order": 4, "group": 0, "subgroup": 0, "version": 0.6 }, { "label": "grinning squinting face", "hexcode": "1F606", "tags": [ "closed", "eyes", "face", "grinning", "haha", "hahaha", "happy", "laugh", "lol", "mouth", "open", "rofl", "smile", "smiling", "squinting" ], "emoji": "😆", "text": "", "type": 1, "order": 5, "group": 0, "subgroup": 0, "version": 0.6, "emoticon": [ "xD", "XD" ] }, { "label": "grinning face with sweat", "hexcode": "1F605", "tags": [ "cold", "dejected", "excited", "face", "grinning", "mouth", "nervous", "open", "smile", "smiling", "stress", "stressed", "sweat" ], "emoji": "😅", "text": "", "type": 1, "order": 6, "group": 0, "subgroup": 0, "version": 0.6 }, { "label": "rolling on the floor laughing", "hexcode": "1F923", "tags": [ "crying", "face", "floor", "funny", "haha", "happy", "hehe", "hilarious", "joy", "laugh", "lmao", "lol", "rofl", "roflmao", "rolling", "tear" ], "emoji": "🤣", "text": "", "type": 1, "order": 7, "group": 0, "subgroup": 0, "version": 3, "emoticon": ":'D" }, { "label": "face with tears of joy", "hexcode": "1F602", "tags": [ "crying", "face", "feels", "funny", "haha", "happy", "hehe", "hilarious", "joy", "laugh", "lmao", "lol", "rofl", "roflmao", "tear" ], "emoji": "😂", "text": "", "type": 1, "order": 8, "group": 0, "subgroup": 0, "version": 0.6, "emoticon": ":')" }, { "label": "slightly smiling face", "hexcode": "1F642", "tags": [ "face", "happy", "slightly", "smile", "smiling" ], "emoji": "🙂", "text": "", "type": 1, "order": 9, "group": 0, "subgroup": 0, "version": 1, "emoticon": ":)" }, { "label": "upside-down face", "hexcode": "1F643", "tags": [ "face", "hehe", "smile", "upside-down" ], "emoji": "🙃", "text": "", "type": 1, "order": 10, "group": 0, "subgroup": 0, "version": 1 }, { "label": "melting face", "hexcode": "1FAE0", "tags": [ "disappear", "dissolve", "embarrassed", "face", "haha", "heat", "hot", "liquid", "lol", "melt", "melting", "sarcasm", "sarcastic" ], "emoji": "🫠", "text": "", "type": 1, "order": 11, "group": 0, "subgroup": 0, "version": 14 }, { "label": "winking face", "hexcode": "1F609", "tags": [ "face", "flirt", "heartbreaker", "sexy", "slide", "tease", "wink", "winking", "winks" ], "emoji": "😉", "text": "", "type": 1, "order": 12, "group": 0, "subgroup": 0, "version": 0.6, "emoticon": ";)" }, { "label": "smiling face with smiling eyes", "hexcode": "1F60A", "tags": [ "blush", "eye", "eyes", "face", "glad", "satisfied", "smile", "smiling" ], "emoji": "😊", "text": "", "type": 1, "order": 13, "group": 0, "subgroup": 0, "version": 0.6, "emoticon": ":>" }, { "label": "smiling face with halo", "hexcode": "1F607", "tags": [ "angel", "angelic", "angels", "blessed", "face", "fairy", "fairytale", "fantasy", "halo", "happy", "innocent", "peaceful", "smile", "smiling", "spirit", "tale" ], "emoji": "😇", "text": "", "type": 1, "order": 14, "group": 0, "subgroup": 0, "version": 1, "emoticon": [ "o:)", "O:)" ] }, { "label": "smiling face with hearts", "hexcode": "1F970", "tags": [ "3", "adore", "crush", "face", "heart", "hearts", "ily", "love", "romance", "smile", "smiling", "you" ], "emoji": "🥰", "text": "", "type": 1, "order": 15, "group": 0, "subgroup": 1, "version": 11 }, { "label": "smiling face with heart-eyes", "hexcode": "1F60D", "tags": [ "143", "bae", "eye", "face", "feels", "heart-eyes", "hearts", "ily", "kisses", "love", "romance", "romantic", "smile", "xoxo" ], "emoji": "😍", "text": "", "type": 1, "order": 16, "group": 0, "subgroup": 1, "version": 0.6 }, { "label": "star-struck", "hexcode": "1F929", "tags": [ "excited", "eyes", "face", "grinning", "smile", "star", "starry-eyed", "wow" ], "emoji": "🤩", "text": "", "type": 1, "order": 17, "group": 0, "subgroup": 1, "version": 5 }, { "label": "face blowing a kiss", "hexcode": "1F618", "tags": [ "adorbs", "bae", "blowing", "face", "flirt", "heart", "ily", "kiss", "love", "lover", "miss", "muah", "romantic", "smooch", "xoxo", "you" ], "emoji": "😘", "text": "", "type": 1, "order": 18, "group": 0, "subgroup": 1, "version": 0.6, "emoticon": [ ":x", ":X" ] }, { "label": "kissing face", "hexcode": "1F617", "tags": [ "143", "date", "dating", "face", "flirt", "ily", "kiss", "love", "smooch", "smooches", "xoxo", "you" ], "emoji": "😗", "text": "", "type": 1, "order": 19, "group": 0, "subgroup": 1, "version": 1 }, { "label": "smiling face", "hexcode": "263A", "tags": [ "face", "happy", "outlined", "relaxed", "smile", "smiling" ], "emoji": "☺️", "text": "☺︎", "type": 0, "order": 21, "group": 0, "subgroup": 1, "version": 0.6 }, { "label": "kissing face with closed eyes", "hexcode": "1F61A", "tags": [ "143", "bae", "blush", "closed", "date", "dating", "eye", "eyes", "face", "flirt", "ily", "kisses", "kissing", "smooches", "xoxo" ], "emoji": "😚", "text": "", "type": 1, "order": 22, "group": 0, "subgroup": 1, "version": 0.6, "emoticon": ":*" }, { "label": "kissing face with smiling eyes", "hexcode": "1F619", "tags": [ "143", "closed", "date", "dating", "eye", "eyes", "face", "flirt", "ily", "kiss", "kisses", "kissing", "love", "night", "smile", "smiling" ], "emoji": "😙", "text": "", "type": 1, "order": 23, "group": 0, "subgroup": 1, "version": 1 }, { "label": "smiling face with tear", "hexcode": "1F972", "tags": [ "face", "glad", "grateful", "happy", "joy", "pain", "proud", "relieved", "smile", "smiley", "smiling", "tear", "touched" ], "emoji": "🥲", "text": "", "type": 1, "order": 24, "group": 0, "subgroup": 1, "version": 13 }, { "label": "face savoring food", "hexcode": "1F60B", "tags": [ "delicious", "eat", "face", "food", "full", "hungry", "savor", "smile", "smiling", "tasty", "um", "yum", "yummy" ], "emoji": "😋", "text": "", "type": 1, "order": 25, "group": 0, "subgroup": 2, "version": 0.6 }, { "label": "face with tongue", "hexcode": "1F61B", "tags": [ "awesome", "cool", "face", "nice", "party", "stuck-out", "sweet", "tongue" ], "emoji": "😛", "text": "", "type": 1, "order": 26, "group": 0, "subgroup": 2, "version": 1, "emoticon": [ ":p", ":P" ] }, { "label": "winking face with tongue", "hexcode": "1F61C", "tags": [ "crazy", "epic", "eye", "face", "funny", "joke", "loopy", "nutty", "party", "stuck-out", "tongue", "wacky", "weirdo", "wink", "winking", "yolo" ], "emoji": "😜", "text": "", "type": 1, "order": 27, "group": 0, "subgroup": 2, "version": 0.6, "emoticon": [ ";p", ";P" ] }, { "label": "zany face", "hexcode": "1F92A", "tags": [ "crazy", "eye", "eyes", "face", "goofy", "large", "small", "zany" ], "emoji": "🤪", "text": "", "type": 1, "order": 28, "group": 0, "subgroup": 2, "version": 5 }, { "label": "squinting face with tongue", "hexcode": "1F61D", "tags": [ "closed", "eye", "eyes", "face", "gross", "horrible", "omg", "squinting", "stuck-out", "taste", "tongue", "whatever", "yolo" ], "emoji": "😝", "text": "", "type": 1, "order": 29, "group": 0, "subgroup": 2, "version": 0.6, "emoticon": [ "xp", "xP", "XP" ] }, { "label": "money-mouth face", "hexcode": "1F911", "tags": [ "face", "money", "money-mouth", "mouth", "paid" ], "emoji": "🤑", "text": "", "type": 1, "order": 30, "group": 0, "subgroup": 2, "version": 1 }, { "label": "smiling face with open hands", "hexcode": "1F917", "tags": [ "face", "hands", "hug", "hugging", "open", "smiling" ], "emoji": "🤗", "text": "", "type": 1, "order": 31, "group": 0, "subgroup": 3, "version": 1 }, { "label": "face with hand over mouth", "hexcode": "1F92D", "tags": [ "face", "giggle", "giggling", "hand", "mouth", "oops", "realization", "secret", "shock", "sudden", "surprise", "whoops" ], "emoji": "🤭", "text": "", "type": 1, "order": 32, "group": 0, "subgroup": 3, "version": 5 }, { "label": "face with open eyes and hand over mouth", "hexcode": "1FAE2", "tags": [ "amazement", "awe", "disbelief", "embarrass", "eyes", "face", "gasp", "hand", "mouth", "omg", "open", "over", "quiet", "scared", "shock", "surprise" ], "emoji": "🫢", "text": "", "type": 1, "order": 33, "group": 0, "subgroup": 3, "version": 14 }, { "label": "face with peeking eye", "hexcode": "1FAE3", "tags": [ "captivated", "embarrass", "eye", "face", "hide", "hiding", "peek", "peeking", "peep", "scared", "shy", "stare" ], "emoji": "🫣", "text": "", "type": 1, "order": 34, "group": 0, "subgroup": 3, "version": 14 }, { "label": "shushing face", "hexcode": "1F92B", "tags": [ "face", "quiet", "shh", "shush", "shushing" ], "emoji": "🤫", "text": "", "type": 1, "order": 35, "group": 0, "subgroup": 3, "version": 5 }, { "label": "thinking face", "hexcode": "1F914", "tags": [ "chin", "consider", "face", "hmm", "ponder", "pondering", "thinking", "wondering" ], "emoji": "🤔", "text": "", "type": 1, "order": 36, "group": 0, "subgroup": 3, "version": 1, "emoticon": [ ":l", ":L" ] }, { "label": "saluting face", "hexcode": "1FAE1", "tags": [ "face", "good", "luck", "ma’am", "ok", "respect", "salute", "saluting", "sir", "troops", "yes" ], "emoji": "🫡", "text": "", "type": 1, "order": 37, "group": 0, "subgroup": 3, "version": 14 }, { "label": "zipper-mouth face", "hexcode": "1F910", "tags": [ "face", "keep", "mouth", "quiet", "secret", "shut", "zip", "zipper", "zipper-mouth" ], "emoji": "🤐", "text": "", "type": 1, "order": 38, "group": 0, "subgroup": 4, "version": 1, "emoticon": [ ":z", ":Z" ] }, { "label": "face with raised eyebrow", "hexcode": "1F928", "tags": [ "disapproval", "disbelief", "distrust", "emoji", "eyebrow", "face", "hmm", "mild", "raised", "skeptic", "skeptical", "skepticism", "surprise", "what" ], "emoji": "🤨", "text": "", "type": 1, "order": 39, "group": 0, "subgroup": 4, "version": 5 }, { "label": "neutral face", "hexcode": "1F610", "tags": [ "awkward", "blank", "deadpan", "expressionless", "face", "fine", "jealous", "meh", "neutral", "oh", "shade", "straight", "unamused", "unhappy", "unimpressed", "whatever" ], "emoji": "😐️", "text": "😐︎", "type": 1, "order": 40, "group": 0, "subgroup": 4, "version": 0.7, "emoticon": ":|" }, { "label": "expressionless face", "hexcode": "1F611", "tags": [ "awkward", "dead", "expressionless", "face", "fine", "inexpressive", "jealous", "meh", "not", "oh", "omg", "straight", "uh", "unhappy", "unimpressed", "whatever" ], "emoji": "😑", "text": "", "type": 1, "order": 41, "group": 0, "subgroup": 4, "version": 1 }, { "label": "face without mouth", "hexcode": "1F636", "tags": [ "awkward", "blank", "expressionless", "face", "mouth", "mouthless", "mute", "quiet", "secret", "silence", "silent", "speechless" ], "emoji": "😶", "text": "", "type": 1, "order": 42, "group": 0, "subgroup": 4, "version": 1, "emoticon": ":#" }, { "label": "dotted line face", "hexcode": "1FAE5", "tags": [ "depressed", "disappear", "dotted", "face", "hidden", "hide", "introvert", "invisible", "line", "meh", "whatever", "wtv" ], "emoji": "🫥", "text": "", "type": 1, "order": 43, "group": 0, "subgroup": 4, "version": 14 }, { "label": "face in clouds", "hexcode": "1F636-200D-1F32B-FE0F", "tags": [ "absentminded", "clouds", "face", "fog", "head" ], "emoji": "😶‍🌫️", "text": "", "type": 1, "order": 44, "group": 0, "subgroup": 4, "version": 13.1 }, { "label": "smirking face", "hexcode": "1F60F", "tags": [ "boss", "dapper", "face", "flirt", "homie", "kidding", "leer", "shade", "slick", "sly", "smirk", "smug", "snicker", "suave", "suspicious", "swag" ], "emoji": "😏", "text": "", "type": 1, "order": 46, "group": 0, "subgroup": 4, "version": 0.6, "emoticon": ":j" }, { "label": "unamused face", "hexcode": "1F612", "tags": [ "...", "bored", "face", "fine", "jealous", "jel", "jelly", "pissed", "smh", "ugh", "uhh", "unamused", "unhappy", "weird", "whatever" ], "emoji": "😒", "text": "", "type": 1, "order": 47, "group": 0, "subgroup": 4, "version": 0.6, "emoticon": ":?" }, { "label": "face with rolling eyes", "hexcode": "1F644", "tags": [ "eyeroll", "eyes", "face", "rolling", "shade", "ugh", "whatever" ], "emoji": "🙄", "text": "", "type": 1, "order": 48, "group": 0, "subgroup": 4, "version": 1 }, { "label": "grimacing face", "hexcode": "1F62C", "tags": [ "awk", "awkward", "dentist", "face", "grimace", "grimacing", "grinning", "smile", "smiling" ], "emoji": "😬", "text": "", "type": 1, "order": 49, "group": 0, "subgroup": 4, "version": 1, "emoticon": "8D" }, { "label": "face exhaling", "hexcode": "1F62E-200D-1F4A8", "tags": [ "blow", "blowing", "exhale", "exhaling", "exhausted", "face", "gasp", "groan", "relief", "sigh", "smiley", "smoke", "whisper", "whistle" ], "emoji": "😮‍💨", "text": "", "type": 1, "order": 50, "group": 0, "subgroup": 4, "version": 13.1 }, { "label": "lying face", "hexcode": "1F925", "tags": [ "face", "liar", "lie", "lying", "pinocchio" ], "emoji": "🤥", "text": "", "type": 1, "order": 51, "group": 0, "subgroup": 4, "version": 3 }, { "label": "shaking face", "hexcode": "1FAE8", "tags": [ "crazy", "daze", "earthquake", "face", "omg", "panic", "shaking", "shock", "surprise", "vibrate", "whoa", "wow" ], "emoji": "🫨", "text": "", "type": 1, "order": 52, "group": 0, "subgroup": 4, "version": 15 }, { "label": "head shaking horizontally", "hexcode": "1F642-200D-2194-FE0F", "tags": [ "head", "horizontally", "no", "shake", "shaking" ], "emoji": "🙂‍↔️", "text": "", "type": 1, "order": 53, "group": 0, "subgroup": 4, "version": 15.1 }, { "label": "head shaking vertically", "hexcode": "1F642-200D-2195-FE0F", "tags": [ "head", "nod", "shaking", "vertically", "yes" ], "emoji": "🙂‍↕️", "text": "", "type": 1, "order": 55, "group": 0, "subgroup": 4, "version": 15.1 }, { "label": "relieved face", "hexcode": "1F60C", "tags": [ "calm", "face", "peace", "relief", "relieved", "zen" ], "emoji": "😌", "text": "", "type": 1, "order": 57, "group": 0, "subgroup": 5, "version": 0.6 }, { "label": "pensive face", "hexcode": "1F614", "tags": [ "awful", "bored", "dejected", "died", "disappointed", "face", "losing", "lost", "pensive", "sad", "sucks" ], "emoji": "😔", "text": "", "type": 1, "order": 58, "group": 0, "subgroup": 5, "version": 0.6 }, { "label": "sleepy face", "hexcode": "1F62A", "tags": [ "crying", "face", "good", "night", "sad", "sleep", "sleeping", "sleepy", "tired" ], "emoji": "😪", "text": "", "type": 1, "order": 59, "group": 0, "subgroup": 5, "version": 0.6 }, { "label": "drooling face", "hexcode": "1F924", "tags": [ "drooling", "face" ], "emoji": "🤤", "text": "", "type": 1, "order": 60, "group": 0, "subgroup": 5, "version": 3 }, { "label": "sleeping face", "hexcode": "1F634", "tags": [ "bed", "bedtime", "face", "good", "goodnight", "nap", "night", "sleep", "sleeping", "tired", "whatever", "yawn", "zzz" ], "emoji": "😴", "text": "", "type": 1, "order": 61, "group": 0, "subgroup": 5, "version": 1 }, { "label": "face with bags under eyes", "hexcode": "1FAE9", "tags": [ "bags", "bored", "exhausted", "eyes", "face", "fatigued", "late", "sleepy", "tired", "weary" ], "emoji": "🫩", "text": "", "type": 1, "order": 62, "group": 0, "subgroup": 5, "version": 16 }, { "label": "face with medical mask", "hexcode": "1F637", "tags": [ "cold", "dentist", "dermatologist", "doctor", "dr", "face", "germs", "mask", "medical", "medicine", "sick" ], "emoji": "😷", "text": "", "type": 1, "order": 63, "group": 0, "subgroup": 6, "version": 0.6 }, { "label": "face with thermometer", "hexcode": "1F912", "tags": [ "face", "ill", "sick", "thermometer" ], "emoji": "🤒", "text": "", "type": 1, "order": 64, "group": 0, "subgroup": 6, "version": 1 }, { "label": "face with head-bandage", "hexcode": "1F915", "tags": [ "bandage", "face", "head-bandage", "hurt", "injury", "ouch" ], "emoji": "🤕", "text": "", "type": 1, "order": 65, "group": 0, "subgroup": 6, "version": 1 }, { "label": "nauseated face", "hexcode": "1F922", "tags": [ "face", "gross", "nasty", "nauseated", "sick", "vomit" ], "emoji": "🤢", "text": "", "type": 1, "order": 66, "group": 0, "subgroup": 6, "version": 3, "emoticon": "%(" }, { "label": "face vomiting", "hexcode": "1F92E", "tags": [ "barf", "ew", "face", "gross", "puke", "sick", "spew", "throw", "up", "vomit", "vomiting" ], "emoji": "🤮", "text": "", "type": 1, "order": 67, "group": 0, "subgroup": 6, "version": 5 }, { "label": "sneezing face", "hexcode": "1F927", "tags": [ "face", "fever", "flu", "gesundheit", "sick", "sneeze", "sneezing" ], "emoji": "🤧", "text": "", "type": 1, "order": 68, "group": 0, "subgroup": 6, "version": 3 }, { "label": "hot face", "hexcode": "1F975", "tags": [ "dying", "face", "feverish", "heat", "hot", "panting", "red-faced", "stroke", "sweating", "tongue" ], "emoji": "🥵", "text": "", "type": 1, "order": 69, "group": 0, "subgroup": 6, "version": 11 }, { "label": "cold face", "hexcode": "1F976", "tags": [ "blue", "blue-faced", "cold", "face", "freezing", "frostbite", "icicles", "subzero", "teeth" ], "emoji": "🥶", "text": "", "type": 1, "order": 70, "group": 0, "subgroup": 6, "version": 11 }, { "label": "woozy face", "hexcode": "1F974", "tags": [ "dizzy", "drunk", "eyes", "face", "intoxicated", "mouth", "tipsy", "uneven", "wavy", "woozy" ], "emoji": "🥴", "text": "", "type": 1, "order": 71, "group": 0, "subgroup": 6, "version": 11, "emoticon": ":&" }, { "label": "face with crossed-out eyes", "hexcode": "1F635", "tags": [ "crossed-out", "dead", "dizzy", "eyes", "face", "feels", "knocked", "out", "sick", "tired" ], "emoji": "😵", "text": "", "type": 1, "order": 72, "group": 0, "subgroup": 6, "version": 0.6, "emoticon": [ "xo", "XO" ] }, { "label": "face with spiral eyes", "hexcode": "1F635-200D-1F4AB", "tags": [ "confused", "dizzy", "eyes", "face", "hypnotized", "omg", "smiley", "spiral", "trouble", "whoa", "woah", "woozy" ], "emoji": "😵‍💫", "text": "", "type": 1, "order": 73, "group": 0, "subgroup": 6, "version": 13.1 }, { "label": "exploding head", "hexcode": "1F92F", "tags": [ "blown", "explode", "exploding", "head", "mind", "mindblown", "no", "shocked", "way" ], "emoji": "🤯", "text": "", "type": 1, "order": 74, "group": 0, "subgroup": 6, "version": 5 }, { "label": "cowboy hat face", "hexcode": "1F920", "tags": [ "cowboy", "cowgirl", "face", "hat" ], "emoji": "🤠", "text": "", "type": 1, "order": 75, "group": 0, "subgroup": 7, "version": 3 }, { "label": "partying face", "hexcode": "1F973", "tags": [ "bday", "birthday", "celebrate", "celebration", "excited", "face", "happy", "hat", "hooray", "horn", "party", "partying" ], "emoji": "🥳", "text": "", "type": 1, "order": 76, "group": 0, "subgroup": 7, "version": 11 }, { "label": "disguised face", "hexcode": "1F978", "tags": [ "disguise", "eyebrow", "face", "glasses", "incognito", "moustache", "mustache", "nose", "person", "spy", "tache", "tash" ], "emoji": "🥸", "text": "", "type": 1, "order": 77, "group": 0, "subgroup": 7, "version": 13 }, { "label": "smiling face with sunglasses", "hexcode": "1F60E", "tags": [ "awesome", "beach", "bright", "bro", "chilling", "cool", "face", "rad", "relaxed", "shades", "slay", "smile", "style", "sunglasses", "swag", "win" ], "emoji": "😎", "text": "", "type": 1, "order": 78, "group": 0, "subgroup": 8, "version": 1, "emoticon": "8)" }, { "label": "nerd face", "hexcode": "1F913", "tags": [ "brainy", "clever", "expert", "face", "geek", "gifted", "glasses", "intelligent", "nerd", "smart" ], "emoji": "🤓", "text": "", "type": 1, "order": 79, "group": 0, "subgroup": 8, "version": 1, "emoticon": ":B" }, { "label": "face with monocle", "hexcode": "1F9D0", "tags": [ "classy", "face", "fancy", "monocle", "rich", "stuffy", "wealthy" ], "emoji": "🧐", "text": "", "type": 1, "order": 80, "group": 0, "subgroup": 8, "version": 5 }, { "label": "confused face", "hexcode": "1F615", "tags": [ "befuddled", "confused", "confusing", "dunno", "face", "frown", "hm", "meh", "not", "sad", "sorry", "sure" ], "emoji": "😕", "text": "", "type": 1, "order": 81, "group": 0, "subgroup": 9, "version": 1, "emoticon": ":/" }, { "label": "face with diagonal mouth", "hexcode": "1FAE4", "tags": [ "confused", "confusion", "diagonal", "disappointed", "doubt", "doubtful", "face", "frustrated", "frustration", "meh", "mouth", "skeptical", "unsure", "whatever", "wtv" ], "emoji": "🫤", "text": "", "type": 1, "order": 82, "group": 0, "subgroup": 9, "version": 14 }, { "label": "worried face", "hexcode": "1F61F", "tags": [ "anxious", "butterflies", "face", "nerves", "nervous", "sad", "stress", "stressed", "surprised", "worried", "worry" ], "emoji": "😟", "text": "", "type": 1, "order": 83, "group": 0, "subgroup": 9, "version": 1 }, { "label": "slightly frowning face", "hexcode": "1F641", "tags": [ "face", "frown", "frowning", "sad", "slightly" ], "emoji": "🙁", "text": "", "type": 1, "order": 84, "group": 0, "subgroup": 9, "version": 1 }, { "label": "frowning face", "hexcode": "2639", "tags": [ "face", "frown", "frowning", "sad" ], "emoji": "☹️", "text": "☹︎", "type": 0, "order": 86, "group": 0, "subgroup": 9, "version": 0.7, "emoticon": ":(" }, { "label": "face with open mouth", "hexcode": "1F62E", "tags": [ "believe", "face", "forgot", "mouth", "omg", "open", "shocked", "surprised", "sympathy", "unbelievable", "unreal", "whoa", "wow", "you" ], "emoji": "😮", "text": "", "type": 1, "order": 87, "group": 0, "subgroup": 9, "version": 1 }, { "label": "hushed face", "hexcode": "1F62F", "tags": [ "epic", "face", "hushed", "omg", "stunned", "surprised", "whoa", "woah" ], "emoji": "😯", "text": "", "type": 1, "order": 88, "group": 0, "subgroup": 9, "version": 1 }, { "label": "astonished face", "hexcode": "1F632", "tags": [ "astonished", "cost", "face", "no", "omg", "shocked", "totally", "way" ], "emoji": "😲", "text": "", "type": 1, "order": 89, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": [ ":o", ":O" ] }, { "label": "flushed face", "hexcode": "1F633", "tags": [ "amazed", "awkward", "crazy", "dazed", "dead", "disbelief", "embarrassed", "face", "flushed", "geez", "heat", "hot", "impressed", "jeez", "what", "wow" ], "emoji": "😳", "text": "", "type": 1, "order": 90, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": ":$" }, { "label": "distorted face", "hexcode": "1FAEA", "tags": [ "anxiety", "bloated", "panic", "shocked", "surprised", "vulnerable" ], "emoji": "🫪", "text": "", "type": 1, "order": 91, "group": 0, "subgroup": 9, "version": 17 }, { "label": "pleading face", "hexcode": "1F97A", "tags": [ "begging", "big", "eyes", "face", "mercy", "not", "pleading", "please", "pretty", "puppy", "sad", "why" ], "emoji": "🥺", "text": "", "type": 1, "order": 92, "group": 0, "subgroup": 9, "version": 11 }, { "label": "face holding back tears", "hexcode": "1F979", "tags": [ "admiration", "aww", "back", "cry", "embarrassed", "face", "feelings", "grateful", "gratitude", "holding", "joy", "please", "proud", "resist", "sad", "tears" ], "emoji": "🥹", "text": "", "type": 1, "order": 93, "group": 0, "subgroup": 9, "version": 14 }, { "label": "frowning face with open mouth", "hexcode": "1F626", "tags": [ "caught", "face", "frown", "frowning", "guard", "mouth", "open", "scared", "scary", "surprise", "what", "wow" ], "emoji": "😦", "text": "", "type": 1, "order": 94, "group": 0, "subgroup": 9, "version": 1 }, { "label": "anguished face", "hexcode": "1F627", "tags": [ "anguished", "face", "forgot", "scared", "scary", "stressed", "surprise", "unhappy", "what", "wow" ], "emoji": "😧", "text": "", "type": 1, "order": 95, "group": 0, "subgroup": 9, "version": 1, "emoticon": [ ":s", ":S" ] }, { "label": "fearful face", "hexcode": "1F628", "tags": [ "afraid", "anxious", "blame", "face", "fear", "fearful", "scared", "worried" ], "emoji": "😨", "text": "", "type": 1, "order": 96, "group": 0, "subgroup": 9, "version": 0.6 }, { "label": "anxious face with sweat", "hexcode": "1F630", "tags": [ "anxious", "blue", "cold", "eek", "face", "mouth", "nervous", "open", "rushed", "scared", "sweat", "yikes" ], "emoji": "😰", "text": "", "type": 1, "order": 97, "group": 0, "subgroup": 9, "version": 0.6 }, { "label": "sad but relieved face", "hexcode": "1F625", "tags": [ "anxious", "call", "close", "complicated", "disappointed", "face", "not", "relieved", "sad", "sweat", "time", "whew" ], "emoji": "😥", "text": "", "type": 1, "order": 98, "group": 0, "subgroup": 9, "version": 0.6 }, { "label": "crying face", "hexcode": "1F622", "tags": [ "awful", "cry", "crying", "face", "feels", "miss", "sad", "tear", "triste", "unhappy" ], "emoji": "😢", "text": "", "type": 1, "order": 99, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": ":'(" }, { "label": "loudly crying face", "hexcode": "1F62D", "tags": [ "bawling", "cry", "crying", "face", "loudly", "sad", "sob", "tear", "tears", "unhappy" ], "emoji": "😭", "text": "", "type": 1, "order": 100, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": ":'o" }, { "label": "face screaming in fear", "hexcode": "1F631", "tags": [ "epic", "face", "fear", "fearful", "munch", "scared", "scream", "screamer", "screaming", "shocked", "surprised", "woah" ], "emoji": "😱", "text": "", "type": 1, "order": 101, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": "Dx" }, { "label": "confounded face", "hexcode": "1F616", "tags": [ "annoyed", "confounded", "confused", "cringe", "distraught", "face", "feels", "frustrated", "mad", "sad" ], "emoji": "😖", "text": "", "type": 1, "order": 102, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": [ "x(", "X(" ] }, { "label": "persevering face", "hexcode": "1F623", "tags": [ "concentrate", "concentration", "face", "focus", "headache", "persevere", "persevering" ], "emoji": "😣", "text": "", "type": 1, "order": 103, "group": 0, "subgroup": 9, "version": 0.6 }, { "label": "disappointed face", "hexcode": "1F61E", "tags": [ "awful", "blame", "dejected", "disappointed", "face", "fail", "losing", "sad", "unhappy" ], "emoji": "😞", "text": "", "type": 1, "order": 104, "group": 0, "subgroup": 9, "version": 0.6 }, { "label": "downcast face with sweat", "hexcode": "1F613", "tags": [ "close", "cold", "downcast", "face", "feels", "headache", "nervous", "sad", "scared", "sweat", "yikes" ], "emoji": "😓", "text": "", "type": 1, "order": 105, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": ":<" }, { "label": "weary face", "hexcode": "1F629", "tags": [ "crying", "face", "fail", "feels", "hungry", "mad", "nooo", "sad", "sleepy", "tired", "unhappy", "weary" ], "emoji": "😩", "text": "", "type": 1, "order": 106, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": "D:" }, { "label": "tired face", "hexcode": "1F62B", "tags": [ "cost", "face", "feels", "nap", "sad", "sneeze", "tired" ], "emoji": "😫", "text": "", "type": 1, "order": 107, "group": 0, "subgroup": 9, "version": 0.6, "emoticon": [ ":c", ":C" ] }, { "label": "yawning face", "hexcode": "1F971", "tags": [ "bedtime", "bored", "face", "goodnight", "nap", "night", "sleep", "sleepy", "tired", "whatever", "yawn", "yawning", "zzz" ], "emoji": "🥱", "text": "", "type": 1, "order": 108, "group": 0, "subgroup": 9, "version": 12 }, { "label": "face with steam from nose", "hexcode": "1F624", "tags": [ "anger", "angry", "face", "feels", "fume", "fuming", "furious", "fury", "mad", "nose", "steam", "triumph", "unhappy", "won" ], "emoji": "😤", "text": "", "type": 1, "order": 109, "group": 0, "subgroup": 10, "version": 0.6 }, { "label": "enraged face", "hexcode": "1F621", "tags": [ "anger", "angry", "enraged", "face", "feels", "mad", "maddening", "pouting", "rage", "red", "shade", "unhappy", "upset" ], "emoji": "😡", "text": "", "type": 1, "order": 110, "group": 0, "subgroup": 10, "version": 0.6, "emoticon": ">:/" }, { "label": "angry face", "hexcode": "1F620", "tags": [ "anger", "angry", "blame", "face", "feels", "frustrated", "mad", "maddening", "rage", "shade", "unhappy", "upset" ], "emoji": "😠", "text": "", "type": 1, "order": 111, "group": 0, "subgroup": 10, "version": 0.6 }, { "label": "face with symbols on mouth", "hexcode": "1F92C", "tags": [ "censor", "cursing", "cussing", "face", "mad", "mouth", "pissed", "swearing", "symbols" ], "emoji": "🤬", "text": "", "type": 1, "order": 112, "group": 0, "subgroup": 10, "version": 5, "emoticon": ":@" }, { "label": "smiling face with horns", "hexcode": "1F608", "tags": [ "demon", "devil", "evil", "face", "fairy", "fairytale", "fantasy", "horns", "purple", "shade", "smile", "smiling", "tale" ], "emoji": "😈", "text": "", "type": 1, "order": 113, "group": 0, "subgroup": 10, "version": 1, "emoticon": ">:)" }, { "label": "angry face with horns", "hexcode": "1F47F", "tags": [ "angry", "demon", "devil", "evil", "face", "fairy", "fairytale", "fantasy", "horns", "imp", "mischievous", "purple", "shade", "tale" ], "emoji": "👿", "text": "", "type": 1, "order": 114, "group": 0, "subgroup": 10, "version": 0.6, "emoticon": ">:(" }, { "label": "skull", "hexcode": "1F480", "tags": [ "body", "dead", "death", "face", "fairy", "fairytale", "i’m", "lmao", "monster", "tale", "yolo" ], "emoji": "💀", "text": "", "type": 1, "order": 115, "group": 0, "subgroup": 10, "version": 0.6 }, { "label": "skull and crossbones", "hexcode": "2620", "tags": [ "bone", "crossbones", "dead", "death", "face", "monster", "skull" ], "emoji": "☠️", "text": "☠︎", "type": 0, "order": 117, "group": 0, "subgroup": 10, "version": 1 }, { "label": "pile of poo", "hexcode": "1F4A9", "tags": [ "bs", "comic", "doo", "dung", "face", "fml", "monster", "pile", "poo", "poop", "smelly", "smh", "stink", "stinks", "stinky", "turd" ], "emoji": "💩", "text": "", "type": 1, "order": 118, "group": 0, "subgroup": 11, "version": 0.6 }, { "label": "clown face", "hexcode": "1F921", "tags": [ "clown", "face" ], "emoji": "🤡", "text": "", "type": 1, "order": 119, "group": 0, "subgroup": 11, "version": 3 }, { "label": "ogre", "hexcode": "1F479", "tags": [ "creature", "devil", "face", "fairy", "fairytale", "fantasy", "mask", "monster", "scary", "tale" ], "emoji": "👹", "text": "", "type": 1, "order": 120, "group": 0, "subgroup": 11, "version": 0.6, "emoticon": ">0)" }, { "label": "goblin", "hexcode": "1F47A", "tags": [ "angry", "creature", "face", "fairy", "fairytale", "fantasy", "mask", "mean", "monster", "tale" ], "emoji": "👺", "text": "", "type": 1, "order": 121, "group": 0, "subgroup": 11, "version": 0.6 }, { "label": "ghost", "hexcode": "1F47B", "tags": [ "boo", "creature", "excited", "face", "fairy", "fairytale", "fantasy", "halloween", "haunting", "monster", "scary", "silly", "tale" ], "emoji": "👻", "text": "", "type": 1, "order": 122, "group": 0, "subgroup": 11, "version": 0.6 }, { "label": "alien", "hexcode": "1F47D", "tags": [ "creature", "extraterrestrial", "face", "fairy", "fairytale", "fantasy", "monster", "space", "tale", "ufo" ], "emoji": "👽️", "text": "👽︎", "type": 1, "order": 123, "group": 0, "subgroup": 11, "version": 0.6 }, { "label": "alien monster", "hexcode": "1F47E", "tags": [ "alien", "creature", "extraterrestrial", "face", "fairy", "fairytale", "fantasy", "game", "gamer", "games", "monster", "pixelated", "space", "tale", "ufo" ], "emoji": "👾", "text": "", "type": 1, "order": 124, "group": 0, "subgroup": 11, "version": 0.6 }, { "label": "robot", "hexcode": "1F916", "tags": [ "face", "monster" ], "emoji": "🤖", "text": "", "type": 1, "order": 125, "group": 0, "subgroup": 11, "version": 1 }, { "label": "grinning cat", "hexcode": "1F63A", "tags": [ "animal", "cat", "face", "grinning", "mouth", "open", "smile", "smiling" ], "emoji": "😺", "text": "", "type": 1, "order": 126, "group": 0, "subgroup": 12, "version": 0.6 }, { "label": "grinning cat with smiling eyes", "hexcode": "1F638", "tags": [ "animal", "cat", "eye", "eyes", "face", "grin", "grinning", "smile", "smiling" ], "emoji": "😸", "text": "", "type": 1, "order": 127, "group": 0, "subgroup": 12, "version": 0.6 }, { "label": "cat with tears of joy", "hexcode": "1F639", "tags": [ "animal", "cat", "face", "joy", "laugh", "laughing", "lol", "tear", "tears" ], "emoji": "😹", "text": "", "type": 1, "order": 128, "group": 0, "subgroup": 12, "version": 0.6 }, { "label": "smiling cat with heart-eyes", "hexcode": "1F63B", "tags": [ "animal", "cat", "eye", "face", "heart", "heart-eyes", "love", "smile", "smiling" ], "emoji": "😻", "text": "", "type": 1, "order": 129, "group": 0, "subgroup": 12, "version": 0.6 }, { "label": "cat with wry smile", "hexcode": "1F63C", "tags": [ "animal", "cat", "face", "ironic", "smile", "wry" ], "emoji": "😼", "text": "", "type": 1, "order": 130, "group": 0, "subgroup": 12, "version": 0.6 }, { "label": "kissing cat", "hexcode": "1F63D", "tags": [ "animal", "cat", "closed", "eye", "eyes", "face", "kiss", "kissing" ], "emoji": "😽", "text": "", "type": 1, "order": 131, "group": 0, "subgroup": 12, "version": 0.6, "emoticon": ":3" }, { "label": "weary cat", "hexcode": "1F640", "tags": [ "animal", "cat", "face", "oh", "surprised", "weary" ], "emoji": "🙀", "text": "", "type": 1, "order": 132, "group": 0, "subgroup": 12, "version": 0.6 }, { "label": "crying cat", "hexcode": "1F63F", "tags": [ "animal", "cat", "cry", "crying", "face", "sad", "tear" ], "emoji": "😿", "text": "", "type": 1, "order": 133, "group": 0, "subgroup": 12, "version": 0.6 }, { "label": "pouting cat", "hexcode": "1F63E", "tags": [ "animal", "cat", "face", "pouting" ], "emoji": "😾", "text": "", "type": 1, "order": 134, "group": 0, "subgroup": 12, "version": 0.6 }, { "label": "see-no-evil monkey", "hexcode": "1F648", "tags": [ "embarrassed", "evil", "face", "forbidden", "forgot", "gesture", "hide", "monkey", "no", "omg", "prohibited", "scared", "secret", "smh", "watch" ], "emoji": "🙈", "text": "", "type": 1, "order": 135, "group": 0, "subgroup": 13, "version": 0.6 }, { "label": "hear-no-evil monkey", "hexcode": "1F649", "tags": [ "animal", "ears", "evil", "face", "forbidden", "gesture", "hear", "listen", "monkey", "no", "not", "prohibited", "secret", "shh", "tmi" ], "emoji": "🙉", "text": "", "type": 1, "order": 136, "group": 0, "subgroup": 13, "version": 0.6 }, { "label": "speak-no-evil monkey", "hexcode": "1F64A", "tags": [ "animal", "evil", "face", "forbidden", "gesture", "monkey", "no", "not", "oops", "prohibited", "quiet", "secret", "speak", "stealth" ], "emoji": "🙊", "text": "", "type": 1, "order": 137, "group": 0, "subgroup": 13, "version": 0.6 }, { "label": "love letter", "hexcode": "1F48C", "tags": [ "heart", "letter", "love", "mail", "romance", "valentine" ], "emoji": "💌", "text": "", "type": 1, "order": 138, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "heart with arrow", "hexcode": "1F498", "tags": [ "143", "adorbs", "arrow", "cupid", "date", "emotion", "heart", "ily", "love", "romance", "valentine" ], "emoji": "💘", "text": "", "type": 1, "order": 139, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "heart with ribbon", "hexcode": "1F49D", "tags": [ "143", "anniversary", "emotion", "heart", "ily", "kisses", "ribbon", "valentine", "xoxo" ], "emoji": "💝", "text": "", "type": 1, "order": 140, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "sparkling heart", "hexcode": "1F496", "tags": [ "143", "emotion", "excited", "good", "heart", "ily", "kisses", "morning", "night", "sparkle", "sparkling", "xoxo" ], "emoji": "💖", "text": "", "type": 1, "order": 141, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "growing heart", "hexcode": "1F497", "tags": [ "143", "emotion", "excited", "growing", "heart", "heartpulse", "ily", "kisses", "muah", "nervous", "pulse", "xoxo" ], "emoji": "💗", "text": "", "type": 1, "order": 142, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "beating heart", "hexcode": "1F493", "tags": [ "143", "beating", "cardio", "emotion", "heart", "heartbeat", "ily", "love", "pulsating", "pulse" ], "emoji": "💓", "text": "", "type": 1, "order": 143, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "revolving hearts", "hexcode": "1F49E", "tags": [ "143", "adorbs", "anniversary", "emotion", "heart", "hearts", "revolving" ], "emoji": "💞", "text": "", "type": 1, "order": 144, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "two hearts", "hexcode": "1F495", "tags": [ "143", "anniversary", "date", "dating", "emotion", "heart", "hearts", "ily", "kisses", "love", "loving", "two", "xoxo" ], "emoji": "💕", "text": "", "type": 1, "order": 145, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "heart decoration", "hexcode": "1F49F", "tags": [ "143", "decoration", "emotion", "heart", "hearth", "purple", "white" ], "emoji": "💟", "text": "", "type": 1, "order": 146, "group": 0, "subgroup": 14, "version": 0.6 }, { "label": "heart exclamation", "hexcode": "2763", "tags": [ "exclamation", "heart", "heavy", "mark", "punctuation" ], "emoji": "❣️", "text": "❣︎", "type": 0, "order": 148, "group": 0, "subgroup": 14, "version": 1 }, { "label": "broken heart", "hexcode": "1F494", "tags": [ "break", "broken", "crushed", "emotion", "heart", "heartbroken", "lonely", "sad" ], "emoji": "💔", "text": "", "type": 1, "order": 149, "group": 0, "subgroup": 14, "version": 0.6, "emoticon": "", "skins": [ { "label": "man mage: light skin tone", "hexcode": "1F9D9-1F3FB-200D-2642-FE0F", "emoji": "🧙🏻‍♂️", "text": "", "type": 1, "order": 1738, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 1 }, { "label": "man mage: medium-light skin tone", "hexcode": "1F9D9-1F3FC-200D-2642-FE0F", "emoji": "🧙🏼‍♂️", "text": "", "type": 1, "order": 1740, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 2 }, { "label": "man mage: medium skin tone", "hexcode": "1F9D9-1F3FD-200D-2642-FE0F", "emoji": "🧙🏽‍♂️", "text": "", "type": 1, "order": 1742, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 3 }, { "label": "man mage: medium-dark skin tone", "hexcode": "1F9D9-1F3FE-200D-2642-FE0F", "emoji": "🧙🏾‍♂️", "text": "", "type": 1, "order": 1744, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 4 }, { "label": "man mage: dark skin tone", "hexcode": "1F9D9-1F3FF-200D-2642-FE0F", "emoji": "🧙🏿‍♂️", "text": "", "type": 1, "order": 1746, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 5 } ] }, { "label": "woman mage", "hexcode": "1F9D9-200D-2640-FE0F", "tags": [ "fantasy", "mage", "magic", "play", "sorcerer", "sorceress", "sorcery", "spell", "summon", "witch", "wizard", "woman" ], "emoji": "🧙‍♀️", "text": "", "type": 1, "order": 1748, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "skins": [ { "label": "woman mage: light skin tone", "hexcode": "1F9D9-1F3FB-200D-2640-FE0F", "emoji": "🧙🏻‍♀️", "text": "", "type": 1, "order": 1750, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 1 }, { "label": "woman mage: medium-light skin tone", "hexcode": "1F9D9-1F3FC-200D-2640-FE0F", "emoji": "🧙🏼‍♀️", "text": "", "type": 1, "order": 1752, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 2 }, { "label": "woman mage: medium skin tone", "hexcode": "1F9D9-1F3FD-200D-2640-FE0F", "emoji": "🧙🏽‍♀️", "text": "", "type": 1, "order": 1754, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 3 }, { "label": "woman mage: medium-dark skin tone", "hexcode": "1F9D9-1F3FE-200D-2640-FE0F", "emoji": "🧙🏾‍♀️", "text": "", "type": 1, "order": 1756, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 4 }, { "label": "woman mage: dark skin tone", "hexcode": "1F9D9-1F3FF-200D-2640-FE0F", "emoji": "🧙🏿‍♀️", "text": "", "type": 1, "order": 1758, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 5 } ] }, { "label": "fairy", "hexcode": "1F9DA", "tags": [ "fairytale", "fantasy", "myth", "person", "pixie", "tale", "wings" ], "emoji": "🧚", "text": "", "type": 1, "order": 1760, "group": 1, "subgroup": 26, "version": 5, "skins": [ { "label": "fairy: light skin tone", "hexcode": "1F9DA-1F3FB", "emoji": "🧚🏻", "text": "", "type": 1, "order": 1761, "group": 1, "subgroup": 26, "version": 5, "tone": 1 }, { "label": "fairy: medium-light skin tone", "hexcode": "1F9DA-1F3FC", "emoji": "🧚🏼", "text": "", "type": 1, "order": 1762, "group": 1, "subgroup": 26, "version": 5, "tone": 2 }, { "label": "fairy: medium skin tone", "hexcode": "1F9DA-1F3FD", "emoji": "🧚🏽", "text": "", "type": 1, "order": 1763, "group": 1, "subgroup": 26, "version": 5, "tone": 3 }, { "label": "fairy: medium-dark skin tone", "hexcode": "1F9DA-1F3FE", "emoji": "🧚🏾", "text": "", "type": 1, "order": 1764, "group": 1, "subgroup": 26, "version": 5, "tone": 4 }, { "label": "fairy: dark skin tone", "hexcode": "1F9DA-1F3FF", "emoji": "🧚🏿", "text": "", "type": 1, "order": 1765, "group": 1, "subgroup": 26, "version": 5, "tone": 5 } ] }, { "label": "man fairy", "hexcode": "1F9DA-200D-2642-FE0F", "tags": [ "fairy", "fairytale", "fantasy", "man", "myth", "oberon", "person", "pixie", "puck", "tale", "wings" ], "emoji": "🧚‍♂️", "text": "", "type": 1, "order": 1766, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "skins": [ { "label": "man fairy: light skin tone", "hexcode": "1F9DA-1F3FB-200D-2642-FE0F", "emoji": "🧚🏻‍♂️", "text": "", "type": 1, "order": 1768, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 1 }, { "label": "man fairy: medium-light skin tone", "hexcode": "1F9DA-1F3FC-200D-2642-FE0F", "emoji": "🧚🏼‍♂️", "text": "", "type": 1, "order": 1770, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 2 }, { "label": "man fairy: medium skin tone", "hexcode": "1F9DA-1F3FD-200D-2642-FE0F", "emoji": "🧚🏽‍♂️", "text": "", "type": 1, "order": 1772, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 3 }, { "label": "man fairy: medium-dark skin tone", "hexcode": "1F9DA-1F3FE-200D-2642-FE0F", "emoji": "🧚🏾‍♂️", "text": "", "type": 1, "order": 1774, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 4 }, { "label": "man fairy: dark skin tone", "hexcode": "1F9DA-1F3FF-200D-2642-FE0F", "emoji": "🧚🏿‍♂️", "text": "", "type": 1, "order": 1776, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 5 } ] }, { "label": "woman fairy", "hexcode": "1F9DA-200D-2640-FE0F", "tags": [ "fairy", "fairytale", "fantasy", "myth", "person", "pixie", "tale", "titania", "wings", "woman" ], "emoji": "🧚‍♀️", "text": "", "type": 1, "order": 1778, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "skins": [ { "label": "woman fairy: light skin tone", "hexcode": "1F9DA-1F3FB-200D-2640-FE0F", "emoji": "🧚🏻‍♀️", "text": "", "type": 1, "order": 1780, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 1 }, { "label": "woman fairy: medium-light skin tone", "hexcode": "1F9DA-1F3FC-200D-2640-FE0F", "emoji": "🧚🏼‍♀️", "text": "", "type": 1, "order": 1782, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 2 }, { "label": "woman fairy: medium skin tone", "hexcode": "1F9DA-1F3FD-200D-2640-FE0F", "emoji": "🧚🏽‍♀️", "text": "", "type": 1, "order": 1784, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 3 }, { "label": "woman fairy: medium-dark skin tone", "hexcode": "1F9DA-1F3FE-200D-2640-FE0F", "emoji": "🧚🏾‍♀️", "text": "", "type": 1, "order": 1786, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 4 }, { "label": "woman fairy: dark skin tone", "hexcode": "1F9DA-1F3FF-200D-2640-FE0F", "emoji": "🧚🏿‍♀️", "text": "", "type": 1, "order": 1788, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 5 } ] }, { "label": "vampire", "hexcode": "1F9DB", "tags": [ "blood", "dracula", "fangs", "halloween", "scary", "supernatural", "teeth", "undead" ], "emoji": "🧛", "text": "", "type": 1, "order": 1790, "group": 1, "subgroup": 26, "version": 5, "emoticon": ":E", "skins": [ { "label": "vampire: light skin tone", "hexcode": "1F9DB-1F3FB", "emoji": "🧛🏻", "text": "", "type": 1, "order": 1791, "group": 1, "subgroup": 26, "version": 5, "tone": 1 }, { "label": "vampire: medium-light skin tone", "hexcode": "1F9DB-1F3FC", "emoji": "🧛🏼", "text": "", "type": 1, "order": 1792, "group": 1, "subgroup": 26, "version": 5, "tone": 2 }, { "label": "vampire: medium skin tone", "hexcode": "1F9DB-1F3FD", "emoji": "🧛🏽", "text": "", "type": 1, "order": 1793, "group": 1, "subgroup": 26, "version": 5, "tone": 3 }, { "label": "vampire: medium-dark skin tone", "hexcode": "1F9DB-1F3FE", "emoji": "🧛🏾", "text": "", "type": 1, "order": 1794, "group": 1, "subgroup": 26, "version": 5, "tone": 4 }, { "label": "vampire: dark skin tone", "hexcode": "1F9DB-1F3FF", "emoji": "🧛🏿", "text": "", "type": 1, "order": 1795, "group": 1, "subgroup": 26, "version": 5, "tone": 5 } ] }, { "label": "man vampire", "hexcode": "1F9DB-200D-2642-FE0F", "tags": [ "blood", "fangs", "halloween", "man", "scary", "supernatural", "teeth", "undead", "vampire" ], "emoji": "🧛‍♂️", "text": "", "type": 1, "order": 1796, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "skins": [ { "label": "man vampire: light skin tone", "hexcode": "1F9DB-1F3FB-200D-2642-FE0F", "emoji": "🧛🏻‍♂️", "text": "", "type": 1, "order": 1798, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 1 }, { "label": "man vampire: medium-light skin tone", "hexcode": "1F9DB-1F3FC-200D-2642-FE0F", "emoji": "🧛🏼‍♂️", "text": "", "type": 1, "order": 1800, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 2 }, { "label": "man vampire: medium skin tone", "hexcode": "1F9DB-1F3FD-200D-2642-FE0F", "emoji": "🧛🏽‍♂️", "text": "", "type": 1, "order": 1802, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 3 }, { "label": "man vampire: medium-dark skin tone", "hexcode": "1F9DB-1F3FE-200D-2642-FE0F", "emoji": "🧛🏾‍♂️", "text": "", "type": 1, "order": 1804, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 4 }, { "label": "man vampire: dark skin tone", "hexcode": "1F9DB-1F3FF-200D-2642-FE0F", "emoji": "🧛🏿‍♂️", "text": "", "type": 1, "order": 1806, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 5 } ] }, { "label": "woman vampire", "hexcode": "1F9DB-200D-2640-FE0F", "tags": [ "blood", "fangs", "halloween", "scary", "supernatural", "teeth", "undead", "vampire", "woman" ], "emoji": "🧛‍♀️", "text": "", "type": 1, "order": 1808, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "skins": [ { "label": "woman vampire: light skin tone", "hexcode": "1F9DB-1F3FB-200D-2640-FE0F", "emoji": "🧛🏻‍♀️", "text": "", "type": 1, "order": 1810, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 1 }, { "label": "woman vampire: medium-light skin tone", "hexcode": "1F9DB-1F3FC-200D-2640-FE0F", "emoji": "🧛🏼‍♀️", "text": "", "type": 1, "order": 1812, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 2 }, { "label": "woman vampire: medium skin tone", "hexcode": "1F9DB-1F3FD-200D-2640-FE0F", "emoji": "🧛🏽‍♀️", "text": "", "type": 1, "order": 1814, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 3 }, { "label": "woman vampire: medium-dark skin tone", "hexcode": "1F9DB-1F3FE-200D-2640-FE0F", "emoji": "🧛🏾‍♀️", "text": "", "type": 1, "order": 1816, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 4 }, { "label": "woman vampire: dark skin tone", "hexcode": "1F9DB-1F3FF-200D-2640-FE0F", "emoji": "🧛🏿‍♀️", "text": "", "type": 1, "order": 1818, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 5 } ] }, { "label": "merperson", "hexcode": "1F9DC", "tags": [ "creature", "fairytale", "folklore", "ocean", "sea", "siren", "trident" ], "emoji": "🧜", "text": "", "type": 1, "order": 1820, "group": 1, "subgroup": 26, "version": 5, "skins": [ { "label": "merperson: light skin tone", "hexcode": "1F9DC-1F3FB", "emoji": "🧜🏻", "text": "", "type": 1, "order": 1821, "group": 1, "subgroup": 26, "version": 5, "tone": 1 }, { "label": "merperson: medium-light skin tone", "hexcode": "1F9DC-1F3FC", "emoji": "🧜🏼", "text": "", "type": 1, "order": 1822, "group": 1, "subgroup": 26, "version": 5, "tone": 2 }, { "label": "merperson: medium skin tone", "hexcode": "1F9DC-1F3FD", "emoji": "🧜🏽", "text": "", "type": 1, "order": 1823, "group": 1, "subgroup": 26, "version": 5, "tone": 3 }, { "label": "merperson: medium-dark skin tone", "hexcode": "1F9DC-1F3FE", "emoji": "🧜🏾", "text": "", "type": 1, "order": 1824, "group": 1, "subgroup": 26, "version": 5, "tone": 4 }, { "label": "merperson: dark skin tone", "hexcode": "1F9DC-1F3FF", "emoji": "🧜🏿", "text": "", "type": 1, "order": 1825, "group": 1, "subgroup": 26, "version": 5, "tone": 5 } ] }, { "label": "merman", "hexcode": "1F9DC-200D-2642-FE0F", "tags": [ "creature", "fairytale", "folklore", "neptune", "ocean", "poseidon", "sea", "siren", "trident", "triton" ], "emoji": "🧜‍♂️", "text": "", "type": 1, "order": 1826, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "skins": [ { "label": "merman: light skin tone", "hexcode": "1F9DC-1F3FB-200D-2642-FE0F", "emoji": "🧜🏻‍♂️", "text": "", "type": 1, "order": 1828, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 1 }, { "label": "merman: medium-light skin tone", "hexcode": "1F9DC-1F3FC-200D-2642-FE0F", "emoji": "🧜🏼‍♂️", "text": "", "type": 1, "order": 1830, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 2 }, { "label": "merman: medium skin tone", "hexcode": "1F9DC-1F3FD-200D-2642-FE0F", "emoji": "🧜🏽‍♂️", "text": "", "type": 1, "order": 1832, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 3 }, { "label": "merman: medium-dark skin tone", "hexcode": "1F9DC-1F3FE-200D-2642-FE0F", "emoji": "🧜🏾‍♂️", "text": "", "type": 1, "order": 1834, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 4 }, { "label": "merman: dark skin tone", "hexcode": "1F9DC-1F3FF-200D-2642-FE0F", "emoji": "🧜🏿‍♂️", "text": "", "type": 1, "order": 1836, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 5 } ] }, { "label": "mermaid", "hexcode": "1F9DC-200D-2640-FE0F", "tags": [ "creature", "fairytale", "folklore", "merwoman", "ocean", "sea", "siren", "trident" ], "emoji": "🧜‍♀️", "text": "", "type": 1, "order": 1838, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "skins": [ { "label": "mermaid: light skin tone", "hexcode": "1F9DC-1F3FB-200D-2640-FE0F", "emoji": "🧜🏻‍♀️", "text": "", "type": 1, "order": 1840, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 1 }, { "label": "mermaid: medium-light skin tone", "hexcode": "1F9DC-1F3FC-200D-2640-FE0F", "emoji": "🧜🏼‍♀️", "text": "", "type": 1, "order": 1842, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 2 }, { "label": "mermaid: medium skin tone", "hexcode": "1F9DC-1F3FD-200D-2640-FE0F", "emoji": "🧜🏽‍♀️", "text": "", "type": 1, "order": 1844, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 3 }, { "label": "mermaid: medium-dark skin tone", "hexcode": "1F9DC-1F3FE-200D-2640-FE0F", "emoji": "🧜🏾‍♀️", "text": "", "type": 1, "order": 1846, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 4 }, { "label": "mermaid: dark skin tone", "hexcode": "1F9DC-1F3FF-200D-2640-FE0F", "emoji": "🧜🏿‍♀️", "text": "", "type": 1, "order": 1848, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 5 } ] }, { "label": "elf", "hexcode": "1F9DD", "tags": [ "elves", "enchantment", "fantasy", "folklore", "magic", "magical", "myth" ], "emoji": "🧝", "text": "", "type": 1, "order": 1850, "group": 1, "subgroup": 26, "version": 5, "skins": [ { "label": "elf: light skin tone", "hexcode": "1F9DD-1F3FB", "emoji": "🧝🏻", "text": "", "type": 1, "order": 1851, "group": 1, "subgroup": 26, "version": 5, "tone": 1 }, { "label": "elf: medium-light skin tone", "hexcode": "1F9DD-1F3FC", "emoji": "🧝🏼", "text": "", "type": 1, "order": 1852, "group": 1, "subgroup": 26, "version": 5, "tone": 2 }, { "label": "elf: medium skin tone", "hexcode": "1F9DD-1F3FD", "emoji": "🧝🏽", "text": "", "type": 1, "order": 1853, "group": 1, "subgroup": 26, "version": 5, "tone": 3 }, { "label": "elf: medium-dark skin tone", "hexcode": "1F9DD-1F3FE", "emoji": "🧝🏾", "text": "", "type": 1, "order": 1854, "group": 1, "subgroup": 26, "version": 5, "tone": 4 }, { "label": "elf: dark skin tone", "hexcode": "1F9DD-1F3FF", "emoji": "🧝🏿", "text": "", "type": 1, "order": 1855, "group": 1, "subgroup": 26, "version": 5, "tone": 5 } ] }, { "label": "man elf", "hexcode": "1F9DD-200D-2642-FE0F", "tags": [ "elf", "elves", "enchantment", "fantasy", "folklore", "magic", "magical", "man", "myth" ], "emoji": "🧝‍♂️", "text": "", "type": 1, "order": 1856, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "skins": [ { "label": "man elf: light skin tone", "hexcode": "1F9DD-1F3FB-200D-2642-FE0F", "emoji": "🧝🏻‍♂️", "text": "", "type": 1, "order": 1858, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 1 }, { "label": "man elf: medium-light skin tone", "hexcode": "1F9DD-1F3FC-200D-2642-FE0F", "emoji": "🧝🏼‍♂️", "text": "", "type": 1, "order": 1860, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 2 }, { "label": "man elf: medium skin tone", "hexcode": "1F9DD-1F3FD-200D-2642-FE0F", "emoji": "🧝🏽‍♂️", "text": "", "type": 1, "order": 1862, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 3 }, { "label": "man elf: medium-dark skin tone", "hexcode": "1F9DD-1F3FE-200D-2642-FE0F", "emoji": "🧝🏾‍♂️", "text": "", "type": 1, "order": 1864, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 4 }, { "label": "man elf: dark skin tone", "hexcode": "1F9DD-1F3FF-200D-2642-FE0F", "emoji": "🧝🏿‍♂️", "text": "", "type": 1, "order": 1866, "group": 1, "subgroup": 26, "version": 5, "gender": 1, "tone": 5 } ] }, { "label": "woman elf", "hexcode": "1F9DD-200D-2640-FE0F", "tags": [ "elf", "elves", "enchantment", "fantasy", "folklore", "magic", "magical", "myth", "woman" ], "emoji": "🧝‍♀️", "text": "", "type": 1, "order": 1868, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "skins": [ { "label": "woman elf: light skin tone", "hexcode": "1F9DD-1F3FB-200D-2640-FE0F", "emoji": "🧝🏻‍♀️", "text": "", "type": 1, "order": 1870, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 1 }, { "label": "woman elf: medium-light skin tone", "hexcode": "1F9DD-1F3FC-200D-2640-FE0F", "emoji": "🧝🏼‍♀️", "text": "", "type": 1, "order": 1872, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 2 }, { "label": "woman elf: medium skin tone", "hexcode": "1F9DD-1F3FD-200D-2640-FE0F", "emoji": "🧝🏽‍♀️", "text": "", "type": 1, "order": 1874, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 3 }, { "label": "woman elf: medium-dark skin tone", "hexcode": "1F9DD-1F3FE-200D-2640-FE0F", "emoji": "🧝🏾‍♀️", "text": "", "type": 1, "order": 1876, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 4 }, { "label": "woman elf: dark skin tone", "hexcode": "1F9DD-1F3FF-200D-2640-FE0F", "emoji": "🧝🏿‍♀️", "text": "", "type": 1, "order": 1878, "group": 1, "subgroup": 26, "version": 5, "gender": 0, "tone": 5 } ] }, { "label": "genie", "hexcode": "1F9DE", "tags": [ "djinn", "fantasy", "jinn", "lamp", "myth", "rub", "wishes" ], "emoji": "🧞", "text": "", "type": 1, "order": 1880, "group": 1, "subgroup": 26, "version": 5 }, { "label": "man genie", "hexcode": "1F9DE-200D-2642-FE0F", "tags": [ "djinn", "fantasy", "genie", "jinn", "lamp", "man", "myth", "rub", "wishes" ], "emoji": "🧞‍♂️", "text": "", "type": 1, "order": 1881, "group": 1, "subgroup": 26, "version": 5, "gender": 1 }, { "label": "woman genie", "hexcode": "1F9DE-200D-2640-FE0F", "tags": [ "djinn", "fantasy", "genie", "jinn", "lamp", "myth", "rub", "wishes", "woman" ], "emoji": "🧞‍♀️", "text": "", "type": 1, "order": 1883, "group": 1, "subgroup": 26, "version": 5, "gender": 0 }, { "label": "zombie", "hexcode": "1F9DF", "tags": [ "apocalypse", "dead", "halloween", "horror", "scary", "undead", "walking" ], "emoji": "🧟", "text": "", "type": 1, "order": 1885, "group": 1, "subgroup": 26, "version": 5, "emoticon": "8#" }, { "label": "man zombie", "hexcode": "1F9DF-200D-2642-FE0F", "tags": [ "apocalypse", "dead", "halloween", "horror", "man", "scary", "undead", "walking", "zombie" ], "emoji": "🧟‍♂️", "text": "", "type": 1, "order": 1886, "group": 1, "subgroup": 26, "version": 5, "gender": 1 }, { "label": "woman zombie", "hexcode": "1F9DF-200D-2640-FE0F", "tags": [ "apocalypse", "dead", "halloween", "horror", "scary", "undead", "walking", "woman", "zombie" ], "emoji": "🧟‍♀️", "text": "", "type": 1, "order": 1888, "group": 1, "subgroup": 26, "version": 5, "gender": 0 }, { "label": "troll", "hexcode": "1F9CC", "tags": [ "fairy", "fantasy", "monster", "tale", "trolling" ], "emoji": "🧌", "text": "", "type": 1, "order": 1890, "group": 1, "subgroup": 26, "version": 14 }, { "label": "hairy creature", "hexcode": "1FAC8", "tags": [ "bigfoot", "cryptid", "forest", "giant", "hairy", "sasquatch", "woodwose", "yeti" ], "emoji": "🫈", "text": "", "type": 1, "order": 1891, "group": 1, "subgroup": 26, "version": 17 }, { "label": "person getting massage", "hexcode": "1F486", "tags": [ "face", "getting", "headache", "massage", "person", "relax", "relaxing", "salon", "soothe", "spa", "tension", "therapy", "treatment" ], "emoji": "💆", "text": "", "type": 1, "order": 1892, "group": 1, "subgroup": 27, "version": 0.6, "skins": [ { "label": "person getting massage: light skin tone", "hexcode": "1F486-1F3FB", "emoji": "💆🏻", "text": "", "type": 1, "order": 1893, "group": 1, "subgroup": 27, "version": 1, "tone": 1 }, { "label": "person getting massage: medium-light skin tone", "hexcode": "1F486-1F3FC", "emoji": "💆🏼", "text": "", "type": 1, "order": 1894, "group": 1, "subgroup": 27, "version": 1, "tone": 2 }, { "label": "person getting massage: medium skin tone", "hexcode": "1F486-1F3FD", "emoji": "💆🏽", "text": "", "type": 1, "order": 1895, "group": 1, "subgroup": 27, "version": 1, "tone": 3 }, { "label": "person getting massage: medium-dark skin tone", "hexcode": "1F486-1F3FE", "emoji": "💆🏾", "text": "", "type": 1, "order": 1896, "group": 1, "subgroup": 27, "version": 1, "tone": 4 }, { "label": "person getting massage: dark skin tone", "hexcode": "1F486-1F3FF", "emoji": "💆🏿", "text": "", "type": 1, "order": 1897, "group": 1, "subgroup": 27, "version": 1, "tone": 5 } ] }, { "label": "man getting massage", "hexcode": "1F486-200D-2642-FE0F", "tags": [ "face", "getting", "headache", "man", "massage", "relax", "relaxing", "salon", "soothe", "spa", "tension", "therapy", "treatment" ], "emoji": "💆‍♂️", "text": "", "type": 1, "order": 1898, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "skins": [ { "label": "man getting massage: light skin tone", "hexcode": "1F486-1F3FB-200D-2642-FE0F", "emoji": "💆🏻‍♂️", "text": "", "type": 1, "order": 1900, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 1 }, { "label": "man getting massage: medium-light skin tone", "hexcode": "1F486-1F3FC-200D-2642-FE0F", "emoji": "💆🏼‍♂️", "text": "", "type": 1, "order": 1902, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 2 }, { "label": "man getting massage: medium skin tone", "hexcode": "1F486-1F3FD-200D-2642-FE0F", "emoji": "💆🏽‍♂️", "text": "", "type": 1, "order": 1904, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 3 }, { "label": "man getting massage: medium-dark skin tone", "hexcode": "1F486-1F3FE-200D-2642-FE0F", "emoji": "💆🏾‍♂️", "text": "", "type": 1, "order": 1906, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 4 }, { "label": "man getting massage: dark skin tone", "hexcode": "1F486-1F3FF-200D-2642-FE0F", "emoji": "💆🏿‍♂️", "text": "", "type": 1, "order": 1908, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman getting massage", "hexcode": "1F486-200D-2640-FE0F", "tags": [ "face", "getting", "headache", "massage", "relax", "relaxing", "salon", "soothe", "spa", "tension", "therapy", "treatment", "woman" ], "emoji": "💆‍♀️", "text": "", "type": 1, "order": 1910, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "skins": [ { "label": "woman getting massage: light skin tone", "hexcode": "1F486-1F3FB-200D-2640-FE0F", "emoji": "💆🏻‍♀️", "text": "", "type": 1, "order": 1912, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman getting massage: medium-light skin tone", "hexcode": "1F486-1F3FC-200D-2640-FE0F", "emoji": "💆🏼‍♀️", "text": "", "type": 1, "order": 1914, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman getting massage: medium skin tone", "hexcode": "1F486-1F3FD-200D-2640-FE0F", "emoji": "💆🏽‍♀️", "text": "", "type": 1, "order": 1916, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman getting massage: medium-dark skin tone", "hexcode": "1F486-1F3FE-200D-2640-FE0F", "emoji": "💆🏾‍♀️", "text": "", "type": 1, "order": 1918, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman getting massage: dark skin tone", "hexcode": "1F486-1F3FF-200D-2640-FE0F", "emoji": "💆🏿‍♀️", "text": "", "type": 1, "order": 1920, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person getting haircut", "hexcode": "1F487", "tags": [ "barber", "beauty", "chop", "cosmetology", "cut", "groom", "hair", "haircut", "parlor", "person", "shears", "style" ], "emoji": "💇", "text": "", "type": 1, "order": 1922, "group": 1, "subgroup": 27, "version": 0.6, "skins": [ { "label": "person getting haircut: light skin tone", "hexcode": "1F487-1F3FB", "emoji": "💇🏻", "text": "", "type": 1, "order": 1923, "group": 1, "subgroup": 27, "version": 1, "tone": 1 }, { "label": "person getting haircut: medium-light skin tone", "hexcode": "1F487-1F3FC", "emoji": "💇🏼", "text": "", "type": 1, "order": 1924, "group": 1, "subgroup": 27, "version": 1, "tone": 2 }, { "label": "person getting haircut: medium skin tone", "hexcode": "1F487-1F3FD", "emoji": "💇🏽", "text": "", "type": 1, "order": 1925, "group": 1, "subgroup": 27, "version": 1, "tone": 3 }, { "label": "person getting haircut: medium-dark skin tone", "hexcode": "1F487-1F3FE", "emoji": "💇🏾", "text": "", "type": 1, "order": 1926, "group": 1, "subgroup": 27, "version": 1, "tone": 4 }, { "label": "person getting haircut: dark skin tone", "hexcode": "1F487-1F3FF", "emoji": "💇🏿", "text": "", "type": 1, "order": 1927, "group": 1, "subgroup": 27, "version": 1, "tone": 5 } ] }, { "label": "man getting haircut", "hexcode": "1F487-200D-2642-FE0F", "tags": [ "barber", "beauty", "chop", "cosmetology", "cut", "groom", "hair", "haircut", "man", "parlor", "person", "shears", "style" ], "emoji": "💇‍♂️", "text": "", "type": 1, "order": 1928, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "skins": [ { "label": "man getting haircut: light skin tone", "hexcode": "1F487-1F3FB-200D-2642-FE0F", "emoji": "💇🏻‍♂️", "text": "", "type": 1, "order": 1930, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 1 }, { "label": "man getting haircut: medium-light skin tone", "hexcode": "1F487-1F3FC-200D-2642-FE0F", "emoji": "💇🏼‍♂️", "text": "", "type": 1, "order": 1932, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 2 }, { "label": "man getting haircut: medium skin tone", "hexcode": "1F487-1F3FD-200D-2642-FE0F", "emoji": "💇🏽‍♂️", "text": "", "type": 1, "order": 1934, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 3 }, { "label": "man getting haircut: medium-dark skin tone", "hexcode": "1F487-1F3FE-200D-2642-FE0F", "emoji": "💇🏾‍♂️", "text": "", "type": 1, "order": 1936, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 4 }, { "label": "man getting haircut: dark skin tone", "hexcode": "1F487-1F3FF-200D-2642-FE0F", "emoji": "💇🏿‍♂️", "text": "", "type": 1, "order": 1938, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman getting haircut", "hexcode": "1F487-200D-2640-FE0F", "tags": [ "barber", "beauty", "chop", "cosmetology", "cut", "groom", "hair", "haircut", "parlor", "person", "shears", "style", "woman" ], "emoji": "💇‍♀️", "text": "", "type": 1, "order": 1940, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "skins": [ { "label": "woman getting haircut: light skin tone", "hexcode": "1F487-1F3FB-200D-2640-FE0F", "emoji": "💇🏻‍♀️", "text": "", "type": 1, "order": 1942, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman getting haircut: medium-light skin tone", "hexcode": "1F487-1F3FC-200D-2640-FE0F", "emoji": "💇🏼‍♀️", "text": "", "type": 1, "order": 1944, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman getting haircut: medium skin tone", "hexcode": "1F487-1F3FD-200D-2640-FE0F", "emoji": "💇🏽‍♀️", "text": "", "type": 1, "order": 1946, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman getting haircut: medium-dark skin tone", "hexcode": "1F487-1F3FE-200D-2640-FE0F", "emoji": "💇🏾‍♀️", "text": "", "type": 1, "order": 1948, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman getting haircut: dark skin tone", "hexcode": "1F487-1F3FF-200D-2640-FE0F", "emoji": "💇🏿‍♀️", "text": "", "type": 1, "order": 1950, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person walking", "hexcode": "1F6B6", "tags": [ "amble", "gait", "hike", "man", "pace", "pedestrian", "person", "stride", "stroll", "walk", "walking" ], "emoji": "🚶", "text": "", "type": 1, "order": 1952, "group": 1, "subgroup": 27, "version": 0.6, "skins": [ { "label": "person walking: light skin tone", "hexcode": "1F6B6-1F3FB", "emoji": "🚶🏻", "text": "", "type": 1, "order": 1953, "group": 1, "subgroup": 27, "version": 1, "tone": 1 }, { "label": "person walking: medium-light skin tone", "hexcode": "1F6B6-1F3FC", "emoji": "🚶🏼", "text": "", "type": 1, "order": 1954, "group": 1, "subgroup": 27, "version": 1, "tone": 2 }, { "label": "person walking: medium skin tone", "hexcode": "1F6B6-1F3FD", "emoji": "🚶🏽", "text": "", "type": 1, "order": 1955, "group": 1, "subgroup": 27, "version": 1, "tone": 3 }, { "label": "person walking: medium-dark skin tone", "hexcode": "1F6B6-1F3FE", "emoji": "🚶🏾", "text": "", "type": 1, "order": 1956, "group": 1, "subgroup": 27, "version": 1, "tone": 4 }, { "label": "person walking: dark skin tone", "hexcode": "1F6B6-1F3FF", "emoji": "🚶🏿", "text": "", "type": 1, "order": 1957, "group": 1, "subgroup": 27, "version": 1, "tone": 5 } ] }, { "label": "man walking", "hexcode": "1F6B6-200D-2642-FE0F", "tags": [ "amble", "gait", "hike", "man", "pace", "pedestrian", "stride", "stroll", "walk", "walking" ], "emoji": "🚶‍♂️", "text": "", "type": 1, "order": 1958, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "skins": [ { "label": "man walking: light skin tone", "hexcode": "1F6B6-1F3FB-200D-2642-FE0F", "emoji": "🚶🏻‍♂️", "text": "", "type": 1, "order": 1960, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 1 }, { "label": "man walking: medium-light skin tone", "hexcode": "1F6B6-1F3FC-200D-2642-FE0F", "emoji": "🚶🏼‍♂️", "text": "", "type": 1, "order": 1962, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 2 }, { "label": "man walking: medium skin tone", "hexcode": "1F6B6-1F3FD-200D-2642-FE0F", "emoji": "🚶🏽‍♂️", "text": "", "type": 1, "order": 1964, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 3 }, { "label": "man walking: medium-dark skin tone", "hexcode": "1F6B6-1F3FE-200D-2642-FE0F", "emoji": "🚶🏾‍♂️", "text": "", "type": 1, "order": 1966, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 4 }, { "label": "man walking: dark skin tone", "hexcode": "1F6B6-1F3FF-200D-2642-FE0F", "emoji": "🚶🏿‍♂️", "text": "", "type": 1, "order": 1968, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman walking", "hexcode": "1F6B6-200D-2640-FE0F", "tags": [ "amble", "gait", "hike", "man", "pace", "pedestrian", "stride", "stroll", "walk", "walking", "woman" ], "emoji": "🚶‍♀️", "text": "", "type": 1, "order": 1970, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "skins": [ { "label": "woman walking: light skin tone", "hexcode": "1F6B6-1F3FB-200D-2640-FE0F", "emoji": "🚶🏻‍♀️", "text": "", "type": 1, "order": 1972, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman walking: medium-light skin tone", "hexcode": "1F6B6-1F3FC-200D-2640-FE0F", "emoji": "🚶🏼‍♀️", "text": "", "type": 1, "order": 1974, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman walking: medium skin tone", "hexcode": "1F6B6-1F3FD-200D-2640-FE0F", "emoji": "🚶🏽‍♀️", "text": "", "type": 1, "order": 1976, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman walking: medium-dark skin tone", "hexcode": "1F6B6-1F3FE-200D-2640-FE0F", "emoji": "🚶🏾‍♀️", "text": "", "type": 1, "order": 1978, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman walking: dark skin tone", "hexcode": "1F6B6-1F3FF-200D-2640-FE0F", "emoji": "🚶🏿‍♀️", "text": "", "type": 1, "order": 1980, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person walking: facing right", "hexcode": "1F6B6-200D-27A1-FE0F", "tags": [ "amble", "facing", "gait", "hike", "man", "pace", "pedestrian", "person", "right", "stride", "stroll", "walk", "walking" ], "emoji": "🚶‍➡️", "text": "", "type": 1, "order": 1982, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "person walking: light skin tone, facing right", "hexcode": "1F6B6-1F3FB-200D-27A1-FE0F", "emoji": "🚶🏻‍➡️", "text": "", "type": 1, "order": 1984, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "person walking: medium-light skin tone, facing right", "hexcode": "1F6B6-1F3FC-200D-27A1-FE0F", "emoji": "🚶🏼‍➡️", "text": "", "type": 1, "order": 1986, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "person walking: medium skin tone, facing right", "hexcode": "1F6B6-1F3FD-200D-27A1-FE0F", "emoji": "🚶🏽‍➡️", "text": "", "type": 1, "order": 1988, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "person walking: medium-dark skin tone, facing right", "hexcode": "1F6B6-1F3FE-200D-27A1-FE0F", "emoji": "🚶🏾‍➡️", "text": "", "type": 1, "order": 1990, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "person walking: dark skin tone, facing right", "hexcode": "1F6B6-1F3FF-200D-27A1-FE0F", "emoji": "🚶🏿‍➡️", "text": "", "type": 1, "order": 1992, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "woman walking: facing right", "hexcode": "1F6B6-200D-2640-FE0F-200D-27A1-FE0F", "tags": [ "amble", "facing", "gait", "hike", "man", "pace", "pedestrian", "right", "stride", "stroll", "walk", "walking", "woman" ], "emoji": "🚶‍♀️‍➡️", "text": "", "type": 1, "order": 1994, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "skins": [ { "label": "woman walking: light skin tone, facing right", "hexcode": "1F6B6-1F3FB-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🚶🏻‍♀️‍➡️", "text": "", "type": 1, "order": 1998, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 1 }, { "label": "woman walking: medium-light skin tone, facing right", "hexcode": "1F6B6-1F3FC-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🚶🏼‍♀️‍➡️", "text": "", "type": 1, "order": 2002, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 2 }, { "label": "woman walking: medium skin tone, facing right", "hexcode": "1F6B6-1F3FD-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🚶🏽‍♀️‍➡️", "text": "", "type": 1, "order": 2006, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 3 }, { "label": "woman walking: medium-dark skin tone, facing right", "hexcode": "1F6B6-1F3FE-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🚶🏾‍♀️‍➡️", "text": "", "type": 1, "order": 2010, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 4 }, { "label": "woman walking: dark skin tone, facing right", "hexcode": "1F6B6-1F3FF-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🚶🏿‍♀️‍➡️", "text": "", "type": 1, "order": 2014, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 5 } ] }, { "label": "man walking: facing right", "hexcode": "1F6B6-200D-2642-FE0F-200D-27A1-FE0F", "tags": [ "amble", "facing", "gait", "hike", "man", "pace", "pedestrian", "right", "stride", "stroll", "walk", "walking" ], "emoji": "🚶‍♂️‍➡️", "text": "", "type": 1, "order": 2018, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "skins": [ { "label": "man walking: light skin tone, facing right", "hexcode": "1F6B6-1F3FB-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🚶🏻‍♂️‍➡️", "text": "", "type": 1, "order": 2022, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 1 }, { "label": "man walking: medium-light skin tone, facing right", "hexcode": "1F6B6-1F3FC-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🚶🏼‍♂️‍➡️", "text": "", "type": 1, "order": 2026, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 2 }, { "label": "man walking: medium skin tone, facing right", "hexcode": "1F6B6-1F3FD-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🚶🏽‍♂️‍➡️", "text": "", "type": 1, "order": 2030, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 3 }, { "label": "man walking: medium-dark skin tone, facing right", "hexcode": "1F6B6-1F3FE-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🚶🏾‍♂️‍➡️", "text": "", "type": 1, "order": 2034, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 4 }, { "label": "man walking: dark skin tone, facing right", "hexcode": "1F6B6-1F3FF-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🚶🏿‍♂️‍➡️", "text": "", "type": 1, "order": 2038, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 5 } ] }, { "label": "person standing", "hexcode": "1F9CD", "tags": [ "person", "stand", "standing" ], "emoji": "🧍", "text": "", "type": 1, "order": 2042, "group": 1, "subgroup": 27, "version": 12, "skins": [ { "label": "person standing: light skin tone", "hexcode": "1F9CD-1F3FB", "emoji": "🧍🏻", "text": "", "type": 1, "order": 2043, "group": 1, "subgroup": 27, "version": 12, "tone": 1 }, { "label": "person standing: medium-light skin tone", "hexcode": "1F9CD-1F3FC", "emoji": "🧍🏼", "text": "", "type": 1, "order": 2044, "group": 1, "subgroup": 27, "version": 12, "tone": 2 }, { "label": "person standing: medium skin tone", "hexcode": "1F9CD-1F3FD", "emoji": "🧍🏽", "text": "", "type": 1, "order": 2045, "group": 1, "subgroup": 27, "version": 12, "tone": 3 }, { "label": "person standing: medium-dark skin tone", "hexcode": "1F9CD-1F3FE", "emoji": "🧍🏾", "text": "", "type": 1, "order": 2046, "group": 1, "subgroup": 27, "version": 12, "tone": 4 }, { "label": "person standing: dark skin tone", "hexcode": "1F9CD-1F3FF", "emoji": "🧍🏿", "text": "", "type": 1, "order": 2047, "group": 1, "subgroup": 27, "version": 12, "tone": 5 } ] }, { "label": "man standing", "hexcode": "1F9CD-200D-2642-FE0F", "tags": [ "man", "stand", "standing" ], "emoji": "🧍‍♂️", "text": "", "type": 1, "order": 2048, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "skins": [ { "label": "man standing: light skin tone", "hexcode": "1F9CD-1F3FB-200D-2642-FE0F", "emoji": "🧍🏻‍♂️", "text": "", "type": 1, "order": 2050, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 1 }, { "label": "man standing: medium-light skin tone", "hexcode": "1F9CD-1F3FC-200D-2642-FE0F", "emoji": "🧍🏼‍♂️", "text": "", "type": 1, "order": 2052, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 2 }, { "label": "man standing: medium skin tone", "hexcode": "1F9CD-1F3FD-200D-2642-FE0F", "emoji": "🧍🏽‍♂️", "text": "", "type": 1, "order": 2054, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 3 }, { "label": "man standing: medium-dark skin tone", "hexcode": "1F9CD-1F3FE-200D-2642-FE0F", "emoji": "🧍🏾‍♂️", "text": "", "type": 1, "order": 2056, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 4 }, { "label": "man standing: dark skin tone", "hexcode": "1F9CD-1F3FF-200D-2642-FE0F", "emoji": "🧍🏿‍♂️", "text": "", "type": 1, "order": 2058, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 5 } ] }, { "label": "woman standing", "hexcode": "1F9CD-200D-2640-FE0F", "tags": [ "stand", "standing", "woman" ], "emoji": "🧍‍♀️", "text": "", "type": 1, "order": 2060, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "skins": [ { "label": "woman standing: light skin tone", "hexcode": "1F9CD-1F3FB-200D-2640-FE0F", "emoji": "🧍🏻‍♀️", "text": "", "type": 1, "order": 2062, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 1 }, { "label": "woman standing: medium-light skin tone", "hexcode": "1F9CD-1F3FC-200D-2640-FE0F", "emoji": "🧍🏼‍♀️", "text": "", "type": 1, "order": 2064, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 2 }, { "label": "woman standing: medium skin tone", "hexcode": "1F9CD-1F3FD-200D-2640-FE0F", "emoji": "🧍🏽‍♀️", "text": "", "type": 1, "order": 2066, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 3 }, { "label": "woman standing: medium-dark skin tone", "hexcode": "1F9CD-1F3FE-200D-2640-FE0F", "emoji": "🧍🏾‍♀️", "text": "", "type": 1, "order": 2068, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 4 }, { "label": "woman standing: dark skin tone", "hexcode": "1F9CD-1F3FF-200D-2640-FE0F", "emoji": "🧍🏿‍♀️", "text": "", "type": 1, "order": 2070, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 5 } ] }, { "label": "person kneeling", "hexcode": "1F9CE", "tags": [ "kneel", "kneeling", "knees", "person" ], "emoji": "🧎", "text": "", "type": 1, "order": 2072, "group": 1, "subgroup": 27, "version": 12, "skins": [ { "label": "person kneeling: light skin tone", "hexcode": "1F9CE-1F3FB", "emoji": "🧎🏻", "text": "", "type": 1, "order": 2073, "group": 1, "subgroup": 27, "version": 12, "tone": 1 }, { "label": "person kneeling: medium-light skin tone", "hexcode": "1F9CE-1F3FC", "emoji": "🧎🏼", "text": "", "type": 1, "order": 2074, "group": 1, "subgroup": 27, "version": 12, "tone": 2 }, { "label": "person kneeling: medium skin tone", "hexcode": "1F9CE-1F3FD", "emoji": "🧎🏽", "text": "", "type": 1, "order": 2075, "group": 1, "subgroup": 27, "version": 12, "tone": 3 }, { "label": "person kneeling: medium-dark skin tone", "hexcode": "1F9CE-1F3FE", "emoji": "🧎🏾", "text": "", "type": 1, "order": 2076, "group": 1, "subgroup": 27, "version": 12, "tone": 4 }, { "label": "person kneeling: dark skin tone", "hexcode": "1F9CE-1F3FF", "emoji": "🧎🏿", "text": "", "type": 1, "order": 2077, "group": 1, "subgroup": 27, "version": 12, "tone": 5 } ] }, { "label": "man kneeling", "hexcode": "1F9CE-200D-2642-FE0F", "tags": [ "kneel", "kneeling", "knees", "man" ], "emoji": "🧎‍♂️", "text": "", "type": 1, "order": 2078, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "skins": [ { "label": "man kneeling: light skin tone", "hexcode": "1F9CE-1F3FB-200D-2642-FE0F", "emoji": "🧎🏻‍♂️", "text": "", "type": 1, "order": 2080, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 1 }, { "label": "man kneeling: medium-light skin tone", "hexcode": "1F9CE-1F3FC-200D-2642-FE0F", "emoji": "🧎🏼‍♂️", "text": "", "type": 1, "order": 2082, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 2 }, { "label": "man kneeling: medium skin tone", "hexcode": "1F9CE-1F3FD-200D-2642-FE0F", "emoji": "🧎🏽‍♂️", "text": "", "type": 1, "order": 2084, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 3 }, { "label": "man kneeling: medium-dark skin tone", "hexcode": "1F9CE-1F3FE-200D-2642-FE0F", "emoji": "🧎🏾‍♂️", "text": "", "type": 1, "order": 2086, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 4 }, { "label": "man kneeling: dark skin tone", "hexcode": "1F9CE-1F3FF-200D-2642-FE0F", "emoji": "🧎🏿‍♂️", "text": "", "type": 1, "order": 2088, "group": 1, "subgroup": 27, "version": 12, "gender": 1, "tone": 5 } ] }, { "label": "woman kneeling", "hexcode": "1F9CE-200D-2640-FE0F", "tags": [ "kneel", "kneeling", "knees", "woman" ], "emoji": "🧎‍♀️", "text": "", "type": 1, "order": 2090, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "skins": [ { "label": "woman kneeling: light skin tone", "hexcode": "1F9CE-1F3FB-200D-2640-FE0F", "emoji": "🧎🏻‍♀️", "text": "", "type": 1, "order": 2092, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 1 }, { "label": "woman kneeling: medium-light skin tone", "hexcode": "1F9CE-1F3FC-200D-2640-FE0F", "emoji": "🧎🏼‍♀️", "text": "", "type": 1, "order": 2094, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 2 }, { "label": "woman kneeling: medium skin tone", "hexcode": "1F9CE-1F3FD-200D-2640-FE0F", "emoji": "🧎🏽‍♀️", "text": "", "type": 1, "order": 2096, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 3 }, { "label": "woman kneeling: medium-dark skin tone", "hexcode": "1F9CE-1F3FE-200D-2640-FE0F", "emoji": "🧎🏾‍♀️", "text": "", "type": 1, "order": 2098, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 4 }, { "label": "woman kneeling: dark skin tone", "hexcode": "1F9CE-1F3FF-200D-2640-FE0F", "emoji": "🧎🏿‍♀️", "text": "", "type": 1, "order": 2100, "group": 1, "subgroup": 27, "version": 12, "gender": 0, "tone": 5 } ] }, { "label": "person kneeling: facing right", "hexcode": "1F9CE-200D-27A1-FE0F", "tags": [ "facing", "kneel", "kneeling", "knees", "person", "right" ], "emoji": "🧎‍➡️", "text": "", "type": 1, "order": 2102, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "person kneeling: light skin tone, facing right", "hexcode": "1F9CE-1F3FB-200D-27A1-FE0F", "emoji": "🧎🏻‍➡️", "text": "", "type": 1, "order": 2104, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "person kneeling: medium-light skin tone, facing right", "hexcode": "1F9CE-1F3FC-200D-27A1-FE0F", "emoji": "🧎🏼‍➡️", "text": "", "type": 1, "order": 2106, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "person kneeling: medium skin tone, facing right", "hexcode": "1F9CE-1F3FD-200D-27A1-FE0F", "emoji": "🧎🏽‍➡️", "text": "", "type": 1, "order": 2108, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "person kneeling: medium-dark skin tone, facing right", "hexcode": "1F9CE-1F3FE-200D-27A1-FE0F", "emoji": "🧎🏾‍➡️", "text": "", "type": 1, "order": 2110, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "person kneeling: dark skin tone, facing right", "hexcode": "1F9CE-1F3FF-200D-27A1-FE0F", "emoji": "🧎🏿‍➡️", "text": "", "type": 1, "order": 2112, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "woman kneeling: facing right", "hexcode": "1F9CE-200D-2640-FE0F-200D-27A1-FE0F", "tags": [ "facing", "kneel", "kneeling", "knees", "right", "woman" ], "emoji": "🧎‍♀️‍➡️", "text": "", "type": 1, "order": 2114, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "skins": [ { "label": "woman kneeling: light skin tone, facing right", "hexcode": "1F9CE-1F3FB-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🧎🏻‍♀️‍➡️", "text": "", "type": 1, "order": 2118, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 1 }, { "label": "woman kneeling: medium-light skin tone, facing right", "hexcode": "1F9CE-1F3FC-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🧎🏼‍♀️‍➡️", "text": "", "type": 1, "order": 2122, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 2 }, { "label": "woman kneeling: medium skin tone, facing right", "hexcode": "1F9CE-1F3FD-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🧎🏽‍♀️‍➡️", "text": "", "type": 1, "order": 2126, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 3 }, { "label": "woman kneeling: medium-dark skin tone, facing right", "hexcode": "1F9CE-1F3FE-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🧎🏾‍♀️‍➡️", "text": "", "type": 1, "order": 2130, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 4 }, { "label": "woman kneeling: dark skin tone, facing right", "hexcode": "1F9CE-1F3FF-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🧎🏿‍♀️‍➡️", "text": "", "type": 1, "order": 2134, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 5 } ] }, { "label": "man kneeling: facing right", "hexcode": "1F9CE-200D-2642-FE0F-200D-27A1-FE0F", "tags": [ "facing", "kneel", "kneeling", "knees", "man", "right" ], "emoji": "🧎‍♂️‍➡️", "text": "", "type": 1, "order": 2138, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "skins": [ { "label": "man kneeling: light skin tone, facing right", "hexcode": "1F9CE-1F3FB-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🧎🏻‍♂️‍➡️", "text": "", "type": 1, "order": 2142, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 1 }, { "label": "man kneeling: medium-light skin tone, facing right", "hexcode": "1F9CE-1F3FC-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🧎🏼‍♂️‍➡️", "text": "", "type": 1, "order": 2146, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 2 }, { "label": "man kneeling: medium skin tone, facing right", "hexcode": "1F9CE-1F3FD-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🧎🏽‍♂️‍➡️", "text": "", "type": 1, "order": 2150, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 3 }, { "label": "man kneeling: medium-dark skin tone, facing right", "hexcode": "1F9CE-1F3FE-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🧎🏾‍♂️‍➡️", "text": "", "type": 1, "order": 2154, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 4 }, { "label": "man kneeling: dark skin tone, facing right", "hexcode": "1F9CE-1F3FF-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🧎🏿‍♂️‍➡️", "text": "", "type": 1, "order": 2158, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 5 } ] }, { "label": "person with white cane", "hexcode": "1F9D1-200D-1F9AF", "tags": [ "accessibility", "blind", "cane", "person", "probing", "white" ], "emoji": "🧑‍🦯", "text": "", "type": 1, "order": 2162, "group": 1, "subgroup": 27, "version": 12.1, "skins": [ { "label": "person with white cane: light skin tone", "hexcode": "1F9D1-1F3FB-200D-1F9AF", "emoji": "🧑🏻‍🦯", "text": "", "type": 1, "order": 2163, "group": 1, "subgroup": 27, "version": 12.1, "tone": 1 }, { "label": "person with white cane: medium-light skin tone", "hexcode": "1F9D1-1F3FC-200D-1F9AF", "emoji": "🧑🏼‍🦯", "text": "", "type": 1, "order": 2164, "group": 1, "subgroup": 27, "version": 12.1, "tone": 2 }, { "label": "person with white cane: medium skin tone", "hexcode": "1F9D1-1F3FD-200D-1F9AF", "emoji": "🧑🏽‍🦯", "text": "", "type": 1, "order": 2165, "group": 1, "subgroup": 27, "version": 12.1, "tone": 3 }, { "label": "person with white cane: medium-dark skin tone", "hexcode": "1F9D1-1F3FE-200D-1F9AF", "emoji": "🧑🏾‍🦯", "text": "", "type": 1, "order": 2166, "group": 1, "subgroup": 27, "version": 12.1, "tone": 4 }, { "label": "person with white cane: dark skin tone", "hexcode": "1F9D1-1F3FF-200D-1F9AF", "emoji": "🧑🏿‍🦯", "text": "", "type": 1, "order": 2167, "group": 1, "subgroup": 27, "version": 12.1, "tone": 5 } ] }, { "label": "person with white cane: facing right", "hexcode": "1F9D1-200D-1F9AF-200D-27A1-FE0F", "tags": [ "accessibility", "blind", "cane", "facing", "person", "probing", "right", "white" ], "emoji": "🧑‍🦯‍➡️", "text": "", "type": 1, "order": 2168, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "person with white cane: light skin tone, facing right", "hexcode": "1F9D1-1F3FB-200D-1F9AF-200D-27A1-FE0F", "emoji": "🧑🏻‍🦯‍➡️", "text": "", "type": 1, "order": 2170, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "person with white cane: medium-light skin tone, facing right", "hexcode": "1F9D1-1F3FC-200D-1F9AF-200D-27A1-FE0F", "emoji": "🧑🏼‍🦯‍➡️", "text": "", "type": 1, "order": 2172, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "person with white cane: medium skin tone, facing right", "hexcode": "1F9D1-1F3FD-200D-1F9AF-200D-27A1-FE0F", "emoji": "🧑🏽‍🦯‍➡️", "text": "", "type": 1, "order": 2174, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "person with white cane: medium-dark skin tone, facing right", "hexcode": "1F9D1-1F3FE-200D-1F9AF-200D-27A1-FE0F", "emoji": "🧑🏾‍🦯‍➡️", "text": "", "type": 1, "order": 2176, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "person with white cane: dark skin tone, facing right", "hexcode": "1F9D1-1F3FF-200D-1F9AF-200D-27A1-FE0F", "emoji": "🧑🏿‍🦯‍➡️", "text": "", "type": 1, "order": 2178, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "man with white cane", "hexcode": "1F468-200D-1F9AF", "tags": [ "accessibility", "blind", "cane", "man", "probing", "white" ], "emoji": "👨‍🦯", "text": "", "type": 1, "order": 2180, "group": 1, "subgroup": 27, "version": 12, "skins": [ { "label": "man with white cane: light skin tone", "hexcode": "1F468-1F3FB-200D-1F9AF", "emoji": "👨🏻‍🦯", "text": "", "type": 1, "order": 2181, "group": 1, "subgroup": 27, "version": 12, "tone": 1 }, { "label": "man with white cane: medium-light skin tone", "hexcode": "1F468-1F3FC-200D-1F9AF", "emoji": "👨🏼‍🦯", "text": "", "type": 1, "order": 2182, "group": 1, "subgroup": 27, "version": 12, "tone": 2 }, { "label": "man with white cane: medium skin tone", "hexcode": "1F468-1F3FD-200D-1F9AF", "emoji": "👨🏽‍🦯", "text": "", "type": 1, "order": 2183, "group": 1, "subgroup": 27, "version": 12, "tone": 3 }, { "label": "man with white cane: medium-dark skin tone", "hexcode": "1F468-1F3FE-200D-1F9AF", "emoji": "👨🏾‍🦯", "text": "", "type": 1, "order": 2184, "group": 1, "subgroup": 27, "version": 12, "tone": 4 }, { "label": "man with white cane: dark skin tone", "hexcode": "1F468-1F3FF-200D-1F9AF", "emoji": "👨🏿‍🦯", "text": "", "type": 1, "order": 2185, "group": 1, "subgroup": 27, "version": 12, "tone": 5 } ] }, { "label": "man with white cane: facing right", "hexcode": "1F468-200D-1F9AF-200D-27A1-FE0F", "tags": [ "accessibility", "blind", "cane", "facing", "man", "probing", "right", "white" ], "emoji": "👨‍🦯‍➡️", "text": "", "type": 1, "order": 2186, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "man with white cane: light skin tone, facing right", "hexcode": "1F468-1F3FB-200D-1F9AF-200D-27A1-FE0F", "emoji": "👨🏻‍🦯‍➡️", "text": "", "type": 1, "order": 2188, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "man with white cane: medium-light skin tone, facing right", "hexcode": "1F468-1F3FC-200D-1F9AF-200D-27A1-FE0F", "emoji": "👨🏼‍🦯‍➡️", "text": "", "type": 1, "order": 2190, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "man with white cane: medium skin tone, facing right", "hexcode": "1F468-1F3FD-200D-1F9AF-200D-27A1-FE0F", "emoji": "👨🏽‍🦯‍➡️", "text": "", "type": 1, "order": 2192, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "man with white cane: medium-dark skin tone, facing right", "hexcode": "1F468-1F3FE-200D-1F9AF-200D-27A1-FE0F", "emoji": "👨🏾‍🦯‍➡️", "text": "", "type": 1, "order": 2194, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "man with white cane: dark skin tone, facing right", "hexcode": "1F468-1F3FF-200D-1F9AF-200D-27A1-FE0F", "emoji": "👨🏿‍🦯‍➡️", "text": "", "type": 1, "order": 2196, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "woman with white cane", "hexcode": "1F469-200D-1F9AF", "tags": [ "accessibility", "blind", "cane", "probing", "white", "woman" ], "emoji": "👩‍🦯", "text": "", "type": 1, "order": 2198, "group": 1, "subgroup": 27, "version": 12, "skins": [ { "label": "woman with white cane: light skin tone", "hexcode": "1F469-1F3FB-200D-1F9AF", "emoji": "👩🏻‍🦯", "text": "", "type": 1, "order": 2199, "group": 1, "subgroup": 27, "version": 12, "tone": 1 }, { "label": "woman with white cane: medium-light skin tone", "hexcode": "1F469-1F3FC-200D-1F9AF", "emoji": "👩🏼‍🦯", "text": "", "type": 1, "order": 2200, "group": 1, "subgroup": 27, "version": 12, "tone": 2 }, { "label": "woman with white cane: medium skin tone", "hexcode": "1F469-1F3FD-200D-1F9AF", "emoji": "👩🏽‍🦯", "text": "", "type": 1, "order": 2201, "group": 1, "subgroup": 27, "version": 12, "tone": 3 }, { "label": "woman with white cane: medium-dark skin tone", "hexcode": "1F469-1F3FE-200D-1F9AF", "emoji": "👩🏾‍🦯", "text": "", "type": 1, "order": 2202, "group": 1, "subgroup": 27, "version": 12, "tone": 4 }, { "label": "woman with white cane: dark skin tone", "hexcode": "1F469-1F3FF-200D-1F9AF", "emoji": "👩🏿‍🦯", "text": "", "type": 1, "order": 2203, "group": 1, "subgroup": 27, "version": 12, "tone": 5 } ] }, { "label": "woman with white cane: facing right", "hexcode": "1F469-200D-1F9AF-200D-27A1-FE0F", "tags": [ "accessibility", "blind", "cane", "facing", "probing", "right", "white", "woman" ], "emoji": "👩‍🦯‍➡️", "text": "", "type": 1, "order": 2204, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "woman with white cane: light skin tone, facing right", "hexcode": "1F469-1F3FB-200D-1F9AF-200D-27A1-FE0F", "emoji": "👩🏻‍🦯‍➡️", "text": "", "type": 1, "order": 2206, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "woman with white cane: medium-light skin tone, facing right", "hexcode": "1F469-1F3FC-200D-1F9AF-200D-27A1-FE0F", "emoji": "👩🏼‍🦯‍➡️", "text": "", "type": 1, "order": 2208, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "woman with white cane: medium skin tone, facing right", "hexcode": "1F469-1F3FD-200D-1F9AF-200D-27A1-FE0F", "emoji": "👩🏽‍🦯‍➡️", "text": "", "type": 1, "order": 2210, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "woman with white cane: medium-dark skin tone, facing right", "hexcode": "1F469-1F3FE-200D-1F9AF-200D-27A1-FE0F", "emoji": "👩🏾‍🦯‍➡️", "text": "", "type": 1, "order": 2212, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "woman with white cane: dark skin tone, facing right", "hexcode": "1F469-1F3FF-200D-1F9AF-200D-27A1-FE0F", "emoji": "👩🏿‍🦯‍➡️", "text": "", "type": 1, "order": 2214, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "person in motorized wheelchair", "hexcode": "1F9D1-200D-1F9BC", "tags": [ "accessibility", "motorized", "person", "wheelchair" ], "emoji": "🧑‍🦼", "text": "", "type": 1, "order": 2216, "group": 1, "subgroup": 27, "version": 12.1, "skins": [ { "label": "person in motorized wheelchair: light skin tone", "hexcode": "1F9D1-1F3FB-200D-1F9BC", "emoji": "🧑🏻‍🦼", "text": "", "type": 1, "order": 2217, "group": 1, "subgroup": 27, "version": 12.1, "tone": 1 }, { "label": "person in motorized wheelchair: medium-light skin tone", "hexcode": "1F9D1-1F3FC-200D-1F9BC", "emoji": "🧑🏼‍🦼", "text": "", "type": 1, "order": 2218, "group": 1, "subgroup": 27, "version": 12.1, "tone": 2 }, { "label": "person in motorized wheelchair: medium skin tone", "hexcode": "1F9D1-1F3FD-200D-1F9BC", "emoji": "🧑🏽‍🦼", "text": "", "type": 1, "order": 2219, "group": 1, "subgroup": 27, "version": 12.1, "tone": 3 }, { "label": "person in motorized wheelchair: medium-dark skin tone", "hexcode": "1F9D1-1F3FE-200D-1F9BC", "emoji": "🧑🏾‍🦼", "text": "", "type": 1, "order": 2220, "group": 1, "subgroup": 27, "version": 12.1, "tone": 4 }, { "label": "person in motorized wheelchair: dark skin tone", "hexcode": "1F9D1-1F3FF-200D-1F9BC", "emoji": "🧑🏿‍🦼", "text": "", "type": 1, "order": 2221, "group": 1, "subgroup": 27, "version": 12.1, "tone": 5 } ] }, { "label": "person in motorized wheelchair: facing right", "hexcode": "1F9D1-200D-1F9BC-200D-27A1-FE0F", "tags": [ "accessibility", "facing", "motorized", "person", "right", "wheelchair" ], "emoji": "🧑‍🦼‍➡️", "text": "", "type": 1, "order": 2222, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "person in motorized wheelchair: light skin tone, facing right", "hexcode": "1F9D1-1F3FB-200D-1F9BC-200D-27A1-FE0F", "emoji": "🧑🏻‍🦼‍➡️", "text": "", "type": 1, "order": 2224, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "person in motorized wheelchair: medium-light skin tone, facing right", "hexcode": "1F9D1-1F3FC-200D-1F9BC-200D-27A1-FE0F", "emoji": "🧑🏼‍🦼‍➡️", "text": "", "type": 1, "order": 2226, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "person in motorized wheelchair: medium skin tone, facing right", "hexcode": "1F9D1-1F3FD-200D-1F9BC-200D-27A1-FE0F", "emoji": "🧑🏽‍🦼‍➡️", "text": "", "type": 1, "order": 2228, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "person in motorized wheelchair: medium-dark skin tone, facing right", "hexcode": "1F9D1-1F3FE-200D-1F9BC-200D-27A1-FE0F", "emoji": "🧑🏾‍🦼‍➡️", "text": "", "type": 1, "order": 2230, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "person in motorized wheelchair: dark skin tone, facing right", "hexcode": "1F9D1-1F3FF-200D-1F9BC-200D-27A1-FE0F", "emoji": "🧑🏿‍🦼‍➡️", "text": "", "type": 1, "order": 2232, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "man in motorized wheelchair", "hexcode": "1F468-200D-1F9BC", "tags": [ "accessibility", "man", "motorized", "wheelchair" ], "emoji": "👨‍🦼", "text": "", "type": 1, "order": 2234, "group": 1, "subgroup": 27, "version": 12, "skins": [ { "label": "man in motorized wheelchair: light skin tone", "hexcode": "1F468-1F3FB-200D-1F9BC", "emoji": "👨🏻‍🦼", "text": "", "type": 1, "order": 2235, "group": 1, "subgroup": 27, "version": 12, "tone": 1 }, { "label": "man in motorized wheelchair: medium-light skin tone", "hexcode": "1F468-1F3FC-200D-1F9BC", "emoji": "👨🏼‍🦼", "text": "", "type": 1, "order": 2236, "group": 1, "subgroup": 27, "version": 12, "tone": 2 }, { "label": "man in motorized wheelchair: medium skin tone", "hexcode": "1F468-1F3FD-200D-1F9BC", "emoji": "👨🏽‍🦼", "text": "", "type": 1, "order": 2237, "group": 1, "subgroup": 27, "version": 12, "tone": 3 }, { "label": "man in motorized wheelchair: medium-dark skin tone", "hexcode": "1F468-1F3FE-200D-1F9BC", "emoji": "👨🏾‍🦼", "text": "", "type": 1, "order": 2238, "group": 1, "subgroup": 27, "version": 12, "tone": 4 }, { "label": "man in motorized wheelchair: dark skin tone", "hexcode": "1F468-1F3FF-200D-1F9BC", "emoji": "👨🏿‍🦼", "text": "", "type": 1, "order": 2239, "group": 1, "subgroup": 27, "version": 12, "tone": 5 } ] }, { "label": "man in motorized wheelchair: facing right", "hexcode": "1F468-200D-1F9BC-200D-27A1-FE0F", "tags": [ "accessibility", "facing", "man", "motorized", "right", "wheelchair" ], "emoji": "👨‍🦼‍➡️", "text": "", "type": 1, "order": 2240, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "man in motorized wheelchair: light skin tone, facing right", "hexcode": "1F468-1F3FB-200D-1F9BC-200D-27A1-FE0F", "emoji": "👨🏻‍🦼‍➡️", "text": "", "type": 1, "order": 2242, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "man in motorized wheelchair: medium-light skin tone, facing right", "hexcode": "1F468-1F3FC-200D-1F9BC-200D-27A1-FE0F", "emoji": "👨🏼‍🦼‍➡️", "text": "", "type": 1, "order": 2244, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "man in motorized wheelchair: medium skin tone, facing right", "hexcode": "1F468-1F3FD-200D-1F9BC-200D-27A1-FE0F", "emoji": "👨🏽‍🦼‍➡️", "text": "", "type": 1, "order": 2246, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "man in motorized wheelchair: medium-dark skin tone, facing right", "hexcode": "1F468-1F3FE-200D-1F9BC-200D-27A1-FE0F", "emoji": "👨🏾‍🦼‍➡️", "text": "", "type": 1, "order": 2248, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "man in motorized wheelchair: dark skin tone, facing right", "hexcode": "1F468-1F3FF-200D-1F9BC-200D-27A1-FE0F", "emoji": "👨🏿‍🦼‍➡️", "text": "", "type": 1, "order": 2250, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "woman in motorized wheelchair", "hexcode": "1F469-200D-1F9BC", "tags": [ "accessibility", "motorized", "wheelchair", "woman" ], "emoji": "👩‍🦼", "text": "", "type": 1, "order": 2252, "group": 1, "subgroup": 27, "version": 12, "skins": [ { "label": "woman in motorized wheelchair: light skin tone", "hexcode": "1F469-1F3FB-200D-1F9BC", "emoji": "👩🏻‍🦼", "text": "", "type": 1, "order": 2253, "group": 1, "subgroup": 27, "version": 12, "tone": 1 }, { "label": "woman in motorized wheelchair: medium-light skin tone", "hexcode": "1F469-1F3FC-200D-1F9BC", "emoji": "👩🏼‍🦼", "text": "", "type": 1, "order": 2254, "group": 1, "subgroup": 27, "version": 12, "tone": 2 }, { "label": "woman in motorized wheelchair: medium skin tone", "hexcode": "1F469-1F3FD-200D-1F9BC", "emoji": "👩🏽‍🦼", "text": "", "type": 1, "order": 2255, "group": 1, "subgroup": 27, "version": 12, "tone": 3 }, { "label": "woman in motorized wheelchair: medium-dark skin tone", "hexcode": "1F469-1F3FE-200D-1F9BC", "emoji": "👩🏾‍🦼", "text": "", "type": 1, "order": 2256, "group": 1, "subgroup": 27, "version": 12, "tone": 4 }, { "label": "woman in motorized wheelchair: dark skin tone", "hexcode": "1F469-1F3FF-200D-1F9BC", "emoji": "👩🏿‍🦼", "text": "", "type": 1, "order": 2257, "group": 1, "subgroup": 27, "version": 12, "tone": 5 } ] }, { "label": "woman in motorized wheelchair: facing right", "hexcode": "1F469-200D-1F9BC-200D-27A1-FE0F", "tags": [ "accessibility", "facing", "motorized", "right", "wheelchair", "woman" ], "emoji": "👩‍🦼‍➡️", "text": "", "type": 1, "order": 2258, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "woman in motorized wheelchair: light skin tone, facing right", "hexcode": "1F469-1F3FB-200D-1F9BC-200D-27A1-FE0F", "emoji": "👩🏻‍🦼‍➡️", "text": "", "type": 1, "order": 2260, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "woman in motorized wheelchair: medium-light skin tone, facing right", "hexcode": "1F469-1F3FC-200D-1F9BC-200D-27A1-FE0F", "emoji": "👩🏼‍🦼‍➡️", "text": "", "type": 1, "order": 2262, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "woman in motorized wheelchair: medium skin tone, facing right", "hexcode": "1F469-1F3FD-200D-1F9BC-200D-27A1-FE0F", "emoji": "👩🏽‍🦼‍➡️", "text": "", "type": 1, "order": 2264, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "woman in motorized wheelchair: medium-dark skin tone, facing right", "hexcode": "1F469-1F3FE-200D-1F9BC-200D-27A1-FE0F", "emoji": "👩🏾‍🦼‍➡️", "text": "", "type": 1, "order": 2266, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "woman in motorized wheelchair: dark skin tone, facing right", "hexcode": "1F469-1F3FF-200D-1F9BC-200D-27A1-FE0F", "emoji": "👩🏿‍🦼‍➡️", "text": "", "type": 1, "order": 2268, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "person in manual wheelchair", "hexcode": "1F9D1-200D-1F9BD", "tags": [ "accessibility", "manual", "person", "wheelchair" ], "emoji": "🧑‍🦽", "text": "", "type": 1, "order": 2270, "group": 1, "subgroup": 27, "version": 12.1, "skins": [ { "label": "person in manual wheelchair: light skin tone", "hexcode": "1F9D1-1F3FB-200D-1F9BD", "emoji": "🧑🏻‍🦽", "text": "", "type": 1, "order": 2271, "group": 1, "subgroup": 27, "version": 12.1, "tone": 1 }, { "label": "person in manual wheelchair: medium-light skin tone", "hexcode": "1F9D1-1F3FC-200D-1F9BD", "emoji": "🧑🏼‍🦽", "text": "", "type": 1, "order": 2272, "group": 1, "subgroup": 27, "version": 12.1, "tone": 2 }, { "label": "person in manual wheelchair: medium skin tone", "hexcode": "1F9D1-1F3FD-200D-1F9BD", "emoji": "🧑🏽‍🦽", "text": "", "type": 1, "order": 2273, "group": 1, "subgroup": 27, "version": 12.1, "tone": 3 }, { "label": "person in manual wheelchair: medium-dark skin tone", "hexcode": "1F9D1-1F3FE-200D-1F9BD", "emoji": "🧑🏾‍🦽", "text": "", "type": 1, "order": 2274, "group": 1, "subgroup": 27, "version": 12.1, "tone": 4 }, { "label": "person in manual wheelchair: dark skin tone", "hexcode": "1F9D1-1F3FF-200D-1F9BD", "emoji": "🧑🏿‍🦽", "text": "", "type": 1, "order": 2275, "group": 1, "subgroup": 27, "version": 12.1, "tone": 5 } ] }, { "label": "person in manual wheelchair: facing right", "hexcode": "1F9D1-200D-1F9BD-200D-27A1-FE0F", "tags": [ "accessibility", "facing", "manual", "person", "right", "wheelchair" ], "emoji": "🧑‍🦽‍➡️", "text": "", "type": 1, "order": 2276, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "person in manual wheelchair: light skin tone, facing right", "hexcode": "1F9D1-1F3FB-200D-1F9BD-200D-27A1-FE0F", "emoji": "🧑🏻‍🦽‍➡️", "text": "", "type": 1, "order": 2278, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "person in manual wheelchair: medium-light skin tone, facing right", "hexcode": "1F9D1-1F3FC-200D-1F9BD-200D-27A1-FE0F", "emoji": "🧑🏼‍🦽‍➡️", "text": "", "type": 1, "order": 2280, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "person in manual wheelchair: medium skin tone, facing right", "hexcode": "1F9D1-1F3FD-200D-1F9BD-200D-27A1-FE0F", "emoji": "🧑🏽‍🦽‍➡️", "text": "", "type": 1, "order": 2282, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "person in manual wheelchair: medium-dark skin tone, facing right", "hexcode": "1F9D1-1F3FE-200D-1F9BD-200D-27A1-FE0F", "emoji": "🧑🏾‍🦽‍➡️", "text": "", "type": 1, "order": 2284, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "person in manual wheelchair: dark skin tone, facing right", "hexcode": "1F9D1-1F3FF-200D-1F9BD-200D-27A1-FE0F", "emoji": "🧑🏿‍🦽‍➡️", "text": "", "type": 1, "order": 2286, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "man in manual wheelchair", "hexcode": "1F468-200D-1F9BD", "tags": [ "accessibility", "man", "manual", "wheelchair" ], "emoji": "👨‍🦽", "text": "", "type": 1, "order": 2288, "group": 1, "subgroup": 27, "version": 12, "skins": [ { "label": "man in manual wheelchair: light skin tone", "hexcode": "1F468-1F3FB-200D-1F9BD", "emoji": "👨🏻‍🦽", "text": "", "type": 1, "order": 2289, "group": 1, "subgroup": 27, "version": 12, "tone": 1 }, { "label": "man in manual wheelchair: medium-light skin tone", "hexcode": "1F468-1F3FC-200D-1F9BD", "emoji": "👨🏼‍🦽", "text": "", "type": 1, "order": 2290, "group": 1, "subgroup": 27, "version": 12, "tone": 2 }, { "label": "man in manual wheelchair: medium skin tone", "hexcode": "1F468-1F3FD-200D-1F9BD", "emoji": "👨🏽‍🦽", "text": "", "type": 1, "order": 2291, "group": 1, "subgroup": 27, "version": 12, "tone": 3 }, { "label": "man in manual wheelchair: medium-dark skin tone", "hexcode": "1F468-1F3FE-200D-1F9BD", "emoji": "👨🏾‍🦽", "text": "", "type": 1, "order": 2292, "group": 1, "subgroup": 27, "version": 12, "tone": 4 }, { "label": "man in manual wheelchair: dark skin tone", "hexcode": "1F468-1F3FF-200D-1F9BD", "emoji": "👨🏿‍🦽", "text": "", "type": 1, "order": 2293, "group": 1, "subgroup": 27, "version": 12, "tone": 5 } ] }, { "label": "man in manual wheelchair: facing right", "hexcode": "1F468-200D-1F9BD-200D-27A1-FE0F", "tags": [ "accessibility", "facing", "man", "manual", "right", "wheelchair" ], "emoji": "👨‍🦽‍➡️", "text": "", "type": 1, "order": 2294, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "man in manual wheelchair: light skin tone, facing right", "hexcode": "1F468-1F3FB-200D-1F9BD-200D-27A1-FE0F", "emoji": "👨🏻‍🦽‍➡️", "text": "", "type": 1, "order": 2296, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "man in manual wheelchair: medium-light skin tone, facing right", "hexcode": "1F468-1F3FC-200D-1F9BD-200D-27A1-FE0F", "emoji": "👨🏼‍🦽‍➡️", "text": "", "type": 1, "order": 2298, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "man in manual wheelchair: medium skin tone, facing right", "hexcode": "1F468-1F3FD-200D-1F9BD-200D-27A1-FE0F", "emoji": "👨🏽‍🦽‍➡️", "text": "", "type": 1, "order": 2300, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "man in manual wheelchair: medium-dark skin tone, facing right", "hexcode": "1F468-1F3FE-200D-1F9BD-200D-27A1-FE0F", "emoji": "👨🏾‍🦽‍➡️", "text": "", "type": 1, "order": 2302, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "man in manual wheelchair: dark skin tone, facing right", "hexcode": "1F468-1F3FF-200D-1F9BD-200D-27A1-FE0F", "emoji": "👨🏿‍🦽‍➡️", "text": "", "type": 1, "order": 2304, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "woman in manual wheelchair", "hexcode": "1F469-200D-1F9BD", "tags": [ "accessibility", "manual", "wheelchair", "woman" ], "emoji": "👩‍🦽", "text": "", "type": 1, "order": 2306, "group": 1, "subgroup": 27, "version": 12, "skins": [ { "label": "woman in manual wheelchair: light skin tone", "hexcode": "1F469-1F3FB-200D-1F9BD", "emoji": "👩🏻‍🦽", "text": "", "type": 1, "order": 2307, "group": 1, "subgroup": 27, "version": 12, "tone": 1 }, { "label": "woman in manual wheelchair: medium-light skin tone", "hexcode": "1F469-1F3FC-200D-1F9BD", "emoji": "👩🏼‍🦽", "text": "", "type": 1, "order": 2308, "group": 1, "subgroup": 27, "version": 12, "tone": 2 }, { "label": "woman in manual wheelchair: medium skin tone", "hexcode": "1F469-1F3FD-200D-1F9BD", "emoji": "👩🏽‍🦽", "text": "", "type": 1, "order": 2309, "group": 1, "subgroup": 27, "version": 12, "tone": 3 }, { "label": "woman in manual wheelchair: medium-dark skin tone", "hexcode": "1F469-1F3FE-200D-1F9BD", "emoji": "👩🏾‍🦽", "text": "", "type": 1, "order": 2310, "group": 1, "subgroup": 27, "version": 12, "tone": 4 }, { "label": "woman in manual wheelchair: dark skin tone", "hexcode": "1F469-1F3FF-200D-1F9BD", "emoji": "👩🏿‍🦽", "text": "", "type": 1, "order": 2311, "group": 1, "subgroup": 27, "version": 12, "tone": 5 } ] }, { "label": "woman in manual wheelchair: facing right", "hexcode": "1F469-200D-1F9BD-200D-27A1-FE0F", "tags": [ "accessibility", "facing", "manual", "right", "wheelchair", "woman" ], "emoji": "👩‍🦽‍➡️", "text": "", "type": 1, "order": 2312, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "woman in manual wheelchair: light skin tone, facing right", "hexcode": "1F469-1F3FB-200D-1F9BD-200D-27A1-FE0F", "emoji": "👩🏻‍🦽‍➡️", "text": "", "type": 1, "order": 2314, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "woman in manual wheelchair: medium-light skin tone, facing right", "hexcode": "1F469-1F3FC-200D-1F9BD-200D-27A1-FE0F", "emoji": "👩🏼‍🦽‍➡️", "text": "", "type": 1, "order": 2316, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "woman in manual wheelchair: medium skin tone, facing right", "hexcode": "1F469-1F3FD-200D-1F9BD-200D-27A1-FE0F", "emoji": "👩🏽‍🦽‍➡️", "text": "", "type": 1, "order": 2318, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "woman in manual wheelchair: medium-dark skin tone, facing right", "hexcode": "1F469-1F3FE-200D-1F9BD-200D-27A1-FE0F", "emoji": "👩🏾‍🦽‍➡️", "text": "", "type": 1, "order": 2320, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "woman in manual wheelchair: dark skin tone, facing right", "hexcode": "1F469-1F3FF-200D-1F9BD-200D-27A1-FE0F", "emoji": "👩🏿‍🦽‍➡️", "text": "", "type": 1, "order": 2322, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "person running", "hexcode": "1F3C3", "tags": [ "fast", "hurry", "marathon", "move", "person", "quick", "race", "racing", "run", "rush", "speed" ], "emoji": "🏃", "text": "", "type": 1, "order": 2324, "group": 1, "subgroup": 27, "version": 0.6, "skins": [ { "label": "person running: light skin tone", "hexcode": "1F3C3-1F3FB", "emoji": "🏃🏻", "text": "", "type": 1, "order": 2325, "group": 1, "subgroup": 27, "version": 1, "tone": 1 }, { "label": "person running: medium-light skin tone", "hexcode": "1F3C3-1F3FC", "emoji": "🏃🏼", "text": "", "type": 1, "order": 2326, "group": 1, "subgroup": 27, "version": 1, "tone": 2 }, { "label": "person running: medium skin tone", "hexcode": "1F3C3-1F3FD", "emoji": "🏃🏽", "text": "", "type": 1, "order": 2327, "group": 1, "subgroup": 27, "version": 1, "tone": 3 }, { "label": "person running: medium-dark skin tone", "hexcode": "1F3C3-1F3FE", "emoji": "🏃🏾", "text": "", "type": 1, "order": 2328, "group": 1, "subgroup": 27, "version": 1, "tone": 4 }, { "label": "person running: dark skin tone", "hexcode": "1F3C3-1F3FF", "emoji": "🏃🏿", "text": "", "type": 1, "order": 2329, "group": 1, "subgroup": 27, "version": 1, "tone": 5 } ] }, { "label": "man running", "hexcode": "1F3C3-200D-2642-FE0F", "tags": [ "fast", "hurry", "man", "marathon", "move", "quick", "race", "racing", "run", "rush", "speed" ], "emoji": "🏃‍♂️", "text": "", "type": 1, "order": 2330, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "skins": [ { "label": "man running: light skin tone", "hexcode": "1F3C3-1F3FB-200D-2642-FE0F", "emoji": "🏃🏻‍♂️", "text": "", "type": 1, "order": 2332, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 1 }, { "label": "man running: medium-light skin tone", "hexcode": "1F3C3-1F3FC-200D-2642-FE0F", "emoji": "🏃🏼‍♂️", "text": "", "type": 1, "order": 2334, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 2 }, { "label": "man running: medium skin tone", "hexcode": "1F3C3-1F3FD-200D-2642-FE0F", "emoji": "🏃🏽‍♂️", "text": "", "type": 1, "order": 2336, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 3 }, { "label": "man running: medium-dark skin tone", "hexcode": "1F3C3-1F3FE-200D-2642-FE0F", "emoji": "🏃🏾‍♂️", "text": "", "type": 1, "order": 2338, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 4 }, { "label": "man running: dark skin tone", "hexcode": "1F3C3-1F3FF-200D-2642-FE0F", "emoji": "🏃🏿‍♂️", "text": "", "type": 1, "order": 2340, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman running", "hexcode": "1F3C3-200D-2640-FE0F", "tags": [ "fast", "hurry", "marathon", "move", "quick", "race", "racing", "run", "rush", "speed", "woman" ], "emoji": "🏃‍♀️", "text": "", "type": 1, "order": 2342, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "skins": [ { "label": "woman running: light skin tone", "hexcode": "1F3C3-1F3FB-200D-2640-FE0F", "emoji": "🏃🏻‍♀️", "text": "", "type": 1, "order": 2344, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman running: medium-light skin tone", "hexcode": "1F3C3-1F3FC-200D-2640-FE0F", "emoji": "🏃🏼‍♀️", "text": "", "type": 1, "order": 2346, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman running: medium skin tone", "hexcode": "1F3C3-1F3FD-200D-2640-FE0F", "emoji": "🏃🏽‍♀️", "text": "", "type": 1, "order": 2348, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman running: medium-dark skin tone", "hexcode": "1F3C3-1F3FE-200D-2640-FE0F", "emoji": "🏃🏾‍♀️", "text": "", "type": 1, "order": 2350, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman running: dark skin tone", "hexcode": "1F3C3-1F3FF-200D-2640-FE0F", "emoji": "🏃🏿‍♀️", "text": "", "type": 1, "order": 2352, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person running: facing right", "hexcode": "1F3C3-200D-27A1-FE0F", "tags": [ "facing", "fast", "hurry", "marathon", "move", "person", "quick", "race", "racing", "right", "run", "rush", "speed" ], "emoji": "🏃‍➡️", "text": "", "type": 1, "order": 2354, "group": 1, "subgroup": 27, "version": 15.1, "skins": [ { "label": "person running: light skin tone, facing right", "hexcode": "1F3C3-1F3FB-200D-27A1-FE0F", "emoji": "🏃🏻‍➡️", "text": "", "type": 1, "order": 2356, "group": 1, "subgroup": 27, "version": 15.1, "tone": 1 }, { "label": "person running: medium-light skin tone, facing right", "hexcode": "1F3C3-1F3FC-200D-27A1-FE0F", "emoji": "🏃🏼‍➡️", "text": "", "type": 1, "order": 2358, "group": 1, "subgroup": 27, "version": 15.1, "tone": 2 }, { "label": "person running: medium skin tone, facing right", "hexcode": "1F3C3-1F3FD-200D-27A1-FE0F", "emoji": "🏃🏽‍➡️", "text": "", "type": 1, "order": 2360, "group": 1, "subgroup": 27, "version": 15.1, "tone": 3 }, { "label": "person running: medium-dark skin tone, facing right", "hexcode": "1F3C3-1F3FE-200D-27A1-FE0F", "emoji": "🏃🏾‍➡️", "text": "", "type": 1, "order": 2362, "group": 1, "subgroup": 27, "version": 15.1, "tone": 4 }, { "label": "person running: dark skin tone, facing right", "hexcode": "1F3C3-1F3FF-200D-27A1-FE0F", "emoji": "🏃🏿‍➡️", "text": "", "type": 1, "order": 2364, "group": 1, "subgroup": 27, "version": 15.1, "tone": 5 } ] }, { "label": "woman running: facing right", "hexcode": "1F3C3-200D-2640-FE0F-200D-27A1-FE0F", "tags": [ "facing", "fast", "hurry", "marathon", "move", "quick", "race", "racing", "right", "run", "rush", "speed", "woman" ], "emoji": "🏃‍♀️‍➡️", "text": "", "type": 1, "order": 2366, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "skins": [ { "label": "woman running: light skin tone, facing right", "hexcode": "1F3C3-1F3FB-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🏃🏻‍♀️‍➡️", "text": "", "type": 1, "order": 2370, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 1 }, { "label": "woman running: medium-light skin tone, facing right", "hexcode": "1F3C3-1F3FC-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🏃🏼‍♀️‍➡️", "text": "", "type": 1, "order": 2374, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 2 }, { "label": "woman running: medium skin tone, facing right", "hexcode": "1F3C3-1F3FD-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🏃🏽‍♀️‍➡️", "text": "", "type": 1, "order": 2378, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 3 }, { "label": "woman running: medium-dark skin tone, facing right", "hexcode": "1F3C3-1F3FE-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🏃🏾‍♀️‍➡️", "text": "", "type": 1, "order": 2382, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 4 }, { "label": "woman running: dark skin tone, facing right", "hexcode": "1F3C3-1F3FF-200D-2640-FE0F-200D-27A1-FE0F", "emoji": "🏃🏿‍♀️‍➡️", "text": "", "type": 1, "order": 2386, "group": 1, "subgroup": 27, "version": 15.1, "gender": 0, "tone": 5 } ] }, { "label": "man running: facing right", "hexcode": "1F3C3-200D-2642-FE0F-200D-27A1-FE0F", "tags": [ "facing", "fast", "hurry", "man", "marathon", "move", "quick", "race", "racing", "right", "run", "rush", "speed" ], "emoji": "🏃‍♂️‍➡️", "text": "", "type": 1, "order": 2390, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "skins": [ { "label": "man running: light skin tone, facing right", "hexcode": "1F3C3-1F3FB-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🏃🏻‍♂️‍➡️", "text": "", "type": 1, "order": 2394, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 1 }, { "label": "man running: medium-light skin tone, facing right", "hexcode": "1F3C3-1F3FC-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🏃🏼‍♂️‍➡️", "text": "", "type": 1, "order": 2398, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 2 }, { "label": "man running: medium skin tone, facing right", "hexcode": "1F3C3-1F3FD-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🏃🏽‍♂️‍➡️", "text": "", "type": 1, "order": 2402, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 3 }, { "label": "man running: medium-dark skin tone, facing right", "hexcode": "1F3C3-1F3FE-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🏃🏾‍♂️‍➡️", "text": "", "type": 1, "order": 2406, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 4 }, { "label": "man running: dark skin tone, facing right", "hexcode": "1F3C3-1F3FF-200D-2642-FE0F-200D-27A1-FE0F", "emoji": "🏃🏿‍♂️‍➡️", "text": "", "type": 1, "order": 2410, "group": 1, "subgroup": 27, "version": 15.1, "gender": 1, "tone": 5 } ] }, { "label": "ballet dancer", "hexcode": "1F9D1-200D-1FA70", "tags": [ "ballet", "dancer" ], "emoji": "🧑‍🩰", "text": "", "type": 1, "order": 2414, "group": 1, "subgroup": 27, "version": 17, "skins": [ { "label": "ballet dancer: light skin tone", "hexcode": "1F9D1-1F3FB-200D-1FA70", "emoji": "🧑🏻‍🩰", "text": "", "type": 1, "order": 2415, "group": 1, "subgroup": 27, "version": 17, "tone": 1 }, { "label": "ballet dancer: medium-light skin tone", "hexcode": "1F9D1-1F3FC-200D-1FA70", "emoji": "🧑🏼‍🩰", "text": "", "type": 1, "order": 2416, "group": 1, "subgroup": 27, "version": 17, "tone": 2 }, { "label": "ballet dancer: medium skin tone", "hexcode": "1F9D1-1F3FD-200D-1FA70", "emoji": "🧑🏽‍🩰", "text": "", "type": 1, "order": 2417, "group": 1, "subgroup": 27, "version": 17, "tone": 3 }, { "label": "ballet dancer: medium-dark skin tone", "hexcode": "1F9D1-1F3FE-200D-1FA70", "emoji": "🧑🏾‍🩰", "text": "", "type": 1, "order": 2418, "group": 1, "subgroup": 27, "version": 17, "tone": 4 }, { "label": "ballet dancer: dark skin tone", "hexcode": "1F9D1-1F3FF-200D-1FA70", "emoji": "🧑🏿‍🩰", "text": "", "type": 1, "order": 2419, "group": 1, "subgroup": 27, "version": 17, "tone": 5 } ] }, { "label": "woman dancing", "hexcode": "1F483", "tags": [ "dance", "dancer", "dancing", "elegant", "festive", "flair", "flamenco", "groove", "let’s", "salsa", "tango", "woman" ], "emoji": "💃", "text": "", "type": 1, "order": 2420, "group": 1, "subgroup": 27, "version": 0.6, "skins": [ { "label": "woman dancing: light skin tone", "hexcode": "1F483-1F3FB", "emoji": "💃🏻", "text": "", "type": 1, "order": 2421, "group": 1, "subgroup": 27, "version": 1, "tone": 1 }, { "label": "woman dancing: medium-light skin tone", "hexcode": "1F483-1F3FC", "emoji": "💃🏼", "text": "", "type": 1, "order": 2422, "group": 1, "subgroup": 27, "version": 1, "tone": 2 }, { "label": "woman dancing: medium skin tone", "hexcode": "1F483-1F3FD", "emoji": "💃🏽", "text": "", "type": 1, "order": 2423, "group": 1, "subgroup": 27, "version": 1, "tone": 3 }, { "label": "woman dancing: medium-dark skin tone", "hexcode": "1F483-1F3FE", "emoji": "💃🏾", "text": "", "type": 1, "order": 2424, "group": 1, "subgroup": 27, "version": 1, "tone": 4 }, { "label": "woman dancing: dark skin tone", "hexcode": "1F483-1F3FF", "emoji": "💃🏿", "text": "", "type": 1, "order": 2425, "group": 1, "subgroup": 27, "version": 1, "tone": 5 } ] }, { "label": "man dancing", "hexcode": "1F57A", "tags": [ "dance", "dancer", "dancing", "elegant", "festive", "flair", "flamenco", "groove", "let’s", "man", "salsa", "tango" ], "emoji": "🕺", "text": "", "type": 1, "order": 2426, "group": 1, "subgroup": 27, "version": 3, "skins": [ { "label": "man dancing: light skin tone", "hexcode": "1F57A-1F3FB", "emoji": "🕺🏻", "text": "", "type": 1, "order": 2427, "group": 1, "subgroup": 27, "version": 3, "tone": 1 }, { "label": "man dancing: medium-light skin tone", "hexcode": "1F57A-1F3FC", "emoji": "🕺🏼", "text": "", "type": 1, "order": 2428, "group": 1, "subgroup": 27, "version": 3, "tone": 2 }, { "label": "man dancing: medium skin tone", "hexcode": "1F57A-1F3FD", "emoji": "🕺🏽", "text": "", "type": 1, "order": 2429, "group": 1, "subgroup": 27, "version": 3, "tone": 3 }, { "label": "man dancing: medium-dark skin tone", "hexcode": "1F57A-1F3FE", "emoji": "🕺🏾", "text": "", "type": 1, "order": 2430, "group": 1, "subgroup": 27, "version": 3, "tone": 4 }, { "label": "man dancing: dark skin tone", "hexcode": "1F57A-1F3FF", "emoji": "🕺🏿", "text": "", "type": 1, "order": 2431, "group": 1, "subgroup": 27, "version": 3, "tone": 5 } ] }, { "label": "person in suit levitating", "hexcode": "1F574", "tags": [ "business", "levitating", "person", "suit" ], "emoji": "🕴️", "text": "🕴︎", "type": 0, "order": 2433, "group": 1, "subgroup": 27, "version": 0.7, "skins": [ { "label": "person in suit levitating: light skin tone", "hexcode": "1F574-1F3FB", "emoji": "🕴🏻", "text": "", "type": 1, "order": 2434, "group": 1, "subgroup": 27, "version": 4, "tone": 1 }, { "label": "person in suit levitating: medium-light skin tone", "hexcode": "1F574-1F3FC", "emoji": "🕴🏼", "text": "", "type": 1, "order": 2435, "group": 1, "subgroup": 27, "version": 4, "tone": 2 }, { "label": "person in suit levitating: medium skin tone", "hexcode": "1F574-1F3FD", "emoji": "🕴🏽", "text": "", "type": 1, "order": 2436, "group": 1, "subgroup": 27, "version": 4, "tone": 3 }, { "label": "person in suit levitating: medium-dark skin tone", "hexcode": "1F574-1F3FE", "emoji": "🕴🏾", "text": "", "type": 1, "order": 2437, "group": 1, "subgroup": 27, "version": 4, "tone": 4 }, { "label": "person in suit levitating: dark skin tone", "hexcode": "1F574-1F3FF", "emoji": "🕴🏿", "text": "", "type": 1, "order": 2438, "group": 1, "subgroup": 27, "version": 4, "tone": 5 } ] }, { "label": "people with bunny ears", "hexcode": "1F46F", "tags": [ "bestie", "bff", "bunny", "counterpart", "dancer", "double", "ear", "identical", "pair", "party", "partying", "people", "soulmate", "twin", "twinsies" ], "emoji": "👯", "text": "", "type": 1, "order": 2439, "group": 1, "subgroup": 27, "version": 0.6, "skins": [ { "label": "people with bunny ears: light skin tone", "hexcode": "1F46F-1F3FB", "emoji": "👯🏻", "text": "", "type": 1, "order": 2440, "group": 1, "subgroup": 27, "version": 17, "tone": 1 }, { "label": "people with bunny ears: medium-light skin tone", "hexcode": "1F46F-1F3FC", "emoji": "👯🏼", "text": "", "type": 1, "order": 2441, "group": 1, "subgroup": 27, "version": 17, "tone": 2 }, { "label": "people with bunny ears: medium skin tone", "hexcode": "1F46F-1F3FD", "emoji": "👯🏽", "text": "", "type": 1, "order": 2442, "group": 1, "subgroup": 27, "version": 17, "tone": 3 }, { "label": "people with bunny ears: medium-dark skin tone", "hexcode": "1F46F-1F3FE", "emoji": "👯🏾", "text": "", "type": 1, "order": 2443, "group": 1, "subgroup": 27, "version": 17, "tone": 4 }, { "label": "people with bunny ears: dark skin tone", "hexcode": "1F46F-1F3FF", "emoji": "👯🏿", "text": "", "type": 1, "order": 2444, "group": 1, "subgroup": 27, "version": 17, "tone": 5 }, { "label": "people with bunny ears: light skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FB-200D-1F430-200D-1F9D1-1F3FC", "emoji": "🧑🏻‍🐰‍🧑🏼", "text": "", "type": 1, "order": 2469, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 2 ] }, { "label": "people with bunny ears: light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FB-200D-1F430-200D-1F9D1-1F3FD", "emoji": "🧑🏻‍🐰‍🧑🏽", "text": "", "type": 1, "order": 2470, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 3 ] }, { "label": "people with bunny ears: light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FB-200D-1F430-200D-1F9D1-1F3FE", "emoji": "🧑🏻‍🐰‍🧑🏾", "text": "", "type": 1, "order": 2471, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 4 ] }, { "label": "people with bunny ears: light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FB-200D-1F430-200D-1F9D1-1F3FF", "emoji": "🧑🏻‍🐰‍🧑🏿", "text": "", "type": 1, "order": 2472, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 5 ] }, { "label": "people with bunny ears: medium-light skin tone, light skin tone", "hexcode": "1F9D1-1F3FC-200D-1F430-200D-1F9D1-1F3FB", "emoji": "🧑🏼‍🐰‍🧑🏻", "text": "", "type": 1, "order": 2473, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 1 ] }, { "label": "people with bunny ears: medium-light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FC-200D-1F430-200D-1F9D1-1F3FD", "emoji": "🧑🏼‍🐰‍🧑🏽", "text": "", "type": 1, "order": 2474, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 3 ] }, { "label": "people with bunny ears: medium-light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FC-200D-1F430-200D-1F9D1-1F3FE", "emoji": "🧑🏼‍🐰‍🧑🏾", "text": "", "type": 1, "order": 2475, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 4 ] }, { "label": "people with bunny ears: medium-light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FC-200D-1F430-200D-1F9D1-1F3FF", "emoji": "🧑🏼‍🐰‍🧑🏿", "text": "", "type": 1, "order": 2476, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 5 ] }, { "label": "people with bunny ears: medium skin tone, light skin tone", "hexcode": "1F9D1-1F3FD-200D-1F430-200D-1F9D1-1F3FB", "emoji": "🧑🏽‍🐰‍🧑🏻", "text": "", "type": 1, "order": 2477, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 1 ] }, { "label": "people with bunny ears: medium skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FD-200D-1F430-200D-1F9D1-1F3FC", "emoji": "🧑🏽‍🐰‍🧑🏼", "text": "", "type": 1, "order": 2478, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 2 ] }, { "label": "people with bunny ears: medium skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FD-200D-1F430-200D-1F9D1-1F3FE", "emoji": "🧑🏽‍🐰‍🧑🏾", "text": "", "type": 1, "order": 2479, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 4 ] }, { "label": "people with bunny ears: medium skin tone, dark skin tone", "hexcode": "1F9D1-1F3FD-200D-1F430-200D-1F9D1-1F3FF", "emoji": "🧑🏽‍🐰‍🧑🏿", "text": "", "type": 1, "order": 2480, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 5 ] }, { "label": "people with bunny ears: medium-dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FE-200D-1F430-200D-1F9D1-1F3FB", "emoji": "🧑🏾‍🐰‍🧑🏻", "text": "", "type": 1, "order": 2481, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 1 ] }, { "label": "people with bunny ears: medium-dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FE-200D-1F430-200D-1F9D1-1F3FC", "emoji": "🧑🏾‍🐰‍🧑🏼", "text": "", "type": 1, "order": 2482, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 2 ] }, { "label": "people with bunny ears: medium-dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FE-200D-1F430-200D-1F9D1-1F3FD", "emoji": "🧑🏾‍🐰‍🧑🏽", "text": "", "type": 1, "order": 2483, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 3 ] }, { "label": "people with bunny ears: medium-dark skin tone, dark skin tone", "hexcode": "1F9D1-1F3FE-200D-1F430-200D-1F9D1-1F3FF", "emoji": "🧑🏾‍🐰‍🧑🏿", "text": "", "type": 1, "order": 2484, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 5 ] }, { "label": "people with bunny ears: dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FF-200D-1F430-200D-1F9D1-1F3FB", "emoji": "🧑🏿‍🐰‍🧑🏻", "text": "", "type": 1, "order": 2485, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 1 ] }, { "label": "people with bunny ears: dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FF-200D-1F430-200D-1F9D1-1F3FC", "emoji": "🧑🏿‍🐰‍🧑🏼", "text": "", "type": 1, "order": 2486, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 2 ] }, { "label": "people with bunny ears: dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FF-200D-1F430-200D-1F9D1-1F3FD", "emoji": "🧑🏿‍🐰‍🧑🏽", "text": "", "type": 1, "order": 2487, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 3 ] }, { "label": "people with bunny ears: dark skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FF-200D-1F430-200D-1F9D1-1F3FE", "emoji": "🧑🏿‍🐰‍🧑🏾", "text": "", "type": 1, "order": 2488, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 4 ] } ] }, { "label": "men with bunny ears", "hexcode": "1F46F-200D-2642-FE0F", "tags": [ "bestie", "bff", "bunny", "counterpart", "dancer", "double", "ear", "identical", "men", "pair", "party", "partying", "people", "soulmate", "twin", "twinsies" ], "emoji": "👯‍♂️", "text": "", "type": 1, "order": 2445, "group": 1, "subgroup": 27, "version": 4, "gender": 1, "skins": [ { "label": "men with bunny ears: light skin tone, medium-light skin tone", "hexcode": "1F468-1F3FB-200D-1F430-200D-1F468-1F3FC", "emoji": "👨🏻‍🐰‍👨🏼", "text": "", "type": 1, "order": 2489, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 2 ] }, { "label": "men with bunny ears: light skin tone, medium skin tone", "hexcode": "1F468-1F3FB-200D-1F430-200D-1F468-1F3FD", "emoji": "👨🏻‍🐰‍👨🏽", "text": "", "type": 1, "order": 2490, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 3 ] }, { "label": "men with bunny ears: light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FB-200D-1F430-200D-1F468-1F3FE", "emoji": "👨🏻‍🐰‍👨🏾", "text": "", "type": 1, "order": 2491, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 4 ] }, { "label": "men with bunny ears: light skin tone, dark skin tone", "hexcode": "1F468-1F3FB-200D-1F430-200D-1F468-1F3FF", "emoji": "👨🏻‍🐰‍👨🏿", "text": "", "type": 1, "order": 2492, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 5 ] }, { "label": "men with bunny ears: medium-light skin tone, light skin tone", "hexcode": "1F468-1F3FC-200D-1F430-200D-1F468-1F3FB", "emoji": "👨🏼‍🐰‍👨🏻", "text": "", "type": 1, "order": 2493, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 1 ] }, { "label": "men with bunny ears: medium-light skin tone, medium skin tone", "hexcode": "1F468-1F3FC-200D-1F430-200D-1F468-1F3FD", "emoji": "👨🏼‍🐰‍👨🏽", "text": "", "type": 1, "order": 2494, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 3 ] }, { "label": "men with bunny ears: medium-light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FC-200D-1F430-200D-1F468-1F3FE", "emoji": "👨🏼‍🐰‍👨🏾", "text": "", "type": 1, "order": 2495, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 4 ] }, { "label": "men with bunny ears: medium-light skin tone, dark skin tone", "hexcode": "1F468-1F3FC-200D-1F430-200D-1F468-1F3FF", "emoji": "👨🏼‍🐰‍👨🏿", "text": "", "type": 1, "order": 2496, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 5 ] }, { "label": "men with bunny ears: medium skin tone, light skin tone", "hexcode": "1F468-1F3FD-200D-1F430-200D-1F468-1F3FB", "emoji": "👨🏽‍🐰‍👨🏻", "text": "", "type": 1, "order": 2497, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 1 ] }, { "label": "men with bunny ears: medium skin tone, medium-light skin tone", "hexcode": "1F468-1F3FD-200D-1F430-200D-1F468-1F3FC", "emoji": "👨🏽‍🐰‍👨🏼", "text": "", "type": 1, "order": 2498, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 2 ] }, { "label": "men with bunny ears: medium skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FD-200D-1F430-200D-1F468-1F3FE", "emoji": "👨🏽‍🐰‍👨🏾", "text": "", "type": 1, "order": 2499, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 4 ] }, { "label": "men with bunny ears: medium skin tone, dark skin tone", "hexcode": "1F468-1F3FD-200D-1F430-200D-1F468-1F3FF", "emoji": "👨🏽‍🐰‍👨🏿", "text": "", "type": 1, "order": 2500, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 5 ] }, { "label": "men with bunny ears: medium-dark skin tone, light skin tone", "hexcode": "1F468-1F3FE-200D-1F430-200D-1F468-1F3FB", "emoji": "👨🏾‍🐰‍👨🏻", "text": "", "type": 1, "order": 2501, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 1 ] }, { "label": "men with bunny ears: medium-dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FE-200D-1F430-200D-1F468-1F3FC", "emoji": "👨🏾‍🐰‍👨🏼", "text": "", "type": 1, "order": 2502, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 2 ] }, { "label": "men with bunny ears: medium-dark skin tone, medium skin tone", "hexcode": "1F468-1F3FE-200D-1F430-200D-1F468-1F3FD", "emoji": "👨🏾‍🐰‍👨🏽", "text": "", "type": 1, "order": 2503, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 3 ] }, { "label": "men with bunny ears: medium-dark skin tone, dark skin tone", "hexcode": "1F468-1F3FE-200D-1F430-200D-1F468-1F3FF", "emoji": "👨🏾‍🐰‍👨🏿", "text": "", "type": 1, "order": 2504, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 5 ] }, { "label": "men with bunny ears: dark skin tone, light skin tone", "hexcode": "1F468-1F3FF-200D-1F430-200D-1F468-1F3FB", "emoji": "👨🏿‍🐰‍👨🏻", "text": "", "type": 1, "order": 2505, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 1 ] }, { "label": "men with bunny ears: dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FF-200D-1F430-200D-1F468-1F3FC", "emoji": "👨🏿‍🐰‍👨🏼", "text": "", "type": 1, "order": 2506, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 2 ] }, { "label": "men with bunny ears: dark skin tone, medium skin tone", "hexcode": "1F468-1F3FF-200D-1F430-200D-1F468-1F3FD", "emoji": "👨🏿‍🐰‍👨🏽", "text": "", "type": 1, "order": 2507, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 3 ] }, { "label": "men with bunny ears: dark skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FF-200D-1F430-200D-1F468-1F3FE", "emoji": "👨🏿‍🐰‍👨🏾", "text": "", "type": 1, "order": 2508, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 4 ] }, { "label": "men with bunny ears: light skin tone", "hexcode": "1F46F-1F3FB-200D-2642-FE0F", "emoji": "👯🏻‍♂️", "text": "", "type": 1, "order": 2447, "group": 1, "subgroup": 27, "version": 17, "gender": 1, "tone": 1 }, { "label": "men with bunny ears: medium-light skin tone", "hexcode": "1F46F-1F3FC-200D-2642-FE0F", "emoji": "👯🏼‍♂️", "text": "", "type": 1, "order": 2449, "group": 1, "subgroup": 27, "version": 17, "gender": 1, "tone": 2 }, { "label": "men with bunny ears: medium skin tone", "hexcode": "1F46F-1F3FD-200D-2642-FE0F", "emoji": "👯🏽‍♂️", "text": "", "type": 1, "order": 2451, "group": 1, "subgroup": 27, "version": 17, "gender": 1, "tone": 3 }, { "label": "men with bunny ears: medium-dark skin tone", "hexcode": "1F46F-1F3FE-200D-2642-FE0F", "emoji": "👯🏾‍♂️", "text": "", "type": 1, "order": 2453, "group": 1, "subgroup": 27, "version": 17, "gender": 1, "tone": 4 }, { "label": "men with bunny ears: dark skin tone", "hexcode": "1F46F-1F3FF-200D-2642-FE0F", "emoji": "👯🏿‍♂️", "text": "", "type": 1, "order": 2455, "group": 1, "subgroup": 27, "version": 17, "gender": 1, "tone": 5 } ] }, { "label": "women with bunny ears", "hexcode": "1F46F-200D-2640-FE0F", "tags": [ "bestie", "bff", "bunny", "counterpart", "dancer", "double", "ear", "identical", "pair", "party", "partying", "people", "soulmate", "twin", "twinsies", "women" ], "emoji": "👯‍♀️", "text": "", "type": 1, "order": 2457, "group": 1, "subgroup": 27, "version": 4, "gender": 0, "skins": [ { "label": "women with bunny ears: light skin tone, medium-light skin tone", "hexcode": "1F469-1F3FB-200D-1F430-200D-1F469-1F3FC", "emoji": "👩🏻‍🐰‍👩🏼", "text": "", "type": 1, "order": 2509, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 2 ] }, { "label": "women with bunny ears: light skin tone, medium skin tone", "hexcode": "1F469-1F3FB-200D-1F430-200D-1F469-1F3FD", "emoji": "👩🏻‍🐰‍👩🏽", "text": "", "type": 1, "order": 2510, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 3 ] }, { "label": "women with bunny ears: light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FB-200D-1F430-200D-1F469-1F3FE", "emoji": "👩🏻‍🐰‍👩🏾", "text": "", "type": 1, "order": 2511, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 4 ] }, { "label": "women with bunny ears: light skin tone, dark skin tone", "hexcode": "1F469-1F3FB-200D-1F430-200D-1F469-1F3FF", "emoji": "👩🏻‍🐰‍👩🏿", "text": "", "type": 1, "order": 2512, "group": 1, "subgroup": 27, "version": 17, "tone": [ 1, 5 ] }, { "label": "women with bunny ears: medium-light skin tone, light skin tone", "hexcode": "1F469-1F3FC-200D-1F430-200D-1F469-1F3FB", "emoji": "👩🏼‍🐰‍👩🏻", "text": "", "type": 1, "order": 2513, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 1 ] }, { "label": "women with bunny ears: medium-light skin tone, medium skin tone", "hexcode": "1F469-1F3FC-200D-1F430-200D-1F469-1F3FD", "emoji": "👩🏼‍🐰‍👩🏽", "text": "", "type": 1, "order": 2514, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 3 ] }, { "label": "women with bunny ears: medium-light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FC-200D-1F430-200D-1F469-1F3FE", "emoji": "👩🏼‍🐰‍👩🏾", "text": "", "type": 1, "order": 2515, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 4 ] }, { "label": "women with bunny ears: medium-light skin tone, dark skin tone", "hexcode": "1F469-1F3FC-200D-1F430-200D-1F469-1F3FF", "emoji": "👩🏼‍🐰‍👩🏿", "text": "", "type": 1, "order": 2516, "group": 1, "subgroup": 27, "version": 17, "tone": [ 2, 5 ] }, { "label": "women with bunny ears: medium skin tone, light skin tone", "hexcode": "1F469-1F3FD-200D-1F430-200D-1F469-1F3FB", "emoji": "👩🏽‍🐰‍👩🏻", "text": "", "type": 1, "order": 2517, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 1 ] }, { "label": "women with bunny ears: medium skin tone, medium-light skin tone", "hexcode": "1F469-1F3FD-200D-1F430-200D-1F469-1F3FC", "emoji": "👩🏽‍🐰‍👩🏼", "text": "", "type": 1, "order": 2518, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 2 ] }, { "label": "women with bunny ears: medium skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FD-200D-1F430-200D-1F469-1F3FE", "emoji": "👩🏽‍🐰‍👩🏾", "text": "", "type": 1, "order": 2519, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 4 ] }, { "label": "women with bunny ears: medium skin tone, dark skin tone", "hexcode": "1F469-1F3FD-200D-1F430-200D-1F469-1F3FF", "emoji": "👩🏽‍🐰‍👩🏿", "text": "", "type": 1, "order": 2520, "group": 1, "subgroup": 27, "version": 17, "tone": [ 3, 5 ] }, { "label": "women with bunny ears: medium-dark skin tone, light skin tone", "hexcode": "1F469-1F3FE-200D-1F430-200D-1F469-1F3FB", "emoji": "👩🏾‍🐰‍👩🏻", "text": "", "type": 1, "order": 2521, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 1 ] }, { "label": "women with bunny ears: medium-dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FE-200D-1F430-200D-1F469-1F3FC", "emoji": "👩🏾‍🐰‍👩🏼", "text": "", "type": 1, "order": 2522, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 2 ] }, { "label": "women with bunny ears: medium-dark skin tone, medium skin tone", "hexcode": "1F469-1F3FE-200D-1F430-200D-1F469-1F3FD", "emoji": "👩🏾‍🐰‍👩🏽", "text": "", "type": 1, "order": 2523, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 3 ] }, { "label": "women with bunny ears: medium-dark skin tone, dark skin tone", "hexcode": "1F469-1F3FE-200D-1F430-200D-1F469-1F3FF", "emoji": "👩🏾‍🐰‍👩🏿", "text": "", "type": 1, "order": 2524, "group": 1, "subgroup": 27, "version": 17, "tone": [ 4, 5 ] }, { "label": "women with bunny ears: dark skin tone, light skin tone", "hexcode": "1F469-1F3FF-200D-1F430-200D-1F469-1F3FB", "emoji": "👩🏿‍🐰‍👩🏻", "text": "", "type": 1, "order": 2525, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 1 ] }, { "label": "women with bunny ears: dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FF-200D-1F430-200D-1F469-1F3FC", "emoji": "👩🏿‍🐰‍👩🏼", "text": "", "type": 1, "order": 2526, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 2 ] }, { "label": "women with bunny ears: dark skin tone, medium skin tone", "hexcode": "1F469-1F3FF-200D-1F430-200D-1F469-1F3FD", "emoji": "👩🏿‍🐰‍👩🏽", "text": "", "type": 1, "order": 2527, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 3 ] }, { "label": "women with bunny ears: dark skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FF-200D-1F430-200D-1F469-1F3FE", "emoji": "👩🏿‍🐰‍👩🏾", "text": "", "type": 1, "order": 2528, "group": 1, "subgroup": 27, "version": 17, "tone": [ 5, 4 ] }, { "label": "women with bunny ears: light skin tone", "hexcode": "1F46F-1F3FB-200D-2640-FE0F", "emoji": "👯🏻‍♀️", "text": "", "type": 1, "order": 2459, "group": 1, "subgroup": 27, "version": 17, "gender": 0, "tone": 1 }, { "label": "women with bunny ears: medium-light skin tone", "hexcode": "1F46F-1F3FC-200D-2640-FE0F", "emoji": "👯🏼‍♀️", "text": "", "type": 1, "order": 2461, "group": 1, "subgroup": 27, "version": 17, "gender": 0, "tone": 2 }, { "label": "women with bunny ears: medium skin tone", "hexcode": "1F46F-1F3FD-200D-2640-FE0F", "emoji": "👯🏽‍♀️", "text": "", "type": 1, "order": 2463, "group": 1, "subgroup": 27, "version": 17, "gender": 0, "tone": 3 }, { "label": "women with bunny ears: medium-dark skin tone", "hexcode": "1F46F-1F3FE-200D-2640-FE0F", "emoji": "👯🏾‍♀️", "text": "", "type": 1, "order": 2465, "group": 1, "subgroup": 27, "version": 17, "gender": 0, "tone": 4 }, { "label": "women with bunny ears: dark skin tone", "hexcode": "1F46F-1F3FF-200D-2640-FE0F", "emoji": "👯🏿‍♀️", "text": "", "type": 1, "order": 2467, "group": 1, "subgroup": 27, "version": 17, "gender": 0, "tone": 5 } ] }, { "label": "person in steamy room", "hexcode": "1F9D6", "tags": [ "day", "luxurious", "pamper", "person", "relax", "room", "sauna", "spa", "steam", "steambath", "unwind" ], "emoji": "🧖", "text": "", "type": 1, "order": 2529, "group": 1, "subgroup": 27, "version": 5, "skins": [ { "label": "person in steamy room: light skin tone", "hexcode": "1F9D6-1F3FB", "emoji": "🧖🏻", "text": "", "type": 1, "order": 2530, "group": 1, "subgroup": 27, "version": 5, "tone": 1 }, { "label": "person in steamy room: medium-light skin tone", "hexcode": "1F9D6-1F3FC", "emoji": "🧖🏼", "text": "", "type": 1, "order": 2531, "group": 1, "subgroup": 27, "version": 5, "tone": 2 }, { "label": "person in steamy room: medium skin tone", "hexcode": "1F9D6-1F3FD", "emoji": "🧖🏽", "text": "", "type": 1, "order": 2532, "group": 1, "subgroup": 27, "version": 5, "tone": 3 }, { "label": "person in steamy room: medium-dark skin tone", "hexcode": "1F9D6-1F3FE", "emoji": "🧖🏾", "text": "", "type": 1, "order": 2533, "group": 1, "subgroup": 27, "version": 5, "tone": 4 }, { "label": "person in steamy room: dark skin tone", "hexcode": "1F9D6-1F3FF", "emoji": "🧖🏿", "text": "", "type": 1, "order": 2534, "group": 1, "subgroup": 27, "version": 5, "tone": 5 } ] }, { "label": "man in steamy room", "hexcode": "1F9D6-200D-2642-FE0F", "tags": [ "day", "luxurious", "man", "pamper", "relax", "room", "sauna", "spa", "steam", "steambath", "unwind" ], "emoji": "🧖‍♂️", "text": "", "type": 1, "order": 2535, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "skins": [ { "label": "man in steamy room: light skin tone", "hexcode": "1F9D6-1F3FB-200D-2642-FE0F", "emoji": "🧖🏻‍♂️", "text": "", "type": 1, "order": 2537, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 1 }, { "label": "man in steamy room: medium-light skin tone", "hexcode": "1F9D6-1F3FC-200D-2642-FE0F", "emoji": "🧖🏼‍♂️", "text": "", "type": 1, "order": 2539, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 2 }, { "label": "man in steamy room: medium skin tone", "hexcode": "1F9D6-1F3FD-200D-2642-FE0F", "emoji": "🧖🏽‍♂️", "text": "", "type": 1, "order": 2541, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 3 }, { "label": "man in steamy room: medium-dark skin tone", "hexcode": "1F9D6-1F3FE-200D-2642-FE0F", "emoji": "🧖🏾‍♂️", "text": "", "type": 1, "order": 2543, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 4 }, { "label": "man in steamy room: dark skin tone", "hexcode": "1F9D6-1F3FF-200D-2642-FE0F", "emoji": "🧖🏿‍♂️", "text": "", "type": 1, "order": 2545, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 5 } ] }, { "label": "woman in steamy room", "hexcode": "1F9D6-200D-2640-FE0F", "tags": [ "day", "luxurious", "pamper", "relax", "room", "sauna", "spa", "steam", "steambath", "unwind", "woman" ], "emoji": "🧖‍♀️", "text": "", "type": 1, "order": 2547, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "skins": [ { "label": "woman in steamy room: light skin tone", "hexcode": "1F9D6-1F3FB-200D-2640-FE0F", "emoji": "🧖🏻‍♀️", "text": "", "type": 1, "order": 2549, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 1 }, { "label": "woman in steamy room: medium-light skin tone", "hexcode": "1F9D6-1F3FC-200D-2640-FE0F", "emoji": "🧖🏼‍♀️", "text": "", "type": 1, "order": 2551, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 2 }, { "label": "woman in steamy room: medium skin tone", "hexcode": "1F9D6-1F3FD-200D-2640-FE0F", "emoji": "🧖🏽‍♀️", "text": "", "type": 1, "order": 2553, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 3 }, { "label": "woman in steamy room: medium-dark skin tone", "hexcode": "1F9D6-1F3FE-200D-2640-FE0F", "emoji": "🧖🏾‍♀️", "text": "", "type": 1, "order": 2555, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 4 }, { "label": "woman in steamy room: dark skin tone", "hexcode": "1F9D6-1F3FF-200D-2640-FE0F", "emoji": "🧖🏿‍♀️", "text": "", "type": 1, "order": 2557, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 5 } ] }, { "label": "person climbing", "hexcode": "1F9D7", "tags": [ "climb", "climber", "climbing", "mountain", "person", "rock", "scale", "up" ], "emoji": "🧗", "text": "", "type": 1, "order": 2559, "group": 1, "subgroup": 27, "version": 5, "skins": [ { "label": "person climbing: light skin tone", "hexcode": "1F9D7-1F3FB", "emoji": "🧗🏻", "text": "", "type": 1, "order": 2560, "group": 1, "subgroup": 27, "version": 5, "tone": 1 }, { "label": "person climbing: medium-light skin tone", "hexcode": "1F9D7-1F3FC", "emoji": "🧗🏼", "text": "", "type": 1, "order": 2561, "group": 1, "subgroup": 27, "version": 5, "tone": 2 }, { "label": "person climbing: medium skin tone", "hexcode": "1F9D7-1F3FD", "emoji": "🧗🏽", "text": "", "type": 1, "order": 2562, "group": 1, "subgroup": 27, "version": 5, "tone": 3 }, { "label": "person climbing: medium-dark skin tone", "hexcode": "1F9D7-1F3FE", "emoji": "🧗🏾", "text": "", "type": 1, "order": 2563, "group": 1, "subgroup": 27, "version": 5, "tone": 4 }, { "label": "person climbing: dark skin tone", "hexcode": "1F9D7-1F3FF", "emoji": "🧗🏿", "text": "", "type": 1, "order": 2564, "group": 1, "subgroup": 27, "version": 5, "tone": 5 } ] }, { "label": "man climbing", "hexcode": "1F9D7-200D-2642-FE0F", "tags": [ "climb", "climber", "climbing", "man", "mountain", "rock", "scale", "up" ], "emoji": "🧗‍♂️", "text": "", "type": 1, "order": 2565, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "skins": [ { "label": "man climbing: light skin tone", "hexcode": "1F9D7-1F3FB-200D-2642-FE0F", "emoji": "🧗🏻‍♂️", "text": "", "type": 1, "order": 2567, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 1 }, { "label": "man climbing: medium-light skin tone", "hexcode": "1F9D7-1F3FC-200D-2642-FE0F", "emoji": "🧗🏼‍♂️", "text": "", "type": 1, "order": 2569, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 2 }, { "label": "man climbing: medium skin tone", "hexcode": "1F9D7-1F3FD-200D-2642-FE0F", "emoji": "🧗🏽‍♂️", "text": "", "type": 1, "order": 2571, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 3 }, { "label": "man climbing: medium-dark skin tone", "hexcode": "1F9D7-1F3FE-200D-2642-FE0F", "emoji": "🧗🏾‍♂️", "text": "", "type": 1, "order": 2573, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 4 }, { "label": "man climbing: dark skin tone", "hexcode": "1F9D7-1F3FF-200D-2642-FE0F", "emoji": "🧗🏿‍♂️", "text": "", "type": 1, "order": 2575, "group": 1, "subgroup": 27, "version": 5, "gender": 1, "tone": 5 } ] }, { "label": "woman climbing", "hexcode": "1F9D7-200D-2640-FE0F", "tags": [ "climb", "climber", "climbing", "mountain", "rock", "scale", "up", "woman" ], "emoji": "🧗‍♀️", "text": "", "type": 1, "order": 2577, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "skins": [ { "label": "woman climbing: light skin tone", "hexcode": "1F9D7-1F3FB-200D-2640-FE0F", "emoji": "🧗🏻‍♀️", "text": "", "type": 1, "order": 2579, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 1 }, { "label": "woman climbing: medium-light skin tone", "hexcode": "1F9D7-1F3FC-200D-2640-FE0F", "emoji": "🧗🏼‍♀️", "text": "", "type": 1, "order": 2581, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 2 }, { "label": "woman climbing: medium skin tone", "hexcode": "1F9D7-1F3FD-200D-2640-FE0F", "emoji": "🧗🏽‍♀️", "text": "", "type": 1, "order": 2583, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 3 }, { "label": "woman climbing: medium-dark skin tone", "hexcode": "1F9D7-1F3FE-200D-2640-FE0F", "emoji": "🧗🏾‍♀️", "text": "", "type": 1, "order": 2585, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 4 }, { "label": "woman climbing: dark skin tone", "hexcode": "1F9D7-1F3FF-200D-2640-FE0F", "emoji": "🧗🏿‍♀️", "text": "", "type": 1, "order": 2587, "group": 1, "subgroup": 27, "version": 5, "gender": 0, "tone": 5 } ] }, { "label": "person fencing", "hexcode": "1F93A", "tags": [ "fencer", "fencing", "person", "sword" ], "emoji": "🤺", "text": "", "type": 1, "order": 2589, "group": 1, "subgroup": 28, "version": 3 }, { "label": "horse racing", "hexcode": "1F3C7", "tags": [ "horse", "jockey", "racehorse", "racing", "riding", "sport" ], "emoji": "🏇", "text": "", "type": 1, "order": 2590, "group": 1, "subgroup": 28, "version": 1, "skins": [ { "label": "horse racing: light skin tone", "hexcode": "1F3C7-1F3FB", "emoji": "🏇🏻", "text": "", "type": 1, "order": 2591, "group": 1, "subgroup": 28, "version": 1, "tone": 1 }, { "label": "horse racing: medium-light skin tone", "hexcode": "1F3C7-1F3FC", "emoji": "🏇🏼", "text": "", "type": 1, "order": 2592, "group": 1, "subgroup": 28, "version": 1, "tone": 2 }, { "label": "horse racing: medium skin tone", "hexcode": "1F3C7-1F3FD", "emoji": "🏇🏽", "text": "", "type": 1, "order": 2593, "group": 1, "subgroup": 28, "version": 1, "tone": 3 }, { "label": "horse racing: medium-dark skin tone", "hexcode": "1F3C7-1F3FE", "emoji": "🏇🏾", "text": "", "type": 1, "order": 2594, "group": 1, "subgroup": 28, "version": 1, "tone": 4 }, { "label": "horse racing: dark skin tone", "hexcode": "1F3C7-1F3FF", "emoji": "🏇🏿", "text": "", "type": 1, "order": 2595, "group": 1, "subgroup": 28, "version": 1, "tone": 5 } ] }, { "label": "skier", "hexcode": "26F7", "tags": [ "ski", "snow" ], "emoji": "⛷️", "text": "⛷︎", "type": 0, "order": 2597, "group": 1, "subgroup": 28, "version": 0.7 }, { "label": "snowboarder", "hexcode": "1F3C2", "tags": [ "ski", "snow", "snowboard", "sport" ], "emoji": "🏂️", "text": "🏂︎", "type": 1, "order": 2598, "group": 1, "subgroup": 28, "version": 0.6, "skins": [ { "label": "snowboarder: light skin tone", "hexcode": "1F3C2-1F3FB", "emoji": "🏂🏻", "text": "", "type": 1, "order": 2599, "group": 1, "subgroup": 28, "version": 1, "tone": 1 }, { "label": "snowboarder: medium-light skin tone", "hexcode": "1F3C2-1F3FC", "emoji": "🏂🏼", "text": "", "type": 1, "order": 2600, "group": 1, "subgroup": 28, "version": 1, "tone": 2 }, { "label": "snowboarder: medium skin tone", "hexcode": "1F3C2-1F3FD", "emoji": "🏂🏽", "text": "", "type": 1, "order": 2601, "group": 1, "subgroup": 28, "version": 1, "tone": 3 }, { "label": "snowboarder: medium-dark skin tone", "hexcode": "1F3C2-1F3FE", "emoji": "🏂🏾", "text": "", "type": 1, "order": 2602, "group": 1, "subgroup": 28, "version": 1, "tone": 4 }, { "label": "snowboarder: dark skin tone", "hexcode": "1F3C2-1F3FF", "emoji": "🏂🏿", "text": "", "type": 1, "order": 2603, "group": 1, "subgroup": 28, "version": 1, "tone": 5 } ] }, { "label": "person golfing", "hexcode": "1F3CC", "tags": [ "ball", "birdie", "caddy", "driving", "golf", "golfing", "green", "person", "pga", "putt", "range", "tee" ], "emoji": "🏌️", "text": "🏌︎", "type": 0, "order": 2605, "group": 1, "subgroup": 28, "version": 0.7, "skins": [ { "label": "person golfing: light skin tone", "hexcode": "1F3CC-1F3FB", "emoji": "🏌🏻", "text": "", "type": 1, "order": 2606, "group": 1, "subgroup": 28, "version": 4, "tone": 1 }, { "label": "person golfing: medium-light skin tone", "hexcode": "1F3CC-1F3FC", "emoji": "🏌🏼", "text": "", "type": 1, "order": 2607, "group": 1, "subgroup": 28, "version": 4, "tone": 2 }, { "label": "person golfing: medium skin tone", "hexcode": "1F3CC-1F3FD", "emoji": "🏌🏽", "text": "", "type": 1, "order": 2608, "group": 1, "subgroup": 28, "version": 4, "tone": 3 }, { "label": "person golfing: medium-dark skin tone", "hexcode": "1F3CC-1F3FE", "emoji": "🏌🏾", "text": "", "type": 1, "order": 2609, "group": 1, "subgroup": 28, "version": 4, "tone": 4 }, { "label": "person golfing: dark skin tone", "hexcode": "1F3CC-1F3FF", "emoji": "🏌🏿", "text": "", "type": 1, "order": 2610, "group": 1, "subgroup": 28, "version": 4, "tone": 5 } ] }, { "label": "man golfing", "hexcode": "1F3CC-FE0F-200D-2642-FE0F", "tags": [ "ball", "birdie", "caddy", "driving", "golf", "golfing", "green", "man", "pga", "putt", "range", "tee" ], "emoji": "🏌️‍♂️", "text": "", "type": 1, "order": 2611, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man golfing: light skin tone", "hexcode": "1F3CC-1F3FB-200D-2642-FE0F", "emoji": "🏌🏻‍♂️", "text": "", "type": 1, "order": 2615, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man golfing: medium-light skin tone", "hexcode": "1F3CC-1F3FC-200D-2642-FE0F", "emoji": "🏌🏼‍♂️", "text": "", "type": 1, "order": 2617, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man golfing: medium skin tone", "hexcode": "1F3CC-1F3FD-200D-2642-FE0F", "emoji": "🏌🏽‍♂️", "text": "", "type": 1, "order": 2619, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man golfing: medium-dark skin tone", "hexcode": "1F3CC-1F3FE-200D-2642-FE0F", "emoji": "🏌🏾‍♂️", "text": "", "type": 1, "order": 2621, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man golfing: dark skin tone", "hexcode": "1F3CC-1F3FF-200D-2642-FE0F", "emoji": "🏌🏿‍♂️", "text": "", "type": 1, "order": 2623, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman golfing", "hexcode": "1F3CC-FE0F-200D-2640-FE0F", "tags": [ "ball", "birdie", "caddy", "driving", "golf", "golfing", "green", "pga", "putt", "range", "tee", "woman" ], "emoji": "🏌️‍♀️", "text": "", "type": 1, "order": 2625, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman golfing: light skin tone", "hexcode": "1F3CC-1F3FB-200D-2640-FE0F", "emoji": "🏌🏻‍♀️", "text": "", "type": 1, "order": 2629, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman golfing: medium-light skin tone", "hexcode": "1F3CC-1F3FC-200D-2640-FE0F", "emoji": "🏌🏼‍♀️", "text": "", "type": 1, "order": 2631, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman golfing: medium skin tone", "hexcode": "1F3CC-1F3FD-200D-2640-FE0F", "emoji": "🏌🏽‍♀️", "text": "", "type": 1, "order": 2633, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman golfing: medium-dark skin tone", "hexcode": "1F3CC-1F3FE-200D-2640-FE0F", "emoji": "🏌🏾‍♀️", "text": "", "type": 1, "order": 2635, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman golfing: dark skin tone", "hexcode": "1F3CC-1F3FF-200D-2640-FE0F", "emoji": "🏌🏿‍♀️", "text": "", "type": 1, "order": 2637, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person surfing", "hexcode": "1F3C4", "tags": [ "beach", "ocean", "person", "sport", "surf", "surfer", "surfing", "swell", "waves" ], "emoji": "🏄️", "text": "🏄︎", "type": 1, "order": 2639, "group": 1, "subgroup": 28, "version": 0.6, "skins": [ { "label": "person surfing: light skin tone", "hexcode": "1F3C4-1F3FB", "emoji": "🏄🏻", "text": "", "type": 1, "order": 2640, "group": 1, "subgroup": 28, "version": 1, "tone": 1 }, { "label": "person surfing: medium-light skin tone", "hexcode": "1F3C4-1F3FC", "emoji": "🏄🏼", "text": "", "type": 1, "order": 2641, "group": 1, "subgroup": 28, "version": 1, "tone": 2 }, { "label": "person surfing: medium skin tone", "hexcode": "1F3C4-1F3FD", "emoji": "🏄🏽", "text": "", "type": 1, "order": 2642, "group": 1, "subgroup": 28, "version": 1, "tone": 3 }, { "label": "person surfing: medium-dark skin tone", "hexcode": "1F3C4-1F3FE", "emoji": "🏄🏾", "text": "", "type": 1, "order": 2643, "group": 1, "subgroup": 28, "version": 1, "tone": 4 }, { "label": "person surfing: dark skin tone", "hexcode": "1F3C4-1F3FF", "emoji": "🏄🏿", "text": "", "type": 1, "order": 2644, "group": 1, "subgroup": 28, "version": 1, "tone": 5 } ] }, { "label": "man surfing", "hexcode": "1F3C4-200D-2642-FE0F", "tags": [ "beach", "man", "ocean", "sport", "surf", "surfer", "surfing", "swell", "waves" ], "emoji": "🏄‍♂️", "text": "", "type": 1, "order": 2645, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man surfing: light skin tone", "hexcode": "1F3C4-1F3FB-200D-2642-FE0F", "emoji": "🏄🏻‍♂️", "text": "", "type": 1, "order": 2647, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man surfing: medium-light skin tone", "hexcode": "1F3C4-1F3FC-200D-2642-FE0F", "emoji": "🏄🏼‍♂️", "text": "", "type": 1, "order": 2649, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man surfing: medium skin tone", "hexcode": "1F3C4-1F3FD-200D-2642-FE0F", "emoji": "🏄🏽‍♂️", "text": "", "type": 1, "order": 2651, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man surfing: medium-dark skin tone", "hexcode": "1F3C4-1F3FE-200D-2642-FE0F", "emoji": "🏄🏾‍♂️", "text": "", "type": 1, "order": 2653, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man surfing: dark skin tone", "hexcode": "1F3C4-1F3FF-200D-2642-FE0F", "emoji": "🏄🏿‍♂️", "text": "", "type": 1, "order": 2655, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman surfing", "hexcode": "1F3C4-200D-2640-FE0F", "tags": [ "beach", "ocean", "person", "sport", "surf", "surfer", "surfing", "swell", "waves" ], "emoji": "🏄‍♀️", "text": "", "type": 1, "order": 2657, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman surfing: light skin tone", "hexcode": "1F3C4-1F3FB-200D-2640-FE0F", "emoji": "🏄🏻‍♀️", "text": "", "type": 1, "order": 2659, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman surfing: medium-light skin tone", "hexcode": "1F3C4-1F3FC-200D-2640-FE0F", "emoji": "🏄🏼‍♀️", "text": "", "type": 1, "order": 2661, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman surfing: medium skin tone", "hexcode": "1F3C4-1F3FD-200D-2640-FE0F", "emoji": "🏄🏽‍♀️", "text": "", "type": 1, "order": 2663, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman surfing: medium-dark skin tone", "hexcode": "1F3C4-1F3FE-200D-2640-FE0F", "emoji": "🏄🏾‍♀️", "text": "", "type": 1, "order": 2665, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman surfing: dark skin tone", "hexcode": "1F3C4-1F3FF-200D-2640-FE0F", "emoji": "🏄🏿‍♀️", "text": "", "type": 1, "order": 2667, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person rowing boat", "hexcode": "1F6A3", "tags": [ "boat", "canoe", "cruise", "fishing", "lake", "oar", "paddle", "person", "raft", "river", "row", "rowboat", "rowing" ], "emoji": "🚣", "text": "", "type": 1, "order": 2669, "group": 1, "subgroup": 28, "version": 1, "skins": [ { "label": "person rowing boat: light skin tone", "hexcode": "1F6A3-1F3FB", "emoji": "🚣🏻", "text": "", "type": 1, "order": 2670, "group": 1, "subgroup": 28, "version": 1, "tone": 1 }, { "label": "person rowing boat: medium-light skin tone", "hexcode": "1F6A3-1F3FC", "emoji": "🚣🏼", "text": "", "type": 1, "order": 2671, "group": 1, "subgroup": 28, "version": 1, "tone": 2 }, { "label": "person rowing boat: medium skin tone", "hexcode": "1F6A3-1F3FD", "emoji": "🚣🏽", "text": "", "type": 1, "order": 2672, "group": 1, "subgroup": 28, "version": 1, "tone": 3 }, { "label": "person rowing boat: medium-dark skin tone", "hexcode": "1F6A3-1F3FE", "emoji": "🚣🏾", "text": "", "type": 1, "order": 2673, "group": 1, "subgroup": 28, "version": 1, "tone": 4 }, { "label": "person rowing boat: dark skin tone", "hexcode": "1F6A3-1F3FF", "emoji": "🚣🏿", "text": "", "type": 1, "order": 2674, "group": 1, "subgroup": 28, "version": 1, "tone": 5 } ] }, { "label": "man rowing boat", "hexcode": "1F6A3-200D-2642-FE0F", "tags": [ "boat", "canoe", "cruise", "fishing", "lake", "man", "oar", "paddle", "raft", "river", "row", "rowboat", "rowing" ], "emoji": "🚣‍♂️", "text": "", "type": 1, "order": 2675, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man rowing boat: light skin tone", "hexcode": "1F6A3-1F3FB-200D-2642-FE0F", "emoji": "🚣🏻‍♂️", "text": "", "type": 1, "order": 2677, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man rowing boat: medium-light skin tone", "hexcode": "1F6A3-1F3FC-200D-2642-FE0F", "emoji": "🚣🏼‍♂️", "text": "", "type": 1, "order": 2679, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man rowing boat: medium skin tone", "hexcode": "1F6A3-1F3FD-200D-2642-FE0F", "emoji": "🚣🏽‍♂️", "text": "", "type": 1, "order": 2681, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man rowing boat: medium-dark skin tone", "hexcode": "1F6A3-1F3FE-200D-2642-FE0F", "emoji": "🚣🏾‍♂️", "text": "", "type": 1, "order": 2683, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man rowing boat: dark skin tone", "hexcode": "1F6A3-1F3FF-200D-2642-FE0F", "emoji": "🚣🏿‍♂️", "text": "", "type": 1, "order": 2685, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman rowing boat", "hexcode": "1F6A3-200D-2640-FE0F", "tags": [ "boat", "canoe", "cruise", "fishing", "lake", "oar", "paddle", "raft", "river", "row", "rowboat", "rowing", "woman" ], "emoji": "🚣‍♀️", "text": "", "type": 1, "order": 2687, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman rowing boat: light skin tone", "hexcode": "1F6A3-1F3FB-200D-2640-FE0F", "emoji": "🚣🏻‍♀️", "text": "", "type": 1, "order": 2689, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman rowing boat: medium-light skin tone", "hexcode": "1F6A3-1F3FC-200D-2640-FE0F", "emoji": "🚣🏼‍♀️", "text": "", "type": 1, "order": 2691, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman rowing boat: medium skin tone", "hexcode": "1F6A3-1F3FD-200D-2640-FE0F", "emoji": "🚣🏽‍♀️", "text": "", "type": 1, "order": 2693, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman rowing boat: medium-dark skin tone", "hexcode": "1F6A3-1F3FE-200D-2640-FE0F", "emoji": "🚣🏾‍♀️", "text": "", "type": 1, "order": 2695, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman rowing boat: dark skin tone", "hexcode": "1F6A3-1F3FF-200D-2640-FE0F", "emoji": "🚣🏿‍♀️", "text": "", "type": 1, "order": 2697, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person swimming", "hexcode": "1F3CA", "tags": [ "freestyle", "person", "sport", "swim", "swimmer", "swimming", "triathlon" ], "emoji": "🏊️", "text": "🏊︎", "type": 1, "order": 2699, "group": 1, "subgroup": 28, "version": 0.6, "skins": [ { "label": "person swimming: light skin tone", "hexcode": "1F3CA-1F3FB", "emoji": "🏊🏻", "text": "", "type": 1, "order": 2700, "group": 1, "subgroup": 28, "version": 1, "tone": 1 }, { "label": "person swimming: medium-light skin tone", "hexcode": "1F3CA-1F3FC", "emoji": "🏊🏼", "text": "", "type": 1, "order": 2701, "group": 1, "subgroup": 28, "version": 1, "tone": 2 }, { "label": "person swimming: medium skin tone", "hexcode": "1F3CA-1F3FD", "emoji": "🏊🏽", "text": "", "type": 1, "order": 2702, "group": 1, "subgroup": 28, "version": 1, "tone": 3 }, { "label": "person swimming: medium-dark skin tone", "hexcode": "1F3CA-1F3FE", "emoji": "🏊🏾", "text": "", "type": 1, "order": 2703, "group": 1, "subgroup": 28, "version": 1, "tone": 4 }, { "label": "person swimming: dark skin tone", "hexcode": "1F3CA-1F3FF", "emoji": "🏊🏿", "text": "", "type": 1, "order": 2704, "group": 1, "subgroup": 28, "version": 1, "tone": 5 } ] }, { "label": "man swimming", "hexcode": "1F3CA-200D-2642-FE0F", "tags": [ "freestyle", "man", "sport", "swim", "swimmer", "swimming", "triathlon" ], "emoji": "🏊‍♂️", "text": "", "type": 1, "order": 2705, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man swimming: light skin tone", "hexcode": "1F3CA-1F3FB-200D-2642-FE0F", "emoji": "🏊🏻‍♂️", "text": "", "type": 1, "order": 2707, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man swimming: medium-light skin tone", "hexcode": "1F3CA-1F3FC-200D-2642-FE0F", "emoji": "🏊🏼‍♂️", "text": "", "type": 1, "order": 2709, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man swimming: medium skin tone", "hexcode": "1F3CA-1F3FD-200D-2642-FE0F", "emoji": "🏊🏽‍♂️", "text": "", "type": 1, "order": 2711, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man swimming: medium-dark skin tone", "hexcode": "1F3CA-1F3FE-200D-2642-FE0F", "emoji": "🏊🏾‍♂️", "text": "", "type": 1, "order": 2713, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man swimming: dark skin tone", "hexcode": "1F3CA-1F3FF-200D-2642-FE0F", "emoji": "🏊🏿‍♂️", "text": "", "type": 1, "order": 2715, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman swimming", "hexcode": "1F3CA-200D-2640-FE0F", "tags": [ "freestyle", "man", "sport", "swim", "swimmer", "swimming", "triathlon" ], "emoji": "🏊‍♀️", "text": "", "type": 1, "order": 2717, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman swimming: light skin tone", "hexcode": "1F3CA-1F3FB-200D-2640-FE0F", "emoji": "🏊🏻‍♀️", "text": "", "type": 1, "order": 2719, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman swimming: medium-light skin tone", "hexcode": "1F3CA-1F3FC-200D-2640-FE0F", "emoji": "🏊🏼‍♀️", "text": "", "type": 1, "order": 2721, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman swimming: medium skin tone", "hexcode": "1F3CA-1F3FD-200D-2640-FE0F", "emoji": "🏊🏽‍♀️", "text": "", "type": 1, "order": 2723, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman swimming: medium-dark skin tone", "hexcode": "1F3CA-1F3FE-200D-2640-FE0F", "emoji": "🏊🏾‍♀️", "text": "", "type": 1, "order": 2725, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman swimming: dark skin tone", "hexcode": "1F3CA-1F3FF-200D-2640-FE0F", "emoji": "🏊🏿‍♀️", "text": "", "type": 1, "order": 2727, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person bouncing ball", "hexcode": "26F9", "tags": [ "athletic", "ball", "basketball", "bouncing", "championship", "dribble", "net", "person", "player", "throw" ], "emoji": "⛹️", "text": "⛹︎", "type": 0, "order": 2730, "group": 1, "subgroup": 28, "version": 0.7, "skins": [ { "label": "person bouncing ball: light skin tone", "hexcode": "26F9-1F3FB", "emoji": "⛹🏻", "text": "", "type": 1, "order": 2731, "group": 1, "subgroup": 28, "version": 2, "tone": 1 }, { "label": "person bouncing ball: medium-light skin tone", "hexcode": "26F9-1F3FC", "emoji": "⛹🏼", "text": "", "type": 1, "order": 2732, "group": 1, "subgroup": 28, "version": 2, "tone": 2 }, { "label": "person bouncing ball: medium skin tone", "hexcode": "26F9-1F3FD", "emoji": "⛹🏽", "text": "", "type": 1, "order": 2733, "group": 1, "subgroup": 28, "version": 2, "tone": 3 }, { "label": "person bouncing ball: medium-dark skin tone", "hexcode": "26F9-1F3FE", "emoji": "⛹🏾", "text": "", "type": 1, "order": 2734, "group": 1, "subgroup": 28, "version": 2, "tone": 4 }, { "label": "person bouncing ball: dark skin tone", "hexcode": "26F9-1F3FF", "emoji": "⛹🏿", "text": "", "type": 1, "order": 2735, "group": 1, "subgroup": 28, "version": 2, "tone": 5 } ] }, { "label": "man bouncing ball", "hexcode": "26F9-FE0F-200D-2642-FE0F", "tags": [ "athletic", "ball", "basketball", "bouncing", "championship", "dribble", "man", "net", "player", "throw" ], "emoji": "⛹️‍♂️", "text": "", "type": 1, "order": 2736, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man bouncing ball: light skin tone", "hexcode": "26F9-1F3FB-200D-2642-FE0F", "emoji": "⛹🏻‍♂️", "text": "", "type": 1, "order": 2740, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man bouncing ball: medium-light skin tone", "hexcode": "26F9-1F3FC-200D-2642-FE0F", "emoji": "⛹🏼‍♂️", "text": "", "type": 1, "order": 2742, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man bouncing ball: medium skin tone", "hexcode": "26F9-1F3FD-200D-2642-FE0F", "emoji": "⛹🏽‍♂️", "text": "", "type": 1, "order": 2744, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man bouncing ball: medium-dark skin tone", "hexcode": "26F9-1F3FE-200D-2642-FE0F", "emoji": "⛹🏾‍♂️", "text": "", "type": 1, "order": 2746, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man bouncing ball: dark skin tone", "hexcode": "26F9-1F3FF-200D-2642-FE0F", "emoji": "⛹🏿‍♂️", "text": "", "type": 1, "order": 2748, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman bouncing ball", "hexcode": "26F9-FE0F-200D-2640-FE0F", "tags": [ "athletic", "ball", "basketball", "bouncing", "championship", "dribble", "net", "player", "throw", "woman" ], "emoji": "⛹️‍♀️", "text": "", "type": 1, "order": 2750, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman bouncing ball: light skin tone", "hexcode": "26F9-1F3FB-200D-2640-FE0F", "emoji": "⛹🏻‍♀️", "text": "", "type": 1, "order": 2754, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman bouncing ball: medium-light skin tone", "hexcode": "26F9-1F3FC-200D-2640-FE0F", "emoji": "⛹🏼‍♀️", "text": "", "type": 1, "order": 2756, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman bouncing ball: medium skin tone", "hexcode": "26F9-1F3FD-200D-2640-FE0F", "emoji": "⛹🏽‍♀️", "text": "", "type": 1, "order": 2758, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman bouncing ball: medium-dark skin tone", "hexcode": "26F9-1F3FE-200D-2640-FE0F", "emoji": "⛹🏾‍♀️", "text": "", "type": 1, "order": 2760, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman bouncing ball: dark skin tone", "hexcode": "26F9-1F3FF-200D-2640-FE0F", "emoji": "⛹🏿‍♀️", "text": "", "type": 1, "order": 2762, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person lifting weights", "hexcode": "1F3CB", "tags": [ "barbell", "bodybuilder", "deadlift", "lifter", "lifting", "person", "powerlifting", "weight", "weightlifter", "weights", "workout" ], "emoji": "🏋️", "text": "🏋︎", "type": 0, "order": 2765, "group": 1, "subgroup": 28, "version": 0.7, "skins": [ { "label": "person lifting weights: light skin tone", "hexcode": "1F3CB-1F3FB", "emoji": "🏋🏻", "text": "", "type": 1, "order": 2766, "group": 1, "subgroup": 28, "version": 2, "tone": 1 }, { "label": "person lifting weights: medium-light skin tone", "hexcode": "1F3CB-1F3FC", "emoji": "🏋🏼", "text": "", "type": 1, "order": 2767, "group": 1, "subgroup": 28, "version": 2, "tone": 2 }, { "label": "person lifting weights: medium skin tone", "hexcode": "1F3CB-1F3FD", "emoji": "🏋🏽", "text": "", "type": 1, "order": 2768, "group": 1, "subgroup": 28, "version": 2, "tone": 3 }, { "label": "person lifting weights: medium-dark skin tone", "hexcode": "1F3CB-1F3FE", "emoji": "🏋🏾", "text": "", "type": 1, "order": 2769, "group": 1, "subgroup": 28, "version": 2, "tone": 4 }, { "label": "person lifting weights: dark skin tone", "hexcode": "1F3CB-1F3FF", "emoji": "🏋🏿", "text": "", "type": 1, "order": 2770, "group": 1, "subgroup": 28, "version": 2, "tone": 5 } ] }, { "label": "man lifting weights", "hexcode": "1F3CB-FE0F-200D-2642-FE0F", "tags": [ "barbell", "bodybuilder", "deadlift", "lifter", "lifting", "man", "powerlifting", "weight", "weightlifter", "weights", "workout" ], "emoji": "🏋️‍♂️", "text": "", "type": 1, "order": 2771, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man lifting weights: light skin tone", "hexcode": "1F3CB-1F3FB-200D-2642-FE0F", "emoji": "🏋🏻‍♂️", "text": "", "type": 1, "order": 2775, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man lifting weights: medium-light skin tone", "hexcode": "1F3CB-1F3FC-200D-2642-FE0F", "emoji": "🏋🏼‍♂️", "text": "", "type": 1, "order": 2777, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man lifting weights: medium skin tone", "hexcode": "1F3CB-1F3FD-200D-2642-FE0F", "emoji": "🏋🏽‍♂️", "text": "", "type": 1, "order": 2779, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man lifting weights: medium-dark skin tone", "hexcode": "1F3CB-1F3FE-200D-2642-FE0F", "emoji": "🏋🏾‍♂️", "text": "", "type": 1, "order": 2781, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man lifting weights: dark skin tone", "hexcode": "1F3CB-1F3FF-200D-2642-FE0F", "emoji": "🏋🏿‍♂️", "text": "", "type": 1, "order": 2783, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman lifting weights", "hexcode": "1F3CB-FE0F-200D-2640-FE0F", "tags": [ "barbell", "bodybuilder", "deadlift", "lifter", "lifting", "powerlifting", "weight", "weightlifter", "weights", "woman", "workout" ], "emoji": "🏋️‍♀️", "text": "", "type": 1, "order": 2785, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman lifting weights: light skin tone", "hexcode": "1F3CB-1F3FB-200D-2640-FE0F", "emoji": "🏋🏻‍♀️", "text": "", "type": 1, "order": 2789, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman lifting weights: medium-light skin tone", "hexcode": "1F3CB-1F3FC-200D-2640-FE0F", "emoji": "🏋🏼‍♀️", "text": "", "type": 1, "order": 2791, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman lifting weights: medium skin tone", "hexcode": "1F3CB-1F3FD-200D-2640-FE0F", "emoji": "🏋🏽‍♀️", "text": "", "type": 1, "order": 2793, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman lifting weights: medium-dark skin tone", "hexcode": "1F3CB-1F3FE-200D-2640-FE0F", "emoji": "🏋🏾‍♀️", "text": "", "type": 1, "order": 2795, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman lifting weights: dark skin tone", "hexcode": "1F3CB-1F3FF-200D-2640-FE0F", "emoji": "🏋🏿‍♀️", "text": "", "type": 1, "order": 2797, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person biking", "hexcode": "1F6B4", "tags": [ "bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "person", "riding", "sport" ], "emoji": "🚴", "text": "", "type": 1, "order": 2799, "group": 1, "subgroup": 28, "version": 1, "skins": [ { "label": "person biking: light skin tone", "hexcode": "1F6B4-1F3FB", "emoji": "🚴🏻", "text": "", "type": 1, "order": 2800, "group": 1, "subgroup": 28, "version": 1, "tone": 1 }, { "label": "person biking: medium-light skin tone", "hexcode": "1F6B4-1F3FC", "emoji": "🚴🏼", "text": "", "type": 1, "order": 2801, "group": 1, "subgroup": 28, "version": 1, "tone": 2 }, { "label": "person biking: medium skin tone", "hexcode": "1F6B4-1F3FD", "emoji": "🚴🏽", "text": "", "type": 1, "order": 2802, "group": 1, "subgroup": 28, "version": 1, "tone": 3 }, { "label": "person biking: medium-dark skin tone", "hexcode": "1F6B4-1F3FE", "emoji": "🚴🏾", "text": "", "type": 1, "order": 2803, "group": 1, "subgroup": 28, "version": 1, "tone": 4 }, { "label": "person biking: dark skin tone", "hexcode": "1F6B4-1F3FF", "emoji": "🚴🏿", "text": "", "type": 1, "order": 2804, "group": 1, "subgroup": 28, "version": 1, "tone": 5 } ] }, { "label": "man biking", "hexcode": "1F6B4-200D-2642-FE0F", "tags": [ "bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "man", "riding", "sport" ], "emoji": "🚴‍♂️", "text": "", "type": 1, "order": 2805, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man biking: light skin tone", "hexcode": "1F6B4-1F3FB-200D-2642-FE0F", "emoji": "🚴🏻‍♂️", "text": "", "type": 1, "order": 2807, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man biking: medium-light skin tone", "hexcode": "1F6B4-1F3FC-200D-2642-FE0F", "emoji": "🚴🏼‍♂️", "text": "", "type": 1, "order": 2809, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man biking: medium skin tone", "hexcode": "1F6B4-1F3FD-200D-2642-FE0F", "emoji": "🚴🏽‍♂️", "text": "", "type": 1, "order": 2811, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man biking: medium-dark skin tone", "hexcode": "1F6B4-1F3FE-200D-2642-FE0F", "emoji": "🚴🏾‍♂️", "text": "", "type": 1, "order": 2813, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man biking: dark skin tone", "hexcode": "1F6B4-1F3FF-200D-2642-FE0F", "emoji": "🚴🏿‍♂️", "text": "", "type": 1, "order": 2815, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman biking", "hexcode": "1F6B4-200D-2640-FE0F", "tags": [ "bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "riding", "sport", "woman" ], "emoji": "🚴‍♀️", "text": "", "type": 1, "order": 2817, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman biking: light skin tone", "hexcode": "1F6B4-1F3FB-200D-2640-FE0F", "emoji": "🚴🏻‍♀️", "text": "", "type": 1, "order": 2819, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman biking: medium-light skin tone", "hexcode": "1F6B4-1F3FC-200D-2640-FE0F", "emoji": "🚴🏼‍♀️", "text": "", "type": 1, "order": 2821, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman biking: medium skin tone", "hexcode": "1F6B4-1F3FD-200D-2640-FE0F", "emoji": "🚴🏽‍♀️", "text": "", "type": 1, "order": 2823, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman biking: medium-dark skin tone", "hexcode": "1F6B4-1F3FE-200D-2640-FE0F", "emoji": "🚴🏾‍♀️", "text": "", "type": 1, "order": 2825, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman biking: dark skin tone", "hexcode": "1F6B4-1F3FF-200D-2640-FE0F", "emoji": "🚴🏿‍♀️", "text": "", "type": 1, "order": 2827, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person mountain biking", "hexcode": "1F6B5", "tags": [ "bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "mountain", "person", "riding", "sport" ], "emoji": "🚵", "text": "", "type": 1, "order": 2829, "group": 1, "subgroup": 28, "version": 1, "skins": [ { "label": "person mountain biking: light skin tone", "hexcode": "1F6B5-1F3FB", "emoji": "🚵🏻", "text": "", "type": 1, "order": 2830, "group": 1, "subgroup": 28, "version": 1, "tone": 1 }, { "label": "person mountain biking: medium-light skin tone", "hexcode": "1F6B5-1F3FC", "emoji": "🚵🏼", "text": "", "type": 1, "order": 2831, "group": 1, "subgroup": 28, "version": 1, "tone": 2 }, { "label": "person mountain biking: medium skin tone", "hexcode": "1F6B5-1F3FD", "emoji": "🚵🏽", "text": "", "type": 1, "order": 2832, "group": 1, "subgroup": 28, "version": 1, "tone": 3 }, { "label": "person mountain biking: medium-dark skin tone", "hexcode": "1F6B5-1F3FE", "emoji": "🚵🏾", "text": "", "type": 1, "order": 2833, "group": 1, "subgroup": 28, "version": 1, "tone": 4 }, { "label": "person mountain biking: dark skin tone", "hexcode": "1F6B5-1F3FF", "emoji": "🚵🏿", "text": "", "type": 1, "order": 2834, "group": 1, "subgroup": 28, "version": 1, "tone": 5 } ] }, { "label": "man mountain biking", "hexcode": "1F6B5-200D-2642-FE0F", "tags": [ "bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "man", "mountain", "riding", "sport" ], "emoji": "🚵‍♂️", "text": "", "type": 1, "order": 2835, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man mountain biking: light skin tone", "hexcode": "1F6B5-1F3FB-200D-2642-FE0F", "emoji": "🚵🏻‍♂️", "text": "", "type": 1, "order": 2837, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man mountain biking: medium-light skin tone", "hexcode": "1F6B5-1F3FC-200D-2642-FE0F", "emoji": "🚵🏼‍♂️", "text": "", "type": 1, "order": 2839, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man mountain biking: medium skin tone", "hexcode": "1F6B5-1F3FD-200D-2642-FE0F", "emoji": "🚵🏽‍♂️", "text": "", "type": 1, "order": 2841, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man mountain biking: medium-dark skin tone", "hexcode": "1F6B5-1F3FE-200D-2642-FE0F", "emoji": "🚵🏾‍♂️", "text": "", "type": 1, "order": 2843, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man mountain biking: dark skin tone", "hexcode": "1F6B5-1F3FF-200D-2642-FE0F", "emoji": "🚵🏿‍♂️", "text": "", "type": 1, "order": 2845, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman mountain biking", "hexcode": "1F6B5-200D-2640-FE0F", "tags": [ "bicycle", "bicyclist", "bike", "biking", "cycle", "cyclist", "mountain", "riding", "sport", "woman" ], "emoji": "🚵‍♀️", "text": "", "type": 1, "order": 2847, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman mountain biking: light skin tone", "hexcode": "1F6B5-1F3FB-200D-2640-FE0F", "emoji": "🚵🏻‍♀️", "text": "", "type": 1, "order": 2849, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman mountain biking: medium-light skin tone", "hexcode": "1F6B5-1F3FC-200D-2640-FE0F", "emoji": "🚵🏼‍♀️", "text": "", "type": 1, "order": 2851, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman mountain biking: medium skin tone", "hexcode": "1F6B5-1F3FD-200D-2640-FE0F", "emoji": "🚵🏽‍♀️", "text": "", "type": 1, "order": 2853, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman mountain biking: medium-dark skin tone", "hexcode": "1F6B5-1F3FE-200D-2640-FE0F", "emoji": "🚵🏾‍♀️", "text": "", "type": 1, "order": 2855, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman mountain biking: dark skin tone", "hexcode": "1F6B5-1F3FF-200D-2640-FE0F", "emoji": "🚵🏿‍♀️", "text": "", "type": 1, "order": 2857, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person cartwheeling", "hexcode": "1F938", "tags": [ "active", "cartwheel", "cartwheeling", "excited", "flip", "gymnastics", "happy", "person", "somersault" ], "emoji": "🤸", "text": "", "type": 1, "order": 2859, "group": 1, "subgroup": 28, "version": 3, "skins": [ { "label": "person cartwheeling: light skin tone", "hexcode": "1F938-1F3FB", "emoji": "🤸🏻", "text": "", "type": 1, "order": 2860, "group": 1, "subgroup": 28, "version": 3, "tone": 1 }, { "label": "person cartwheeling: medium-light skin tone", "hexcode": "1F938-1F3FC", "emoji": "🤸🏼", "text": "", "type": 1, "order": 2861, "group": 1, "subgroup": 28, "version": 3, "tone": 2 }, { "label": "person cartwheeling: medium skin tone", "hexcode": "1F938-1F3FD", "emoji": "🤸🏽", "text": "", "type": 1, "order": 2862, "group": 1, "subgroup": 28, "version": 3, "tone": 3 }, { "label": "person cartwheeling: medium-dark skin tone", "hexcode": "1F938-1F3FE", "emoji": "🤸🏾", "text": "", "type": 1, "order": 2863, "group": 1, "subgroup": 28, "version": 3, "tone": 4 }, { "label": "person cartwheeling: dark skin tone", "hexcode": "1F938-1F3FF", "emoji": "🤸🏿", "text": "", "type": 1, "order": 2864, "group": 1, "subgroup": 28, "version": 3, "tone": 5 } ] }, { "label": "man cartwheeling", "hexcode": "1F938-200D-2642-FE0F", "tags": [ "active", "cartwheel", "cartwheeling", "excited", "flip", "gymnastics", "happy", "man", "somersault" ], "emoji": "🤸‍♂️", "text": "", "type": 1, "order": 2865, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man cartwheeling: light skin tone", "hexcode": "1F938-1F3FB-200D-2642-FE0F", "emoji": "🤸🏻‍♂️", "text": "", "type": 1, "order": 2867, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man cartwheeling: medium-light skin tone", "hexcode": "1F938-1F3FC-200D-2642-FE0F", "emoji": "🤸🏼‍♂️", "text": "", "type": 1, "order": 2869, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man cartwheeling: medium skin tone", "hexcode": "1F938-1F3FD-200D-2642-FE0F", "emoji": "🤸🏽‍♂️", "text": "", "type": 1, "order": 2871, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man cartwheeling: medium-dark skin tone", "hexcode": "1F938-1F3FE-200D-2642-FE0F", "emoji": "🤸🏾‍♂️", "text": "", "type": 1, "order": 2873, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man cartwheeling: dark skin tone", "hexcode": "1F938-1F3FF-200D-2642-FE0F", "emoji": "🤸🏿‍♂️", "text": "", "type": 1, "order": 2875, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman cartwheeling", "hexcode": "1F938-200D-2640-FE0F", "tags": [ "active", "cartwheel", "cartwheeling", "excited", "flip", "gymnastics", "happy", "somersault", "woman" ], "emoji": "🤸‍♀️", "text": "", "type": 1, "order": 2877, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman cartwheeling: light skin tone", "hexcode": "1F938-1F3FB-200D-2640-FE0F", "emoji": "🤸🏻‍♀️", "text": "", "type": 1, "order": 2879, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman cartwheeling: medium-light skin tone", "hexcode": "1F938-1F3FC-200D-2640-FE0F", "emoji": "🤸🏼‍♀️", "text": "", "type": 1, "order": 2881, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman cartwheeling: medium skin tone", "hexcode": "1F938-1F3FD-200D-2640-FE0F", "emoji": "🤸🏽‍♀️", "text": "", "type": 1, "order": 2883, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman cartwheeling: medium-dark skin tone", "hexcode": "1F938-1F3FE-200D-2640-FE0F", "emoji": "🤸🏾‍♀️", "text": "", "type": 1, "order": 2885, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman cartwheeling: dark skin tone", "hexcode": "1F938-1F3FF-200D-2640-FE0F", "emoji": "🤸🏿‍♀️", "text": "", "type": 1, "order": 2887, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "people wrestling", "hexcode": "1F93C", "tags": [ "combat", "duel", "grapple", "people", "ring", "tournament", "wrestle", "wrestling" ], "emoji": "🤼", "text": "", "type": 1, "order": 2889, "group": 1, "subgroup": 28, "version": 3, "skins": [ { "label": "people wrestling: light skin tone", "hexcode": "1F93C-1F3FB", "emoji": "🤼🏻", "text": "", "type": 1, "order": 2890, "group": 1, "subgroup": 28, "version": 17, "tone": 1 }, { "label": "people wrestling: medium-light skin tone", "hexcode": "1F93C-1F3FC", "emoji": "🤼🏼", "text": "", "type": 1, "order": 2891, "group": 1, "subgroup": 28, "version": 17, "tone": 2 }, { "label": "people wrestling: medium skin tone", "hexcode": "1F93C-1F3FD", "emoji": "🤼🏽", "text": "", "type": 1, "order": 2892, "group": 1, "subgroup": 28, "version": 17, "tone": 3 }, { "label": "people wrestling: medium-dark skin tone", "hexcode": "1F93C-1F3FE", "emoji": "🤼🏾", "text": "", "type": 1, "order": 2893, "group": 1, "subgroup": 28, "version": 17, "tone": 4 }, { "label": "people wrestling: dark skin tone", "hexcode": "1F93C-1F3FF", "emoji": "🤼🏿", "text": "", "type": 1, "order": 2894, "group": 1, "subgroup": 28, "version": 17, "tone": 5 }, { "label": "people wrestling: light skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FB-200D-1FAEF-200D-1F9D1-1F3FC", "emoji": "🧑🏻‍🫯‍🧑🏼", "text": "", "type": 1, "order": 2919, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 2 ] }, { "label": "people wrestling: light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FB-200D-1FAEF-200D-1F9D1-1F3FD", "emoji": "🧑🏻‍🫯‍🧑🏽", "text": "", "type": 1, "order": 2920, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 3 ] }, { "label": "people wrestling: light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FB-200D-1FAEF-200D-1F9D1-1F3FE", "emoji": "🧑🏻‍🫯‍🧑🏾", "text": "", "type": 1, "order": 2921, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 4 ] }, { "label": "people wrestling: light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FB-200D-1FAEF-200D-1F9D1-1F3FF", "emoji": "🧑🏻‍🫯‍🧑🏿", "text": "", "type": 1, "order": 2922, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 5 ] }, { "label": "people wrestling: medium-light skin tone, light skin tone", "hexcode": "1F9D1-1F3FC-200D-1FAEF-200D-1F9D1-1F3FB", "emoji": "🧑🏼‍🫯‍🧑🏻", "text": "", "type": 1, "order": 2923, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 1 ] }, { "label": "people wrestling: medium-light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FC-200D-1FAEF-200D-1F9D1-1F3FD", "emoji": "🧑🏼‍🫯‍🧑🏽", "text": "", "type": 1, "order": 2924, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 3 ] }, { "label": "people wrestling: medium-light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FC-200D-1FAEF-200D-1F9D1-1F3FE", "emoji": "🧑🏼‍🫯‍🧑🏾", "text": "", "type": 1, "order": 2925, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 4 ] }, { "label": "people wrestling: medium-light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FC-200D-1FAEF-200D-1F9D1-1F3FF", "emoji": "🧑🏼‍🫯‍🧑🏿", "text": "", "type": 1, "order": 2926, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 5 ] }, { "label": "people wrestling: medium skin tone, light skin tone", "hexcode": "1F9D1-1F3FD-200D-1FAEF-200D-1F9D1-1F3FB", "emoji": "🧑🏽‍🫯‍🧑🏻", "text": "", "type": 1, "order": 2927, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 1 ] }, { "label": "people wrestling: medium skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FD-200D-1FAEF-200D-1F9D1-1F3FC", "emoji": "🧑🏽‍🫯‍🧑🏼", "text": "", "type": 1, "order": 2928, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 2 ] }, { "label": "people wrestling: medium skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FD-200D-1FAEF-200D-1F9D1-1F3FE", "emoji": "🧑🏽‍🫯‍🧑🏾", "text": "", "type": 1, "order": 2929, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 4 ] }, { "label": "people wrestling: medium skin tone, dark skin tone", "hexcode": "1F9D1-1F3FD-200D-1FAEF-200D-1F9D1-1F3FF", "emoji": "🧑🏽‍🫯‍🧑🏿", "text": "", "type": 1, "order": 2930, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 5 ] }, { "label": "people wrestling: medium-dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FE-200D-1FAEF-200D-1F9D1-1F3FB", "emoji": "🧑🏾‍🫯‍🧑🏻", "text": "", "type": 1, "order": 2931, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 1 ] }, { "label": "people wrestling: medium-dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FE-200D-1FAEF-200D-1F9D1-1F3FC", "emoji": "🧑🏾‍🫯‍🧑🏼", "text": "", "type": 1, "order": 2932, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 2 ] }, { "label": "people wrestling: medium-dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FE-200D-1FAEF-200D-1F9D1-1F3FD", "emoji": "🧑🏾‍🫯‍🧑🏽", "text": "", "type": 1, "order": 2933, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 3 ] }, { "label": "people wrestling: medium-dark skin tone, dark skin tone", "hexcode": "1F9D1-1F3FE-200D-1FAEF-200D-1F9D1-1F3FF", "emoji": "🧑🏾‍🫯‍🧑🏿", "text": "", "type": 1, "order": 2934, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 5 ] }, { "label": "people wrestling: dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FF-200D-1FAEF-200D-1F9D1-1F3FB", "emoji": "🧑🏿‍🫯‍🧑🏻", "text": "", "type": 1, "order": 2935, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 1 ] }, { "label": "people wrestling: dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FF-200D-1FAEF-200D-1F9D1-1F3FC", "emoji": "🧑🏿‍🫯‍🧑🏼", "text": "", "type": 1, "order": 2936, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 2 ] }, { "label": "people wrestling: dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FF-200D-1FAEF-200D-1F9D1-1F3FD", "emoji": "🧑🏿‍🫯‍🧑🏽", "text": "", "type": 1, "order": 2937, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 3 ] }, { "label": "people wrestling: dark skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FF-200D-1FAEF-200D-1F9D1-1F3FE", "emoji": "🧑🏿‍🫯‍🧑🏾", "text": "", "type": 1, "order": 2938, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 4 ] } ] }, { "label": "men wrestling", "hexcode": "1F93C-200D-2642-FE0F", "tags": [ "combat", "duel", "grapple", "men", "ring", "tournament", "wrestle", "wrestling" ], "emoji": "🤼‍♂️", "text": "", "type": 1, "order": 2895, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "men wrestling: light skin tone, medium-light skin tone", "hexcode": "1F468-1F3FB-200D-1FAEF-200D-1F468-1F3FC", "emoji": "👨🏻‍🫯‍👨🏼", "text": "", "type": 1, "order": 2939, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 2 ] }, { "label": "men wrestling: light skin tone, medium skin tone", "hexcode": "1F468-1F3FB-200D-1FAEF-200D-1F468-1F3FD", "emoji": "👨🏻‍🫯‍👨🏽", "text": "", "type": 1, "order": 2940, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 3 ] }, { "label": "men wrestling: light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FB-200D-1FAEF-200D-1F468-1F3FE", "emoji": "👨🏻‍🫯‍👨🏾", "text": "", "type": 1, "order": 2941, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 4 ] }, { "label": "men wrestling: light skin tone, dark skin tone", "hexcode": "1F468-1F3FB-200D-1FAEF-200D-1F468-1F3FF", "emoji": "👨🏻‍🫯‍👨🏿", "text": "", "type": 1, "order": 2942, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 5 ] }, { "label": "men wrestling: medium-light skin tone, light skin tone", "hexcode": "1F468-1F3FC-200D-1FAEF-200D-1F468-1F3FB", "emoji": "👨🏼‍🫯‍👨🏻", "text": "", "type": 1, "order": 2943, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 1 ] }, { "label": "men wrestling: medium-light skin tone, medium skin tone", "hexcode": "1F468-1F3FC-200D-1FAEF-200D-1F468-1F3FD", "emoji": "👨🏼‍🫯‍👨🏽", "text": "", "type": 1, "order": 2944, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 3 ] }, { "label": "men wrestling: medium-light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FC-200D-1FAEF-200D-1F468-1F3FE", "emoji": "👨🏼‍🫯‍👨🏾", "text": "", "type": 1, "order": 2945, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 4 ] }, { "label": "men wrestling: medium-light skin tone, dark skin tone", "hexcode": "1F468-1F3FC-200D-1FAEF-200D-1F468-1F3FF", "emoji": "👨🏼‍🫯‍👨🏿", "text": "", "type": 1, "order": 2946, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 5 ] }, { "label": "men wrestling: medium skin tone, light skin tone", "hexcode": "1F468-1F3FD-200D-1FAEF-200D-1F468-1F3FB", "emoji": "👨🏽‍🫯‍👨🏻", "text": "", "type": 1, "order": 2947, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 1 ] }, { "label": "men wrestling: medium skin tone, medium-light skin tone", "hexcode": "1F468-1F3FD-200D-1FAEF-200D-1F468-1F3FC", "emoji": "👨🏽‍🫯‍👨🏼", "text": "", "type": 1, "order": 2948, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 2 ] }, { "label": "men wrestling: medium skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FD-200D-1FAEF-200D-1F468-1F3FE", "emoji": "👨🏽‍🫯‍👨🏾", "text": "", "type": 1, "order": 2949, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 4 ] }, { "label": "men wrestling: medium skin tone, dark skin tone", "hexcode": "1F468-1F3FD-200D-1FAEF-200D-1F468-1F3FF", "emoji": "👨🏽‍🫯‍👨🏿", "text": "", "type": 1, "order": 2950, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 5 ] }, { "label": "men wrestling: medium-dark skin tone, light skin tone", "hexcode": "1F468-1F3FE-200D-1FAEF-200D-1F468-1F3FB", "emoji": "👨🏾‍🫯‍👨🏻", "text": "", "type": 1, "order": 2951, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 1 ] }, { "label": "men wrestling: medium-dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FE-200D-1FAEF-200D-1F468-1F3FC", "emoji": "👨🏾‍🫯‍👨🏼", "text": "", "type": 1, "order": 2952, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 2 ] }, { "label": "men wrestling: medium-dark skin tone, medium skin tone", "hexcode": "1F468-1F3FE-200D-1FAEF-200D-1F468-1F3FD", "emoji": "👨🏾‍🫯‍👨🏽", "text": "", "type": 1, "order": 2953, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 3 ] }, { "label": "men wrestling: medium-dark skin tone, dark skin tone", "hexcode": "1F468-1F3FE-200D-1FAEF-200D-1F468-1F3FF", "emoji": "👨🏾‍🫯‍👨🏿", "text": "", "type": 1, "order": 2954, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 5 ] }, { "label": "men wrestling: dark skin tone, light skin tone", "hexcode": "1F468-1F3FF-200D-1FAEF-200D-1F468-1F3FB", "emoji": "👨🏿‍🫯‍👨🏻", "text": "", "type": 1, "order": 2955, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 1 ] }, { "label": "men wrestling: dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FF-200D-1FAEF-200D-1F468-1F3FC", "emoji": "👨🏿‍🫯‍👨🏼", "text": "", "type": 1, "order": 2956, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 2 ] }, { "label": "men wrestling: dark skin tone, medium skin tone", "hexcode": "1F468-1F3FF-200D-1FAEF-200D-1F468-1F3FD", "emoji": "👨🏿‍🫯‍👨🏽", "text": "", "type": 1, "order": 2957, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 3 ] }, { "label": "men wrestling: dark skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FF-200D-1FAEF-200D-1F468-1F3FE", "emoji": "👨🏿‍🫯‍👨🏾", "text": "", "type": 1, "order": 2958, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 4 ] }, { "label": "men wrestling: light skin tone", "hexcode": "1F93C-1F3FB-200D-2642-FE0F", "emoji": "🤼🏻‍♂️", "text": "", "type": 1, "order": 2897, "group": 1, "subgroup": 28, "version": 17, "gender": 1, "tone": 1 }, { "label": "men wrestling: medium-light skin tone", "hexcode": "1F93C-1F3FC-200D-2642-FE0F", "emoji": "🤼🏼‍♂️", "text": "", "type": 1, "order": 2899, "group": 1, "subgroup": 28, "version": 17, "gender": 1, "tone": 2 }, { "label": "men wrestling: medium skin tone", "hexcode": "1F93C-1F3FD-200D-2642-FE0F", "emoji": "🤼🏽‍♂️", "text": "", "type": 1, "order": 2901, "group": 1, "subgroup": 28, "version": 17, "gender": 1, "tone": 3 }, { "label": "men wrestling: medium-dark skin tone", "hexcode": "1F93C-1F3FE-200D-2642-FE0F", "emoji": "🤼🏾‍♂️", "text": "", "type": 1, "order": 2903, "group": 1, "subgroup": 28, "version": 17, "gender": 1, "tone": 4 }, { "label": "men wrestling: dark skin tone", "hexcode": "1F93C-1F3FF-200D-2642-FE0F", "emoji": "🤼🏿‍♂️", "text": "", "type": 1, "order": 2905, "group": 1, "subgroup": 28, "version": 17, "gender": 1, "tone": 5 } ] }, { "label": "women wrestling", "hexcode": "1F93C-200D-2640-FE0F", "tags": [ "combat", "duel", "grapple", "ring", "tournament", "women", "wrestle", "wrestling" ], "emoji": "🤼‍♀️", "text": "", "type": 1, "order": 2907, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "women wrestling: light skin tone, medium-light skin tone", "hexcode": "1F469-1F3FB-200D-1FAEF-200D-1F469-1F3FC", "emoji": "👩🏻‍🫯‍👩🏼", "text": "", "type": 1, "order": 2959, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 2 ] }, { "label": "women wrestling: light skin tone, medium skin tone", "hexcode": "1F469-1F3FB-200D-1FAEF-200D-1F469-1F3FD", "emoji": "👩🏻‍🫯‍👩🏽", "text": "", "type": 1, "order": 2960, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 3 ] }, { "label": "women wrestling: light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FB-200D-1FAEF-200D-1F469-1F3FE", "emoji": "👩🏻‍🫯‍👩🏾", "text": "", "type": 1, "order": 2961, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 4 ] }, { "label": "women wrestling: light skin tone, dark skin tone", "hexcode": "1F469-1F3FB-200D-1FAEF-200D-1F469-1F3FF", "emoji": "👩🏻‍🫯‍👩🏿", "text": "", "type": 1, "order": 2962, "group": 1, "subgroup": 28, "version": 17, "tone": [ 1, 5 ] }, { "label": "women wrestling: medium-light skin tone, light skin tone", "hexcode": "1F469-1F3FC-200D-1FAEF-200D-1F469-1F3FB", "emoji": "👩🏼‍🫯‍👩🏻", "text": "", "type": 1, "order": 2963, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 1 ] }, { "label": "women wrestling: medium-light skin tone, medium skin tone", "hexcode": "1F469-1F3FC-200D-1FAEF-200D-1F469-1F3FD", "emoji": "👩🏼‍🫯‍👩🏽", "text": "", "type": 1, "order": 2964, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 3 ] }, { "label": "women wrestling: medium-light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FC-200D-1FAEF-200D-1F469-1F3FE", "emoji": "👩🏼‍🫯‍👩🏾", "text": "", "type": 1, "order": 2965, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 4 ] }, { "label": "women wrestling: medium-light skin tone, dark skin tone", "hexcode": "1F469-1F3FC-200D-1FAEF-200D-1F469-1F3FF", "emoji": "👩🏼‍🫯‍👩🏿", "text": "", "type": 1, "order": 2966, "group": 1, "subgroup": 28, "version": 17, "tone": [ 2, 5 ] }, { "label": "women wrestling: medium skin tone, light skin tone", "hexcode": "1F469-1F3FD-200D-1FAEF-200D-1F469-1F3FB", "emoji": "👩🏽‍🫯‍👩🏻", "text": "", "type": 1, "order": 2967, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 1 ] }, { "label": "women wrestling: medium skin tone, medium-light skin tone", "hexcode": "1F469-1F3FD-200D-1FAEF-200D-1F469-1F3FC", "emoji": "👩🏽‍🫯‍👩🏼", "text": "", "type": 1, "order": 2968, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 2 ] }, { "label": "women wrestling: medium skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FD-200D-1FAEF-200D-1F469-1F3FE", "emoji": "👩🏽‍🫯‍👩🏾", "text": "", "type": 1, "order": 2969, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 4 ] }, { "label": "women wrestling: medium skin tone, dark skin tone", "hexcode": "1F469-1F3FD-200D-1FAEF-200D-1F469-1F3FF", "emoji": "👩🏽‍🫯‍👩🏿", "text": "", "type": 1, "order": 2970, "group": 1, "subgroup": 28, "version": 17, "tone": [ 3, 5 ] }, { "label": "women wrestling: medium-dark skin tone, light skin tone", "hexcode": "1F469-1F3FE-200D-1FAEF-200D-1F469-1F3FB", "emoji": "👩🏾‍🫯‍👩🏻", "text": "", "type": 1, "order": 2971, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 1 ] }, { "label": "women wrestling: medium-dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FE-200D-1FAEF-200D-1F469-1F3FC", "emoji": "👩🏾‍🫯‍👩🏼", "text": "", "type": 1, "order": 2972, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 2 ] }, { "label": "women wrestling: medium-dark skin tone, medium skin tone", "hexcode": "1F469-1F3FE-200D-1FAEF-200D-1F469-1F3FD", "emoji": "👩🏾‍🫯‍👩🏽", "text": "", "type": 1, "order": 2973, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 3 ] }, { "label": "women wrestling: medium-dark skin tone, dark skin tone", "hexcode": "1F469-1F3FE-200D-1FAEF-200D-1F469-1F3FF", "emoji": "👩🏾‍🫯‍👩🏿", "text": "", "type": 1, "order": 2974, "group": 1, "subgroup": 28, "version": 17, "tone": [ 4, 5 ] }, { "label": "women wrestling: dark skin tone, light skin tone", "hexcode": "1F469-1F3FF-200D-1FAEF-200D-1F469-1F3FB", "emoji": "👩🏿‍🫯‍👩🏻", "text": "", "type": 1, "order": 2975, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 1 ] }, { "label": "women wrestling: dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FF-200D-1FAEF-200D-1F469-1F3FC", "emoji": "👩🏿‍🫯‍👩🏼", "text": "", "type": 1, "order": 2976, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 2 ] }, { "label": "women wrestling: dark skin tone, medium skin tone", "hexcode": "1F469-1F3FF-200D-1FAEF-200D-1F469-1F3FD", "emoji": "👩🏿‍🫯‍👩🏽", "text": "", "type": 1, "order": 2977, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 3 ] }, { "label": "women wrestling: dark skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FF-200D-1FAEF-200D-1F469-1F3FE", "emoji": "👩🏿‍🫯‍👩🏾", "text": "", "type": 1, "order": 2978, "group": 1, "subgroup": 28, "version": 17, "tone": [ 5, 4 ] }, { "label": "women wrestling: light skin tone", "hexcode": "1F93C-1F3FB-200D-2640-FE0F", "emoji": "🤼🏻‍♀️", "text": "", "type": 1, "order": 2909, "group": 1, "subgroup": 28, "version": 17, "gender": 0, "tone": 1 }, { "label": "women wrestling: medium-light skin tone", "hexcode": "1F93C-1F3FC-200D-2640-FE0F", "emoji": "🤼🏼‍♀️", "text": "", "type": 1, "order": 2911, "group": 1, "subgroup": 28, "version": 17, "gender": 0, "tone": 2 }, { "label": "women wrestling: medium skin tone", "hexcode": "1F93C-1F3FD-200D-2640-FE0F", "emoji": "🤼🏽‍♀️", "text": "", "type": 1, "order": 2913, "group": 1, "subgroup": 28, "version": 17, "gender": 0, "tone": 3 }, { "label": "women wrestling: medium-dark skin tone", "hexcode": "1F93C-1F3FE-200D-2640-FE0F", "emoji": "🤼🏾‍♀️", "text": "", "type": 1, "order": 2915, "group": 1, "subgroup": 28, "version": 17, "gender": 0, "tone": 4 }, { "label": "women wrestling: dark skin tone", "hexcode": "1F93C-1F3FF-200D-2640-FE0F", "emoji": "🤼🏿‍♀️", "text": "", "type": 1, "order": 2917, "group": 1, "subgroup": 28, "version": 17, "gender": 0, "tone": 5 } ] }, { "label": "person playing water polo", "hexcode": "1F93D", "tags": [ "person", "playing", "polo", "sport", "swimming", "water", "waterpolo" ], "emoji": "🤽", "text": "", "type": 1, "order": 2979, "group": 1, "subgroup": 28, "version": 3, "skins": [ { "label": "person playing water polo: light skin tone", "hexcode": "1F93D-1F3FB", "emoji": "🤽🏻", "text": "", "type": 1, "order": 2980, "group": 1, "subgroup": 28, "version": 3, "tone": 1 }, { "label": "person playing water polo: medium-light skin tone", "hexcode": "1F93D-1F3FC", "emoji": "🤽🏼", "text": "", "type": 1, "order": 2981, "group": 1, "subgroup": 28, "version": 3, "tone": 2 }, { "label": "person playing water polo: medium skin tone", "hexcode": "1F93D-1F3FD", "emoji": "🤽🏽", "text": "", "type": 1, "order": 2982, "group": 1, "subgroup": 28, "version": 3, "tone": 3 }, { "label": "person playing water polo: medium-dark skin tone", "hexcode": "1F93D-1F3FE", "emoji": "🤽🏾", "text": "", "type": 1, "order": 2983, "group": 1, "subgroup": 28, "version": 3, "tone": 4 }, { "label": "person playing water polo: dark skin tone", "hexcode": "1F93D-1F3FF", "emoji": "🤽🏿", "text": "", "type": 1, "order": 2984, "group": 1, "subgroup": 28, "version": 3, "tone": 5 } ] }, { "label": "man playing water polo", "hexcode": "1F93D-200D-2642-FE0F", "tags": [ "man", "playing", "polo", "sport", "swimming", "water", "waterpolo" ], "emoji": "🤽‍♂️", "text": "", "type": 1, "order": 2985, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man playing water polo: light skin tone", "hexcode": "1F93D-1F3FB-200D-2642-FE0F", "emoji": "🤽🏻‍♂️", "text": "", "type": 1, "order": 2987, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man playing water polo: medium-light skin tone", "hexcode": "1F93D-1F3FC-200D-2642-FE0F", "emoji": "🤽🏼‍♂️", "text": "", "type": 1, "order": 2989, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man playing water polo: medium skin tone", "hexcode": "1F93D-1F3FD-200D-2642-FE0F", "emoji": "🤽🏽‍♂️", "text": "", "type": 1, "order": 2991, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man playing water polo: medium-dark skin tone", "hexcode": "1F93D-1F3FE-200D-2642-FE0F", "emoji": "🤽🏾‍♂️", "text": "", "type": 1, "order": 2993, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man playing water polo: dark skin tone", "hexcode": "1F93D-1F3FF-200D-2642-FE0F", "emoji": "🤽🏿‍♂️", "text": "", "type": 1, "order": 2995, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman playing water polo", "hexcode": "1F93D-200D-2640-FE0F", "tags": [ "playing", "polo", "sport", "swimming", "water", "waterpolo", "woman" ], "emoji": "🤽‍♀️", "text": "", "type": 1, "order": 2997, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman playing water polo: light skin tone", "hexcode": "1F93D-1F3FB-200D-2640-FE0F", "emoji": "🤽🏻‍♀️", "text": "", "type": 1, "order": 2999, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman playing water polo: medium-light skin tone", "hexcode": "1F93D-1F3FC-200D-2640-FE0F", "emoji": "🤽🏼‍♀️", "text": "", "type": 1, "order": 3001, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman playing water polo: medium skin tone", "hexcode": "1F93D-1F3FD-200D-2640-FE0F", "emoji": "🤽🏽‍♀️", "text": "", "type": 1, "order": 3003, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman playing water polo: medium-dark skin tone", "hexcode": "1F93D-1F3FE-200D-2640-FE0F", "emoji": "🤽🏾‍♀️", "text": "", "type": 1, "order": 3005, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman playing water polo: dark skin tone", "hexcode": "1F93D-1F3FF-200D-2640-FE0F", "emoji": "🤽🏿‍♀️", "text": "", "type": 1, "order": 3007, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person playing handball", "hexcode": "1F93E", "tags": [ "athletics", "ball", "catch", "chuck", "handball", "hurl", "lob", "person", "pitch", "playing", "sport", "throw", "toss" ], "emoji": "🤾", "text": "", "type": 1, "order": 3009, "group": 1, "subgroup": 28, "version": 3, "skins": [ { "label": "person playing handball: light skin tone", "hexcode": "1F93E-1F3FB", "emoji": "🤾🏻", "text": "", "type": 1, "order": 3010, "group": 1, "subgroup": 28, "version": 3, "tone": 1 }, { "label": "person playing handball: medium-light skin tone", "hexcode": "1F93E-1F3FC", "emoji": "🤾🏼", "text": "", "type": 1, "order": 3011, "group": 1, "subgroup": 28, "version": 3, "tone": 2 }, { "label": "person playing handball: medium skin tone", "hexcode": "1F93E-1F3FD", "emoji": "🤾🏽", "text": "", "type": 1, "order": 3012, "group": 1, "subgroup": 28, "version": 3, "tone": 3 }, { "label": "person playing handball: medium-dark skin tone", "hexcode": "1F93E-1F3FE", "emoji": "🤾🏾", "text": "", "type": 1, "order": 3013, "group": 1, "subgroup": 28, "version": 3, "tone": 4 }, { "label": "person playing handball: dark skin tone", "hexcode": "1F93E-1F3FF", "emoji": "🤾🏿", "text": "", "type": 1, "order": 3014, "group": 1, "subgroup": 28, "version": 3, "tone": 5 } ] }, { "label": "man playing handball", "hexcode": "1F93E-200D-2642-FE0F", "tags": [ "athletics", "ball", "catch", "chuck", "handball", "hurl", "lob", "man", "pitch", "playing", "sport", "throw", "toss" ], "emoji": "🤾‍♂️", "text": "", "type": 1, "order": 3015, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man playing handball: light skin tone", "hexcode": "1F93E-1F3FB-200D-2642-FE0F", "emoji": "🤾🏻‍♂️", "text": "", "type": 1, "order": 3017, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man playing handball: medium-light skin tone", "hexcode": "1F93E-1F3FC-200D-2642-FE0F", "emoji": "🤾🏼‍♂️", "text": "", "type": 1, "order": 3019, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man playing handball: medium skin tone", "hexcode": "1F93E-1F3FD-200D-2642-FE0F", "emoji": "🤾🏽‍♂️", "text": "", "type": 1, "order": 3021, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man playing handball: medium-dark skin tone", "hexcode": "1F93E-1F3FE-200D-2642-FE0F", "emoji": "🤾🏾‍♂️", "text": "", "type": 1, "order": 3023, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man playing handball: dark skin tone", "hexcode": "1F93E-1F3FF-200D-2642-FE0F", "emoji": "🤾🏿‍♂️", "text": "", "type": 1, "order": 3025, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman playing handball", "hexcode": "1F93E-200D-2640-FE0F", "tags": [ "athletics", "ball", "catch", "chuck", "handball", "hurl", "lob", "pitch", "playing", "sport", "throw", "toss", "woman" ], "emoji": "🤾‍♀️", "text": "", "type": 1, "order": 3027, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman playing handball: light skin tone", "hexcode": "1F93E-1F3FB-200D-2640-FE0F", "emoji": "🤾🏻‍♀️", "text": "", "type": 1, "order": 3029, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman playing handball: medium-light skin tone", "hexcode": "1F93E-1F3FC-200D-2640-FE0F", "emoji": "🤾🏼‍♀️", "text": "", "type": 1, "order": 3031, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman playing handball: medium skin tone", "hexcode": "1F93E-1F3FD-200D-2640-FE0F", "emoji": "🤾🏽‍♀️", "text": "", "type": 1, "order": 3033, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman playing handball: medium-dark skin tone", "hexcode": "1F93E-1F3FE-200D-2640-FE0F", "emoji": "🤾🏾‍♀️", "text": "", "type": 1, "order": 3035, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman playing handball: dark skin tone", "hexcode": "1F93E-1F3FF-200D-2640-FE0F", "emoji": "🤾🏿‍♀️", "text": "", "type": 1, "order": 3037, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person juggling", "hexcode": "1F939", "tags": [ "act", "balance", "balancing", "handle", "juggle", "juggling", "manage", "multitask", "person", "skill" ], "emoji": "🤹", "text": "", "type": 1, "order": 3039, "group": 1, "subgroup": 28, "version": 3, "skins": [ { "label": "person juggling: light skin tone", "hexcode": "1F939-1F3FB", "emoji": "🤹🏻", "text": "", "type": 1, "order": 3040, "group": 1, "subgroup": 28, "version": 3, "tone": 1 }, { "label": "person juggling: medium-light skin tone", "hexcode": "1F939-1F3FC", "emoji": "🤹🏼", "text": "", "type": 1, "order": 3041, "group": 1, "subgroup": 28, "version": 3, "tone": 2 }, { "label": "person juggling: medium skin tone", "hexcode": "1F939-1F3FD", "emoji": "🤹🏽", "text": "", "type": 1, "order": 3042, "group": 1, "subgroup": 28, "version": 3, "tone": 3 }, { "label": "person juggling: medium-dark skin tone", "hexcode": "1F939-1F3FE", "emoji": "🤹🏾", "text": "", "type": 1, "order": 3043, "group": 1, "subgroup": 28, "version": 3, "tone": 4 }, { "label": "person juggling: dark skin tone", "hexcode": "1F939-1F3FF", "emoji": "🤹🏿", "text": "", "type": 1, "order": 3044, "group": 1, "subgroup": 28, "version": 3, "tone": 5 } ] }, { "label": "man juggling", "hexcode": "1F939-200D-2642-FE0F", "tags": [ "act", "balance", "balancing", "handle", "juggle", "juggling", "man", "manage", "multitask", "skill" ], "emoji": "🤹‍♂️", "text": "", "type": 1, "order": 3045, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "skins": [ { "label": "man juggling: light skin tone", "hexcode": "1F939-1F3FB-200D-2642-FE0F", "emoji": "🤹🏻‍♂️", "text": "", "type": 1, "order": 3047, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 1 }, { "label": "man juggling: medium-light skin tone", "hexcode": "1F939-1F3FC-200D-2642-FE0F", "emoji": "🤹🏼‍♂️", "text": "", "type": 1, "order": 3049, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 2 }, { "label": "man juggling: medium skin tone", "hexcode": "1F939-1F3FD-200D-2642-FE0F", "emoji": "🤹🏽‍♂️", "text": "", "type": 1, "order": 3051, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 3 }, { "label": "man juggling: medium-dark skin tone", "hexcode": "1F939-1F3FE-200D-2642-FE0F", "emoji": "🤹🏾‍♂️", "text": "", "type": 1, "order": 3053, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 4 }, { "label": "man juggling: dark skin tone", "hexcode": "1F939-1F3FF-200D-2642-FE0F", "emoji": "🤹🏿‍♂️", "text": "", "type": 1, "order": 3055, "group": 1, "subgroup": 28, "version": 4, "gender": 1, "tone": 5 } ] }, { "label": "woman juggling", "hexcode": "1F939-200D-2640-FE0F", "tags": [ "act", "balance", "balancing", "handle", "juggle", "juggling", "manage", "multitask", "skill", "woman" ], "emoji": "🤹‍♀️", "text": "", "type": 1, "order": 3057, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "skins": [ { "label": "woman juggling: light skin tone", "hexcode": "1F939-1F3FB-200D-2640-FE0F", "emoji": "🤹🏻‍♀️", "text": "", "type": 1, "order": 3059, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 1 }, { "label": "woman juggling: medium-light skin tone", "hexcode": "1F939-1F3FC-200D-2640-FE0F", "emoji": "🤹🏼‍♀️", "text": "", "type": 1, "order": 3061, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 2 }, { "label": "woman juggling: medium skin tone", "hexcode": "1F939-1F3FD-200D-2640-FE0F", "emoji": "🤹🏽‍♀️", "text": "", "type": 1, "order": 3063, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 3 }, { "label": "woman juggling: medium-dark skin tone", "hexcode": "1F939-1F3FE-200D-2640-FE0F", "emoji": "🤹🏾‍♀️", "text": "", "type": 1, "order": 3065, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 4 }, { "label": "woman juggling: dark skin tone", "hexcode": "1F939-1F3FF-200D-2640-FE0F", "emoji": "🤹🏿‍♀️", "text": "", "type": 1, "order": 3067, "group": 1, "subgroup": 28, "version": 4, "gender": 0, "tone": 5 } ] }, { "label": "person in lotus position", "hexcode": "1F9D8", "tags": [ "cross", "legged", "legs", "lotus", "meditation", "peace", "person", "position", "relax", "serenity", "yoga", "yogi", "zen" ], "emoji": "🧘", "text": "", "type": 1, "order": 3069, "group": 1, "subgroup": 29, "version": 5, "skins": [ { "label": "person in lotus position: light skin tone", "hexcode": "1F9D8-1F3FB", "emoji": "🧘🏻", "text": "", "type": 1, "order": 3070, "group": 1, "subgroup": 29, "version": 5, "tone": 1 }, { "label": "person in lotus position: medium-light skin tone", "hexcode": "1F9D8-1F3FC", "emoji": "🧘🏼", "text": "", "type": 1, "order": 3071, "group": 1, "subgroup": 29, "version": 5, "tone": 2 }, { "label": "person in lotus position: medium skin tone", "hexcode": "1F9D8-1F3FD", "emoji": "🧘🏽", "text": "", "type": 1, "order": 3072, "group": 1, "subgroup": 29, "version": 5, "tone": 3 }, { "label": "person in lotus position: medium-dark skin tone", "hexcode": "1F9D8-1F3FE", "emoji": "🧘🏾", "text": "", "type": 1, "order": 3073, "group": 1, "subgroup": 29, "version": 5, "tone": 4 }, { "label": "person in lotus position: dark skin tone", "hexcode": "1F9D8-1F3FF", "emoji": "🧘🏿", "text": "", "type": 1, "order": 3074, "group": 1, "subgroup": 29, "version": 5, "tone": 5 } ] }, { "label": "man in lotus position", "hexcode": "1F9D8-200D-2642-FE0F", "tags": [ "cross", "legged", "legs", "lotus", "man", "meditation", "peace", "position", "relax", "serenity", "yoga", "yogi", "zen" ], "emoji": "🧘‍♂️", "text": "", "type": 1, "order": 3075, "group": 1, "subgroup": 29, "version": 5, "gender": 1, "skins": [ { "label": "man in lotus position: light skin tone", "hexcode": "1F9D8-1F3FB-200D-2642-FE0F", "emoji": "🧘🏻‍♂️", "text": "", "type": 1, "order": 3077, "group": 1, "subgroup": 29, "version": 5, "gender": 1, "tone": 1 }, { "label": "man in lotus position: medium-light skin tone", "hexcode": "1F9D8-1F3FC-200D-2642-FE0F", "emoji": "🧘🏼‍♂️", "text": "", "type": 1, "order": 3079, "group": 1, "subgroup": 29, "version": 5, "gender": 1, "tone": 2 }, { "label": "man in lotus position: medium skin tone", "hexcode": "1F9D8-1F3FD-200D-2642-FE0F", "emoji": "🧘🏽‍♂️", "text": "", "type": 1, "order": 3081, "group": 1, "subgroup": 29, "version": 5, "gender": 1, "tone": 3 }, { "label": "man in lotus position: medium-dark skin tone", "hexcode": "1F9D8-1F3FE-200D-2642-FE0F", "emoji": "🧘🏾‍♂️", "text": "", "type": 1, "order": 3083, "group": 1, "subgroup": 29, "version": 5, "gender": 1, "tone": 4 }, { "label": "man in lotus position: dark skin tone", "hexcode": "1F9D8-1F3FF-200D-2642-FE0F", "emoji": "🧘🏿‍♂️", "text": "", "type": 1, "order": 3085, "group": 1, "subgroup": 29, "version": 5, "gender": 1, "tone": 5 } ] }, { "label": "woman in lotus position", "hexcode": "1F9D8-200D-2640-FE0F", "tags": [ "cross", "legged", "legs", "lotus", "meditation", "peace", "position", "relax", "serenity", "woman", "yoga", "yogi", "zen" ], "emoji": "🧘‍♀️", "text": "", "type": 1, "order": 3087, "group": 1, "subgroup": 29, "version": 5, "gender": 0, "skins": [ { "label": "woman in lotus position: light skin tone", "hexcode": "1F9D8-1F3FB-200D-2640-FE0F", "emoji": "🧘🏻‍♀️", "text": "", "type": 1, "order": 3089, "group": 1, "subgroup": 29, "version": 5, "gender": 0, "tone": 1 }, { "label": "woman in lotus position: medium-light skin tone", "hexcode": "1F9D8-1F3FC-200D-2640-FE0F", "emoji": "🧘🏼‍♀️", "text": "", "type": 1, "order": 3091, "group": 1, "subgroup": 29, "version": 5, "gender": 0, "tone": 2 }, { "label": "woman in lotus position: medium skin tone", "hexcode": "1F9D8-1F3FD-200D-2640-FE0F", "emoji": "🧘🏽‍♀️", "text": "", "type": 1, "order": 3093, "group": 1, "subgroup": 29, "version": 5, "gender": 0, "tone": 3 }, { "label": "woman in lotus position: medium-dark skin tone", "hexcode": "1F9D8-1F3FE-200D-2640-FE0F", "emoji": "🧘🏾‍♀️", "text": "", "type": 1, "order": 3095, "group": 1, "subgroup": 29, "version": 5, "gender": 0, "tone": 4 }, { "label": "woman in lotus position: dark skin tone", "hexcode": "1F9D8-1F3FF-200D-2640-FE0F", "emoji": "🧘🏿‍♀️", "text": "", "type": 1, "order": 3097, "group": 1, "subgroup": 29, "version": 5, "gender": 0, "tone": 5 } ] }, { "label": "person taking bath", "hexcode": "1F6C0", "tags": [ "bath", "bathtub", "person", "taking", "tub" ], "emoji": "🛀", "text": "", "type": 1, "order": 3099, "group": 1, "subgroup": 29, "version": 0.6, "skins": [ { "label": "person taking bath: light skin tone", "hexcode": "1F6C0-1F3FB", "emoji": "🛀🏻", "text": "", "type": 1, "order": 3100, "group": 1, "subgroup": 29, "version": 1, "tone": 1 }, { "label": "person taking bath: medium-light skin tone", "hexcode": "1F6C0-1F3FC", "emoji": "🛀🏼", "text": "", "type": 1, "order": 3101, "group": 1, "subgroup": 29, "version": 1, "tone": 2 }, { "label": "person taking bath: medium skin tone", "hexcode": "1F6C0-1F3FD", "emoji": "🛀🏽", "text": "", "type": 1, "order": 3102, "group": 1, "subgroup": 29, "version": 1, "tone": 3 }, { "label": "person taking bath: medium-dark skin tone", "hexcode": "1F6C0-1F3FE", "emoji": "🛀🏾", "text": "", "type": 1, "order": 3103, "group": 1, "subgroup": 29, "version": 1, "tone": 4 }, { "label": "person taking bath: dark skin tone", "hexcode": "1F6C0-1F3FF", "emoji": "🛀🏿", "text": "", "type": 1, "order": 3104, "group": 1, "subgroup": 29, "version": 1, "tone": 5 } ] }, { "label": "person in bed", "hexcode": "1F6CC", "tags": [ "bed", "bedtime", "good", "goodnight", "hotel", "nap", "night", "person", "sleep", "tired", "zzz" ], "emoji": "🛌", "text": "", "type": 1, "order": 3105, "group": 1, "subgroup": 29, "version": 1, "skins": [ { "label": "person in bed: light skin tone", "hexcode": "1F6CC-1F3FB", "emoji": "🛌🏻", "text": "", "type": 1, "order": 3106, "group": 1, "subgroup": 29, "version": 4, "tone": 1 }, { "label": "person in bed: medium-light skin tone", "hexcode": "1F6CC-1F3FC", "emoji": "🛌🏼", "text": "", "type": 1, "order": 3107, "group": 1, "subgroup": 29, "version": 4, "tone": 2 }, { "label": "person in bed: medium skin tone", "hexcode": "1F6CC-1F3FD", "emoji": "🛌🏽", "text": "", "type": 1, "order": 3108, "group": 1, "subgroup": 29, "version": 4, "tone": 3 }, { "label": "person in bed: medium-dark skin tone", "hexcode": "1F6CC-1F3FE", "emoji": "🛌🏾", "text": "", "type": 1, "order": 3109, "group": 1, "subgroup": 29, "version": 4, "tone": 4 }, { "label": "person in bed: dark skin tone", "hexcode": "1F6CC-1F3FF", "emoji": "🛌🏿", "text": "", "type": 1, "order": 3110, "group": 1, "subgroup": 29, "version": 4, "tone": 5 } ] }, { "label": "people holding hands", "hexcode": "1F9D1-200D-1F91D-200D-1F9D1", "tags": [ "bae", "bestie", "bff", "couple", "dating", "flirt", "friends", "hand", "hold", "people", "twins" ], "emoji": "🧑‍🤝‍🧑", "text": "", "type": 1, "order": 3111, "group": 1, "subgroup": 30, "version": 12, "skins": [ { "label": "people holding hands: light skin tone", "hexcode": "1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FB", "emoji": "🧑🏻‍🤝‍🧑🏻", "text": "", "type": 1, "order": 3112, "group": 1, "subgroup": 30, "version": 12, "tone": 1 }, { "label": "people holding hands: light skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FC", "emoji": "🧑🏻‍🤝‍🧑🏼", "text": "", "type": 1, "order": 3113, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 2 ] }, { "label": "people holding hands: light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FD", "emoji": "🧑🏻‍🤝‍🧑🏽", "text": "", "type": 1, "order": 3114, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 3 ] }, { "label": "people holding hands: light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FE", "emoji": "🧑🏻‍🤝‍🧑🏾", "text": "", "type": 1, "order": 3115, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 4 ] }, { "label": "people holding hands: light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FB-200D-1F91D-200D-1F9D1-1F3FF", "emoji": "🧑🏻‍🤝‍🧑🏿", "text": "", "type": 1, "order": 3116, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 5 ] }, { "label": "people holding hands: medium-light skin tone, light skin tone", "hexcode": "1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FB", "emoji": "🧑🏼‍🤝‍🧑🏻", "text": "", "type": 1, "order": 3117, "group": 1, "subgroup": 30, "version": 12, "tone": [ 2, 1 ] }, { "label": "people holding hands: medium-light skin tone", "hexcode": "1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FC", "emoji": "🧑🏼‍🤝‍🧑🏼", "text": "", "type": 1, "order": 3118, "group": 1, "subgroup": 30, "version": 12, "tone": 2 }, { "label": "people holding hands: medium-light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FD", "emoji": "🧑🏼‍🤝‍🧑🏽", "text": "", "type": 1, "order": 3119, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 3 ] }, { "label": "people holding hands: medium-light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FE", "emoji": "🧑🏼‍🤝‍🧑🏾", "text": "", "type": 1, "order": 3120, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 4 ] }, { "label": "people holding hands: medium-light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FC-200D-1F91D-200D-1F9D1-1F3FF", "emoji": "🧑🏼‍🤝‍🧑🏿", "text": "", "type": 1, "order": 3121, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 5 ] }, { "label": "people holding hands: medium skin tone, light skin tone", "hexcode": "1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FB", "emoji": "🧑🏽‍🤝‍🧑🏻", "text": "", "type": 1, "order": 3122, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 1 ] }, { "label": "people holding hands: medium skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FC", "emoji": "🧑🏽‍🤝‍🧑🏼", "text": "", "type": 1, "order": 3123, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 2 ] }, { "label": "people holding hands: medium skin tone", "hexcode": "1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FD", "emoji": "🧑🏽‍🤝‍🧑🏽", "text": "", "type": 1, "order": 3124, "group": 1, "subgroup": 30, "version": 12, "tone": 3 }, { "label": "people holding hands: medium skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FE", "emoji": "🧑🏽‍🤝‍🧑🏾", "text": "", "type": 1, "order": 3125, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 3, 4 ] }, { "label": "people holding hands: medium skin tone, dark skin tone", "hexcode": "1F9D1-1F3FD-200D-1F91D-200D-1F9D1-1F3FF", "emoji": "🧑🏽‍🤝‍🧑🏿", "text": "", "type": 1, "order": 3126, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 3, 5 ] }, { "label": "people holding hands: medium-dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FB", "emoji": "🧑🏾‍🤝‍🧑🏻", "text": "", "type": 1, "order": 3127, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 1 ] }, { "label": "people holding hands: medium-dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FC", "emoji": "🧑🏾‍🤝‍🧑🏼", "text": "", "type": 1, "order": 3128, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 2 ] }, { "label": "people holding hands: medium-dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FD", "emoji": "🧑🏾‍🤝‍🧑🏽", "text": "", "type": 1, "order": 3129, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 3 ] }, { "label": "people holding hands: medium-dark skin tone", "hexcode": "1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FE", "emoji": "🧑🏾‍🤝‍🧑🏾", "text": "", "type": 1, "order": 3130, "group": 1, "subgroup": 30, "version": 12, "tone": 4 }, { "label": "people holding hands: medium-dark skin tone, dark skin tone", "hexcode": "1F9D1-1F3FE-200D-1F91D-200D-1F9D1-1F3FF", "emoji": "🧑🏾‍🤝‍🧑🏿", "text": "", "type": 1, "order": 3131, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 4, 5 ] }, { "label": "people holding hands: dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FB", "emoji": "🧑🏿‍🤝‍🧑🏻", "text": "", "type": 1, "order": 3132, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 1 ] }, { "label": "people holding hands: dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FC", "emoji": "🧑🏿‍🤝‍🧑🏼", "text": "", "type": 1, "order": 3133, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 2 ] }, { "label": "people holding hands: dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FD", "emoji": "🧑🏿‍🤝‍🧑🏽", "text": "", "type": 1, "order": 3134, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 3 ] }, { "label": "people holding hands: dark skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FE", "emoji": "🧑🏿‍🤝‍🧑🏾", "text": "", "type": 1, "order": 3135, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 4 ] }, { "label": "people holding hands: dark skin tone", "hexcode": "1F9D1-1F3FF-200D-1F91D-200D-1F9D1-1F3FF", "emoji": "🧑🏿‍🤝‍🧑🏿", "text": "", "type": 1, "order": 3136, "group": 1, "subgroup": 30, "version": 12, "tone": 5 } ] }, { "label": "women holding hands", "hexcode": "1F46D", "tags": [ "bae", "bestie", "bff", "couple", "dating", "flirt", "friends", "girls", "hand", "hold", "sisters", "twins", "women" ], "emoji": "👭", "text": "", "type": 1, "order": 3137, "group": 1, "subgroup": 30, "version": 1, "skins": [ { "label": "women holding hands: light skin tone", "hexcode": "1F46D-1F3FB", "emoji": "👭🏻", "text": "", "type": 1, "order": 3138, "group": 1, "subgroup": 30, "version": 12, "tone": 1 }, { "label": "women holding hands: medium-light skin tone", "hexcode": "1F46D-1F3FC", "emoji": "👭🏼", "text": "", "type": 1, "order": 3144, "group": 1, "subgroup": 30, "version": 12, "tone": 2 }, { "label": "women holding hands: medium skin tone", "hexcode": "1F46D-1F3FD", "emoji": "👭🏽", "text": "", "type": 1, "order": 3150, "group": 1, "subgroup": 30, "version": 12, "tone": 3 }, { "label": "women holding hands: medium-dark skin tone", "hexcode": "1F46D-1F3FE", "emoji": "👭🏾", "text": "", "type": 1, "order": 3156, "group": 1, "subgroup": 30, "version": 12, "tone": 4 }, { "label": "women holding hands: dark skin tone", "hexcode": "1F46D-1F3FF", "emoji": "👭🏿", "text": "", "type": 1, "order": 3162, "group": 1, "subgroup": 30, "version": 12, "tone": 5 }, { "label": "women holding hands: light skin tone, medium-light skin tone", "hexcode": "1F469-1F3FB-200D-1F91D-200D-1F469-1F3FC", "emoji": "👩🏻‍🤝‍👩🏼", "text": "", "type": 1, "order": 3139, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 2 ] }, { "label": "women holding hands: light skin tone, medium skin tone", "hexcode": "1F469-1F3FB-200D-1F91D-200D-1F469-1F3FD", "emoji": "👩🏻‍🤝‍👩🏽", "text": "", "type": 1, "order": 3140, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 3 ] }, { "label": "women holding hands: light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FB-200D-1F91D-200D-1F469-1F3FE", "emoji": "👩🏻‍🤝‍👩🏾", "text": "", "type": 1, "order": 3141, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 4 ] }, { "label": "women holding hands: light skin tone, dark skin tone", "hexcode": "1F469-1F3FB-200D-1F91D-200D-1F469-1F3FF", "emoji": "👩🏻‍🤝‍👩🏿", "text": "", "type": 1, "order": 3142, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 5 ] }, { "label": "women holding hands: medium-light skin tone, light skin tone", "hexcode": "1F469-1F3FC-200D-1F91D-200D-1F469-1F3FB", "emoji": "👩🏼‍🤝‍👩🏻", "text": "", "type": 1, "order": 3143, "group": 1, "subgroup": 30, "version": 12, "tone": [ 2, 1 ] }, { "label": "women holding hands: medium-light skin tone, medium skin tone", "hexcode": "1F469-1F3FC-200D-1F91D-200D-1F469-1F3FD", "emoji": "👩🏼‍🤝‍👩🏽", "text": "", "type": 1, "order": 3145, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 3 ] }, { "label": "women holding hands: medium-light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FC-200D-1F91D-200D-1F469-1F3FE", "emoji": "👩🏼‍🤝‍👩🏾", "text": "", "type": 1, "order": 3146, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 4 ] }, { "label": "women holding hands: medium-light skin tone, dark skin tone", "hexcode": "1F469-1F3FC-200D-1F91D-200D-1F469-1F3FF", "emoji": "👩🏼‍🤝‍👩🏿", "text": "", "type": 1, "order": 3147, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 5 ] }, { "label": "women holding hands: medium skin tone, light skin tone", "hexcode": "1F469-1F3FD-200D-1F91D-200D-1F469-1F3FB", "emoji": "👩🏽‍🤝‍👩🏻", "text": "", "type": 1, "order": 3148, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 1 ] }, { "label": "women holding hands: medium skin tone, medium-light skin tone", "hexcode": "1F469-1F3FD-200D-1F91D-200D-1F469-1F3FC", "emoji": "👩🏽‍🤝‍👩🏼", "text": "", "type": 1, "order": 3149, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 2 ] }, { "label": "women holding hands: medium skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FD-200D-1F91D-200D-1F469-1F3FE", "emoji": "👩🏽‍🤝‍👩🏾", "text": "", "type": 1, "order": 3151, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 3, 4 ] }, { "label": "women holding hands: medium skin tone, dark skin tone", "hexcode": "1F469-1F3FD-200D-1F91D-200D-1F469-1F3FF", "emoji": "👩🏽‍🤝‍👩🏿", "text": "", "type": 1, "order": 3152, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 3, 5 ] }, { "label": "women holding hands: medium-dark skin tone, light skin tone", "hexcode": "1F469-1F3FE-200D-1F91D-200D-1F469-1F3FB", "emoji": "👩🏾‍🤝‍👩🏻", "text": "", "type": 1, "order": 3153, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 1 ] }, { "label": "women holding hands: medium-dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FE-200D-1F91D-200D-1F469-1F3FC", "emoji": "👩🏾‍🤝‍👩🏼", "text": "", "type": 1, "order": 3154, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 2 ] }, { "label": "women holding hands: medium-dark skin tone, medium skin tone", "hexcode": "1F469-1F3FE-200D-1F91D-200D-1F469-1F3FD", "emoji": "👩🏾‍🤝‍👩🏽", "text": "", "type": 1, "order": 3155, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 3 ] }, { "label": "women holding hands: medium-dark skin tone, dark skin tone", "hexcode": "1F469-1F3FE-200D-1F91D-200D-1F469-1F3FF", "emoji": "👩🏾‍🤝‍👩🏿", "text": "", "type": 1, "order": 3157, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 4, 5 ] }, { "label": "women holding hands: dark skin tone, light skin tone", "hexcode": "1F469-1F3FF-200D-1F91D-200D-1F469-1F3FB", "emoji": "👩🏿‍🤝‍👩🏻", "text": "", "type": 1, "order": 3158, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 1 ] }, { "label": "women holding hands: dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FF-200D-1F91D-200D-1F469-1F3FC", "emoji": "👩🏿‍🤝‍👩🏼", "text": "", "type": 1, "order": 3159, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 2 ] }, { "label": "women holding hands: dark skin tone, medium skin tone", "hexcode": "1F469-1F3FF-200D-1F91D-200D-1F469-1F3FD", "emoji": "👩🏿‍🤝‍👩🏽", "text": "", "type": 1, "order": 3160, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 3 ] }, { "label": "women holding hands: dark skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FF-200D-1F91D-200D-1F469-1F3FE", "emoji": "👩🏿‍🤝‍👩🏾", "text": "", "type": 1, "order": 3161, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 4 ] } ] }, { "label": "woman and man holding hands", "hexcode": "1F46B", "tags": [ "bae", "bestie", "bff", "couple", "dating", "flirt", "friends", "hand", "hold", "man", "twins", "woman" ], "emoji": "👫", "text": "", "type": 1, "order": 3163, "group": 1, "subgroup": 30, "version": 0.6, "skins": [ { "label": "woman and man holding hands: light skin tone", "hexcode": "1F46B-1F3FB", "emoji": "👫🏻", "text": "", "type": 1, "order": 3164, "group": 1, "subgroup": 30, "version": 12, "tone": 1 }, { "label": "woman and man holding hands: medium-light skin tone", "hexcode": "1F46B-1F3FC", "emoji": "👫🏼", "text": "", "type": 1, "order": 3170, "group": 1, "subgroup": 30, "version": 12, "tone": 2 }, { "label": "woman and man holding hands: medium skin tone", "hexcode": "1F46B-1F3FD", "emoji": "👫🏽", "text": "", "type": 1, "order": 3176, "group": 1, "subgroup": 30, "version": 12, "tone": 3 }, { "label": "woman and man holding hands: medium-dark skin tone", "hexcode": "1F46B-1F3FE", "emoji": "👫🏾", "text": "", "type": 1, "order": 3182, "group": 1, "subgroup": 30, "version": 12, "tone": 4 }, { "label": "woman and man holding hands: dark skin tone", "hexcode": "1F46B-1F3FF", "emoji": "👫🏿", "text": "", "type": 1, "order": 3188, "group": 1, "subgroup": 30, "version": 12, "tone": 5 }, { "label": "woman and man holding hands: light skin tone, medium-light skin tone", "hexcode": "1F469-1F3FB-200D-1F91D-200D-1F468-1F3FC", "emoji": "👩🏻‍🤝‍👨🏼", "text": "", "type": 1, "order": 3165, "group": 1, "subgroup": 30, "version": 12, "tone": [ 1, 2 ] }, { "label": "woman and man holding hands: light skin tone, medium skin tone", "hexcode": "1F469-1F3FB-200D-1F91D-200D-1F468-1F3FD", "emoji": "👩🏻‍🤝‍👨🏽", "text": "", "type": 1, "order": 3166, "group": 1, "subgroup": 30, "version": 12, "tone": [ 1, 3 ] }, { "label": "woman and man holding hands: light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FB-200D-1F91D-200D-1F468-1F3FE", "emoji": "👩🏻‍🤝‍👨🏾", "text": "", "type": 1, "order": 3167, "group": 1, "subgroup": 30, "version": 12, "tone": [ 1, 4 ] }, { "label": "woman and man holding hands: light skin tone, dark skin tone", "hexcode": "1F469-1F3FB-200D-1F91D-200D-1F468-1F3FF", "emoji": "👩🏻‍🤝‍👨🏿", "text": "", "type": 1, "order": 3168, "group": 1, "subgroup": 30, "version": 12, "tone": [ 1, 5 ] }, { "label": "woman and man holding hands: medium-light skin tone, light skin tone", "hexcode": "1F469-1F3FC-200D-1F91D-200D-1F468-1F3FB", "emoji": "👩🏼‍🤝‍👨🏻", "text": "", "type": 1, "order": 3169, "group": 1, "subgroup": 30, "version": 12, "tone": [ 2, 1 ] }, { "label": "woman and man holding hands: medium-light skin tone, medium skin tone", "hexcode": "1F469-1F3FC-200D-1F91D-200D-1F468-1F3FD", "emoji": "👩🏼‍🤝‍👨🏽", "text": "", "type": 1, "order": 3171, "group": 1, "subgroup": 30, "version": 12, "tone": [ 2, 3 ] }, { "label": "woman and man holding hands: medium-light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FC-200D-1F91D-200D-1F468-1F3FE", "emoji": "👩🏼‍🤝‍👨🏾", "text": "", "type": 1, "order": 3172, "group": 1, "subgroup": 30, "version": 12, "tone": [ 2, 4 ] }, { "label": "woman and man holding hands: medium-light skin tone, dark skin tone", "hexcode": "1F469-1F3FC-200D-1F91D-200D-1F468-1F3FF", "emoji": "👩🏼‍🤝‍👨🏿", "text": "", "type": 1, "order": 3173, "group": 1, "subgroup": 30, "version": 12, "tone": [ 2, 5 ] }, { "label": "woman and man holding hands: medium skin tone, light skin tone", "hexcode": "1F469-1F3FD-200D-1F91D-200D-1F468-1F3FB", "emoji": "👩🏽‍🤝‍👨🏻", "text": "", "type": 1, "order": 3174, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 1 ] }, { "label": "woman and man holding hands: medium skin tone, medium-light skin tone", "hexcode": "1F469-1F3FD-200D-1F91D-200D-1F468-1F3FC", "emoji": "👩🏽‍🤝‍👨🏼", "text": "", "type": 1, "order": 3175, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 2 ] }, { "label": "woman and man holding hands: medium skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FD-200D-1F91D-200D-1F468-1F3FE", "emoji": "👩🏽‍🤝‍👨🏾", "text": "", "type": 1, "order": 3177, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 4 ] }, { "label": "woman and man holding hands: medium skin tone, dark skin tone", "hexcode": "1F469-1F3FD-200D-1F91D-200D-1F468-1F3FF", "emoji": "👩🏽‍🤝‍👨🏿", "text": "", "type": 1, "order": 3178, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 5 ] }, { "label": "woman and man holding hands: medium-dark skin tone, light skin tone", "hexcode": "1F469-1F3FE-200D-1F91D-200D-1F468-1F3FB", "emoji": "👩🏾‍🤝‍👨🏻", "text": "", "type": 1, "order": 3179, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 1 ] }, { "label": "woman and man holding hands: medium-dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FE-200D-1F91D-200D-1F468-1F3FC", "emoji": "👩🏾‍🤝‍👨🏼", "text": "", "type": 1, "order": 3180, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 2 ] }, { "label": "woman and man holding hands: medium-dark skin tone, medium skin tone", "hexcode": "1F469-1F3FE-200D-1F91D-200D-1F468-1F3FD", "emoji": "👩🏾‍🤝‍👨🏽", "text": "", "type": 1, "order": 3181, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 3 ] }, { "label": "woman and man holding hands: medium-dark skin tone, dark skin tone", "hexcode": "1F469-1F3FE-200D-1F91D-200D-1F468-1F3FF", "emoji": "👩🏾‍🤝‍👨🏿", "text": "", "type": 1, "order": 3183, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 5 ] }, { "label": "woman and man holding hands: dark skin tone, light skin tone", "hexcode": "1F469-1F3FF-200D-1F91D-200D-1F468-1F3FB", "emoji": "👩🏿‍🤝‍👨🏻", "text": "", "type": 1, "order": 3184, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 1 ] }, { "label": "woman and man holding hands: dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FF-200D-1F91D-200D-1F468-1F3FC", "emoji": "👩🏿‍🤝‍👨🏼", "text": "", "type": 1, "order": 3185, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 2 ] }, { "label": "woman and man holding hands: dark skin tone, medium skin tone", "hexcode": "1F469-1F3FF-200D-1F91D-200D-1F468-1F3FD", "emoji": "👩🏿‍🤝‍👨🏽", "text": "", "type": 1, "order": 3186, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 3 ] }, { "label": "woman and man holding hands: dark skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FF-200D-1F91D-200D-1F468-1F3FE", "emoji": "👩🏿‍🤝‍👨🏾", "text": "", "type": 1, "order": 3187, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 4 ] } ] }, { "label": "men holding hands", "hexcode": "1F46C", "tags": [ "bae", "bestie", "bff", "boys", "brothers", "couple", "dating", "flirt", "friends", "hand", "hold", "men", "twins" ], "emoji": "👬", "text": "", "type": 1, "order": 3189, "group": 1, "subgroup": 30, "version": 1, "skins": [ { "label": "men holding hands: light skin tone", "hexcode": "1F46C-1F3FB", "emoji": "👬🏻", "text": "", "type": 1, "order": 3190, "group": 1, "subgroup": 30, "version": 12, "tone": 1 }, { "label": "men holding hands: medium-light skin tone", "hexcode": "1F46C-1F3FC", "emoji": "👬🏼", "text": "", "type": 1, "order": 3196, "group": 1, "subgroup": 30, "version": 12, "tone": 2 }, { "label": "men holding hands: medium skin tone", "hexcode": "1F46C-1F3FD", "emoji": "👬🏽", "text": "", "type": 1, "order": 3202, "group": 1, "subgroup": 30, "version": 12, "tone": 3 }, { "label": "men holding hands: medium-dark skin tone", "hexcode": "1F46C-1F3FE", "emoji": "👬🏾", "text": "", "type": 1, "order": 3208, "group": 1, "subgroup": 30, "version": 12, "tone": 4 }, { "label": "men holding hands: dark skin tone", "hexcode": "1F46C-1F3FF", "emoji": "👬🏿", "text": "", "type": 1, "order": 3214, "group": 1, "subgroup": 30, "version": 12, "tone": 5 }, { "label": "men holding hands: light skin tone, medium-light skin tone", "hexcode": "1F468-1F3FB-200D-1F91D-200D-1F468-1F3FC", "emoji": "👨🏻‍🤝‍👨🏼", "text": "", "type": 1, "order": 3191, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 2 ] }, { "label": "men holding hands: light skin tone, medium skin tone", "hexcode": "1F468-1F3FB-200D-1F91D-200D-1F468-1F3FD", "emoji": "👨🏻‍🤝‍👨🏽", "text": "", "type": 1, "order": 3192, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 3 ] }, { "label": "men holding hands: light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FB-200D-1F91D-200D-1F468-1F3FE", "emoji": "👨🏻‍🤝‍👨🏾", "text": "", "type": 1, "order": 3193, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 4 ] }, { "label": "men holding hands: light skin tone, dark skin tone", "hexcode": "1F468-1F3FB-200D-1F91D-200D-1F468-1F3FF", "emoji": "👨🏻‍🤝‍👨🏿", "text": "", "type": 1, "order": 3194, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 1, 5 ] }, { "label": "men holding hands: medium-light skin tone, light skin tone", "hexcode": "1F468-1F3FC-200D-1F91D-200D-1F468-1F3FB", "emoji": "👨🏼‍🤝‍👨🏻", "text": "", "type": 1, "order": 3195, "group": 1, "subgroup": 30, "version": 12, "tone": [ 2, 1 ] }, { "label": "men holding hands: medium-light skin tone, medium skin tone", "hexcode": "1F468-1F3FC-200D-1F91D-200D-1F468-1F3FD", "emoji": "👨🏼‍🤝‍👨🏽", "text": "", "type": 1, "order": 3197, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 3 ] }, { "label": "men holding hands: medium-light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FC-200D-1F91D-200D-1F468-1F3FE", "emoji": "👨🏼‍🤝‍👨🏾", "text": "", "type": 1, "order": 3198, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 4 ] }, { "label": "men holding hands: medium-light skin tone, dark skin tone", "hexcode": "1F468-1F3FC-200D-1F91D-200D-1F468-1F3FF", "emoji": "👨🏼‍🤝‍👨🏿", "text": "", "type": 1, "order": 3199, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 2, 5 ] }, { "label": "men holding hands: medium skin tone, light skin tone", "hexcode": "1F468-1F3FD-200D-1F91D-200D-1F468-1F3FB", "emoji": "👨🏽‍🤝‍👨🏻", "text": "", "type": 1, "order": 3200, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 1 ] }, { "label": "men holding hands: medium skin tone, medium-light skin tone", "hexcode": "1F468-1F3FD-200D-1F91D-200D-1F468-1F3FC", "emoji": "👨🏽‍🤝‍👨🏼", "text": "", "type": 1, "order": 3201, "group": 1, "subgroup": 30, "version": 12, "tone": [ 3, 2 ] }, { "label": "men holding hands: medium skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FD-200D-1F91D-200D-1F468-1F3FE", "emoji": "👨🏽‍🤝‍👨🏾", "text": "", "type": 1, "order": 3203, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 3, 4 ] }, { "label": "men holding hands: medium skin tone, dark skin tone", "hexcode": "1F468-1F3FD-200D-1F91D-200D-1F468-1F3FF", "emoji": "👨🏽‍🤝‍👨🏿", "text": "", "type": 1, "order": 3204, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 3, 5 ] }, { "label": "men holding hands: medium-dark skin tone, light skin tone", "hexcode": "1F468-1F3FE-200D-1F91D-200D-1F468-1F3FB", "emoji": "👨🏾‍🤝‍👨🏻", "text": "", "type": 1, "order": 3205, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 1 ] }, { "label": "men holding hands: medium-dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FE-200D-1F91D-200D-1F468-1F3FC", "emoji": "👨🏾‍🤝‍👨🏼", "text": "", "type": 1, "order": 3206, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 2 ] }, { "label": "men holding hands: medium-dark skin tone, medium skin tone", "hexcode": "1F468-1F3FE-200D-1F91D-200D-1F468-1F3FD", "emoji": "👨🏾‍🤝‍👨🏽", "text": "", "type": 1, "order": 3207, "group": 1, "subgroup": 30, "version": 12, "tone": [ 4, 3 ] }, { "label": "men holding hands: medium-dark skin tone, dark skin tone", "hexcode": "1F468-1F3FE-200D-1F91D-200D-1F468-1F3FF", "emoji": "👨🏾‍🤝‍👨🏿", "text": "", "type": 1, "order": 3209, "group": 1, "subgroup": 30, "version": 12.1, "tone": [ 4, 5 ] }, { "label": "men holding hands: dark skin tone, light skin tone", "hexcode": "1F468-1F3FF-200D-1F91D-200D-1F468-1F3FB", "emoji": "👨🏿‍🤝‍👨🏻", "text": "", "type": 1, "order": 3210, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 1 ] }, { "label": "men holding hands: dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FF-200D-1F91D-200D-1F468-1F3FC", "emoji": "👨🏿‍🤝‍👨🏼", "text": "", "type": 1, "order": 3211, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 2 ] }, { "label": "men holding hands: dark skin tone, medium skin tone", "hexcode": "1F468-1F3FF-200D-1F91D-200D-1F468-1F3FD", "emoji": "👨🏿‍🤝‍👨🏽", "text": "", "type": 1, "order": 3212, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 3 ] }, { "label": "men holding hands: dark skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FF-200D-1F91D-200D-1F468-1F3FE", "emoji": "👨🏿‍🤝‍👨🏾", "text": "", "type": 1, "order": 3213, "group": 1, "subgroup": 30, "version": 12, "tone": [ 5, 4 ] } ] }, { "label": "kiss", "hexcode": "1F48F", "tags": [ "anniversary", "babe", "bae", "couple", "date", "dating", "heart", "love", "mwah", "person", "romance", "together", "xoxo" ], "emoji": "💏", "text": "", "type": 1, "order": 3215, "group": 1, "subgroup": 30, "version": 0.6, "skins": [ { "label": "kiss: light skin tone", "hexcode": "1F48F-1F3FB", "emoji": "💏🏻", "text": "", "type": 1, "order": 3216, "group": 1, "subgroup": 30, "version": 13.1, "tone": 1 }, { "label": "kiss: medium-light skin tone", "hexcode": "1F48F-1F3FC", "emoji": "💏🏼", "text": "", "type": 1, "order": 3217, "group": 1, "subgroup": 30, "version": 13.1, "tone": 2 }, { "label": "kiss: medium skin tone", "hexcode": "1F48F-1F3FD", "emoji": "💏🏽", "text": "", "type": 1, "order": 3218, "group": 1, "subgroup": 30, "version": 13.1, "tone": 3 }, { "label": "kiss: medium-dark skin tone", "hexcode": "1F48F-1F3FE", "emoji": "💏🏾", "text": "", "type": 1, "order": 3219, "group": 1, "subgroup": 30, "version": 13.1, "tone": 4 }, { "label": "kiss: dark skin tone", "hexcode": "1F48F-1F3FF", "emoji": "💏🏿", "text": "", "type": 1, "order": 3220, "group": 1, "subgroup": 30, "version": 13.1, "tone": 5 }, { "label": "kiss: person, person, light skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FC", "emoji": "🧑🏻‍❤️‍💋‍🧑🏼", "text": "", "type": 1, "order": 3221, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 2 ] }, { "label": "kiss: person, person, light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FD", "emoji": "🧑🏻‍❤️‍💋‍🧑🏽", "text": "", "type": 1, "order": 3223, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 3 ] }, { "label": "kiss: person, person, light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FE", "emoji": "🧑🏻‍❤️‍💋‍🧑🏾", "text": "", "type": 1, "order": 3225, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 4 ] }, { "label": "kiss: person, person, light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FF", "emoji": "🧑🏻‍❤️‍💋‍🧑🏿", "text": "", "type": 1, "order": 3227, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 5 ] }, { "label": "kiss: person, person, medium-light skin tone, light skin tone", "hexcode": "1F9D1-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FB", "emoji": "🧑🏼‍❤️‍💋‍🧑🏻", "text": "", "type": 1, "order": 3229, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 1 ] }, { "label": "kiss: person, person, medium-light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FD", "emoji": "🧑🏼‍❤️‍💋‍🧑🏽", "text": "", "type": 1, "order": 3231, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 3 ] }, { "label": "kiss: person, person, medium-light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FE", "emoji": "🧑🏼‍❤️‍💋‍🧑🏾", "text": "", "type": 1, "order": 3233, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 4 ] }, { "label": "kiss: person, person, medium-light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FF", "emoji": "🧑🏼‍❤️‍💋‍🧑🏿", "text": "", "type": 1, "order": 3235, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 5 ] }, { "label": "kiss: person, person, medium skin tone, light skin tone", "hexcode": "1F9D1-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FB", "emoji": "🧑🏽‍❤️‍💋‍🧑🏻", "text": "", "type": 1, "order": 3237, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 1 ] }, { "label": "kiss: person, person, medium skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FC", "emoji": "🧑🏽‍❤️‍💋‍🧑🏼", "text": "", "type": 1, "order": 3239, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 2 ] }, { "label": "kiss: person, person, medium skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FE", "emoji": "🧑🏽‍❤️‍💋‍🧑🏾", "text": "", "type": 1, "order": 3241, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 4 ] }, { "label": "kiss: person, person, medium skin tone, dark skin tone", "hexcode": "1F9D1-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FF", "emoji": "🧑🏽‍❤️‍💋‍🧑🏿", "text": "", "type": 1, "order": 3243, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 5 ] }, { "label": "kiss: person, person, medium-dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FB", "emoji": "🧑🏾‍❤️‍💋‍🧑🏻", "text": "", "type": 1, "order": 3245, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 1 ] }, { "label": "kiss: person, person, medium-dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FC", "emoji": "🧑🏾‍❤️‍💋‍🧑🏼", "text": "", "type": 1, "order": 3247, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 2 ] }, { "label": "kiss: person, person, medium-dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FD", "emoji": "🧑🏾‍❤️‍💋‍🧑🏽", "text": "", "type": 1, "order": 3249, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 3 ] }, { "label": "kiss: person, person, medium-dark skin tone, dark skin tone", "hexcode": "1F9D1-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FF", "emoji": "🧑🏾‍❤️‍💋‍🧑🏿", "text": "", "type": 1, "order": 3251, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 5 ] }, { "label": "kiss: person, person, dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FB", "emoji": "🧑🏿‍❤️‍💋‍🧑🏻", "text": "", "type": 1, "order": 3253, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 1 ] }, { "label": "kiss: person, person, dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FC", "emoji": "🧑🏿‍❤️‍💋‍🧑🏼", "text": "", "type": 1, "order": 3255, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 2 ] }, { "label": "kiss: person, person, dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FD", "emoji": "🧑🏿‍❤️‍💋‍🧑🏽", "text": "", "type": 1, "order": 3257, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 3 ] }, { "label": "kiss: person, person, dark skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F9D1-1F3FE", "emoji": "🧑🏿‍❤️‍💋‍🧑🏾", "text": "", "type": 1, "order": 3259, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 4 ] } ] }, { "label": "kiss: woman, man", "hexcode": "1F469-200D-2764-FE0F-200D-1F48B-200D-1F468", "tags": [ "anniversary", "babe", "bae", "couple", "date", "dating", "heart", "kiss", "love", "man", "mwah", "person", "romance", "together", "woman", "xoxo" ], "emoji": "👩‍❤️‍💋‍👨", "text": "", "type": 1, "order": 3261, "group": 1, "subgroup": 30, "version": 2, "skins": [ { "label": "kiss: woman, man, light skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👩🏻‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3263, "group": 1, "subgroup": 30, "version": 13.1, "tone": 1 }, { "label": "kiss: woman, man, light skin tone, medium-light skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👩🏻‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3265, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 2 ] }, { "label": "kiss: woman, man, light skin tone, medium skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👩🏻‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3267, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 3 ] }, { "label": "kiss: woman, man, light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👩🏻‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3269, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 4 ] }, { "label": "kiss: woman, man, light skin tone, dark skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👩🏻‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3271, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 5 ] }, { "label": "kiss: woman, man, medium-light skin tone, light skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👩🏼‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3273, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 1 ] }, { "label": "kiss: woman, man, medium-light skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👩🏼‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3275, "group": 1, "subgroup": 30, "version": 13.1, "tone": 2 }, { "label": "kiss: woman, man, medium-light skin tone, medium skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👩🏼‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3277, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 3 ] }, { "label": "kiss: woman, man, medium-light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👩🏼‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3279, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 4 ] }, { "label": "kiss: woman, man, medium-light skin tone, dark skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👩🏼‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3281, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 5 ] }, { "label": "kiss: woman, man, medium skin tone, light skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👩🏽‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3283, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 1 ] }, { "label": "kiss: woman, man, medium skin tone, medium-light skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👩🏽‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3285, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 2 ] }, { "label": "kiss: woman, man, medium skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👩🏽‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3287, "group": 1, "subgroup": 30, "version": 13.1, "tone": 3 }, { "label": "kiss: woman, man, medium skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👩🏽‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3289, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 4 ] }, { "label": "kiss: woman, man, medium skin tone, dark skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👩🏽‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3291, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 5 ] }, { "label": "kiss: woman, man, medium-dark skin tone, light skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👩🏾‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3293, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 1 ] }, { "label": "kiss: woman, man, medium-dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👩🏾‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3295, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 2 ] }, { "label": "kiss: woman, man, medium-dark skin tone, medium skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👩🏾‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3297, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 3 ] }, { "label": "kiss: woman, man, medium-dark skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👩🏾‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3299, "group": 1, "subgroup": 30, "version": 13.1, "tone": 4 }, { "label": "kiss: woman, man, medium-dark skin tone, dark skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👩🏾‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3301, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 5 ] }, { "label": "kiss: woman, man, dark skin tone, light skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👩🏿‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3303, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 1 ] }, { "label": "kiss: woman, man, dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👩🏿‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3305, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 2 ] }, { "label": "kiss: woman, man, dark skin tone, medium skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👩🏿‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3307, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 3 ] }, { "label": "kiss: woman, man, dark skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👩🏿‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3309, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 4 ] }, { "label": "kiss: woman, man, dark skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👩🏿‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3311, "group": 1, "subgroup": 30, "version": 13.1, "tone": 5 } ] }, { "label": "kiss: man, man", "hexcode": "1F468-200D-2764-FE0F-200D-1F48B-200D-1F468", "tags": [ "anniversary", "babe", "bae", "couple", "date", "dating", "heart", "kiss", "love", "man", "mwah", "person", "romance", "together", "xoxo" ], "emoji": "👨‍❤️‍💋‍👨", "text": "", "type": 1, "order": 3313, "group": 1, "subgroup": 30, "version": 2, "skins": [ { "label": "kiss: man, man, light skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👨🏻‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3315, "group": 1, "subgroup": 30, "version": 13.1, "tone": 1 }, { "label": "kiss: man, man, light skin tone, medium-light skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👨🏻‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3317, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 2 ] }, { "label": "kiss: man, man, light skin tone, medium skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👨🏻‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3319, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 3 ] }, { "label": "kiss: man, man, light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👨🏻‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3321, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 4 ] }, { "label": "kiss: man, man, light skin tone, dark skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👨🏻‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3323, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 5 ] }, { "label": "kiss: man, man, medium-light skin tone, light skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👨🏼‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3325, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 1 ] }, { "label": "kiss: man, man, medium-light skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👨🏼‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3327, "group": 1, "subgroup": 30, "version": 13.1, "tone": 2 }, { "label": "kiss: man, man, medium-light skin tone, medium skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👨🏼‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3329, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 3 ] }, { "label": "kiss: man, man, medium-light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👨🏼‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3331, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 4 ] }, { "label": "kiss: man, man, medium-light skin tone, dark skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👨🏼‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3333, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 5 ] }, { "label": "kiss: man, man, medium skin tone, light skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👨🏽‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3335, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 1 ] }, { "label": "kiss: man, man, medium skin tone, medium-light skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👨🏽‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3337, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 2 ] }, { "label": "kiss: man, man, medium skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👨🏽‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3339, "group": 1, "subgroup": 30, "version": 13.1, "tone": 3 }, { "label": "kiss: man, man, medium skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👨🏽‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3341, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 4 ] }, { "label": "kiss: man, man, medium skin tone, dark skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👨🏽‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3343, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 5 ] }, { "label": "kiss: man, man, medium-dark skin tone, light skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👨🏾‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3345, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 1 ] }, { "label": "kiss: man, man, medium-dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👨🏾‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3347, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 2 ] }, { "label": "kiss: man, man, medium-dark skin tone, medium skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👨🏾‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3349, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 3 ] }, { "label": "kiss: man, man, medium-dark skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👨🏾‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3351, "group": 1, "subgroup": 30, "version": 13.1, "tone": 4 }, { "label": "kiss: man, man, medium-dark skin tone, dark skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👨🏾‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3353, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 5 ] }, { "label": "kiss: man, man, dark skin tone, light skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FB", "emoji": "👨🏿‍❤️‍💋‍👨🏻", "text": "", "type": 1, "order": 3355, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 1 ] }, { "label": "kiss: man, man, dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FC", "emoji": "👨🏿‍❤️‍💋‍👨🏼", "text": "", "type": 1, "order": 3357, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 2 ] }, { "label": "kiss: man, man, dark skin tone, medium skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FD", "emoji": "👨🏿‍❤️‍💋‍👨🏽", "text": "", "type": 1, "order": 3359, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 3 ] }, { "label": "kiss: man, man, dark skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FE", "emoji": "👨🏿‍❤️‍💋‍👨🏾", "text": "", "type": 1, "order": 3361, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 4 ] }, { "label": "kiss: man, man, dark skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F468-1F3FF", "emoji": "👨🏿‍❤️‍💋‍👨🏿", "text": "", "type": 1, "order": 3363, "group": 1, "subgroup": 30, "version": 13.1, "tone": 5 } ] }, { "label": "kiss: woman, woman", "hexcode": "1F469-200D-2764-FE0F-200D-1F48B-200D-1F469", "tags": [ "anniversary", "babe", "bae", "couple", "date", "dating", "heart", "kiss", "love", "mwah", "person", "romance", "together", "woman", "xoxo" ], "emoji": "👩‍❤️‍💋‍👩", "text": "", "type": 1, "order": 3365, "group": 1, "subgroup": 30, "version": 2, "skins": [ { "label": "kiss: woman, woman, light skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB", "emoji": "👩🏻‍❤️‍💋‍👩🏻", "text": "", "type": 1, "order": 3367, "group": 1, "subgroup": 30, "version": 13.1, "tone": 1 }, { "label": "kiss: woman, woman, light skin tone, medium-light skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC", "emoji": "👩🏻‍❤️‍💋‍👩🏼", "text": "", "type": 1, "order": 3369, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 2 ] }, { "label": "kiss: woman, woman, light skin tone, medium skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD", "emoji": "👩🏻‍❤️‍💋‍👩🏽", "text": "", "type": 1, "order": 3371, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 3 ] }, { "label": "kiss: woman, woman, light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE", "emoji": "👩🏻‍❤️‍💋‍👩🏾", "text": "", "type": 1, "order": 3373, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 4 ] }, { "label": "kiss: woman, woman, light skin tone, dark skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF", "emoji": "👩🏻‍❤️‍💋‍👩🏿", "text": "", "type": 1, "order": 3375, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 5 ] }, { "label": "kiss: woman, woman, medium-light skin tone, light skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB", "emoji": "👩🏼‍❤️‍💋‍👩🏻", "text": "", "type": 1, "order": 3377, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 1 ] }, { "label": "kiss: woman, woman, medium-light skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC", "emoji": "👩🏼‍❤️‍💋‍👩🏼", "text": "", "type": 1, "order": 3379, "group": 1, "subgroup": 30, "version": 13.1, "tone": 2 }, { "label": "kiss: woman, woman, medium-light skin tone, medium skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD", "emoji": "👩🏼‍❤️‍💋‍👩🏽", "text": "", "type": 1, "order": 3381, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 3 ] }, { "label": "kiss: woman, woman, medium-light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE", "emoji": "👩🏼‍❤️‍💋‍👩🏾", "text": "", "type": 1, "order": 3383, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 4 ] }, { "label": "kiss: woman, woman, medium-light skin tone, dark skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF", "emoji": "👩🏼‍❤️‍💋‍👩🏿", "text": "", "type": 1, "order": 3385, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 5 ] }, { "label": "kiss: woman, woman, medium skin tone, light skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB", "emoji": "👩🏽‍❤️‍💋‍👩🏻", "text": "", "type": 1, "order": 3387, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 1 ] }, { "label": "kiss: woman, woman, medium skin tone, medium-light skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC", "emoji": "👩🏽‍❤️‍💋‍👩🏼", "text": "", "type": 1, "order": 3389, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 2 ] }, { "label": "kiss: woman, woman, medium skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD", "emoji": "👩🏽‍❤️‍💋‍👩🏽", "text": "", "type": 1, "order": 3391, "group": 1, "subgroup": 30, "version": 13.1, "tone": 3 }, { "label": "kiss: woman, woman, medium skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE", "emoji": "👩🏽‍❤️‍💋‍👩🏾", "text": "", "type": 1, "order": 3393, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 4 ] }, { "label": "kiss: woman, woman, medium skin tone, dark skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF", "emoji": "👩🏽‍❤️‍💋‍👩🏿", "text": "", "type": 1, "order": 3395, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 5 ] }, { "label": "kiss: woman, woman, medium-dark skin tone, light skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB", "emoji": "👩🏾‍❤️‍💋‍👩🏻", "text": "", "type": 1, "order": 3397, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 1 ] }, { "label": "kiss: woman, woman, medium-dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC", "emoji": "👩🏾‍❤️‍💋‍👩🏼", "text": "", "type": 1, "order": 3399, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 2 ] }, { "label": "kiss: woman, woman, medium-dark skin tone, medium skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD", "emoji": "👩🏾‍❤️‍💋‍👩🏽", "text": "", "type": 1, "order": 3401, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 3 ] }, { "label": "kiss: woman, woman, medium-dark skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE", "emoji": "👩🏾‍❤️‍💋‍👩🏾", "text": "", "type": 1, "order": 3403, "group": 1, "subgroup": 30, "version": 13.1, "tone": 4 }, { "label": "kiss: woman, woman, medium-dark skin tone, dark skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF", "emoji": "👩🏾‍❤️‍💋‍👩🏿", "text": "", "type": 1, "order": 3405, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 5 ] }, { "label": "kiss: woman, woman, dark skin tone, light skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FB", "emoji": "👩🏿‍❤️‍💋‍👩🏻", "text": "", "type": 1, "order": 3407, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 1 ] }, { "label": "kiss: woman, woman, dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FC", "emoji": "👩🏿‍❤️‍💋‍👩🏼", "text": "", "type": 1, "order": 3409, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 2 ] }, { "label": "kiss: woman, woman, dark skin tone, medium skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FD", "emoji": "👩🏿‍❤️‍💋‍👩🏽", "text": "", "type": 1, "order": 3411, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 3 ] }, { "label": "kiss: woman, woman, dark skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FE", "emoji": "👩🏿‍❤️‍💋‍👩🏾", "text": "", "type": 1, "order": 3413, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 4 ] }, { "label": "kiss: woman, woman, dark skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F48B-200D-1F469-1F3FF", "emoji": "👩🏿‍❤️‍💋‍👩🏿", "text": "", "type": 1, "order": 3415, "group": 1, "subgroup": 30, "version": 13.1, "tone": 5 } ] }, { "label": "couple with heart", "hexcode": "1F491", "tags": [ "anniversary", "babe", "bae", "couple", "dating", "heart", "kiss", "love", "person", "relationship", "romance", "together", "you" ], "emoji": "💑", "text": "", "type": 1, "order": 3417, "group": 1, "subgroup": 30, "version": 0.6, "skins": [ { "label": "couple with heart: light skin tone", "hexcode": "1F491-1F3FB", "emoji": "💑🏻", "text": "", "type": 1, "order": 3418, "group": 1, "subgroup": 30, "version": 13.1, "tone": 1 }, { "label": "couple with heart: medium-light skin tone", "hexcode": "1F491-1F3FC", "emoji": "💑🏼", "text": "", "type": 1, "order": 3419, "group": 1, "subgroup": 30, "version": 13.1, "tone": 2 }, { "label": "couple with heart: medium skin tone", "hexcode": "1F491-1F3FD", "emoji": "💑🏽", "text": "", "type": 1, "order": 3420, "group": 1, "subgroup": 30, "version": 13.1, "tone": 3 }, { "label": "couple with heart: medium-dark skin tone", "hexcode": "1F491-1F3FE", "emoji": "💑🏾", "text": "", "type": 1, "order": 3421, "group": 1, "subgroup": 30, "version": 13.1, "tone": 4 }, { "label": "couple with heart: dark skin tone", "hexcode": "1F491-1F3FF", "emoji": "💑🏿", "text": "", "type": 1, "order": 3422, "group": 1, "subgroup": 30, "version": 13.1, "tone": 5 }, { "label": "couple with heart: person, person, light skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FB-200D-2764-FE0F-200D-1F9D1-1F3FC", "emoji": "🧑🏻‍❤️‍🧑🏼", "text": "", "type": 1, "order": 3423, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 2 ] }, { "label": "couple with heart: person, person, light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FB-200D-2764-FE0F-200D-1F9D1-1F3FD", "emoji": "🧑🏻‍❤️‍🧑🏽", "text": "", "type": 1, "order": 3425, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 3 ] }, { "label": "couple with heart: person, person, light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FB-200D-2764-FE0F-200D-1F9D1-1F3FE", "emoji": "🧑🏻‍❤️‍🧑🏾", "text": "", "type": 1, "order": 3427, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 4 ] }, { "label": "couple with heart: person, person, light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FB-200D-2764-FE0F-200D-1F9D1-1F3FF", "emoji": "🧑🏻‍❤️‍🧑🏿", "text": "", "type": 1, "order": 3429, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 5 ] }, { "label": "couple with heart: person, person, medium-light skin tone, light skin tone", "hexcode": "1F9D1-1F3FC-200D-2764-FE0F-200D-1F9D1-1F3FB", "emoji": "🧑🏼‍❤️‍🧑🏻", "text": "", "type": 1, "order": 3431, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 1 ] }, { "label": "couple with heart: person, person, medium-light skin tone, medium skin tone", "hexcode": "1F9D1-1F3FC-200D-2764-FE0F-200D-1F9D1-1F3FD", "emoji": "🧑🏼‍❤️‍🧑🏽", "text": "", "type": 1, "order": 3433, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 3 ] }, { "label": "couple with heart: person, person, medium-light skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FC-200D-2764-FE0F-200D-1F9D1-1F3FE", "emoji": "🧑🏼‍❤️‍🧑🏾", "text": "", "type": 1, "order": 3435, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 4 ] }, { "label": "couple with heart: person, person, medium-light skin tone, dark skin tone", "hexcode": "1F9D1-1F3FC-200D-2764-FE0F-200D-1F9D1-1F3FF", "emoji": "🧑🏼‍❤️‍🧑🏿", "text": "", "type": 1, "order": 3437, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 5 ] }, { "label": "couple with heart: person, person, medium skin tone, light skin tone", "hexcode": "1F9D1-1F3FD-200D-2764-FE0F-200D-1F9D1-1F3FB", "emoji": "🧑🏽‍❤️‍🧑🏻", "text": "", "type": 1, "order": 3439, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 1 ] }, { "label": "couple with heart: person, person, medium skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FD-200D-2764-FE0F-200D-1F9D1-1F3FC", "emoji": "🧑🏽‍❤️‍🧑🏼", "text": "", "type": 1, "order": 3441, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 2 ] }, { "label": "couple with heart: person, person, medium skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FD-200D-2764-FE0F-200D-1F9D1-1F3FE", "emoji": "🧑🏽‍❤️‍🧑🏾", "text": "", "type": 1, "order": 3443, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 4 ] }, { "label": "couple with heart: person, person, medium skin tone, dark skin tone", "hexcode": "1F9D1-1F3FD-200D-2764-FE0F-200D-1F9D1-1F3FF", "emoji": "🧑🏽‍❤️‍🧑🏿", "text": "", "type": 1, "order": 3445, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 5 ] }, { "label": "couple with heart: person, person, medium-dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FE-200D-2764-FE0F-200D-1F9D1-1F3FB", "emoji": "🧑🏾‍❤️‍🧑🏻", "text": "", "type": 1, "order": 3447, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 1 ] }, { "label": "couple with heart: person, person, medium-dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FE-200D-2764-FE0F-200D-1F9D1-1F3FC", "emoji": "🧑🏾‍❤️‍🧑🏼", "text": "", "type": 1, "order": 3449, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 2 ] }, { "label": "couple with heart: person, person, medium-dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FE-200D-2764-FE0F-200D-1F9D1-1F3FD", "emoji": "🧑🏾‍❤️‍🧑🏽", "text": "", "type": 1, "order": 3451, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 3 ] }, { "label": "couple with heart: person, person, medium-dark skin tone, dark skin tone", "hexcode": "1F9D1-1F3FE-200D-2764-FE0F-200D-1F9D1-1F3FF", "emoji": "🧑🏾‍❤️‍🧑🏿", "text": "", "type": 1, "order": 3453, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 5 ] }, { "label": "couple with heart: person, person, dark skin tone, light skin tone", "hexcode": "1F9D1-1F3FF-200D-2764-FE0F-200D-1F9D1-1F3FB", "emoji": "🧑🏿‍❤️‍🧑🏻", "text": "", "type": 1, "order": 3455, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 1 ] }, { "label": "couple with heart: person, person, dark skin tone, medium-light skin tone", "hexcode": "1F9D1-1F3FF-200D-2764-FE0F-200D-1F9D1-1F3FC", "emoji": "🧑🏿‍❤️‍🧑🏼", "text": "", "type": 1, "order": 3457, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 2 ] }, { "label": "couple with heart: person, person, dark skin tone, medium skin tone", "hexcode": "1F9D1-1F3FF-200D-2764-FE0F-200D-1F9D1-1F3FD", "emoji": "🧑🏿‍❤️‍🧑🏽", "text": "", "type": 1, "order": 3459, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 3 ] }, { "label": "couple with heart: person, person, dark skin tone, medium-dark skin tone", "hexcode": "1F9D1-1F3FF-200D-2764-FE0F-200D-1F9D1-1F3FE", "emoji": "🧑🏿‍❤️‍🧑🏾", "text": "", "type": 1, "order": 3461, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 4 ] } ] }, { "label": "couple with heart: woman, man", "hexcode": "1F469-200D-2764-FE0F-200D-1F468", "tags": [ "anniversary", "babe", "bae", "couple", "dating", "heart", "kiss", "love", "man", "person", "relationship", "romance", "together", "woman", "you" ], "emoji": "👩‍❤️‍👨", "text": "", "type": 1, "order": 3463, "group": 1, "subgroup": 30, "version": 2, "skins": [ { "label": "couple with heart: woman, man, light skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👩🏻‍❤️‍👨🏻", "text": "", "type": 1, "order": 3465, "group": 1, "subgroup": 30, "version": 13.1, "tone": 1 }, { "label": "couple with heart: woman, man, light skin tone, medium-light skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👩🏻‍❤️‍👨🏼", "text": "", "type": 1, "order": 3467, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 2 ] }, { "label": "couple with heart: woman, man, light skin tone, medium skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👩🏻‍❤️‍👨🏽", "text": "", "type": 1, "order": 3469, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 3 ] }, { "label": "couple with heart: woman, man, light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👩🏻‍❤️‍👨🏾", "text": "", "type": 1, "order": 3471, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 4 ] }, { "label": "couple with heart: woman, man, light skin tone, dark skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👩🏻‍❤️‍👨🏿", "text": "", "type": 1, "order": 3473, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 5 ] }, { "label": "couple with heart: woman, man, medium-light skin tone, light skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👩🏼‍❤️‍👨🏻", "text": "", "type": 1, "order": 3475, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 1 ] }, { "label": "couple with heart: woman, man, medium-light skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👩🏼‍❤️‍👨🏼", "text": "", "type": 1, "order": 3477, "group": 1, "subgroup": 30, "version": 13.1, "tone": 2 }, { "label": "couple with heart: woman, man, medium-light skin tone, medium skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👩🏼‍❤️‍👨🏽", "text": "", "type": 1, "order": 3479, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 3 ] }, { "label": "couple with heart: woman, man, medium-light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👩🏼‍❤️‍👨🏾", "text": "", "type": 1, "order": 3481, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 4 ] }, { "label": "couple with heart: woman, man, medium-light skin tone, dark skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👩🏼‍❤️‍👨🏿", "text": "", "type": 1, "order": 3483, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 5 ] }, { "label": "couple with heart: woman, man, medium skin tone, light skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👩🏽‍❤️‍👨🏻", "text": "", "type": 1, "order": 3485, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 1 ] }, { "label": "couple with heart: woman, man, medium skin tone, medium-light skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👩🏽‍❤️‍👨🏼", "text": "", "type": 1, "order": 3487, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 2 ] }, { "label": "couple with heart: woman, man, medium skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👩🏽‍❤️‍👨🏽", "text": "", "type": 1, "order": 3489, "group": 1, "subgroup": 30, "version": 13.1, "tone": 3 }, { "label": "couple with heart: woman, man, medium skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👩🏽‍❤️‍👨🏾", "text": "", "type": 1, "order": 3491, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 4 ] }, { "label": "couple with heart: woman, man, medium skin tone, dark skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👩🏽‍❤️‍👨🏿", "text": "", "type": 1, "order": 3493, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 5 ] }, { "label": "couple with heart: woman, man, medium-dark skin tone, light skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👩🏾‍❤️‍👨🏻", "text": "", "type": 1, "order": 3495, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 1 ] }, { "label": "couple with heart: woman, man, medium-dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👩🏾‍❤️‍👨🏼", "text": "", "type": 1, "order": 3497, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 2 ] }, { "label": "couple with heart: woman, man, medium-dark skin tone, medium skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👩🏾‍❤️‍👨🏽", "text": "", "type": 1, "order": 3499, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 3 ] }, { "label": "couple with heart: woman, man, medium-dark skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👩🏾‍❤️‍👨🏾", "text": "", "type": 1, "order": 3501, "group": 1, "subgroup": 30, "version": 13.1, "tone": 4 }, { "label": "couple with heart: woman, man, medium-dark skin tone, dark skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👩🏾‍❤️‍👨🏿", "text": "", "type": 1, "order": 3503, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 5 ] }, { "label": "couple with heart: woman, man, dark skin tone, light skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👩🏿‍❤️‍👨🏻", "text": "", "type": 1, "order": 3505, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 1 ] }, { "label": "couple with heart: woman, man, dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👩🏿‍❤️‍👨🏼", "text": "", "type": 1, "order": 3507, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 2 ] }, { "label": "couple with heart: woman, man, dark skin tone, medium skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👩🏿‍❤️‍👨🏽", "text": "", "type": 1, "order": 3509, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 3 ] }, { "label": "couple with heart: woman, man, dark skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👩🏿‍❤️‍👨🏾", "text": "", "type": 1, "order": 3511, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 4 ] }, { "label": "couple with heart: woman, man, dark skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👩🏿‍❤️‍👨🏿", "text": "", "type": 1, "order": 3513, "group": 1, "subgroup": 30, "version": 13.1, "tone": 5 } ] }, { "label": "couple with heart: man, man", "hexcode": "1F468-200D-2764-FE0F-200D-1F468", "tags": [ "anniversary", "babe", "bae", "couple", "dating", "heart", "kiss", "love", "man", "person", "relationship", "romance", "together", "you" ], "emoji": "👨‍❤️‍👨", "text": "", "type": 1, "order": 3515, "group": 1, "subgroup": 30, "version": 2, "skins": [ { "label": "couple with heart: man, man, light skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👨🏻‍❤️‍👨🏻", "text": "", "type": 1, "order": 3517, "group": 1, "subgroup": 30, "version": 13.1, "tone": 1 }, { "label": "couple with heart: man, man, light skin tone, medium-light skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👨🏻‍❤️‍👨🏼", "text": "", "type": 1, "order": 3519, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 2 ] }, { "label": "couple with heart: man, man, light skin tone, medium skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👨🏻‍❤️‍👨🏽", "text": "", "type": 1, "order": 3521, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 3 ] }, { "label": "couple with heart: man, man, light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👨🏻‍❤️‍👨🏾", "text": "", "type": 1, "order": 3523, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 4 ] }, { "label": "couple with heart: man, man, light skin tone, dark skin tone", "hexcode": "1F468-1F3FB-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👨🏻‍❤️‍👨🏿", "text": "", "type": 1, "order": 3525, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 5 ] }, { "label": "couple with heart: man, man, medium-light skin tone, light skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👨🏼‍❤️‍👨🏻", "text": "", "type": 1, "order": 3527, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 1 ] }, { "label": "couple with heart: man, man, medium-light skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👨🏼‍❤️‍👨🏼", "text": "", "type": 1, "order": 3529, "group": 1, "subgroup": 30, "version": 13.1, "tone": 2 }, { "label": "couple with heart: man, man, medium-light skin tone, medium skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👨🏼‍❤️‍👨🏽", "text": "", "type": 1, "order": 3531, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 3 ] }, { "label": "couple with heart: man, man, medium-light skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👨🏼‍❤️‍👨🏾", "text": "", "type": 1, "order": 3533, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 4 ] }, { "label": "couple with heart: man, man, medium-light skin tone, dark skin tone", "hexcode": "1F468-1F3FC-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👨🏼‍❤️‍👨🏿", "text": "", "type": 1, "order": 3535, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 5 ] }, { "label": "couple with heart: man, man, medium skin tone, light skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👨🏽‍❤️‍👨🏻", "text": "", "type": 1, "order": 3537, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 1 ] }, { "label": "couple with heart: man, man, medium skin tone, medium-light skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👨🏽‍❤️‍👨🏼", "text": "", "type": 1, "order": 3539, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 2 ] }, { "label": "couple with heart: man, man, medium skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👨🏽‍❤️‍👨🏽", "text": "", "type": 1, "order": 3541, "group": 1, "subgroup": 30, "version": 13.1, "tone": 3 }, { "label": "couple with heart: man, man, medium skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👨🏽‍❤️‍👨🏾", "text": "", "type": 1, "order": 3543, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 4 ] }, { "label": "couple with heart: man, man, medium skin tone, dark skin tone", "hexcode": "1F468-1F3FD-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👨🏽‍❤️‍👨🏿", "text": "", "type": 1, "order": 3545, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 5 ] }, { "label": "couple with heart: man, man, medium-dark skin tone, light skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👨🏾‍❤️‍👨🏻", "text": "", "type": 1, "order": 3547, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 1 ] }, { "label": "couple with heart: man, man, medium-dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👨🏾‍❤️‍👨🏼", "text": "", "type": 1, "order": 3549, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 2 ] }, { "label": "couple with heart: man, man, medium-dark skin tone, medium skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👨🏾‍❤️‍👨🏽", "text": "", "type": 1, "order": 3551, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 3 ] }, { "label": "couple with heart: man, man, medium-dark skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👨🏾‍❤️‍👨🏾", "text": "", "type": 1, "order": 3553, "group": 1, "subgroup": 30, "version": 13.1, "tone": 4 }, { "label": "couple with heart: man, man, medium-dark skin tone, dark skin tone", "hexcode": "1F468-1F3FE-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👨🏾‍❤️‍👨🏿", "text": "", "type": 1, "order": 3555, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 5 ] }, { "label": "couple with heart: man, man, dark skin tone, light skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FB", "emoji": "👨🏿‍❤️‍👨🏻", "text": "", "type": 1, "order": 3557, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 1 ] }, { "label": "couple with heart: man, man, dark skin tone, medium-light skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FC", "emoji": "👨🏿‍❤️‍👨🏼", "text": "", "type": 1, "order": 3559, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 2 ] }, { "label": "couple with heart: man, man, dark skin tone, medium skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FD", "emoji": "👨🏿‍❤️‍👨🏽", "text": "", "type": 1, "order": 3561, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 3 ] }, { "label": "couple with heart: man, man, dark skin tone, medium-dark skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FE", "emoji": "👨🏿‍❤️‍👨🏾", "text": "", "type": 1, "order": 3563, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 4 ] }, { "label": "couple with heart: man, man, dark skin tone", "hexcode": "1F468-1F3FF-200D-2764-FE0F-200D-1F468-1F3FF", "emoji": "👨🏿‍❤️‍👨🏿", "text": "", "type": 1, "order": 3565, "group": 1, "subgroup": 30, "version": 13.1, "tone": 5 } ] }, { "label": "couple with heart: woman, woman", "hexcode": "1F469-200D-2764-FE0F-200D-1F469", "tags": [ "anniversary", "babe", "bae", "couple", "dating", "heart", "kiss", "love", "person", "relationship", "romance", "together", "woman", "you" ], "emoji": "👩‍❤️‍👩", "text": "", "type": 1, "order": 3567, "group": 1, "subgroup": 30, "version": 2, "skins": [ { "label": "couple with heart: woman, woman, light skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FB", "emoji": "👩🏻‍❤️‍👩🏻", "text": "", "type": 1, "order": 3569, "group": 1, "subgroup": 30, "version": 13.1, "tone": 1 }, { "label": "couple with heart: woman, woman, light skin tone, medium-light skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FC", "emoji": "👩🏻‍❤️‍👩🏼", "text": "", "type": 1, "order": 3571, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 2 ] }, { "label": "couple with heart: woman, woman, light skin tone, medium skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FD", "emoji": "👩🏻‍❤️‍👩🏽", "text": "", "type": 1, "order": 3573, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 3 ] }, { "label": "couple with heart: woman, woman, light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FE", "emoji": "👩🏻‍❤️‍👩🏾", "text": "", "type": 1, "order": 3575, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 4 ] }, { "label": "couple with heart: woman, woman, light skin tone, dark skin tone", "hexcode": "1F469-1F3FB-200D-2764-FE0F-200D-1F469-1F3FF", "emoji": "👩🏻‍❤️‍👩🏿", "text": "", "type": 1, "order": 3577, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 1, 5 ] }, { "label": "couple with heart: woman, woman, medium-light skin tone, light skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FB", "emoji": "👩🏼‍❤️‍👩🏻", "text": "", "type": 1, "order": 3579, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 1 ] }, { "label": "couple with heart: woman, woman, medium-light skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FC", "emoji": "👩🏼‍❤️‍👩🏼", "text": "", "type": 1, "order": 3581, "group": 1, "subgroup": 30, "version": 13.1, "tone": 2 }, { "label": "couple with heart: woman, woman, medium-light skin tone, medium skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FD", "emoji": "👩🏼‍❤️‍👩🏽", "text": "", "type": 1, "order": 3583, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 3 ] }, { "label": "couple with heart: woman, woman, medium-light skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FE", "emoji": "👩🏼‍❤️‍👩🏾", "text": "", "type": 1, "order": 3585, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 4 ] }, { "label": "couple with heart: woman, woman, medium-light skin tone, dark skin tone", "hexcode": "1F469-1F3FC-200D-2764-FE0F-200D-1F469-1F3FF", "emoji": "👩🏼‍❤️‍👩🏿", "text": "", "type": 1, "order": 3587, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 2, 5 ] }, { "label": "couple with heart: woman, woman, medium skin tone, light skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FB", "emoji": "👩🏽‍❤️‍👩🏻", "text": "", "type": 1, "order": 3589, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 1 ] }, { "label": "couple with heart: woman, woman, medium skin tone, medium-light skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FC", "emoji": "👩🏽‍❤️‍👩🏼", "text": "", "type": 1, "order": 3591, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 2 ] }, { "label": "couple with heart: woman, woman, medium skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FD", "emoji": "👩🏽‍❤️‍👩🏽", "text": "", "type": 1, "order": 3593, "group": 1, "subgroup": 30, "version": 13.1, "tone": 3 }, { "label": "couple with heart: woman, woman, medium skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FE", "emoji": "👩🏽‍❤️‍👩🏾", "text": "", "type": 1, "order": 3595, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 4 ] }, { "label": "couple with heart: woman, woman, medium skin tone, dark skin tone", "hexcode": "1F469-1F3FD-200D-2764-FE0F-200D-1F469-1F3FF", "emoji": "👩🏽‍❤️‍👩🏿", "text": "", "type": 1, "order": 3597, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 3, 5 ] }, { "label": "couple with heart: woman, woman, medium-dark skin tone, light skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FB", "emoji": "👩🏾‍❤️‍👩🏻", "text": "", "type": 1, "order": 3599, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 1 ] }, { "label": "couple with heart: woman, woman, medium-dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FC", "emoji": "👩🏾‍❤️‍👩🏼", "text": "", "type": 1, "order": 3601, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 2 ] }, { "label": "couple with heart: woman, woman, medium-dark skin tone, medium skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FD", "emoji": "👩🏾‍❤️‍👩🏽", "text": "", "type": 1, "order": 3603, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 3 ] }, { "label": "couple with heart: woman, woman, medium-dark skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FE", "emoji": "👩🏾‍❤️‍👩🏾", "text": "", "type": 1, "order": 3605, "group": 1, "subgroup": 30, "version": 13.1, "tone": 4 }, { "label": "couple with heart: woman, woman, medium-dark skin tone, dark skin tone", "hexcode": "1F469-1F3FE-200D-2764-FE0F-200D-1F469-1F3FF", "emoji": "👩🏾‍❤️‍👩🏿", "text": "", "type": 1, "order": 3607, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 4, 5 ] }, { "label": "couple with heart: woman, woman, dark skin tone, light skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FB", "emoji": "👩🏿‍❤️‍👩🏻", "text": "", "type": 1, "order": 3609, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 1 ] }, { "label": "couple with heart: woman, woman, dark skin tone, medium-light skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FC", "emoji": "👩🏿‍❤️‍👩🏼", "text": "", "type": 1, "order": 3611, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 2 ] }, { "label": "couple with heart: woman, woman, dark skin tone, medium skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FD", "emoji": "👩🏿‍❤️‍👩🏽", "text": "", "type": 1, "order": 3613, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 3 ] }, { "label": "couple with heart: woman, woman, dark skin tone, medium-dark skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FE", "emoji": "👩🏿‍❤️‍👩🏾", "text": "", "type": 1, "order": 3615, "group": 1, "subgroup": 30, "version": 13.1, "tone": [ 5, 4 ] }, { "label": "couple with heart: woman, woman, dark skin tone", "hexcode": "1F469-1F3FF-200D-2764-FE0F-200D-1F469-1F3FF", "emoji": "👩🏿‍❤️‍👩🏿", "text": "", "type": 1, "order": 3617, "group": 1, "subgroup": 30, "version": 13.1, "tone": 5 } ] }, { "label": "family: man, woman, boy", "hexcode": "1F468-200D-1F469-200D-1F466", "tags": [ "boy", "child", "family", "man", "woman" ], "emoji": "👨‍👩‍👦", "text": "", "type": 1, "order": 3619, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, woman, girl", "hexcode": "1F468-200D-1F469-200D-1F467", "tags": [ "child", "family", "girl", "man", "woman" ], "emoji": "👨‍👩‍👧", "text": "", "type": 1, "order": 3620, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, woman, girl, boy", "hexcode": "1F468-200D-1F469-200D-1F467-200D-1F466", "tags": [ "boy", "child", "family", "girl", "man", "woman" ], "emoji": "👨‍👩‍👧‍👦", "text": "", "type": 1, "order": 3621, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, woman, boy, boy", "hexcode": "1F468-200D-1F469-200D-1F466-200D-1F466", "tags": [ "boy", "child", "family", "man", "woman" ], "emoji": "👨‍👩‍👦‍👦", "text": "", "type": 1, "order": 3622, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, woman, girl, girl", "hexcode": "1F468-200D-1F469-200D-1F467-200D-1F467", "tags": [ "child", "family", "girl", "man", "woman" ], "emoji": "👨‍👩‍👧‍👧", "text": "", "type": 1, "order": 3623, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, man, boy", "hexcode": "1F468-200D-1F468-200D-1F466", "tags": [ "boy", "child", "family", "man" ], "emoji": "👨‍👨‍👦", "text": "", "type": 1, "order": 3624, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, man, girl", "hexcode": "1F468-200D-1F468-200D-1F467", "tags": [ "child", "family", "girl", "man" ], "emoji": "👨‍👨‍👧", "text": "", "type": 1, "order": 3625, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, man, girl, boy", "hexcode": "1F468-200D-1F468-200D-1F467-200D-1F466", "tags": [ "boy", "child", "family", "girl", "man" ], "emoji": "👨‍👨‍👧‍👦", "text": "", "type": 1, "order": 3626, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, man, boy, boy", "hexcode": "1F468-200D-1F468-200D-1F466-200D-1F466", "tags": [ "boy", "child", "family", "man" ], "emoji": "👨‍👨‍👦‍👦", "text": "", "type": 1, "order": 3627, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, man, girl, girl", "hexcode": "1F468-200D-1F468-200D-1F467-200D-1F467", "tags": [ "child", "family", "girl", "man" ], "emoji": "👨‍👨‍👧‍👧", "text": "", "type": 1, "order": 3628, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: woman, woman, boy", "hexcode": "1F469-200D-1F469-200D-1F466", "tags": [ "boy", "child", "family", "woman" ], "emoji": "👩‍👩‍👦", "text": "", "type": 1, "order": 3629, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: woman, woman, girl", "hexcode": "1F469-200D-1F469-200D-1F467", "tags": [ "child", "family", "girl", "woman" ], "emoji": "👩‍👩‍👧", "text": "", "type": 1, "order": 3630, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: woman, woman, girl, boy", "hexcode": "1F469-200D-1F469-200D-1F467-200D-1F466", "tags": [ "boy", "child", "family", "girl", "woman" ], "emoji": "👩‍👩‍👧‍👦", "text": "", "type": 1, "order": 3631, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: woman, woman, boy, boy", "hexcode": "1F469-200D-1F469-200D-1F466-200D-1F466", "tags": [ "boy", "child", "family", "woman" ], "emoji": "👩‍👩‍👦‍👦", "text": "", "type": 1, "order": 3632, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: woman, woman, girl, girl", "hexcode": "1F469-200D-1F469-200D-1F467-200D-1F467", "tags": [ "child", "family", "girl", "woman" ], "emoji": "👩‍👩‍👧‍👧", "text": "", "type": 1, "order": 3633, "group": 1, "subgroup": 30, "version": 2 }, { "label": "family: man, boy", "hexcode": "1F468-200D-1F466", "tags": [ "boy", "child", "family", "man" ], "emoji": "👨‍👦", "text": "", "type": 1, "order": 3634, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: man, boy, boy", "hexcode": "1F468-200D-1F466-200D-1F466", "tags": [ "boy", "child", "family", "man" ], "emoji": "👨‍👦‍👦", "text": "", "type": 1, "order": 3635, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: man, girl", "hexcode": "1F468-200D-1F467", "tags": [ "child", "family", "girl", "man" ], "emoji": "👨‍👧", "text": "", "type": 1, "order": 3636, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: man, girl, boy", "hexcode": "1F468-200D-1F467-200D-1F466", "tags": [ "boy", "child", "family", "girl", "man" ], "emoji": "👨‍👧‍👦", "text": "", "type": 1, "order": 3637, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: man, girl, girl", "hexcode": "1F468-200D-1F467-200D-1F467", "tags": [ "child", "family", "girl", "man" ], "emoji": "👨‍👧‍👧", "text": "", "type": 1, "order": 3638, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: woman, boy", "hexcode": "1F469-200D-1F466", "tags": [ "boy", "child", "family", "woman" ], "emoji": "👩‍👦", "text": "", "type": 1, "order": 3639, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: woman, boy, boy", "hexcode": "1F469-200D-1F466-200D-1F466", "tags": [ "boy", "child", "family", "woman" ], "emoji": "👩‍👦‍👦", "text": "", "type": 1, "order": 3640, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: woman, girl", "hexcode": "1F469-200D-1F467", "tags": [ "child", "family", "girl", "woman" ], "emoji": "👩‍👧", "text": "", "type": 1, "order": 3641, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: woman, girl, boy", "hexcode": "1F469-200D-1F467-200D-1F466", "tags": [ "boy", "child", "family", "girl", "woman" ], "emoji": "👩‍👧‍👦", "text": "", "type": 1, "order": 3642, "group": 1, "subgroup": 30, "version": 4 }, { "label": "family: woman, girl, girl", "hexcode": "1F469-200D-1F467-200D-1F467", "tags": [ "child", "family", "girl", "woman" ], "emoji": "👩‍👧‍👧", "text": "", "type": 1, "order": 3643, "group": 1, "subgroup": 30, "version": 4 }, { "label": "speaking head", "hexcode": "1F5E3", "tags": [ "face", "head", "silhouette", "speak", "speaking" ], "emoji": "🗣️", "text": "🗣︎", "type": 0, "order": 3645, "group": 1, "subgroup": 31, "version": 0.7 }, { "label": "bust in silhouette", "hexcode": "1F464", "tags": [ "bust", "mysterious", "shadow", "silhouette" ], "emoji": "👤", "text": "", "type": 1, "order": 3646, "group": 1, "subgroup": 31, "version": 0.6 }, { "label": "busts in silhouette", "hexcode": "1F465", "tags": [ "bff", "bust", "busts", "everyone", "friend", "friends", "people", "silhouette" ], "emoji": "👥", "text": "", "type": 1, "order": 3647, "group": 1, "subgroup": 31, "version": 1 }, { "label": "people hugging", "hexcode": "1FAC2", "tags": [ "comfort", "embrace", "farewell", "friendship", "goodbye", "hello", "hug", "hugging", "love", "people", "thanks" ], "emoji": "🫂", "text": "", "type": 1, "order": 3648, "group": 1, "subgroup": 31, "version": 13 }, { "label": "family", "hexcode": "1F46A", "tags": [ "child" ], "emoji": "👪️", "text": "👪︎", "type": 1, "order": 3649, "group": 1, "subgroup": 31, "version": 0.6 }, { "label": "family: adult, adult, child", "hexcode": "1F9D1-200D-1F9D1-200D-1F9D2", "tags": [ "adult", "child", "family" ], "emoji": "🧑‍🧑‍🧒", "text": "", "type": 1, "order": 3650, "group": 1, "subgroup": 31, "version": 15.1 }, { "label": "family: adult, adult, child, child", "hexcode": "1F9D1-200D-1F9D1-200D-1F9D2-200D-1F9D2", "tags": [ "adult", "child", "family" ], "emoji": "🧑‍🧑‍🧒‍🧒", "text": "", "type": 1, "order": 3651, "group": 1, "subgroup": 31, "version": 15.1 }, { "label": "family: adult, child", "hexcode": "1F9D1-200D-1F9D2", "tags": [ "adult", "child", "family" ], "emoji": "🧑‍🧒", "text": "", "type": 1, "order": 3652, "group": 1, "subgroup": 31, "version": 15.1 }, { "label": "family: adult, child, child", "hexcode": "1F9D1-200D-1F9D2-200D-1F9D2", "tags": [ "adult", "child", "family" ], "emoji": "🧑‍🧒‍🧒", "text": "", "type": 1, "order": 3653, "group": 1, "subgroup": 31, "version": 15.1 }, { "label": "footprints", "hexcode": "1F463", "tags": [ "barefoot", "clothing", "footprint", "omw", "print", "walk" ], "emoji": "👣", "text": "", "type": 1, "order": 3654, "group": 1, "subgroup": 31, "version": 0.6 }, { "label": "fingerprint", "hexcode": "1FAC6", "tags": [ "clue", "crime", "detective", "forensics", "identity", "mystery", "print", "safety", "trace" ], "emoji": "🫆", "text": "", "type": 1, "order": 3655, "group": 1, "subgroup": 31, "version": 16 }, { "label": "light skin tone", "hexcode": "1F3FB", "tags": [ "1–2", "light", "skin", "tone", "type" ], "emoji": "🏻", "text": "", "type": 1, "order": 3656, "group": 2, "subgroup": 32, "version": 1 }, { "label": "medium-light skin tone", "hexcode": "1F3FC", "tags": [ "3", "medium-light", "skin", "tone", "type" ], "emoji": "🏼", "text": "", "type": 1, "order": 3657, "group": 2, "subgroup": 32, "version": 1 }, { "label": "medium skin tone", "hexcode": "1F3FD", "tags": [ "4", "medium", "skin", "tone", "type" ], "emoji": "🏽", "text": "", "type": 1, "order": 3658, "group": 2, "subgroup": 32, "version": 1 }, { "label": "medium-dark skin tone", "hexcode": "1F3FE", "tags": [ "5", "medium-dark", "skin", "tone", "type" ], "emoji": "🏾", "text": "", "type": 1, "order": 3659, "group": 2, "subgroup": 32, "version": 1 }, { "label": "dark skin tone", "hexcode": "1F3FF", "tags": [ "6", "dark", "skin", "tone", "type" ], "emoji": "🏿", "text": "", "type": 1, "order": 3660, "group": 2, "subgroup": 32, "version": 1 }, { "label": "red hair", "hexcode": "1F9B0", "tags": [ "ginger", "hair", "red", "redhead" ], "emoji": "🦰", "text": "", "type": 1, "order": 3661, "group": 2, "subgroup": 33, "version": 11 }, { "label": "curly hair", "hexcode": "1F9B1", "tags": [ "afro", "curly", "hair", "ringlets" ], "emoji": "🦱", "text": "", "type": 1, "order": 3662, "group": 2, "subgroup": 33, "version": 11 }, { "label": "white hair", "hexcode": "1F9B3", "tags": [ "gray", "hair", "old", "white" ], "emoji": "🦳", "text": "", "type": 1, "order": 3663, "group": 2, "subgroup": 33, "version": 11 }, { "label": "bald", "hexcode": "1F9B2", "tags": [ "chemotherapy", "hair", "hairless", "no", "shaven" ], "emoji": "🦲", "text": "", "type": 1, "order": 3664, "group": 2, "subgroup": 33, "version": 11 }, { "label": "monkey face", "hexcode": "1F435", "tags": [ "animal", "banana", "face", "monkey" ], "emoji": "🐵", "text": "", "type": 1, "order": 3665, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "monkey", "hexcode": "1F412", "tags": [ "animal", "banana" ], "emoji": "🐒", "text": "", "type": 1, "order": 3666, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "gorilla", "hexcode": "1F98D", "tags": [ "animal" ], "emoji": "🦍", "text": "", "type": 1, "order": 3667, "group": 3, "subgroup": 34, "version": 3 }, { "label": "orangutan", "hexcode": "1F9A7", "tags": [ "animal", "ape", "monkey" ], "emoji": "🦧", "text": "", "type": 1, "order": 3668, "group": 3, "subgroup": 34, "version": 12 }, { "label": "dog face", "hexcode": "1F436", "tags": [ "adorbs", "animal", "dog", "face", "pet", "puppies", "puppy" ], "emoji": "🐶", "text": "", "type": 1, "order": 3669, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "dog", "hexcode": "1F415", "tags": [ "animal", "animals", "dogs", "pet" ], "emoji": "🐕️", "text": "🐕︎", "type": 1, "order": 3670, "group": 3, "subgroup": 34, "version": 0.7 }, { "label": "guide dog", "hexcode": "1F9AE", "tags": [ "accessibility", "animal", "blind", "dog", "guide" ], "emoji": "🦮", "text": "", "type": 1, "order": 3671, "group": 3, "subgroup": 34, "version": 12 }, { "label": "service dog", "hexcode": "1F415-200D-1F9BA", "tags": [ "accessibility", "animal", "assistance", "dog", "service" ], "emoji": "🐕‍🦺", "text": "", "type": 1, "order": 3672, "group": 3, "subgroup": 34, "version": 12 }, { "label": "poodle", "hexcode": "1F429", "tags": [ "animal", "dog", "fluffy" ], "emoji": "🐩", "text": "", "type": 1, "order": 3673, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "wolf", "hexcode": "1F43A", "tags": [ "animal", "face" ], "emoji": "🐺", "text": "", "type": 1, "order": 3674, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "fox", "hexcode": "1F98A", "tags": [ "animal", "face" ], "emoji": "🦊", "text": "", "type": 1, "order": 3675, "group": 3, "subgroup": 34, "version": 3 }, { "label": "raccoon", "hexcode": "1F99D", "tags": [ "animal", "curious", "sly" ], "emoji": "🦝", "text": "", "type": 1, "order": 3676, "group": 3, "subgroup": 34, "version": 11 }, { "label": "cat face", "hexcode": "1F431", "tags": [ "animal", "cat", "face", "kitten", "kitty", "pet" ], "emoji": "🐱", "text": "", "type": 1, "order": 3677, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "cat", "hexcode": "1F408", "tags": [ "animal", "animals", "cats", "kitten", "pet" ], "emoji": "🐈️", "text": "🐈︎", "type": 1, "order": 3678, "group": 3, "subgroup": 34, "version": 0.7 }, { "label": "black cat", "hexcode": "1F408-200D-2B1B", "tags": [ "animal", "black", "cat", "feline", "halloween", "meow", "unlucky" ], "emoji": "🐈‍⬛", "text": "", "type": 1, "order": 3679, "group": 3, "subgroup": 34, "version": 13 }, { "label": "lion", "hexcode": "1F981", "tags": [ "alpha", "animal", "face", "leo", "mane", "order", "rawr", "roar", "safari", "strong", "zodiac" ], "emoji": "🦁", "text": "", "type": 1, "order": 3680, "group": 3, "subgroup": 34, "version": 1 }, { "label": "tiger face", "hexcode": "1F42F", "tags": [ "animal", "big", "cat", "face", "predator", "tiger" ], "emoji": "🐯", "text": "", "type": 1, "order": 3681, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "tiger", "hexcode": "1F405", "tags": [ "animal", "big", "cat", "predator", "zoo" ], "emoji": "🐅", "text": "", "type": 1, "order": 3682, "group": 3, "subgroup": 34, "version": 1 }, { "label": "leopard", "hexcode": "1F406", "tags": [ "animal", "big", "cat", "predator", "zoo" ], "emoji": "🐆", "text": "", "type": 1, "order": 3683, "group": 3, "subgroup": 34, "version": 1 }, { "label": "horse face", "hexcode": "1F434", "tags": [ "animal", "dressage", "equine", "face", "farm", "horse", "horses" ], "emoji": "🐴", "text": "", "type": 1, "order": 3684, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "moose", "hexcode": "1FACE", "tags": [ "alces", "animal", "antlers", "elk", "mammal" ], "emoji": "🫎", "text": "", "type": 1, "order": 3685, "group": 3, "subgroup": 34, "version": 15 }, { "label": "donkey", "hexcode": "1FACF", "tags": [ "animal", "ass", "burro", "hinny", "mammal", "mule", "stubborn" ], "emoji": "🫏", "text": "", "type": 1, "order": 3686, "group": 3, "subgroup": 34, "version": 15 }, { "label": "horse", "hexcode": "1F40E", "tags": [ "animal", "equestrian", "farm", "racehorse", "racing" ], "emoji": "🐎", "text": "", "type": 1, "order": 3687, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "unicorn", "hexcode": "1F984", "tags": [ "face" ], "emoji": "🦄", "text": "", "type": 1, "order": 3688, "group": 3, "subgroup": 34, "version": 1 }, { "label": "zebra", "hexcode": "1F993", "tags": [ "animal", "stripe" ], "emoji": "🦓", "text": "", "type": 1, "order": 3689, "group": 3, "subgroup": 34, "version": 5 }, { "label": "deer", "hexcode": "1F98C", "tags": [ "animal" ], "emoji": "🦌", "text": "", "type": 1, "order": 3690, "group": 3, "subgroup": 34, "version": 3 }, { "label": "bison", "hexcode": "1F9AC", "tags": [ "animal", "buffalo", "herd", "wisent" ], "emoji": "🦬", "text": "", "type": 1, "order": 3691, "group": 3, "subgroup": 34, "version": 13 }, { "label": "cow face", "hexcode": "1F42E", "tags": [ "animal", "cow", "face", "farm", "milk", "moo" ], "emoji": "🐮", "text": "", "type": 1, "order": 3692, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "ox", "hexcode": "1F402", "tags": [ "animal", "animals", "bull", "farm", "taurus", "zodiac" ], "emoji": "🐂", "text": "", "type": 1, "order": 3693, "group": 3, "subgroup": 34, "version": 1 }, { "label": "water buffalo", "hexcode": "1F403", "tags": [ "animal", "buffalo", "water", "zoo" ], "emoji": "🐃", "text": "", "type": 1, "order": 3694, "group": 3, "subgroup": 34, "version": 1 }, { "label": "cow", "hexcode": "1F404", "tags": [ "animal", "animals", "farm", "milk", "moo" ], "emoji": "🐄", "text": "", "type": 1, "order": 3695, "group": 3, "subgroup": 34, "version": 1 }, { "label": "pig face", "hexcode": "1F437", "tags": [ "animal", "bacon", "face", "farm", "pig", "pork" ], "emoji": "🐷", "text": "", "type": 1, "order": 3696, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "pig", "hexcode": "1F416", "tags": [ "animal", "bacon", "farm", "pork", "sow" ], "emoji": "🐖", "text": "", "type": 1, "order": 3697, "group": 3, "subgroup": 34, "version": 1 }, { "label": "boar", "hexcode": "1F417", "tags": [ "animal", "pig" ], "emoji": "🐗", "text": "", "type": 1, "order": 3698, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "pig nose", "hexcode": "1F43D", "tags": [ "animal", "face", "farm", "nose", "pig", "smell", "snout" ], "emoji": "🐽", "text": "", "type": 1, "order": 3699, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "ram", "hexcode": "1F40F", "tags": [ "animal", "aries", "horns", "male", "sheep", "zodiac", "zoo" ], "emoji": "🐏", "text": "", "type": 1, "order": 3700, "group": 3, "subgroup": 34, "version": 1 }, { "label": "ewe", "hexcode": "1F411", "tags": [ "animal", "baa", "farm", "female", "fluffy", "lamb", "sheep", "wool" ], "emoji": "🐑", "text": "", "type": 1, "order": 3701, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "goat", "hexcode": "1F410", "tags": [ "animal", "capricorn", "farm", "milk", "zodiac" ], "emoji": "🐐", "text": "", "type": 1, "order": 3702, "group": 3, "subgroup": 34, "version": 1 }, { "label": "camel", "hexcode": "1F42A", "tags": [ "animal", "desert", "dromedary", "hump", "one" ], "emoji": "🐪", "text": "", "type": 1, "order": 3703, "group": 3, "subgroup": 34, "version": 1 }, { "label": "two-hump camel", "hexcode": "1F42B", "tags": [ "animal", "bactrian", "camel", "desert", "hump", "two", "two-hump" ], "emoji": "🐫", "text": "", "type": 1, "order": 3704, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "llama", "hexcode": "1F999", "tags": [ "alpaca", "animal", "guanaco", "vicuña", "wool" ], "emoji": "🦙", "text": "", "type": 1, "order": 3705, "group": 3, "subgroup": 34, "version": 11 }, { "label": "giraffe", "hexcode": "1F992", "tags": [ "animal", "spots" ], "emoji": "🦒", "text": "", "type": 1, "order": 3706, "group": 3, "subgroup": 34, "version": 5 }, { "label": "elephant", "hexcode": "1F418", "tags": [ "animal" ], "emoji": "🐘", "text": "", "type": 1, "order": 3707, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "mammoth", "hexcode": "1F9A3", "tags": [ "animal", "extinction", "large", "tusk", "wooly" ], "emoji": "🦣", "text": "", "type": 1, "order": 3708, "group": 3, "subgroup": 34, "version": 13 }, { "label": "rhinoceros", "hexcode": "1F98F", "tags": [ "animal" ], "emoji": "🦏", "text": "", "type": 1, "order": 3709, "group": 3, "subgroup": 34, "version": 3 }, { "label": "hippopotamus", "hexcode": "1F99B", "tags": [ "animal", "hippo" ], "emoji": "🦛", "text": "", "type": 1, "order": 3710, "group": 3, "subgroup": 34, "version": 11 }, { "label": "mouse face", "hexcode": "1F42D", "tags": [ "animal", "face", "mouse" ], "emoji": "🐭", "text": "", "type": 1, "order": 3711, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "mouse", "hexcode": "1F401", "tags": [ "animal", "animals" ], "emoji": "🐁", "text": "", "type": 1, "order": 3712, "group": 3, "subgroup": 34, "version": 1 }, { "label": "rat", "hexcode": "1F400", "tags": [ "animal" ], "emoji": "🐀", "text": "", "type": 1, "order": 3713, "group": 3, "subgroup": 34, "version": 1 }, { "label": "hamster", "hexcode": "1F439", "tags": [ "animal", "face", "pet" ], "emoji": "🐹", "text": "", "type": 1, "order": 3714, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "rabbit face", "hexcode": "1F430", "tags": [ "animal", "bunny", "face", "pet", "rabbit" ], "emoji": "🐰", "text": "", "type": 1, "order": 3715, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "rabbit", "hexcode": "1F407", "tags": [ "animal", "bunny", "pet" ], "emoji": "🐇", "text": "", "type": 1, "order": 3716, "group": 3, "subgroup": 34, "version": 1 }, { "label": "chipmunk", "hexcode": "1F43F", "tags": [ "animal", "squirrel" ], "emoji": "🐿️", "text": "🐿︎", "type": 0, "order": 3718, "group": 3, "subgroup": 34, "version": 0.7 }, { "label": "beaver", "hexcode": "1F9AB", "tags": [ "animal", "dam", "teeth" ], "emoji": "🦫", "text": "", "type": 1, "order": 3719, "group": 3, "subgroup": 34, "version": 13 }, { "label": "hedgehog", "hexcode": "1F994", "tags": [ "animal", "spiny" ], "emoji": "🦔", "text": "", "type": 1, "order": 3720, "group": 3, "subgroup": 34, "version": 5 }, { "label": "bat", "hexcode": "1F987", "tags": [ "animal", "vampire" ], "emoji": "🦇", "text": "", "type": 1, "order": 3721, "group": 3, "subgroup": 34, "version": 3 }, { "label": "bear", "hexcode": "1F43B", "tags": [ "animal", "face", "grizzly", "growl", "honey" ], "emoji": "🐻", "text": "", "type": 1, "order": 3722, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "polar bear", "hexcode": "1F43B-200D-2744-FE0F", "tags": [ "animal", "arctic", "bear", "polar", "white" ], "emoji": "🐻‍❄️", "text": "", "type": 1, "order": 3723, "group": 3, "subgroup": 34, "version": 13 }, { "label": "koala", "hexcode": "1F428", "tags": [ "animal", "australia", "bear", "down", "face", "marsupial", "under" ], "emoji": "🐨", "text": "", "type": 1, "order": 3725, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "panda", "hexcode": "1F43C", "tags": [ "animal", "bamboo", "face" ], "emoji": "🐼", "text": "", "type": 1, "order": 3726, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "sloth", "hexcode": "1F9A5", "tags": [ "lazy", "slow" ], "emoji": "🦥", "text": "", "type": 1, "order": 3727, "group": 3, "subgroup": 34, "version": 12 }, { "label": "otter", "hexcode": "1F9A6", "tags": [ "animal", "fishing", "playful" ], "emoji": "🦦", "text": "", "type": 1, "order": 3728, "group": 3, "subgroup": 34, "version": 12 }, { "label": "skunk", "hexcode": "1F9A8", "tags": [ "animal", "stink" ], "emoji": "🦨", "text": "", "type": 1, "order": 3729, "group": 3, "subgroup": 34, "version": 12 }, { "label": "kangaroo", "hexcode": "1F998", "tags": [ "animal", "joey", "jump", "marsupial" ], "emoji": "🦘", "text": "", "type": 1, "order": 3730, "group": 3, "subgroup": 34, "version": 11 }, { "label": "badger", "hexcode": "1F9A1", "tags": [ "animal", "honey", "pester" ], "emoji": "🦡", "text": "", "type": 1, "order": 3731, "group": 3, "subgroup": 34, "version": 11 }, { "label": "paw prints", "hexcode": "1F43E", "tags": [ "feet", "paw", "paws", "print", "prints" ], "emoji": "🐾", "text": "", "type": 1, "order": 3732, "group": 3, "subgroup": 34, "version": 0.6 }, { "label": "turkey", "hexcode": "1F983", "tags": [ "bird", "gobble", "thanksgiving" ], "emoji": "🦃", "text": "", "type": 1, "order": 3733, "group": 3, "subgroup": 35, "version": 1 }, { "label": "chicken", "hexcode": "1F414", "tags": [ "animal", "bird", "ornithology" ], "emoji": "🐔", "text": "", "type": 1, "order": 3734, "group": 3, "subgroup": 35, "version": 0.6 }, { "label": "rooster", "hexcode": "1F413", "tags": [ "animal", "bird", "ornithology" ], "emoji": "🐓", "text": "", "type": 1, "order": 3735, "group": 3, "subgroup": 35, "version": 1 }, { "label": "hatching chick", "hexcode": "1F423", "tags": [ "animal", "baby", "bird", "chick", "egg", "hatching" ], "emoji": "🐣", "text": "", "type": 1, "order": 3736, "group": 3, "subgroup": 35, "version": 0.6 }, { "label": "baby chick", "hexcode": "1F424", "tags": [ "animal", "baby", "bird", "chick", "ornithology" ], "emoji": "🐤", "text": "", "type": 1, "order": 3737, "group": 3, "subgroup": 35, "version": 0.6 }, { "label": "front-facing baby chick", "hexcode": "1F425", "tags": [ "animal", "baby", "bird", "chick", "front-facing", "newborn", "ornithology" ], "emoji": "🐥", "text": "", "type": 1, "order": 3738, "group": 3, "subgroup": 35, "version": 0.6 }, { "label": "bird", "hexcode": "1F426", "tags": [ "animal", "ornithology" ], "emoji": "🐦️", "text": "🐦︎", "type": 1, "order": 3739, "group": 3, "subgroup": 35, "version": 0.6 }, { "label": "penguin", "hexcode": "1F427", "tags": [ "animal", "antarctica", "bird", "ornithology" ], "emoji": "🐧", "text": "", "type": 1, "order": 3740, "group": 3, "subgroup": 35, "version": 0.6 }, { "label": "dove", "hexcode": "1F54A", "tags": [ "bird", "fly", "ornithology", "peace" ], "emoji": "🕊️", "text": "🕊︎", "type": 0, "order": 3742, "group": 3, "subgroup": 35, "version": 0.7 }, { "label": "eagle", "hexcode": "1F985", "tags": [ "animal", "bird", "ornithology" ], "emoji": "🦅", "text": "", "type": 1, "order": 3743, "group": 3, "subgroup": 35, "version": 3 }, { "label": "duck", "hexcode": "1F986", "tags": [ "animal", "bird", "ornithology" ], "emoji": "🦆", "text": "", "type": 1, "order": 3744, "group": 3, "subgroup": 35, "version": 3 }, { "label": "swan", "hexcode": "1F9A2", "tags": [ "animal", "bird", "cygnet", "duckling", "ornithology", "ugly" ], "emoji": "🦢", "text": "", "type": 1, "order": 3745, "group": 3, "subgroup": 35, "version": 11 }, { "label": "owl", "hexcode": "1F989", "tags": [ "animal", "bird", "ornithology", "wise" ], "emoji": "🦉", "text": "", "type": 1, "order": 3746, "group": 3, "subgroup": 35, "version": 3 }, { "label": "dodo", "hexcode": "1F9A4", "tags": [ "animal", "bird", "extinction", "large", "ornithology" ], "emoji": "🦤", "text": "", "type": 1, "order": 3747, "group": 3, "subgroup": 35, "version": 13 }, { "label": "feather", "hexcode": "1FAB6", "tags": [ "bird", "flight", "light", "plumage" ], "emoji": "🪶", "text": "", "type": 1, "order": 3748, "group": 3, "subgroup": 35, "version": 13 }, { "label": "flamingo", "hexcode": "1F9A9", "tags": [ "animal", "bird", "flamboyant", "ornithology", "tropical" ], "emoji": "🦩", "text": "", "type": 1, "order": 3749, "group": 3, "subgroup": 35, "version": 12 }, { "label": "peacock", "hexcode": "1F99A", "tags": [ "animal", "bird", "colorful", "ornithology", "ostentatious", "peahen", "pretty", "proud" ], "emoji": "🦚", "text": "", "type": 1, "order": 3750, "group": 3, "subgroup": 35, "version": 11 }, { "label": "parrot", "hexcode": "1F99C", "tags": [ "animal", "bird", "ornithology", "pirate", "talk" ], "emoji": "🦜", "text": "", "type": 1, "order": 3751, "group": 3, "subgroup": 35, "version": 11 }, { "label": "wing", "hexcode": "1FABD", "tags": [ "angelic", "ascend", "aviation", "bird", "fly", "flying", "heavenly", "mythology", "soar" ], "emoji": "🪽", "text": "", "type": 1, "order": 3752, "group": 3, "subgroup": 35, "version": 15 }, { "label": "black bird", "hexcode": "1F426-200D-2B1B", "tags": [ "animal", "beak", "bird", "black", "caw", "corvid", "crow", "ornithology", "raven", "rook" ], "emoji": "🐦‍⬛", "text": "", "type": 1, "order": 3753, "group": 3, "subgroup": 35, "version": 15 }, { "label": "goose", "hexcode": "1FABF", "tags": [ "animal", "bird", "duck", "flock", "fowl", "gaggle", "gander", "geese", "honk", "ornithology", "silly" ], "emoji": "🪿", "text": "", "type": 1, "order": 3754, "group": 3, "subgroup": 35, "version": 15 }, { "label": "phoenix", "hexcode": "1F426-200D-1F525", "tags": [ "ascend", "ascension", "emerge", "fantasy", "firebird", "glory", "immortal", "rebirth", "reincarnation", "reinvent", "renewal", "revival", "revive", "rise", "transform" ], "emoji": "🐦‍🔥", "text": "", "type": 1, "order": 3755, "group": 3, "subgroup": 35, "version": 15.1 }, { "label": "frog", "hexcode": "1F438", "tags": [ "animal", "face" ], "emoji": "🐸", "text": "", "type": 1, "order": 3756, "group": 3, "subgroup": 36, "version": 0.6 }, { "label": "crocodile", "hexcode": "1F40A", "tags": [ "animal", "zoo" ], "emoji": "🐊", "text": "", "type": 1, "order": 3757, "group": 3, "subgroup": 37, "version": 1 }, { "label": "turtle", "hexcode": "1F422", "tags": [ "animal", "terrapin", "tortoise" ], "emoji": "🐢", "text": "", "type": 1, "order": 3758, "group": 3, "subgroup": 37, "version": 0.6 }, { "label": "lizard", "hexcode": "1F98E", "tags": [ "animal", "reptile" ], "emoji": "🦎", "text": "", "type": 1, "order": 3759, "group": 3, "subgroup": 37, "version": 3 }, { "label": "snake", "hexcode": "1F40D", "tags": [ "animal", "bearer", "ophiuchus", "serpent", "zodiac" ], "emoji": "🐍", "text": "", "type": 1, "order": 3760, "group": 3, "subgroup": 37, "version": 0.6 }, { "label": "dragon face", "hexcode": "1F432", "tags": [ "animal", "dragon", "face", "fairy", "fairytale", "tale" ], "emoji": "🐲", "text": "", "type": 1, "order": 3761, "group": 3, "subgroup": 37, "version": 0.6 }, { "label": "dragon", "hexcode": "1F409", "tags": [ "animal", "fairy", "fairytale", "knights", "tale" ], "emoji": "🐉", "text": "", "type": 1, "order": 3762, "group": 3, "subgroup": 37, "version": 1 }, { "label": "sauropod", "hexcode": "1F995", "tags": [ "brachiosaurus", "brontosaurus", "dinosaur", "diplodocus" ], "emoji": "🦕", "text": "", "type": 1, "order": 3763, "group": 3, "subgroup": 37, "version": 5 }, { "label": "T-Rex", "hexcode": "1F996", "tags": [ "dinosaur", "rex", "t", "t-rex", "tyrannosaurus" ], "emoji": "🦖", "text": "", "type": 1, "order": 3764, "group": 3, "subgroup": 37, "version": 5 }, { "label": "spouting whale", "hexcode": "1F433", "tags": [ "animal", "beach", "face", "ocean", "spouting", "whale" ], "emoji": "🐳", "text": "", "type": 1, "order": 3765, "group": 3, "subgroup": 38, "version": 0.6 }, { "label": "whale", "hexcode": "1F40B", "tags": [ "animal", "beach", "ocean" ], "emoji": "🐋", "text": "", "type": 1, "order": 3766, "group": 3, "subgroup": 38, "version": 1 }, { "label": "dolphin", "hexcode": "1F42C", "tags": [ "animal", "beach", "flipper", "ocean" ], "emoji": "🐬", "text": "", "type": 1, "order": 3767, "group": 3, "subgroup": 38, "version": 0.6 }, { "label": "orca", "hexcode": "1FACD", "tags": [ "marine", "ocean", "whale" ], "emoji": "🫍", "text": "", "type": 1, "order": 3768, "group": 3, "subgroup": 38, "version": 17 }, { "label": "seal", "hexcode": "1F9AD", "tags": [ "animal", "lion", "ocean", "sea" ], "emoji": "🦭", "text": "", "type": 1, "order": 3769, "group": 3, "subgroup": 38, "version": 13 }, { "label": "fish", "hexcode": "1F41F", "tags": [ "animal", "dinner", "fishes", "fishing", "pisces", "zodiac" ], "emoji": "🐟️", "text": "🐟︎", "type": 1, "order": 3770, "group": 3, "subgroup": 38, "version": 0.6 }, { "label": "tropical fish", "hexcode": "1F420", "tags": [ "animal", "fish", "fishes", "tropical" ], "emoji": "🐠", "text": "", "type": 1, "order": 3771, "group": 3, "subgroup": 38, "version": 0.6 }, { "label": "blowfish", "hexcode": "1F421", "tags": [ "animal", "fish" ], "emoji": "🐡", "text": "", "type": 1, "order": 3772, "group": 3, "subgroup": 38, "version": 0.6 }, { "label": "shark", "hexcode": "1F988", "tags": [ "animal", "fish" ], "emoji": "🦈", "text": "", "type": 1, "order": 3773, "group": 3, "subgroup": 38, "version": 3 }, { "label": "octopus", "hexcode": "1F419", "tags": [ "animal", "creature", "ocean" ], "emoji": "🐙", "text": "", "type": 1, "order": 3774, "group": 3, "subgroup": 38, "version": 0.6 }, { "label": "spiral shell", "hexcode": "1F41A", "tags": [ "animal", "beach", "conch", "sea", "shell", "spiral" ], "emoji": "🐚", "text": "", "type": 1, "order": 3775, "group": 3, "subgroup": 38, "version": 0.6 }, { "label": "coral", "hexcode": "1FAB8", "tags": [ "change", "climate", "ocean", "reef", "sea" ], "emoji": "🪸", "text": "", "type": 1, "order": 3776, "group": 3, "subgroup": 38, "version": 14 }, { "label": "jellyfish", "hexcode": "1FABC", "tags": [ "animal", "aquarium", "burn", "invertebrate", "jelly", "life", "marine", "ocean", "ouch", "plankton", "sea", "sting", "stinger", "tentacles" ], "emoji": "🪼", "text": "", "type": 1, "order": 3777, "group": 3, "subgroup": 38, "version": 15 }, { "label": "crab", "hexcode": "1F980", "tags": [ "cancer", "zodiac" ], "emoji": "🦀", "text": "", "type": 1, "order": 3778, "group": 3, "subgroup": 38, "version": 1 }, { "label": "lobster", "hexcode": "1F99E", "tags": [ "animal", "bisque", "claws", "seafood" ], "emoji": "🦞", "text": "", "type": 1, "order": 3779, "group": 3, "subgroup": 38, "version": 11 }, { "label": "shrimp", "hexcode": "1F990", "tags": [ "food", "shellfish", "small" ], "emoji": "🦐", "text": "", "type": 1, "order": 3780, "group": 3, "subgroup": 38, "version": 3 }, { "label": "squid", "hexcode": "1F991", "tags": [ "animal", "food", "mollusk" ], "emoji": "🦑", "text": "", "type": 1, "order": 3781, "group": 3, "subgroup": 38, "version": 3 }, { "label": "oyster", "hexcode": "1F9AA", "tags": [ "diving", "pearl" ], "emoji": "🦪", "text": "", "type": 1, "order": 3782, "group": 3, "subgroup": 38, "version": 12 }, { "label": "snail", "hexcode": "1F40C", "tags": [ "animal", "escargot", "garden", "nature", "slug" ], "emoji": "🐌", "text": "", "type": 1, "order": 3783, "group": 3, "subgroup": 39, "version": 0.6 }, { "label": "butterfly", "hexcode": "1F98B", "tags": [ "insect", "pretty" ], "emoji": "🦋", "text": "", "type": 1, "order": 3784, "group": 3, "subgroup": 39, "version": 3 }, { "label": "bug", "hexcode": "1F41B", "tags": [ "animal", "garden", "insect" ], "emoji": "🐛", "text": "", "type": 1, "order": 3785, "group": 3, "subgroup": 39, "version": 0.6 }, { "label": "ant", "hexcode": "1F41C", "tags": [ "animal", "garden", "insect" ], "emoji": "🐜", "text": "", "type": 1, "order": 3786, "group": 3, "subgroup": 39, "version": 0.6 }, { "label": "honeybee", "hexcode": "1F41D", "tags": [ "animal", "bee", "bumblebee", "honey", "insect", "nature", "spring" ], "emoji": "🐝", "text": "", "type": 1, "order": 3787, "group": 3, "subgroup": 39, "version": 0.6 }, { "label": "beetle", "hexcode": "1FAB2", "tags": [ "animal", "bug", "insect" ], "emoji": "🪲", "text": "", "type": 1, "order": 3788, "group": 3, "subgroup": 39, "version": 13 }, { "label": "lady beetle", "hexcode": "1F41E", "tags": [ "animal", "beetle", "garden", "insect", "lady", "ladybird", "ladybug", "nature" ], "emoji": "🐞", "text": "", "type": 1, "order": 3789, "group": 3, "subgroup": 39, "version": 0.6 }, { "label": "cricket", "hexcode": "1F997", "tags": [ "animal", "bug", "grasshopper", "insect", "orthoptera" ], "emoji": "🦗", "text": "", "type": 1, "order": 3790, "group": 3, "subgroup": 39, "version": 5 }, { "label": "cockroach", "hexcode": "1FAB3", "tags": [ "animal", "insect", "pest", "roach" ], "emoji": "🪳", "text": "", "type": 1, "order": 3791, "group": 3, "subgroup": 39, "version": 13 }, { "label": "spider", "hexcode": "1F577", "tags": [ "animal", "insect" ], "emoji": "🕷️", "text": "🕷︎", "type": 0, "order": 3793, "group": 3, "subgroup": 39, "version": 0.7 }, { "label": "spider web", "hexcode": "1F578", "tags": [ "spider", "web" ], "emoji": "🕸️", "text": "🕸︎", "type": 0, "order": 3795, "group": 3, "subgroup": 39, "version": 0.7 }, { "label": "scorpion", "hexcode": "1F982", "tags": [ "scorpio", "scorpius", "zodiac" ], "emoji": "🦂", "text": "", "type": 1, "order": 3796, "group": 3, "subgroup": 39, "version": 1 }, { "label": "mosquito", "hexcode": "1F99F", "tags": [ "bite", "disease", "fever", "insect", "malaria", "pest", "virus" ], "emoji": "🦟", "text": "", "type": 1, "order": 3797, "group": 3, "subgroup": 39, "version": 11 }, { "label": "fly", "hexcode": "1FAB0", "tags": [ "animal", "disease", "insect", "maggot", "pest", "rotting" ], "emoji": "🪰", "text": "", "type": 1, "order": 3798, "group": 3, "subgroup": 39, "version": 13 }, { "label": "worm", "hexcode": "1FAB1", "tags": [ "animal", "annelid", "earthworm", "parasite" ], "emoji": "🪱", "text": "", "type": 1, "order": 3799, "group": 3, "subgroup": 39, "version": 13 }, { "label": "microbe", "hexcode": "1F9A0", "tags": [ "amoeba", "bacteria", "science", "virus" ], "emoji": "🦠", "text": "", "type": 1, "order": 3800, "group": 3, "subgroup": 39, "version": 11 }, { "label": "bouquet", "hexcode": "1F490", "tags": [ "anniversary", "birthday", "date", "flower", "love", "plant", "romance" ], "emoji": "💐", "text": "", "type": 1, "order": 3801, "group": 3, "subgroup": 40, "version": 0.6 }, { "label": "cherry blossom", "hexcode": "1F338", "tags": [ "blossom", "cherry", "flower", "plant", "spring", "springtime" ], "emoji": "🌸", "text": "", "type": 1, "order": 3802, "group": 3, "subgroup": 40, "version": 0.6 }, { "label": "white flower", "hexcode": "1F4AE", "tags": [ "flower", "white" ], "emoji": "💮", "text": "", "type": 1, "order": 3803, "group": 3, "subgroup": 40, "version": 0.6 }, { "label": "lotus", "hexcode": "1FAB7", "tags": [ "beauty", "buddhism", "calm", "flower", "hinduism", "peace", "purity", "serenity" ], "emoji": "🪷", "text": "", "type": 1, "order": 3804, "group": 3, "subgroup": 40, "version": 14 }, { "label": "rosette", "hexcode": "1F3F5", "tags": [ "plant" ], "emoji": "🏵️", "text": "🏵︎", "type": 0, "order": 3806, "group": 3, "subgroup": 40, "version": 0.7 }, { "label": "rose", "hexcode": "1F339", "tags": [ "beauty", "elegant", "flower", "love", "plant", "red", "valentine" ], "emoji": "🌹", "text": "", "type": 1, "order": 3807, "group": 3, "subgroup": 40, "version": 0.6 }, { "label": "wilted flower", "hexcode": "1F940", "tags": [ "dying", "flower", "wilted" ], "emoji": "🥀", "text": "", "type": 1, "order": 3808, "group": 3, "subgroup": 40, "version": 3 }, { "label": "hibiscus", "hexcode": "1F33A", "tags": [ "flower", "plant" ], "emoji": "🌺", "text": "", "type": 1, "order": 3809, "group": 3, "subgroup": 40, "version": 0.6 }, { "label": "sunflower", "hexcode": "1F33B", "tags": [ "flower", "outdoors", "plant", "sun" ], "emoji": "🌻", "text": "", "type": 1, "order": 3810, "group": 3, "subgroup": 40, "version": 0.6 }, { "label": "blossom", "hexcode": "1F33C", "tags": [ "buttercup", "dandelion", "flower", "plant" ], "emoji": "🌼", "text": "", "type": 1, "order": 3811, "group": 3, "subgroup": 40, "version": 0.6 }, { "label": "tulip", "hexcode": "1F337", "tags": [ "blossom", "flower", "growth", "plant" ], "emoji": "🌷", "text": "", "type": 1, "order": 3812, "group": 3, "subgroup": 40, "version": 0.6 }, { "label": "hyacinth", "hexcode": "1FABB", "tags": [ "bloom", "bluebonnet", "flower", "indigo", "lavender", "lilac", "lupine", "plant", "purple", "shrub", "snapdragon", "spring", "violet" ], "emoji": "🪻", "text": "", "type": 1, "order": 3813, "group": 3, "subgroup": 40, "version": 15 }, { "label": "seedling", "hexcode": "1F331", "tags": [ "plant", "sapling", "sprout", "young" ], "emoji": "🌱", "text": "", "type": 1, "order": 3814, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "potted plant", "hexcode": "1FAB4", "tags": [ "decor", "grow", "house", "nurturing", "plant", "pot", "potted" ], "emoji": "🪴", "text": "", "type": 1, "order": 3815, "group": 3, "subgroup": 41, "version": 13 }, { "label": "evergreen tree", "hexcode": "1F332", "tags": [ "christmas", "evergreen", "forest", "pine", "tree" ], "emoji": "🌲", "text": "", "type": 1, "order": 3816, "group": 3, "subgroup": 41, "version": 1 }, { "label": "deciduous tree", "hexcode": "1F333", "tags": [ "deciduous", "forest", "green", "habitat", "shedding", "tree" ], "emoji": "🌳", "text": "", "type": 1, "order": 3817, "group": 3, "subgroup": 41, "version": 1 }, { "label": "palm tree", "hexcode": "1F334", "tags": [ "beach", "palm", "plant", "tree", "tropical" ], "emoji": "🌴", "text": "", "type": 1, "order": 3818, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "cactus", "hexcode": "1F335", "tags": [ "desert", "drought", "nature", "plant" ], "emoji": "🌵", "text": "", "type": 1, "order": 3819, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "sheaf of rice", "hexcode": "1F33E", "tags": [ "ear", "grain", "grains", "plant", "rice", "sheaf" ], "emoji": "🌾", "text": "", "type": 1, "order": 3820, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "herb", "hexcode": "1F33F", "tags": [ "leaf", "plant" ], "emoji": "🌿", "text": "", "type": 1, "order": 3821, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "shamrock", "hexcode": "2618", "tags": [ "irish", "plant" ], "emoji": "☘️", "text": "☘︎", "type": 0, "order": 3823, "group": 3, "subgroup": 41, "version": 1 }, { "label": "four leaf clover", "hexcode": "1F340", "tags": [ "4", "clover", "four", "four-leaf", "irish", "leaf", "lucky", "plant" ], "emoji": "🍀", "text": "", "type": 1, "order": 3824, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "maple leaf", "hexcode": "1F341", "tags": [ "falling", "leaf", "maple" ], "emoji": "🍁", "text": "", "type": 1, "order": 3825, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "fallen leaf", "hexcode": "1F342", "tags": [ "autumn", "fall", "fallen", "falling", "leaf" ], "emoji": "🍂", "text": "", "type": 1, "order": 3826, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "leaf fluttering in wind", "hexcode": "1F343", "tags": [ "blow", "flutter", "fluttering", "leaf", "wind" ], "emoji": "🍃", "text": "", "type": 1, "order": 3827, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "empty nest", "hexcode": "1FAB9", "tags": [ "branch", "empty", "home", "nest", "nesting" ], "emoji": "🪹", "text": "", "type": 1, "order": 3828, "group": 3, "subgroup": 41, "version": 14 }, { "label": "nest with eggs", "hexcode": "1FABA", "tags": [ "bird", "branch", "egg", "eggs", "nest", "nesting" ], "emoji": "🪺", "text": "", "type": 1, "order": 3829, "group": 3, "subgroup": 41, "version": 14 }, { "label": "mushroom", "hexcode": "1F344", "tags": [ "fungus", "toadstool" ], "emoji": "🍄", "text": "", "type": 1, "order": 3830, "group": 3, "subgroup": 41, "version": 0.6 }, { "label": "leafless tree", "hexcode": "1FABE", "tags": [ "bare", "barren", "branches", "dead", "drought", "leafless", "tree", "trunk", "winter", "wood" ], "emoji": "🪾", "text": "", "type": 1, "order": 3831, "group": 3, "subgroup": 41, "version": 16 }, { "label": "grapes", "hexcode": "1F347", "tags": [ "dionysus", "fruit", "grape" ], "emoji": "🍇", "text": "", "type": 1, "order": 3832, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "melon", "hexcode": "1F348", "tags": [ "cantaloupe", "fruit" ], "emoji": "🍈", "text": "", "type": 1, "order": 3833, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "watermelon", "hexcode": "1F349", "tags": [ "fruit" ], "emoji": "🍉", "text": "", "type": 1, "order": 3834, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "tangerine", "hexcode": "1F34A", "tags": [ "c", "citrus", "fruit", "nectarine", "orange", "vitamin" ], "emoji": "🍊", "text": "", "type": 1, "order": 3835, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "lemon", "hexcode": "1F34B", "tags": [ "citrus", "fruit", "sour" ], "emoji": "🍋", "text": "", "type": 1, "order": 3836, "group": 4, "subgroup": 42, "version": 1 }, { "label": "lime", "hexcode": "1F34B-200D-1F7E9", "tags": [ "acidity", "citrus", "cocktail", "fruit", "garnish", "key", "margarita", "mojito", "refreshing", "salsa", "sour", "tangy", "tequila", "tropical", "zest" ], "emoji": "🍋‍🟩", "text": "", "type": 1, "order": 3837, "group": 4, "subgroup": 42, "version": 15.1 }, { "label": "banana", "hexcode": "1F34C", "tags": [ "fruit", "potassium" ], "emoji": "🍌", "text": "", "type": 1, "order": 3838, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "pineapple", "hexcode": "1F34D", "tags": [ "colada", "fruit", "pina", "tropical" ], "emoji": "🍍", "text": "", "type": 1, "order": 3839, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "mango", "hexcode": "1F96D", "tags": [ "food", "fruit", "tropical" ], "emoji": "🥭", "text": "", "type": 1, "order": 3840, "group": 4, "subgroup": 42, "version": 11 }, { "label": "red apple", "hexcode": "1F34E", "tags": [ "apple", "diet", "food", "fruit", "health", "red", "ripe" ], "emoji": "🍎", "text": "", "type": 1, "order": 3841, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "green apple", "hexcode": "1F34F", "tags": [ "apple", "fruit", "green" ], "emoji": "🍏", "text": "", "type": 1, "order": 3842, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "pear", "hexcode": "1F350", "tags": [ "fruit" ], "emoji": "🍐", "text": "", "type": 1, "order": 3843, "group": 4, "subgroup": 42, "version": 1 }, { "label": "peach", "hexcode": "1F351", "tags": [ "fruit" ], "emoji": "🍑", "text": "", "type": 1, "order": 3844, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "cherries", "hexcode": "1F352", "tags": [ "berries", "cherry", "fruit", "red" ], "emoji": "🍒", "text": "", "type": 1, "order": 3845, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "strawberry", "hexcode": "1F353", "tags": [ "berry", "fruit" ], "emoji": "🍓", "text": "", "type": 1, "order": 3846, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "blueberries", "hexcode": "1FAD0", "tags": [ "berries", "berry", "bilberry", "blue", "blueberry", "food", "fruit" ], "emoji": "🫐", "text": "", "type": 1, "order": 3847, "group": 4, "subgroup": 42, "version": 13 }, { "label": "kiwi fruit", "hexcode": "1F95D", "tags": [ "food", "fruit", "kiwi" ], "emoji": "🥝", "text": "", "type": 1, "order": 3848, "group": 4, "subgroup": 42, "version": 3 }, { "label": "tomato", "hexcode": "1F345", "tags": [ "food", "fruit", "vegetable" ], "emoji": "🍅", "text": "", "type": 1, "order": 3849, "group": 4, "subgroup": 42, "version": 0.6 }, { "label": "olive", "hexcode": "1FAD2", "tags": [ "food" ], "emoji": "🫒", "text": "", "type": 1, "order": 3850, "group": 4, "subgroup": 42, "version": 13 }, { "label": "coconut", "hexcode": "1F965", "tags": [ "colada", "palm", "piña" ], "emoji": "🥥", "text": "", "type": 1, "order": 3851, "group": 4, "subgroup": 42, "version": 5 }, { "label": "avocado", "hexcode": "1F951", "tags": [ "food", "fruit" ], "emoji": "🥑", "text": "", "type": 1, "order": 3852, "group": 4, "subgroup": 43, "version": 3 }, { "label": "eggplant", "hexcode": "1F346", "tags": [ "aubergine", "vegetable" ], "emoji": "🍆", "text": "", "type": 1, "order": 3853, "group": 4, "subgroup": 43, "version": 0.6 }, { "label": "potato", "hexcode": "1F954", "tags": [ "food", "vegetable" ], "emoji": "🥔", "text": "", "type": 1, "order": 3854, "group": 4, "subgroup": 43, "version": 3 }, { "label": "carrot", "hexcode": "1F955", "tags": [ "food", "vegetable" ], "emoji": "🥕", "text": "", "type": 1, "order": 3855, "group": 4, "subgroup": 43, "version": 3 }, { "label": "ear of corn", "hexcode": "1F33D", "tags": [ "corn", "crops", "ear", "farm", "maize", "maze" ], "emoji": "🌽", "text": "", "type": 1, "order": 3856, "group": 4, "subgroup": 43, "version": 0.6 }, { "label": "hot pepper", "hexcode": "1F336", "tags": [ "hot", "pepper" ], "emoji": "🌶️", "text": "🌶︎", "type": 0, "order": 3858, "group": 4, "subgroup": 43, "version": 0.7 }, { "label": "bell pepper", "hexcode": "1FAD1", "tags": [ "bell", "capsicum", "food", "pepper", "vegetable" ], "emoji": "🫑", "text": "", "type": 1, "order": 3859, "group": 4, "subgroup": 43, "version": 13 }, { "label": "cucumber", "hexcode": "1F952", "tags": [ "food", "pickle", "vegetable" ], "emoji": "🥒", "text": "", "type": 1, "order": 3860, "group": 4, "subgroup": 43, "version": 3 }, { "label": "leafy green", "hexcode": "1F96C", "tags": [ "bok", "burgers", "cabbage", "choy", "green", "kale", "leafy", "lettuce", "salad" ], "emoji": "🥬", "text": "", "type": 1, "order": 3861, "group": 4, "subgroup": 43, "version": 11 }, { "label": "broccoli", "hexcode": "1F966", "tags": [ "cabbage", "wild" ], "emoji": "🥦", "text": "", "type": 1, "order": 3862, "group": 4, "subgroup": 43, "version": 5 }, { "label": "garlic", "hexcode": "1F9C4", "tags": [ "flavoring" ], "emoji": "🧄", "text": "", "type": 1, "order": 3863, "group": 4, "subgroup": 43, "version": 12 }, { "label": "onion", "hexcode": "1F9C5", "tags": [ "flavoring" ], "emoji": "🧅", "text": "", "type": 1, "order": 3864, "group": 4, "subgroup": 43, "version": 12 }, { "label": "peanuts", "hexcode": "1F95C", "tags": [ "food", "nut", "peanut", "vegetable" ], "emoji": "🥜", "text": "", "type": 1, "order": 3865, "group": 4, "subgroup": 43, "version": 3 }, { "label": "beans", "hexcode": "1FAD8", "tags": [ "food", "kidney", "legume", "small" ], "emoji": "🫘", "text": "", "type": 1, "order": 3866, "group": 4, "subgroup": 43, "version": 14 }, { "label": "chestnut", "hexcode": "1F330", "tags": [ "almond", "plant" ], "emoji": "🌰", "text": "", "type": 1, "order": 3867, "group": 4, "subgroup": 43, "version": 0.6 }, { "label": "ginger root", "hexcode": "1FADA", "tags": [ "beer", "ginger", "health", "herb", "natural", "root", "spice" ], "emoji": "🫚", "text": "", "type": 1, "order": 3868, "group": 4, "subgroup": 43, "version": 15 }, { "label": "pea pod", "hexcode": "1FADB", "tags": [ "beans", "beanstalk", "edamame", "legume", "pea", "pod", "soybean", "vegetable", "veggie" ], "emoji": "🫛", "text": "", "type": 1, "order": 3869, "group": 4, "subgroup": 43, "version": 15 }, { "label": "brown mushroom", "hexcode": "1F344-200D-1F7EB", "tags": [ "food", "fungi", "fungus", "mushroom", "nature", "pizza", "portobello", "shiitake", "shroom", "spore", "sprout", "toppings", "truffle", "vegetable", "vegetarian", "veggie" ], "emoji": "🍄‍🟫", "text": "", "type": 1, "order": 3870, "group": 4, "subgroup": 43, "version": 15.1 }, { "label": "root vegetable", "hexcode": "1FADC", "tags": [ "beet", "food", "garden", "radish", "root", "salad", "turnip", "vegetable", "vegetarian" ], "emoji": "🫜", "text": "", "type": 1, "order": 3871, "group": 4, "subgroup": 43, "version": 16 }, { "label": "bread", "hexcode": "1F35E", "tags": [ "carbs", "food", "grain", "loaf", "restaurant", "toast", "wheat" ], "emoji": "🍞", "text": "", "type": 1, "order": 3872, "group": 4, "subgroup": 44, "version": 0.6 }, { "label": "croissant", "hexcode": "1F950", "tags": [ "bread", "breakfast", "crescent", "food", "french", "roll" ], "emoji": "🥐", "text": "", "type": 1, "order": 3873, "group": 4, "subgroup": 44, "version": 3 }, { "label": "baguette bread", "hexcode": "1F956", "tags": [ "baguette", "bread", "food", "french" ], "emoji": "🥖", "text": "", "type": 1, "order": 3874, "group": 4, "subgroup": 44, "version": 3 }, { "label": "flatbread", "hexcode": "1FAD3", "tags": [ "arepa", "bread", "food", "gordita", "lavash", "naan", "pita" ], "emoji": "🫓", "text": "", "type": 1, "order": 3875, "group": 4, "subgroup": 44, "version": 13 }, { "label": "pretzel", "hexcode": "1F968", "tags": [ "convoluted", "twisted" ], "emoji": "🥨", "text": "", "type": 1, "order": 3876, "group": 4, "subgroup": 44, "version": 5 }, { "label": "bagel", "hexcode": "1F96F", "tags": [ "bakery", "bread", "breakfast", "schmear" ], "emoji": "🥯", "text": "", "type": 1, "order": 3877, "group": 4, "subgroup": 44, "version": 11 }, { "label": "pancakes", "hexcode": "1F95E", "tags": [ "breakfast", "crêpe", "food", "hotcake", "pancake" ], "emoji": "🥞", "text": "", "type": 1, "order": 3878, "group": 4, "subgroup": 44, "version": 3 }, { "label": "waffle", "hexcode": "1F9C7", "tags": [ "breakfast", "indecisive", "iron" ], "emoji": "🧇", "text": "", "type": 1, "order": 3879, "group": 4, "subgroup": 44, "version": 12 }, { "label": "cheese wedge", "hexcode": "1F9C0", "tags": [ "cheese", "wedge" ], "emoji": "🧀", "text": "", "type": 1, "order": 3880, "group": 4, "subgroup": 44, "version": 1 }, { "label": "meat on bone", "hexcode": "1F356", "tags": [ "bone", "meat" ], "emoji": "🍖", "text": "", "type": 1, "order": 3881, "group": 4, "subgroup": 44, "version": 0.6 }, { "label": "poultry leg", "hexcode": "1F357", "tags": [ "bone", "chicken", "drumstick", "hungry", "leg", "poultry", "turkey" ], "emoji": "🍗", "text": "", "type": 1, "order": 3882, "group": 4, "subgroup": 44, "version": 0.6 }, { "label": "cut of meat", "hexcode": "1F969", "tags": [ "chop", "cut", "lambchop", "meat", "porkchop", "red", "steak" ], "emoji": "🥩", "text": "", "type": 1, "order": 3883, "group": 4, "subgroup": 44, "version": 5 }, { "label": "bacon", "hexcode": "1F953", "tags": [ "breakfast", "food", "meat" ], "emoji": "🥓", "text": "", "type": 1, "order": 3884, "group": 4, "subgroup": 44, "version": 3 }, { "label": "hamburger", "hexcode": "1F354", "tags": [ "burger", "eat", "fast", "food", "hungry" ], "emoji": "🍔", "text": "", "type": 1, "order": 3885, "group": 4, "subgroup": 44, "version": 0.6 }, { "label": "french fries", "hexcode": "1F35F", "tags": [ "fast", "food", "french", "fries" ], "emoji": "🍟", "text": "", "type": 1, "order": 3886, "group": 4, "subgroup": 44, "version": 0.6 }, { "label": "pizza", "hexcode": "1F355", "tags": [ "cheese", "food", "hungry", "pepperoni", "slice" ], "emoji": "🍕", "text": "", "type": 1, "order": 3887, "group": 4, "subgroup": 44, "version": 0.6 }, { "label": "hot dog", "hexcode": "1F32D", "tags": [ "dog", "frankfurter", "hot", "hotdog", "sausage" ], "emoji": "🌭", "text": "", "type": 1, "order": 3888, "group": 4, "subgroup": 44, "version": 1 }, { "label": "sandwich", "hexcode": "1F96A", "tags": [ "bread" ], "emoji": "🥪", "text": "", "type": 1, "order": 3889, "group": 4, "subgroup": 44, "version": 5 }, { "label": "taco", "hexcode": "1F32E", "tags": [ "mexican" ], "emoji": "🌮", "text": "", "type": 1, "order": 3890, "group": 4, "subgroup": 44, "version": 1 }, { "label": "burrito", "hexcode": "1F32F", "tags": [ "mexican", "wrap" ], "emoji": "🌯", "text": "", "type": 1, "order": 3891, "group": 4, "subgroup": 44, "version": 1 }, { "label": "tamale", "hexcode": "1FAD4", "tags": [ "food", "mexican", "pamonha", "wrapped" ], "emoji": "🫔", "text": "", "type": 1, "order": 3892, "group": 4, "subgroup": 44, "version": 13 }, { "label": "stuffed flatbread", "hexcode": "1F959", "tags": [ "falafel", "flatbread", "food", "gyro", "kebab", "stuffed" ], "emoji": "🥙", "text": "", "type": 1, "order": 3893, "group": 4, "subgroup": 44, "version": 3 }, { "label": "falafel", "hexcode": "1F9C6", "tags": [ "chickpea", "meatball" ], "emoji": "🧆", "text": "", "type": 1, "order": 3894, "group": 4, "subgroup": 44, "version": 12 }, { "label": "egg", "hexcode": "1F95A", "tags": [ "breakfast", "food" ], "emoji": "🥚", "text": "", "type": 1, "order": 3895, "group": 4, "subgroup": 44, "version": 3 }, { "label": "cooking", "hexcode": "1F373", "tags": [ "breakfast", "easy", "egg", "fry", "frying", "over", "pan", "restaurant", "side", "sunny", "up" ], "emoji": "🍳", "text": "", "type": 1, "order": 3896, "group": 4, "subgroup": 44, "version": 0.6 }, { "label": "shallow pan of food", "hexcode": "1F958", "tags": [ "casserole", "food", "paella", "pan", "shallow" ], "emoji": "🥘", "text": "", "type": 1, "order": 3897, "group": 4, "subgroup": 44, "version": 3 }, { "label": "pot of food", "hexcode": "1F372", "tags": [ "food", "pot", "soup", "stew" ], "emoji": "🍲", "text": "", "type": 1, "order": 3898, "group": 4, "subgroup": 44, "version": 0.6 }, { "label": "fondue", "hexcode": "1FAD5", "tags": [ "cheese", "chocolate", "food", "melted", "pot", "ski" ], "emoji": "🫕", "text": "", "type": 1, "order": 3899, "group": 4, "subgroup": 44, "version": 13 }, { "label": "bowl with spoon", "hexcode": "1F963", "tags": [ "bowl", "breakfast", "cereal", "congee", "oatmeal", "porridge", "spoon" ], "emoji": "🥣", "text": "", "type": 1, "order": 3900, "group": 4, "subgroup": 44, "version": 5 }, { "label": "green salad", "hexcode": "1F957", "tags": [ "food", "green", "salad" ], "emoji": "🥗", "text": "", "type": 1, "order": 3901, "group": 4, "subgroup": 44, "version": 3 }, { "label": "popcorn", "hexcode": "1F37F", "tags": [ "corn", "movie", "pop" ], "emoji": "🍿", "text": "", "type": 1, "order": 3902, "group": 4, "subgroup": 44, "version": 1 }, { "label": "butter", "hexcode": "1F9C8", "tags": [ "dairy" ], "emoji": "🧈", "text": "", "type": 1, "order": 3903, "group": 4, "subgroup": 44, "version": 12 }, { "label": "salt", "hexcode": "1F9C2", "tags": [ "condiment", "flavor", "mad", "salty", "shaker", "taste", "upset" ], "emoji": "🧂", "text": "", "type": 1, "order": 3904, "group": 4, "subgroup": 44, "version": 11 }, { "label": "canned food", "hexcode": "1F96B", "tags": [ "can", "canned", "food" ], "emoji": "🥫", "text": "", "type": 1, "order": 3905, "group": 4, "subgroup": 44, "version": 5 }, { "label": "bento box", "hexcode": "1F371", "tags": [ "bento", "box", "food" ], "emoji": "🍱", "text": "", "type": 1, "order": 3906, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "rice cracker", "hexcode": "1F358", "tags": [ "cracker", "food", "rice" ], "emoji": "🍘", "text": "", "type": 1, "order": 3907, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "rice ball", "hexcode": "1F359", "tags": [ "ball", "food", "japanese", "rice" ], "emoji": "🍙", "text": "", "type": 1, "order": 3908, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "cooked rice", "hexcode": "1F35A", "tags": [ "cooked", "food", "rice" ], "emoji": "🍚", "text": "", "type": 1, "order": 3909, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "curry rice", "hexcode": "1F35B", "tags": [ "curry", "food", "rice" ], "emoji": "🍛", "text": "", "type": 1, "order": 3910, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "steaming bowl", "hexcode": "1F35C", "tags": [ "bowl", "chopsticks", "food", "noodle", "pho", "ramen", "soup", "steaming" ], "emoji": "🍜", "text": "", "type": 1, "order": 3911, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "spaghetti", "hexcode": "1F35D", "tags": [ "food", "meatballs", "pasta", "restaurant" ], "emoji": "🍝", "text": "", "type": 1, "order": 3912, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "roasted sweet potato", "hexcode": "1F360", "tags": [ "food", "potato", "roasted", "sweet" ], "emoji": "🍠", "text": "", "type": 1, "order": 3913, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "oden", "hexcode": "1F362", "tags": [ "food", "kebab", "restaurant", "seafood", "skewer", "stick" ], "emoji": "🍢", "text": "", "type": 1, "order": 3914, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "sushi", "hexcode": "1F363", "tags": [ "food" ], "emoji": "🍣", "text": "", "type": 1, "order": 3915, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "fried shrimp", "hexcode": "1F364", "tags": [ "fried", "prawn", "shrimp", "tempura" ], "emoji": "🍤", "text": "", "type": 1, "order": 3916, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "fish cake with swirl", "hexcode": "1F365", "tags": [ "cake", "fish", "food", "pastry", "restaurant", "swirl" ], "emoji": "🍥", "text": "", "type": 1, "order": 3917, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "moon cake", "hexcode": "1F96E", "tags": [ "autumn", "cake", "festival", "moon", "yuèbǐng" ], "emoji": "🥮", "text": "", "type": 1, "order": 3918, "group": 4, "subgroup": 45, "version": 11 }, { "label": "dango", "hexcode": "1F361", "tags": [ "dessert", "japanese", "skewer", "stick", "sweet" ], "emoji": "🍡", "text": "", "type": 1, "order": 3919, "group": 4, "subgroup": 45, "version": 0.6 }, { "label": "dumpling", "hexcode": "1F95F", "tags": [ "empanada", "gyōza", "jiaozi", "pierogi", "potsticker" ], "emoji": "🥟", "text": "", "type": 1, "order": 3920, "group": 4, "subgroup": 45, "version": 5 }, { "label": "fortune cookie", "hexcode": "1F960", "tags": [ "cookie", "fortune", "prophecy" ], "emoji": "🥠", "text": "", "type": 1, "order": 3921, "group": 4, "subgroup": 45, "version": 5 }, { "label": "takeout box", "hexcode": "1F961", "tags": [ "box", "chopsticks", "delivery", "food", "oyster", "pail", "takeout" ], "emoji": "🥡", "text": "", "type": 1, "order": 3922, "group": 4, "subgroup": 45, "version": 5 }, { "label": "soft ice cream", "hexcode": "1F366", "tags": [ "cream", "dessert", "food", "ice", "icecream", "restaurant", "serve", "soft", "sweet" ], "emoji": "🍦", "text": "", "type": 1, "order": 3923, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "shaved ice", "hexcode": "1F367", "tags": [ "dessert", "ice", "restaurant", "shaved", "sweet" ], "emoji": "🍧", "text": "", "type": 1, "order": 3924, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "ice cream", "hexcode": "1F368", "tags": [ "cream", "dessert", "food", "ice", "restaurant", "sweet" ], "emoji": "🍨", "text": "", "type": 1, "order": 3925, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "doughnut", "hexcode": "1F369", "tags": [ "breakfast", "dessert", "donut", "food", "sweet" ], "emoji": "🍩", "text": "", "type": 1, "order": 3926, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "cookie", "hexcode": "1F36A", "tags": [ "chip", "chocolate", "dessert", "sweet" ], "emoji": "🍪", "text": "", "type": 1, "order": 3927, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "birthday cake", "hexcode": "1F382", "tags": [ "bday", "birthday", "cake", "celebration", "dessert", "happy", "pastry", "sweet" ], "emoji": "🎂", "text": "", "type": 1, "order": 3928, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "shortcake", "hexcode": "1F370", "tags": [ "cake", "dessert", "pastry", "slice", "sweet" ], "emoji": "🍰", "text": "", "type": 1, "order": 3929, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "cupcake", "hexcode": "1F9C1", "tags": [ "bakery", "dessert", "sprinkles", "sugar", "sweet", "treat" ], "emoji": "🧁", "text": "", "type": 1, "order": 3930, "group": 4, "subgroup": 46, "version": 11 }, { "label": "pie", "hexcode": "1F967", "tags": [ "apple", "filling", "fruit", "meat", "pastry", "pumpkin", "slice" ], "emoji": "🥧", "text": "", "type": 1, "order": 3931, "group": 4, "subgroup": 46, "version": 5 }, { "label": "chocolate bar", "hexcode": "1F36B", "tags": [ "bar", "candy", "chocolate", "dessert", "halloween", "sweet", "tooth" ], "emoji": "🍫", "text": "", "type": 1, "order": 3932, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "candy", "hexcode": "1F36C", "tags": [ "cavities", "dessert", "halloween", "restaurant", "sweet", "tooth", "wrapper" ], "emoji": "🍬", "text": "", "type": 1, "order": 3933, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "lollipop", "hexcode": "1F36D", "tags": [ "candy", "dessert", "food", "restaurant", "sweet" ], "emoji": "🍭", "text": "", "type": 1, "order": 3934, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "custard", "hexcode": "1F36E", "tags": [ "dessert", "pudding", "sweet" ], "emoji": "🍮", "text": "", "type": 1, "order": 3935, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "honey pot", "hexcode": "1F36F", "tags": [ "barrel", "bear", "food", "honey", "honeypot", "jar", "pot", "sweet" ], "emoji": "🍯", "text": "", "type": 1, "order": 3936, "group": 4, "subgroup": 46, "version": 0.6 }, { "label": "baby bottle", "hexcode": "1F37C", "tags": [ "babies", "baby", "birth", "born", "bottle", "drink", "infant", "milk", "newborn" ], "emoji": "🍼", "text": "", "type": 1, "order": 3937, "group": 4, "subgroup": 47, "version": 1 }, { "label": "glass of milk", "hexcode": "1F95B", "tags": [ "drink", "glass", "milk" ], "emoji": "🥛", "text": "", "type": 1, "order": 3938, "group": 4, "subgroup": 47, "version": 3 }, { "label": "hot beverage", "hexcode": "2615", "tags": [ "beverage", "cafe", "caffeine", "chai", "coffee", "drink", "hot", "morning", "steaming", "tea" ], "emoji": "☕️", "text": "☕︎", "type": 1, "order": 3939, "group": 4, "subgroup": 47, "version": 0.6 }, { "label": "teapot", "hexcode": "1FAD6", "tags": [ "brew", "drink", "food", "pot", "tea" ], "emoji": "🫖", "text": "", "type": 1, "order": 3940, "group": 4, "subgroup": 47, "version": 13 }, { "label": "teacup without handle", "hexcode": "1F375", "tags": [ "beverage", "cup", "drink", "handle", "oolong", "tea", "teacup" ], "emoji": "🍵", "text": "", "type": 1, "order": 3941, "group": 4, "subgroup": 47, "version": 0.6 }, { "label": "sake", "hexcode": "1F376", "tags": [ "bar", "beverage", "bottle", "cup", "drink", "restaurant" ], "emoji": "🍶", "text": "", "type": 1, "order": 3942, "group": 4, "subgroup": 47, "version": 0.6 }, { "label": "bottle with popping cork", "hexcode": "1F37E", "tags": [ "bar", "bottle", "cork", "drink", "popping" ], "emoji": "🍾", "text": "", "type": 1, "order": 3943, "group": 4, "subgroup": 47, "version": 1 }, { "label": "wine glass", "hexcode": "1F377", "tags": [ "alcohol", "bar", "beverage", "booze", "club", "drink", "drinking", "drinks", "glass", "restaurant", "wine" ], "emoji": "🍷", "text": "", "type": 1, "order": 3944, "group": 4, "subgroup": 47, "version": 0.6 }, { "label": "cocktail glass", "hexcode": "1F378", "tags": [ "alcohol", "bar", "booze", "club", "cocktail", "drink", "drinking", "drinks", "glass", "mad", "martini", "men" ], "emoji": "🍸️", "text": "🍸︎", "type": 1, "order": 3945, "group": 4, "subgroup": 47, "version": 0.6 }, { "label": "tropical drink", "hexcode": "1F379", "tags": [ "alcohol", "bar", "booze", "club", "cocktail", "drink", "drinking", "drinks", "drunk", "mai", "party", "tai", "tropical", "tropics" ], "emoji": "🍹", "text": "", "type": 1, "order": 3946, "group": 4, "subgroup": 47, "version": 0.6 }, { "label": "beer mug", "hexcode": "1F37A", "tags": [ "alcohol", "ale", "bar", "beer", "booze", "drink", "drinking", "drinks", "mug", "octoberfest", "oktoberfest", "pint", "stein", "summer" ], "emoji": "🍺", "text": "", "type": 1, "order": 3947, "group": 4, "subgroup": 47, "version": 0.6 }, { "label": "clinking beer mugs", "hexcode": "1F37B", "tags": [ "alcohol", "bar", "beer", "booze", "bottoms", "cheers", "clink", "clinking", "drinking", "drinks", "mugs" ], "emoji": "🍻", "text": "", "type": 1, "order": 3948, "group": 4, "subgroup": 47, "version": 0.6 }, { "label": "clinking glasses", "hexcode": "1F942", "tags": [ "celebrate", "clink", "clinking", "drink", "glass", "glasses" ], "emoji": "🥂", "text": "", "type": 1, "order": 3949, "group": 4, "subgroup": 47, "version": 3 }, { "label": "tumbler glass", "hexcode": "1F943", "tags": [ "glass", "liquor", "scotch", "shot", "tumbler", "whiskey", "whisky" ], "emoji": "🥃", "text": "", "type": 1, "order": 3950, "group": 4, "subgroup": 47, "version": 3 }, { "label": "pouring liquid", "hexcode": "1FAD7", "tags": [ "accident", "drink", "empty", "glass", "liquid", "oops", "pour", "pouring", "spill", "water" ], "emoji": "🫗", "text": "", "type": 1, "order": 3951, "group": 4, "subgroup": 47, "version": 14 }, { "label": "cup with straw", "hexcode": "1F964", "tags": [ "cup", "drink", "juice", "malt", "soda", "soft", "straw", "water" ], "emoji": "🥤", "text": "", "type": 1, "order": 3952, "group": 4, "subgroup": 47, "version": 5 }, { "label": "bubble tea", "hexcode": "1F9CB", "tags": [ "boba", "bubble", "food", "milk", "pearl", "tea" ], "emoji": "🧋", "text": "", "type": 1, "order": 3953, "group": 4, "subgroup": 47, "version": 13 }, { "label": "beverage box", "hexcode": "1F9C3", "tags": [ "beverage", "box", "juice", "straw", "sweet" ], "emoji": "🧃", "text": "", "type": 1, "order": 3954, "group": 4, "subgroup": 47, "version": 12 }, { "label": "mate", "hexcode": "1F9C9", "tags": [ "drink" ], "emoji": "🧉", "text": "", "type": 1, "order": 3955, "group": 4, "subgroup": 47, "version": 12 }, { "label": "ice", "hexcode": "1F9CA", "tags": [ "cold", "cube", "iceberg" ], "emoji": "🧊", "text": "", "type": 1, "order": 3956, "group": 4, "subgroup": 47, "version": 12 }, { "label": "chopsticks", "hexcode": "1F962", "tags": [ "hashi", "jeotgarak", "kuaizi" ], "emoji": "🥢", "text": "", "type": 1, "order": 3957, "group": 4, "subgroup": 48, "version": 5 }, { "label": "fork and knife with plate", "hexcode": "1F37D", "tags": [ "cooking", "dinner", "eat", "fork", "knife", "plate" ], "emoji": "🍽️", "text": "🍽︎", "type": 0, "order": 3959, "group": 4, "subgroup": 48, "version": 0.7 }, { "label": "fork and knife", "hexcode": "1F374", "tags": [ "breakfast", "breaky", "cooking", "cutlery", "delicious", "dinner", "eat", "feed", "food", "fork", "hungry", "knife", "lunch", "restaurant", "yum", "yummy" ], "emoji": "🍴", "text": "", "type": 1, "order": 3960, "group": 4, "subgroup": 48, "version": 0.6 }, { "label": "spoon", "hexcode": "1F944", "tags": [ "eat", "tableware" ], "emoji": "🥄", "text": "", "type": 1, "order": 3961, "group": 4, "subgroup": 48, "version": 3 }, { "label": "kitchen knife", "hexcode": "1F52A", "tags": [ "chef", "cooking", "hocho", "kitchen", "knife", "tool", "weapon" ], "emoji": "🔪", "text": "", "type": 1, "order": 3962, "group": 4, "subgroup": 48, "version": 0.6 }, { "label": "jar", "hexcode": "1FAD9", "tags": [ "condiment", "container", "empty", "nothing", "sauce", "store" ], "emoji": "🫙", "text": "", "type": 1, "order": 3963, "group": 4, "subgroup": 48, "version": 14 }, { "label": "amphora", "hexcode": "1F3FA", "tags": [ "aquarius", "cooking", "drink", "jug", "tool", "weapon", "zodiac" ], "emoji": "🏺", "text": "", "type": 1, "order": 3964, "group": 4, "subgroup": 48, "version": 1 }, { "label": "globe showing Europe-Africa", "hexcode": "1F30D", "tags": [ "africa", "earth", "europe", "europe-africa", "globe", "showing", "world" ], "emoji": "🌍️", "text": "🌍︎", "type": 1, "order": 3965, "group": 5, "subgroup": 49, "version": 0.7 }, { "label": "globe showing Americas", "hexcode": "1F30E", "tags": [ "americas", "earth", "globe", "showing", "world" ], "emoji": "🌎️", "text": "🌎︎", "type": 1, "order": 3966, "group": 5, "subgroup": 49, "version": 0.7 }, { "label": "globe showing Asia-Australia", "hexcode": "1F30F", "tags": [ "asia", "asia-australia", "australia", "earth", "globe", "showing", "world" ], "emoji": "🌏️", "text": "🌏︎", "type": 1, "order": 3967, "group": 5, "subgroup": 49, "version": 0.6 }, { "label": "globe with meridians", "hexcode": "1F310", "tags": [ "earth", "globe", "internet", "meridians", "web", "world", "worldwide" ], "emoji": "🌐", "text": "", "type": 1, "order": 3968, "group": 5, "subgroup": 49, "version": 1 }, { "label": "world map", "hexcode": "1F5FA", "tags": [ "map", "world" ], "emoji": "🗺️", "text": "🗺︎", "type": 0, "order": 3970, "group": 5, "subgroup": 49, "version": 0.7 }, { "label": "map of Japan", "hexcode": "1F5FE", "tags": [ "japan", "map" ], "emoji": "🗾", "text": "", "type": 1, "order": 3971, "group": 5, "subgroup": 49, "version": 0.6 }, { "label": "compass", "hexcode": "1F9ED", "tags": [ "direction", "magnetic", "navigation", "orienteering" ], "emoji": "🧭", "text": "", "type": 1, "order": 3972, "group": 5, "subgroup": 49, "version": 11 }, { "label": "snow-capped mountain", "hexcode": "1F3D4", "tags": [ "cold", "mountain", "snow", "snow-capped" ], "emoji": "🏔️", "text": "🏔︎", "type": 0, "order": 3974, "group": 5, "subgroup": 50, "version": 0.7 }, { "label": "mountain", "hexcode": "26F0", "tags": [ "mountain" ], "emoji": "⛰️", "text": "⛰︎", "type": 0, "order": 3976, "group": 5, "subgroup": 50, "version": 0.7 }, { "label": "landslide", "hexcode": "1F6D8", "tags": [ "avalanche", "danger", "disaster", "earthquake", "mountain", "mudslide", "rocks" ], "emoji": "🛘", "text": "", "type": 1, "order": 3977, "group": 5, "subgroup": 50, "version": 17 }, { "label": "volcano", "hexcode": "1F30B", "tags": [ "eruption", "mountain", "nature" ], "emoji": "🌋", "text": "", "type": 1, "order": 3978, "group": 5, "subgroup": 50, "version": 0.6 }, { "label": "mount fuji", "hexcode": "1F5FB", "tags": [ "fuji", "mount", "mountain", "nature" ], "emoji": "🗻", "text": "", "type": 1, "order": 3979, "group": 5, "subgroup": 50, "version": 0.6 }, { "label": "camping", "hexcode": "1F3D5", "tags": [ "camping" ], "emoji": "🏕️", "text": "🏕︎", "type": 0, "order": 3981, "group": 5, "subgroup": 50, "version": 0.7 }, { "label": "beach with umbrella", "hexcode": "1F3D6", "tags": [ "beach", "umbrella" ], "emoji": "🏖️", "text": "🏖︎", "type": 0, "order": 3983, "group": 5, "subgroup": 50, "version": 0.7 }, { "label": "desert", "hexcode": "1F3DC", "tags": [ "desert" ], "emoji": "🏜️", "text": "🏜︎", "type": 0, "order": 3985, "group": 5, "subgroup": 50, "version": 0.7 }, { "label": "desert island", "hexcode": "1F3DD", "tags": [ "desert", "island" ], "emoji": "🏝️", "text": "🏝︎", "type": 0, "order": 3987, "group": 5, "subgroup": 50, "version": 0.7 }, { "label": "national park", "hexcode": "1F3DE", "tags": [ "national", "park" ], "emoji": "🏞️", "text": "🏞︎", "type": 0, "order": 3989, "group": 5, "subgroup": 50, "version": 0.7 }, { "label": "stadium", "hexcode": "1F3DF", "tags": [ "stadium" ], "emoji": "🏟️", "text": "🏟︎", "type": 0, "order": 3991, "group": 5, "subgroup": 51, "version": 0.7 }, { "label": "classical building", "hexcode": "1F3DB", "tags": [ "building", "classical" ], "emoji": "🏛️", "text": "🏛︎", "type": 0, "order": 3993, "group": 5, "subgroup": 51, "version": 0.7 }, { "label": "building construction", "hexcode": "1F3D7", "tags": [ "building", "construction", "crane" ], "emoji": "🏗️", "text": "🏗︎", "type": 0, "order": 3995, "group": 5, "subgroup": 51, "version": 0.7 }, { "label": "brick", "hexcode": "1F9F1", "tags": [ "bricks", "clay", "mortar", "wall" ], "emoji": "🧱", "text": "", "type": 1, "order": 3996, "group": 5, "subgroup": 51, "version": 11 }, { "label": "rock", "hexcode": "1FAA8", "tags": [ "boulder", "heavy", "solid", "stone", "tough" ], "emoji": "🪨", "text": "", "type": 1, "order": 3997, "group": 5, "subgroup": 51, "version": 13 }, { "label": "wood", "hexcode": "1FAB5", "tags": [ "log", "lumber", "timber" ], "emoji": "🪵", "text": "", "type": 1, "order": 3998, "group": 5, "subgroup": 51, "version": 13 }, { "label": "hut", "hexcode": "1F6D6", "tags": [ "home", "house", "roundhouse", "shelter", "yurt" ], "emoji": "🛖", "text": "", "type": 1, "order": 3999, "group": 5, "subgroup": 51, "version": 13 }, { "label": "houses", "hexcode": "1F3D8", "tags": [ "house" ], "emoji": "🏘️", "text": "🏘︎", "type": 0, "order": 4001, "group": 5, "subgroup": 51, "version": 0.7 }, { "label": "derelict house", "hexcode": "1F3DA", "tags": [ "derelict", "home", "house" ], "emoji": "🏚️", "text": "🏚︎", "type": 0, "order": 4003, "group": 5, "subgroup": 51, "version": 0.7 }, { "label": "house", "hexcode": "1F3E0", "tags": [ "building", "country", "heart", "home", "ranch", "settle", "simple", "suburban", "suburbia", "where" ], "emoji": "🏠️", "text": "🏠︎", "type": 1, "order": 4004, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "house with garden", "hexcode": "1F3E1", "tags": [ "building", "country", "garden", "heart", "home", "house", "ranch", "settle", "simple", "suburban", "suburbia", "where" ], "emoji": "🏡", "text": "", "type": 1, "order": 4005, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "office building", "hexcode": "1F3E2", "tags": [ "building", "city", "cubical", "job", "office" ], "emoji": "🏢", "text": "", "type": 1, "order": 4006, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "Japanese post office", "hexcode": "1F3E3", "tags": [ "building", "japanese", "office", "post" ], "emoji": "🏣", "text": "", "type": 1, "order": 4007, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "post office", "hexcode": "1F3E4", "tags": [ "building", "european", "office", "post" ], "emoji": "🏤", "text": "", "type": 1, "order": 4008, "group": 5, "subgroup": 51, "version": 1 }, { "label": "hospital", "hexcode": "1F3E5", "tags": [ "building", "doctor", "medicine" ], "emoji": "🏥", "text": "", "type": 1, "order": 4009, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "bank", "hexcode": "1F3E6", "tags": [ "building" ], "emoji": "🏦", "text": "", "type": 1, "order": 4010, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "hotel", "hexcode": "1F3E8", "tags": [ "building" ], "emoji": "🏨", "text": "", "type": 1, "order": 4011, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "love hotel", "hexcode": "1F3E9", "tags": [ "building", "hotel", "love" ], "emoji": "🏩", "text": "", "type": 1, "order": 4012, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "convenience store", "hexcode": "1F3EA", "tags": [ "24", "building", "convenience", "hours", "store" ], "emoji": "🏪", "text": "", "type": 1, "order": 4013, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "school", "hexcode": "1F3EB", "tags": [ "building" ], "emoji": "🏫", "text": "", "type": 1, "order": 4014, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "department store", "hexcode": "1F3EC", "tags": [ "building", "department", "store" ], "emoji": "🏬", "text": "", "type": 1, "order": 4015, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "factory", "hexcode": "1F3ED", "tags": [ "building" ], "emoji": "🏭️", "text": "🏭︎", "type": 1, "order": 4016, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "Japanese castle", "hexcode": "1F3EF", "tags": [ "building", "castle", "japanese" ], "emoji": "🏯", "text": "", "type": 1, "order": 4017, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "castle", "hexcode": "1F3F0", "tags": [ "building", "european" ], "emoji": "🏰", "text": "", "type": 1, "order": 4018, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "wedding", "hexcode": "1F492", "tags": [ "chapel", "hitched", "nuptials", "romance" ], "emoji": "💒", "text": "", "type": 1, "order": 4019, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "Tokyo tower", "hexcode": "1F5FC", "tags": [ "tokyo", "tower" ], "emoji": "🗼", "text": "", "type": 1, "order": 4020, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "Statue of Liberty", "hexcode": "1F5FD", "tags": [ "liberty", "new", "ny", "nyc", "statue", "york" ], "emoji": "🗽", "text": "", "type": 1, "order": 4021, "group": 5, "subgroup": 51, "version": 0.6 }, { "label": "church", "hexcode": "26EA", "tags": [ "bless", "chapel", "christian", "cross", "religion" ], "emoji": "⛪️", "text": "⛪︎", "type": 1, "order": 4022, "group": 5, "subgroup": 52, "version": 0.6 }, { "label": "mosque", "hexcode": "1F54C", "tags": [ "islam", "masjid", "muslim", "religion" ], "emoji": "🕌", "text": "", "type": 1, "order": 4023, "group": 5, "subgroup": 52, "version": 1 }, { "label": "hindu temple", "hexcode": "1F6D5", "tags": [ "hindu", "temple" ], "emoji": "🛕", "text": "", "type": 1, "order": 4024, "group": 5, "subgroup": 52, "version": 12 }, { "label": "synagogue", "hexcode": "1F54D", "tags": [ "jew", "jewish", "judaism", "religion", "temple" ], "emoji": "🕍", "text": "", "type": 1, "order": 4025, "group": 5, "subgroup": 52, "version": 1 }, { "label": "shinto shrine", "hexcode": "26E9", "tags": [ "religion", "shinto", "shrine" ], "emoji": "⛩️", "text": "⛩︎", "type": 0, "order": 4027, "group": 5, "subgroup": 52, "version": 0.7 }, { "label": "kaaba", "hexcode": "1F54B", "tags": [ "hajj", "islam", "muslim", "religion", "umrah" ], "emoji": "🕋", "text": "", "type": 1, "order": 4028, "group": 5, "subgroup": 52, "version": 1 }, { "label": "fountain", "hexcode": "26F2", "tags": [ "fountain" ], "emoji": "⛲️", "text": "⛲︎", "type": 1, "order": 4029, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "tent", "hexcode": "26FA", "tags": [ "camping" ], "emoji": "⛺️", "text": "⛺︎", "type": 1, "order": 4030, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "foggy", "hexcode": "1F301", "tags": [ "fog" ], "emoji": "🌁", "text": "", "type": 1, "order": 4031, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "night with stars", "hexcode": "1F303", "tags": [ "night", "star", "stars" ], "emoji": "🌃", "text": "", "type": 1, "order": 4032, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "cityscape", "hexcode": "1F3D9", "tags": [ "city" ], "emoji": "🏙️", "text": "🏙︎", "type": 0, "order": 4034, "group": 5, "subgroup": 53, "version": 0.7 }, { "label": "sunrise over mountains", "hexcode": "1F304", "tags": [ "morning", "mountains", "over", "sun", "sunrise" ], "emoji": "🌄", "text": "", "type": 1, "order": 4035, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "sunrise", "hexcode": "1F305", "tags": [ "morning", "nature", "sun" ], "emoji": "🌅", "text": "", "type": 1, "order": 4036, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "cityscape at dusk", "hexcode": "1F306", "tags": [ "at", "building", "city", "cityscape", "dusk", "evening", "landscape", "sun", "sunset" ], "emoji": "🌆", "text": "", "type": 1, "order": 4037, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "sunset", "hexcode": "1F307", "tags": [ "building", "dusk", "sun" ], "emoji": "🌇", "text": "", "type": 1, "order": 4038, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "bridge at night", "hexcode": "1F309", "tags": [ "at", "bridge", "night" ], "emoji": "🌉", "text": "", "type": 1, "order": 4039, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "hot springs", "hexcode": "2668", "tags": [ "hot", "hotsprings", "springs", "steaming" ], "emoji": "♨️", "text": "♨︎", "type": 0, "order": 4041, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "carousel horse", "hexcode": "1F3A0", "tags": [ "carousel", "entertainment", "horse" ], "emoji": "🎠", "text": "", "type": 1, "order": 4042, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "playground slide", "hexcode": "1F6DD", "tags": [ "amusement", "park", "play", "playground", "playing", "slide", "sliding", "theme" ], "emoji": "🛝", "text": "", "type": 1, "order": 4043, "group": 5, "subgroup": 53, "version": 14 }, { "label": "ferris wheel", "hexcode": "1F3A1", "tags": [ "amusement", "ferris", "park", "theme", "wheel" ], "emoji": "🎡", "text": "", "type": 1, "order": 4044, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "roller coaster", "hexcode": "1F3A2", "tags": [ "amusement", "coaster", "park", "roller", "theme" ], "emoji": "🎢", "text": "", "type": 1, "order": 4045, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "barber pole", "hexcode": "1F488", "tags": [ "barber", "cut", "fresh", "haircut", "pole", "shave" ], "emoji": "💈", "text": "", "type": 1, "order": 4046, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "circus tent", "hexcode": "1F3AA", "tags": [ "circus", "tent" ], "emoji": "🎪", "text": "", "type": 1, "order": 4047, "group": 5, "subgroup": 53, "version": 0.6 }, { "label": "locomotive", "hexcode": "1F682", "tags": [ "caboose", "engine", "railway", "steam", "train", "trains", "travel" ], "emoji": "🚂", "text": "", "type": 1, "order": 4048, "group": 5, "subgroup": 54, "version": 1 }, { "label": "railway car", "hexcode": "1F683", "tags": [ "car", "electric", "railway", "train", "tram", "travel", "trolleybus" ], "emoji": "🚃", "text": "", "type": 1, "order": 4049, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "high-speed train", "hexcode": "1F684", "tags": [ "high-speed", "railway", "shinkansen", "speed", "train" ], "emoji": "🚄", "text": "", "type": 1, "order": 4050, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "bullet train", "hexcode": "1F685", "tags": [ "bullet", "high-speed", "nose", "railway", "shinkansen", "speed", "train", "travel" ], "emoji": "🚅", "text": "", "type": 1, "order": 4051, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "train", "hexcode": "1F686", "tags": [ "arrived", "choo", "railway" ], "emoji": "🚆", "text": "", "type": 1, "order": 4052, "group": 5, "subgroup": 54, "version": 1 }, { "label": "metro", "hexcode": "1F687", "tags": [ "subway", "travel" ], "emoji": "🚇️", "text": "🚇︎", "type": 1, "order": 4053, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "light rail", "hexcode": "1F688", "tags": [ "arrived", "light", "monorail", "rail", "railway" ], "emoji": "🚈", "text": "", "type": 1, "order": 4054, "group": 5, "subgroup": 54, "version": 1 }, { "label": "station", "hexcode": "1F689", "tags": [ "railway", "train" ], "emoji": "🚉", "text": "", "type": 1, "order": 4055, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "tram", "hexcode": "1F68A", "tags": [ "trolleybus" ], "emoji": "🚊", "text": "", "type": 1, "order": 4056, "group": 5, "subgroup": 54, "version": 1 }, { "label": "monorail", "hexcode": "1F69D", "tags": [ "vehicle" ], "emoji": "🚝", "text": "", "type": 1, "order": 4057, "group": 5, "subgroup": 54, "version": 1 }, { "label": "mountain railway", "hexcode": "1F69E", "tags": [ "car", "mountain", "railway", "trip" ], "emoji": "🚞", "text": "", "type": 1, "order": 4058, "group": 5, "subgroup": 54, "version": 1 }, { "label": "tram car", "hexcode": "1F68B", "tags": [ "bus", "car", "tram", "trolley", "trolleybus" ], "emoji": "🚋", "text": "", "type": 1, "order": 4059, "group": 5, "subgroup": 54, "version": 1 }, { "label": "bus", "hexcode": "1F68C", "tags": [ "school", "vehicle" ], "emoji": "🚌", "text": "", "type": 1, "order": 4060, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "oncoming bus", "hexcode": "1F68D", "tags": [ "bus", "cars", "oncoming" ], "emoji": "🚍️", "text": "🚍︎", "type": 1, "order": 4061, "group": 5, "subgroup": 54, "version": 0.7 }, { "label": "trolleybus", "hexcode": "1F68E", "tags": [ "bus", "tram", "trolley" ], "emoji": "🚎", "text": "", "type": 1, "order": 4062, "group": 5, "subgroup": 54, "version": 1 }, { "label": "minibus", "hexcode": "1F690", "tags": [ "bus", "drive", "van", "vehicle" ], "emoji": "🚐", "text": "", "type": 1, "order": 4063, "group": 5, "subgroup": 54, "version": 1 }, { "label": "ambulance", "hexcode": "1F691", "tags": [ "emergency", "vehicle" ], "emoji": "🚑️", "text": "🚑︎", "type": 1, "order": 4064, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "fire engine", "hexcode": "1F692", "tags": [ "engine", "fire", "truck" ], "emoji": "🚒", "text": "", "type": 1, "order": 4065, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "police car", "hexcode": "1F693", "tags": [ "5–0", "car", "cops", "patrol", "police" ], "emoji": "🚓", "text": "", "type": 1, "order": 4066, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "oncoming police car", "hexcode": "1F694", "tags": [ "car", "oncoming", "police" ], "emoji": "🚔️", "text": "🚔︎", "type": 1, "order": 4067, "group": 5, "subgroup": 54, "version": 0.7 }, { "label": "taxi", "hexcode": "1F695", "tags": [ "cab", "cabbie", "car", "drive", "vehicle", "yellow" ], "emoji": "🚕", "text": "", "type": 1, "order": 4068, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "oncoming taxi", "hexcode": "1F696", "tags": [ "cab", "cabbie", "cars", "drove", "hail", "oncoming", "taxi", "yellow" ], "emoji": "🚖", "text": "", "type": 1, "order": 4069, "group": 5, "subgroup": 54, "version": 1 }, { "label": "automobile", "hexcode": "1F697", "tags": [ "car", "driving", "vehicle" ], "emoji": "🚗", "text": "", "type": 1, "order": 4070, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "oncoming automobile", "hexcode": "1F698", "tags": [ "automobile", "car", "cars", "drove", "oncoming", "vehicle" ], "emoji": "🚘️", "text": "🚘︎", "type": 1, "order": 4071, "group": 5, "subgroup": 54, "version": 0.7 }, { "label": "sport utility vehicle", "hexcode": "1F699", "tags": [ "car", "drive", "recreational", "sport", "sportutility", "utility", "vehicle" ], "emoji": "🚙", "text": "", "type": 1, "order": 4072, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "pickup truck", "hexcode": "1F6FB", "tags": [ "automobile", "car", "flatbed", "pick-up", "pickup", "transportation", "truck" ], "emoji": "🛻", "text": "", "type": 1, "order": 4073, "group": 5, "subgroup": 54, "version": 13 }, { "label": "delivery truck", "hexcode": "1F69A", "tags": [ "car", "delivery", "drive", "truck", "vehicle" ], "emoji": "🚚", "text": "", "type": 1, "order": 4074, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "articulated lorry", "hexcode": "1F69B", "tags": [ "articulated", "car", "drive", "lorry", "move", "semi", "truck", "vehicle" ], "emoji": "🚛", "text": "", "type": 1, "order": 4075, "group": 5, "subgroup": 54, "version": 1 }, { "label": "tractor", "hexcode": "1F69C", "tags": [ "vehicle" ], "emoji": "🚜", "text": "", "type": 1, "order": 4076, "group": 5, "subgroup": 54, "version": 1 }, { "label": "racing car", "hexcode": "1F3CE", "tags": [ "car", "racing", "zoom" ], "emoji": "🏎️", "text": "🏎︎", "type": 0, "order": 4078, "group": 5, "subgroup": 54, "version": 0.7 }, { "label": "motorcycle", "hexcode": "1F3CD", "tags": [ "racing" ], "emoji": "🏍️", "text": "🏍︎", "type": 0, "order": 4080, "group": 5, "subgroup": 54, "version": 0.7 }, { "label": "motor scooter", "hexcode": "1F6F5", "tags": [ "motor", "scooter" ], "emoji": "🛵", "text": "", "type": 1, "order": 4081, "group": 5, "subgroup": 54, "version": 3 }, { "label": "manual wheelchair", "hexcode": "1F9BD", "tags": [ "accessibility", "manual", "wheelchair" ], "emoji": "🦽", "text": "", "type": 1, "order": 4082, "group": 5, "subgroup": 54, "version": 12 }, { "label": "motorized wheelchair", "hexcode": "1F9BC", "tags": [ "accessibility", "motorized", "wheelchair" ], "emoji": "🦼", "text": "", "type": 1, "order": 4083, "group": 5, "subgroup": 54, "version": 12 }, { "label": "auto rickshaw", "hexcode": "1F6FA", "tags": [ "auto", "rickshaw", "tuk" ], "emoji": "🛺", "text": "", "type": 1, "order": 4084, "group": 5, "subgroup": 54, "version": 12 }, { "label": "bicycle", "hexcode": "1F6B2", "tags": [ "bike", "class", "cycle", "cycling", "cyclist", "gang", "ride", "spin", "spinning" ], "emoji": "🚲️", "text": "🚲︎", "type": 1, "order": 4085, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "kick scooter", "hexcode": "1F6F4", "tags": [ "kick", "scooter" ], "emoji": "🛴", "text": "", "type": 1, "order": 4086, "group": 5, "subgroup": 54, "version": 3 }, { "label": "skateboard", "hexcode": "1F6F9", "tags": [ "board", "skate", "skater", "wheels" ], "emoji": "🛹", "text": "", "type": 1, "order": 4087, "group": 5, "subgroup": 54, "version": 11 }, { "label": "roller skate", "hexcode": "1F6FC", "tags": [ "blades", "roller", "skate", "skates", "sport" ], "emoji": "🛼", "text": "", "type": 1, "order": 4088, "group": 5, "subgroup": 54, "version": 13 }, { "label": "bus stop", "hexcode": "1F68F", "tags": [ "bus", "busstop", "stop" ], "emoji": "🚏", "text": "", "type": 1, "order": 4089, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "motorway", "hexcode": "1F6E3", "tags": [ "highway", "road" ], "emoji": "🛣️", "text": "🛣︎", "type": 0, "order": 4091, "group": 5, "subgroup": 54, "version": 0.7 }, { "label": "railway track", "hexcode": "1F6E4", "tags": [ "railway", "track", "train" ], "emoji": "🛤️", "text": "🛤︎", "type": 0, "order": 4093, "group": 5, "subgroup": 54, "version": 0.7 }, { "label": "oil drum", "hexcode": "1F6E2", "tags": [ "drum", "oil" ], "emoji": "🛢️", "text": "🛢︎", "type": 0, "order": 4095, "group": 5, "subgroup": 54, "version": 0.7 }, { "label": "fuel pump", "hexcode": "26FD", "tags": [ "diesel", "fuel", "fuelpump", "gas", "gasoline", "pump", "station" ], "emoji": "⛽️", "text": "⛽︎", "type": 1, "order": 4096, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "wheel", "hexcode": "1F6DE", "tags": [ "car", "circle", "tire", "turn", "vehicle" ], "emoji": "🛞", "text": "", "type": 1, "order": 4097, "group": 5, "subgroup": 54, "version": 14 }, { "label": "police car light", "hexcode": "1F6A8", "tags": [ "alarm", "alert", "beacon", "car", "emergency", "light", "police", "revolving", "siren" ], "emoji": "🚨", "text": "", "type": 1, "order": 4098, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "horizontal traffic light", "hexcode": "1F6A5", "tags": [ "horizontal", "intersection", "light", "signal", "stop", "stoplight", "traffic" ], "emoji": "🚥", "text": "", "type": 1, "order": 4099, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "vertical traffic light", "hexcode": "1F6A6", "tags": [ "drove", "intersection", "light", "signal", "stop", "stoplight", "traffic", "vertical" ], "emoji": "🚦", "text": "", "type": 1, "order": 4100, "group": 5, "subgroup": 54, "version": 1 }, { "label": "stop sign", "hexcode": "1F6D1", "tags": [ "octagonal", "sign", "stop" ], "emoji": "🛑", "text": "", "type": 1, "order": 4101, "group": 5, "subgroup": 54, "version": 3 }, { "label": "construction", "hexcode": "1F6A7", "tags": [ "barrier" ], "emoji": "🚧", "text": "", "type": 1, "order": 4102, "group": 5, "subgroup": 54, "version": 0.6 }, { "label": "anchor", "hexcode": "2693", "tags": [ "ship", "tool" ], "emoji": "⚓️", "text": "⚓︎", "type": 1, "order": 4103, "group": 5, "subgroup": 55, "version": 0.6 }, { "label": "ring buoy", "hexcode": "1F6DF", "tags": [ "buoy", "float", "life", "lifesaver", "preserver", "rescue", "ring", "safety", "save", "saver", "swim" ], "emoji": "🛟", "text": "", "type": 1, "order": 4104, "group": 5, "subgroup": 55, "version": 14 }, { "label": "sailboat", "hexcode": "26F5", "tags": [ "boat", "resort", "sailing", "sea", "yacht" ], "emoji": "⛵️", "text": "⛵︎", "type": 1, "order": 4105, "group": 5, "subgroup": 55, "version": 0.6 }, { "label": "canoe", "hexcode": "1F6F6", "tags": [ "boat" ], "emoji": "🛶", "text": "", "type": 1, "order": 4106, "group": 5, "subgroup": 55, "version": 3 }, { "label": "speedboat", "hexcode": "1F6A4", "tags": [ "billionaire", "boat", "lake", "luxury", "millionaire", "summer", "travel" ], "emoji": "🚤", "text": "", "type": 1, "order": 4107, "group": 5, "subgroup": 55, "version": 0.6 }, { "label": "passenger ship", "hexcode": "1F6F3", "tags": [ "passenger", "ship" ], "emoji": "🛳️", "text": "🛳︎", "type": 0, "order": 4109, "group": 5, "subgroup": 55, "version": 0.7 }, { "label": "ferry", "hexcode": "26F4", "tags": [ "boat", "passenger" ], "emoji": "⛴️", "text": "⛴︎", "type": 0, "order": 4111, "group": 5, "subgroup": 55, "version": 0.7 }, { "label": "motor boat", "hexcode": "1F6E5", "tags": [ "boat", "motor", "motorboat" ], "emoji": "🛥️", "text": "🛥︎", "type": 0, "order": 4113, "group": 5, "subgroup": 55, "version": 0.7 }, { "label": "ship", "hexcode": "1F6A2", "tags": [ "boat", "passenger", "travel" ], "emoji": "🚢", "text": "", "type": 1, "order": 4114, "group": 5, "subgroup": 55, "version": 0.6 }, { "label": "airplane", "hexcode": "2708", "tags": [ "aeroplane", "fly", "flying", "jet", "plane", "travel" ], "emoji": "✈️", "text": "✈︎", "type": 0, "order": 4116, "group": 5, "subgroup": 56, "version": 0.6 }, { "label": "small airplane", "hexcode": "1F6E9", "tags": [ "aeroplane", "airplane", "plane", "small" ], "emoji": "🛩️", "text": "🛩︎", "type": 0, "order": 4118, "group": 5, "subgroup": 56, "version": 0.7 }, { "label": "airplane departure", "hexcode": "1F6EB", "tags": [ "aeroplane", "airplane", "check-in", "departure", "departures", "plane" ], "emoji": "🛫", "text": "", "type": 1, "order": 4119, "group": 5, "subgroup": 56, "version": 1 }, { "label": "airplane arrival", "hexcode": "1F6EC", "tags": [ "aeroplane", "airplane", "arrival", "arrivals", "arriving", "landing", "plane" ], "emoji": "🛬", "text": "", "type": 1, "order": 4120, "group": 5, "subgroup": 56, "version": 1 }, { "label": "parachute", "hexcode": "1FA82", "tags": [ "hang-glide", "parasail", "skydive" ], "emoji": "🪂", "text": "", "type": 1, "order": 4121, "group": 5, "subgroup": 56, "version": 12 }, { "label": "seat", "hexcode": "1F4BA", "tags": [ "chair" ], "emoji": "💺", "text": "", "type": 1, "order": 4122, "group": 5, "subgroup": 56, "version": 0.6 }, { "label": "helicopter", "hexcode": "1F681", "tags": [ "copter", "roflcopter", "travel", "vehicle" ], "emoji": "🚁", "text": "", "type": 1, "order": 4123, "group": 5, "subgroup": 56, "version": 1 }, { "label": "suspension railway", "hexcode": "1F69F", "tags": [ "railway", "suspension" ], "emoji": "🚟", "text": "", "type": 1, "order": 4124, "group": 5, "subgroup": 56, "version": 1 }, { "label": "mountain cableway", "hexcode": "1F6A0", "tags": [ "cable", "cableway", "gondola", "lift", "mountain", "ski" ], "emoji": "🚠", "text": "", "type": 1, "order": 4125, "group": 5, "subgroup": 56, "version": 1 }, { "label": "aerial tramway", "hexcode": "1F6A1", "tags": [ "aerial", "cable", "car", "gondola", "ropeway", "tramway" ], "emoji": "🚡", "text": "", "type": 1, "order": 4126, "group": 5, "subgroup": 56, "version": 1 }, { "label": "satellite", "hexcode": "1F6F0", "tags": [ "space" ], "emoji": "🛰️", "text": "🛰︎", "type": 0, "order": 4128, "group": 5, "subgroup": 56, "version": 0.7 }, { "label": "rocket", "hexcode": "1F680", "tags": [ "launch", "rockets", "space", "travel" ], "emoji": "🚀", "text": "", "type": 1, "order": 4129, "group": 5, "subgroup": 56, "version": 0.6 }, { "label": "flying saucer", "hexcode": "1F6F8", "tags": [ "aliens", "extra", "flying", "saucer", "terrestrial", "ufo" ], "emoji": "🛸", "text": "", "type": 1, "order": 4130, "group": 5, "subgroup": 56, "version": 5 }, { "label": "bellhop bell", "hexcode": "1F6CE", "tags": [ "bell", "bellhop", "hotel" ], "emoji": "🛎️", "text": "🛎︎", "type": 0, "order": 4132, "group": 5, "subgroup": 57, "version": 0.7 }, { "label": "luggage", "hexcode": "1F9F3", "tags": [ "bag", "packing", "roller", "suitcase", "travel" ], "emoji": "🧳", "text": "", "type": 1, "order": 4133, "group": 5, "subgroup": 57, "version": 11 }, { "label": "hourglass done", "hexcode": "231B", "tags": [ "done", "hourglass", "sand", "time", "timer" ], "emoji": "⌛️", "text": "⌛︎", "type": 1, "order": 4134, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "hourglass not done", "hexcode": "23F3", "tags": [ "done", "flowing", "hourglass", "hours", "not", "sand", "timer", "waiting", "yolo" ], "emoji": "⏳️", "text": "⏳︎", "type": 1, "order": 4135, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "watch", "hexcode": "231A", "tags": [ "clock", "time" ], "emoji": "⌚️", "text": "⌚︎", "type": 1, "order": 4136, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "alarm clock", "hexcode": "23F0", "tags": [ "alarm", "clock", "hours", "hrs", "late", "time", "waiting" ], "emoji": "⏰️", "text": "⏰︎", "type": 1, "order": 4137, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "stopwatch", "hexcode": "23F1", "tags": [ "clock", "time" ], "emoji": "⏱️", "text": "⏱︎", "type": 0, "order": 4139, "group": 5, "subgroup": 58, "version": 1 }, { "label": "timer clock", "hexcode": "23F2", "tags": [ "clock", "timer" ], "emoji": "⏲️", "text": "⏲︎", "type": 0, "order": 4141, "group": 5, "subgroup": 58, "version": 1 }, { "label": "mantelpiece clock", "hexcode": "1F570", "tags": [ "clock", "mantelpiece", "time" ], "emoji": "🕰️", "text": "🕰︎", "type": 0, "order": 4143, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "twelve o’clock", "hexcode": "1F55B", "tags": [ "12", "12:00", "clock", "o’clock", "time", "twelve" ], "emoji": "🕛️", "text": "🕛︎", "type": 1, "order": 4144, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "twelve-thirty", "hexcode": "1F567", "tags": [ "12", "12:30", "30", "clock", "thirty", "time", "twelve" ], "emoji": "🕧️", "text": "🕧︎", "type": 1, "order": 4145, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "one o’clock", "hexcode": "1F550", "tags": [ "1", "1:00", "clock", "one", "o’clock", "time" ], "emoji": "🕐️", "text": "🕐︎", "type": 1, "order": 4146, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "one-thirty", "hexcode": "1F55C", "tags": [ "1", "1:30", "30", "clock", "one", "thirty", "time" ], "emoji": "🕜️", "text": "🕜︎", "type": 1, "order": 4147, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "two o’clock", "hexcode": "1F551", "tags": [ "2", "2:00", "clock", "o’clock", "time", "two" ], "emoji": "🕑️", "text": "🕑︎", "type": 1, "order": 4148, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "two-thirty", "hexcode": "1F55D", "tags": [ "2", "2:30", "30", "clock", "thirty", "time", "two" ], "emoji": "🕝️", "text": "🕝︎", "type": 1, "order": 4149, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "three o’clock", "hexcode": "1F552", "tags": [ "3", "3:00", "clock", "o’clock", "three", "time" ], "emoji": "🕒️", "text": "🕒︎", "type": 1, "order": 4150, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "three-thirty", "hexcode": "1F55E", "tags": [ "3", "30", "3:30", "clock", "thirty", "three", "time" ], "emoji": "🕞️", "text": "🕞︎", "type": 1, "order": 4151, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "four o’clock", "hexcode": "1F553", "tags": [ "4", "4:00", "clock", "four", "o’clock", "time" ], "emoji": "🕓️", "text": "🕓︎", "type": 1, "order": 4152, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "four-thirty", "hexcode": "1F55F", "tags": [ "30", "4", "4:30", "clock", "four", "thirty", "time" ], "emoji": "🕟️", "text": "🕟︎", "type": 1, "order": 4153, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "five o’clock", "hexcode": "1F554", "tags": [ "5", "5:00", "clock", "five", "o’clock", "time" ], "emoji": "🕔️", "text": "🕔︎", "type": 1, "order": 4154, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "five-thirty", "hexcode": "1F560", "tags": [ "30", "5", "5:30", "clock", "five", "thirty", "time" ], "emoji": "🕠️", "text": "🕠︎", "type": 1, "order": 4155, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "six o’clock", "hexcode": "1F555", "tags": [ "6", "6:00", "clock", "o’clock", "six", "time" ], "emoji": "🕕️", "text": "🕕︎", "type": 1, "order": 4156, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "six-thirty", "hexcode": "1F561", "tags": [ "30", "6", "6:30", "clock", "six", "thirty" ], "emoji": "🕡️", "text": "🕡︎", "type": 1, "order": 4157, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "seven o’clock", "hexcode": "1F556", "tags": [ "0", "7", "7:00", "clock", "o’clock", "seven" ], "emoji": "🕖️", "text": "🕖︎", "type": 1, "order": 4158, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "seven-thirty", "hexcode": "1F562", "tags": [ "30", "7", "7:30", "clock", "seven", "thirty" ], "emoji": "🕢️", "text": "🕢︎", "type": 1, "order": 4159, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "eight o’clock", "hexcode": "1F557", "tags": [ "8", "8:00", "clock", "eight", "o’clock", "time" ], "emoji": "🕗️", "text": "🕗︎", "type": 1, "order": 4160, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "eight-thirty", "hexcode": "1F563", "tags": [ "30", "8", "8:30", "clock", "eight", "thirty", "time" ], "emoji": "🕣️", "text": "🕣︎", "type": 1, "order": 4161, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "nine o’clock", "hexcode": "1F558", "tags": [ "9", "9:00", "clock", "nine", "o’clock", "time" ], "emoji": "🕘️", "text": "🕘︎", "type": 1, "order": 4162, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "nine-thirty", "hexcode": "1F564", "tags": [ "30", "9", "9:30", "clock", "nine", "thirty", "time" ], "emoji": "🕤️", "text": "🕤︎", "type": 1, "order": 4163, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "ten o’clock", "hexcode": "1F559", "tags": [ "0", "10", "10:00", "clock", "o’clock", "ten" ], "emoji": "🕙️", "text": "🕙︎", "type": 1, "order": 4164, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "ten-thirty", "hexcode": "1F565", "tags": [ "10", "10:30", "30", "clock", "ten", "thirty", "time" ], "emoji": "🕥️", "text": "🕥︎", "type": 1, "order": 4165, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "eleven o’clock", "hexcode": "1F55A", "tags": [ "11", "11:00", "clock", "eleven", "o’clock", "time" ], "emoji": "🕚️", "text": "🕚︎", "type": 1, "order": 4166, "group": 5, "subgroup": 58, "version": 0.6 }, { "label": "eleven-thirty", "hexcode": "1F566", "tags": [ "11", "11:30", "30", "clock", "eleven", "thirty", "time" ], "emoji": "🕦️", "text": "🕦︎", "type": 1, "order": 4167, "group": 5, "subgroup": 58, "version": 0.7 }, { "label": "new moon", "hexcode": "1F311", "tags": [ "dark", "moon", "new", "space" ], "emoji": "🌑", "text": "", "type": 1, "order": 4168, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "waxing crescent moon", "hexcode": "1F312", "tags": [ "crescent", "dreams", "moon", "space", "waxing" ], "emoji": "🌒", "text": "", "type": 1, "order": 4169, "group": 5, "subgroup": 59, "version": 1 }, { "label": "first quarter moon", "hexcode": "1F313", "tags": [ "first", "moon", "quarter", "space" ], "emoji": "🌓", "text": "", "type": 1, "order": 4170, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "waxing gibbous moon", "hexcode": "1F314", "tags": [ "gibbous", "moon", "space", "waxing" ], "emoji": "🌔", "text": "", "type": 1, "order": 4171, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "full moon", "hexcode": "1F315", "tags": [ "full", "moon", "space" ], "emoji": "🌕️", "text": "🌕︎", "type": 1, "order": 4172, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "waning gibbous moon", "hexcode": "1F316", "tags": [ "gibbous", "moon", "space", "waning" ], "emoji": "🌖", "text": "", "type": 1, "order": 4173, "group": 5, "subgroup": 59, "version": 1 }, { "label": "last quarter moon", "hexcode": "1F317", "tags": [ "last", "moon", "quarter", "space" ], "emoji": "🌗", "text": "", "type": 1, "order": 4174, "group": 5, "subgroup": 59, "version": 1 }, { "label": "waning crescent moon", "hexcode": "1F318", "tags": [ "crescent", "moon", "space", "waning" ], "emoji": "🌘", "text": "", "type": 1, "order": 4175, "group": 5, "subgroup": 59, "version": 1 }, { "label": "crescent moon", "hexcode": "1F319", "tags": [ "crescent", "moon", "ramadan", "space" ], "emoji": "🌙", "text": "", "type": 1, "order": 4176, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "new moon face", "hexcode": "1F31A", "tags": [ "face", "moon", "new", "space" ], "emoji": "🌚", "text": "", "type": 1, "order": 4177, "group": 5, "subgroup": 59, "version": 1 }, { "label": "first quarter moon face", "hexcode": "1F31B", "tags": [ "face", "first", "moon", "quarter", "space" ], "emoji": "🌛", "text": "", "type": 1, "order": 4178, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "last quarter moon face", "hexcode": "1F31C", "tags": [ "dreams", "face", "last", "moon", "quarter" ], "emoji": "🌜️", "text": "🌜︎", "type": 1, "order": 4179, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "thermometer", "hexcode": "1F321", "tags": [ "weather" ], "emoji": "🌡️", "text": "🌡︎", "type": 0, "order": 4181, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "sun", "hexcode": "2600", "tags": [ "bright", "rays", "space", "sunny", "weather" ], "emoji": "☀️", "text": "☀︎", "type": 0, "order": 4183, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "full moon face", "hexcode": "1F31D", "tags": [ "bright", "face", "full", "moon" ], "emoji": "🌝", "text": "", "type": 1, "order": 4184, "group": 5, "subgroup": 59, "version": 1 }, { "label": "sun with face", "hexcode": "1F31E", "tags": [ "beach", "bright", "day", "face", "heat", "shine", "sun", "sunny", "sunshine", "weather" ], "emoji": "🌞", "text": "", "type": 1, "order": 4185, "group": 5, "subgroup": 59, "version": 1 }, { "label": "ringed planet", "hexcode": "1FA90", "tags": [ "planet", "ringed", "saturn", "saturnine" ], "emoji": "🪐", "text": "", "type": 1, "order": 4186, "group": 5, "subgroup": 59, "version": 12 }, { "label": "star", "hexcode": "2B50", "tags": [ "astronomy", "medium", "stars", "white" ], "emoji": "⭐️", "text": "⭐︎", "type": 1, "order": 4187, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "glowing star", "hexcode": "1F31F", "tags": [ "glittery", "glow", "glowing", "night", "shining", "sparkle", "star", "win" ], "emoji": "🌟", "text": "", "type": 1, "order": 4188, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "shooting star", "hexcode": "1F320", "tags": [ "falling", "night", "shooting", "space", "star" ], "emoji": "🌠", "text": "", "type": 1, "order": 4189, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "milky way", "hexcode": "1F30C", "tags": [ "milky", "space", "way" ], "emoji": "🌌", "text": "", "type": 1, "order": 4190, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "cloud", "hexcode": "2601", "tags": [ "weather" ], "emoji": "☁️", "text": "☁︎", "type": 0, "order": 4192, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "sun behind cloud", "hexcode": "26C5", "tags": [ "behind", "cloud", "cloudy", "sun", "weather" ], "emoji": "⛅️", "text": "⛅︎", "type": 1, "order": 4193, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "cloud with lightning and rain", "hexcode": "26C8", "tags": [ "cloud", "lightning", "rain", "thunder", "thunderstorm" ], "emoji": "⛈️", "text": "⛈︎", "type": 0, "order": 4195, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "sun behind small cloud", "hexcode": "1F324", "tags": [ "behind", "cloud", "sun", "weather" ], "emoji": "🌤️", "text": "🌤︎", "type": 0, "order": 4197, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "sun behind large cloud", "hexcode": "1F325", "tags": [ "behind", "cloud", "sun", "weather" ], "emoji": "🌥️", "text": "🌥︎", "type": 0, "order": 4199, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "sun behind rain cloud", "hexcode": "1F326", "tags": [ "behind", "cloud", "rain", "sun", "weather" ], "emoji": "🌦️", "text": "🌦︎", "type": 0, "order": 4201, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "cloud with rain", "hexcode": "1F327", "tags": [ "cloud", "rain", "weather" ], "emoji": "🌧️", "text": "🌧︎", "type": 0, "order": 4203, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "cloud with snow", "hexcode": "1F328", "tags": [ "cloud", "cold", "snow", "weather" ], "emoji": "🌨️", "text": "🌨︎", "type": 0, "order": 4205, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "cloud with lightning", "hexcode": "1F329", "tags": [ "cloud", "lightning", "weather" ], "emoji": "🌩️", "text": "🌩︎", "type": 0, "order": 4207, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "tornado", "hexcode": "1F32A", "tags": [ "cloud", "weather", "whirlwind" ], "emoji": "🌪️", "text": "🌪︎", "type": 0, "order": 4209, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "fog", "hexcode": "1F32B", "tags": [ "cloud", "weather" ], "emoji": "🌫️", "text": "🌫︎", "type": 0, "order": 4211, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "wind face", "hexcode": "1F32C", "tags": [ "blow", "cloud", "face", "wind" ], "emoji": "🌬️", "text": "🌬︎", "type": 0, "order": 4213, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "cyclone", "hexcode": "1F300", "tags": [ "dizzy", "hurricane", "twister", "typhoon", "weather" ], "emoji": "🌀", "text": "", "type": 1, "order": 4214, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "rainbow", "hexcode": "1F308", "tags": [ "gay", "genderqueer", "glbt", "glbtq", "lesbian", "lgbt", "lgbtq", "lgbtqia", "nature", "pride", "queer", "rain", "trans", "transgender", "weather" ], "emoji": "🌈", "text": "", "type": 1, "order": 4215, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "closed umbrella", "hexcode": "1F302", "tags": [ "closed", "clothing", "rain", "umbrella" ], "emoji": "🌂", "text": "", "type": 1, "order": 4216, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "umbrella", "hexcode": "2602", "tags": [ "clothing", "rain" ], "emoji": "☂️", "text": "☂︎", "type": 0, "order": 4218, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "umbrella with rain drops", "hexcode": "2614", "tags": [ "clothing", "drop", "drops", "rain", "umbrella", "weather" ], "emoji": "☔️", "text": "☔︎", "type": 1, "order": 4219, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "umbrella on ground", "hexcode": "26F1", "tags": [ "ground", "rain", "sun", "umbrella" ], "emoji": "⛱️", "text": "⛱︎", "type": 0, "order": 4221, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "high voltage", "hexcode": "26A1", "tags": [ "danger", "electric", "electricity", "high", "lightning", "nature", "thunder", "thunderbolt", "voltage", "zap" ], "emoji": "⚡️", "text": "⚡︎", "type": 1, "order": 4222, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "snowflake", "hexcode": "2744", "tags": [ "cold", "snow", "weather" ], "emoji": "❄️", "text": "❄︎", "type": 0, "order": 4224, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "snowman", "hexcode": "2603", "tags": [ "cold", "man", "snow" ], "emoji": "☃️", "text": "☃︎", "type": 0, "order": 4226, "group": 5, "subgroup": 59, "version": 0.7 }, { "label": "snowman without snow", "hexcode": "26C4", "tags": [ "cold", "man", "snow", "snowman" ], "emoji": "⛄️", "text": "⛄︎", "type": 1, "order": 4227, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "comet", "hexcode": "2604", "tags": [ "space" ], "emoji": "☄️", "text": "☄︎", "type": 0, "order": 4229, "group": 5, "subgroup": 59, "version": 1 }, { "label": "fire", "hexcode": "1F525", "tags": [ "af", "burn", "flame", "hot", "lit", "litaf", "tool" ], "emoji": "🔥", "text": "", "type": 1, "order": 4230, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "droplet", "hexcode": "1F4A7", "tags": [ "cold", "comic", "drop", "nature", "sad", "sweat", "tear", "water", "weather" ], "emoji": "💧", "text": "", "type": 1, "order": 4231, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "water wave", "hexcode": "1F30A", "tags": [ "nature", "ocean", "surf", "surfer", "surfing", "water", "wave" ], "emoji": "🌊", "text": "", "type": 1, "order": 4232, "group": 5, "subgroup": 59, "version": 0.6 }, { "label": "jack-o-lantern", "hexcode": "1F383", "tags": [ "celebration", "halloween", "jack", "lantern", "pumpkin" ], "emoji": "🎃", "text": "", "type": 1, "order": 4233, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "Christmas tree", "hexcode": "1F384", "tags": [ "celebration", "christmas", "tree" ], "emoji": "🎄", "text": "", "type": 1, "order": 4234, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "fireworks", "hexcode": "1F386", "tags": [ "boom", "celebration", "entertainment", "yolo" ], "emoji": "🎆", "text": "", "type": 1, "order": 4235, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "sparkler", "hexcode": "1F387", "tags": [ "boom", "celebration", "fireworks", "sparkle" ], "emoji": "🎇", "text": "", "type": 1, "order": 4236, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "firecracker", "hexcode": "1F9E8", "tags": [ "dynamite", "explosive", "fire", "fireworks", "light", "pop", "popping", "spark" ], "emoji": "🧨", "text": "", "type": 1, "order": 4237, "group": 6, "subgroup": 60, "version": 11 }, { "label": "sparkles", "hexcode": "2728", "tags": [ "*", "magic", "sparkle", "star" ], "emoji": "✨️", "text": "✨︎", "type": 1, "order": 4238, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "balloon", "hexcode": "1F388", "tags": [ "birthday", "celebrate", "celebration" ], "emoji": "🎈", "text": "", "type": 1, "order": 4239, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "party popper", "hexcode": "1F389", "tags": [ "awesome", "birthday", "celebrate", "celebration", "excited", "hooray", "party", "popper", "tada", "woohoo" ], "emoji": "🎉", "text": "", "type": 1, "order": 4240, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "confetti ball", "hexcode": "1F38A", "tags": [ "ball", "celebrate", "celebration", "confetti", "party", "woohoo" ], "emoji": "🎊", "text": "", "type": 1, "order": 4241, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "tanabata tree", "hexcode": "1F38B", "tags": [ "banner", "celebration", "japanese", "tanabata", "tree" ], "emoji": "🎋", "text": "", "type": 1, "order": 4242, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "pine decoration", "hexcode": "1F38D", "tags": [ "bamboo", "celebration", "decoration", "japanese", "pine", "plant" ], "emoji": "🎍", "text": "", "type": 1, "order": 4243, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "Japanese dolls", "hexcode": "1F38E", "tags": [ "celebration", "doll", "dolls", "festival", "japanese" ], "emoji": "🎎", "text": "", "type": 1, "order": 4244, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "carp streamer", "hexcode": "1F38F", "tags": [ "carp", "celebration", "streamer" ], "emoji": "🎏", "text": "", "type": 1, "order": 4245, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "wind chime", "hexcode": "1F390", "tags": [ "bell", "celebration", "chime", "wind" ], "emoji": "🎐", "text": "", "type": 1, "order": 4246, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "moon viewing ceremony", "hexcode": "1F391", "tags": [ "celebration", "ceremony", "moon", "viewing" ], "emoji": "🎑", "text": "", "type": 1, "order": 4247, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "red envelope", "hexcode": "1F9E7", "tags": [ "envelope", "gift", "good", "hóngbāo", "lai", "luck", "money", "red", "see" ], "emoji": "🧧", "text": "", "type": 1, "order": 4248, "group": 6, "subgroup": 60, "version": 11 }, { "label": "ribbon", "hexcode": "1F380", "tags": [ "celebration" ], "emoji": "🎀", "text": "", "type": 1, "order": 4249, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "wrapped gift", "hexcode": "1F381", "tags": [ "birthday", "bow", "box", "celebration", "christmas", "gift", "present", "surprise", "wrapped" ], "emoji": "🎁", "text": "", "type": 1, "order": 4250, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "reminder ribbon", "hexcode": "1F397", "tags": [ "celebration", "reminder", "ribbon" ], "emoji": "🎗️", "text": "🎗︎", "type": 0, "order": 4252, "group": 6, "subgroup": 60, "version": 0.7 }, { "label": "admission tickets", "hexcode": "1F39F", "tags": [ "admission", "ticket", "tickets" ], "emoji": "🎟️", "text": "🎟︎", "type": 0, "order": 4254, "group": 6, "subgroup": 60, "version": 0.7 }, { "label": "ticket", "hexcode": "1F3AB", "tags": [ "admission", "stub" ], "emoji": "🎫", "text": "", "type": 1, "order": 4255, "group": 6, "subgroup": 60, "version": 0.6 }, { "label": "military medal", "hexcode": "1F396", "tags": [ "award", "celebration", "medal", "military" ], "emoji": "🎖️", "text": "🎖︎", "type": 0, "order": 4257, "group": 6, "subgroup": 61, "version": 0.7 }, { "label": "trophy", "hexcode": "1F3C6", "tags": [ "champion", "champs", "prize", "slay", "sport", "victory", "win", "winning" ], "emoji": "🏆️", "text": "🏆︎", "type": 1, "order": 4258, "group": 6, "subgroup": 61, "version": 0.6 }, { "label": "sports medal", "hexcode": "1F3C5", "tags": [ "award", "gold", "medal", "sports", "winner" ], "emoji": "🏅", "text": "", "type": 1, "order": 4259, "group": 6, "subgroup": 61, "version": 1 }, { "label": "1st place medal", "hexcode": "1F947", "tags": [ "1st", "first", "gold", "medal", "place" ], "emoji": "🥇", "text": "", "type": 1, "order": 4260, "group": 6, "subgroup": 61, "version": 3 }, { "label": "2nd place medal", "hexcode": "1F948", "tags": [ "2nd", "medal", "place", "second", "silver" ], "emoji": "🥈", "text": "", "type": 1, "order": 4261, "group": 6, "subgroup": 61, "version": 3 }, { "label": "3rd place medal", "hexcode": "1F949", "tags": [ "3rd", "bronze", "medal", "place", "third" ], "emoji": "🥉", "text": "", "type": 1, "order": 4262, "group": 6, "subgroup": 61, "version": 3 }, { "label": "soccer ball", "hexcode": "26BD", "tags": [ "ball", "football", "futbol", "soccer", "sport" ], "emoji": "⚽️", "text": "⚽︎", "type": 1, "order": 4263, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "baseball", "hexcode": "26BE", "tags": [ "ball", "sport" ], "emoji": "⚾️", "text": "⚾︎", "type": 1, "order": 4264, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "softball", "hexcode": "1F94E", "tags": [ "ball", "glove", "sports", "underarm" ], "emoji": "🥎", "text": "", "type": 1, "order": 4265, "group": 6, "subgroup": 62, "version": 11 }, { "label": "basketball", "hexcode": "1F3C0", "tags": [ "ball", "hoop", "sport" ], "emoji": "🏀", "text": "", "type": 1, "order": 4266, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "volleyball", "hexcode": "1F3D0", "tags": [ "ball", "game" ], "emoji": "🏐", "text": "", "type": 1, "order": 4267, "group": 6, "subgroup": 62, "version": 1 }, { "label": "american football", "hexcode": "1F3C8", "tags": [ "american", "ball", "bowl", "football", "sport", "super" ], "emoji": "🏈", "text": "", "type": 1, "order": 4268, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "rugby football", "hexcode": "1F3C9", "tags": [ "ball", "football", "rugby", "sport" ], "emoji": "🏉", "text": "", "type": 1, "order": 4269, "group": 6, "subgroup": 62, "version": 1 }, { "label": "tennis", "hexcode": "1F3BE", "tags": [ "ball", "racquet", "sport" ], "emoji": "🎾", "text": "", "type": 1, "order": 4270, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "flying disc", "hexcode": "1F94F", "tags": [ "disc", "flying", "ultimate" ], "emoji": "🥏", "text": "", "type": 1, "order": 4271, "group": 6, "subgroup": 62, "version": 11 }, { "label": "bowling", "hexcode": "1F3B3", "tags": [ "ball", "game", "sport", "strike" ], "emoji": "🎳", "text": "", "type": 1, "order": 4272, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "cricket game", "hexcode": "1F3CF", "tags": [ "ball", "bat", "cricket", "game" ], "emoji": "🏏", "text": "", "type": 1, "order": 4273, "group": 6, "subgroup": 62, "version": 1 }, { "label": "field hockey", "hexcode": "1F3D1", "tags": [ "ball", "field", "game", "hockey", "stick" ], "emoji": "🏑", "text": "", "type": 1, "order": 4274, "group": 6, "subgroup": 62, "version": 1 }, { "label": "ice hockey", "hexcode": "1F3D2", "tags": [ "game", "hockey", "ice", "puck", "stick" ], "emoji": "🏒", "text": "", "type": 1, "order": 4275, "group": 6, "subgroup": 62, "version": 1 }, { "label": "lacrosse", "hexcode": "1F94D", "tags": [ "ball", "goal", "sports", "stick" ], "emoji": "🥍", "text": "", "type": 1, "order": 4276, "group": 6, "subgroup": 62, "version": 11 }, { "label": "ping pong", "hexcode": "1F3D3", "tags": [ "ball", "bat", "game", "paddle", "ping", "pingpong", "pong", "table", "tennis" ], "emoji": "🏓", "text": "", "type": 1, "order": 4277, "group": 6, "subgroup": 62, "version": 1 }, { "label": "badminton", "hexcode": "1F3F8", "tags": [ "birdie", "game", "racquet", "shuttlecock" ], "emoji": "🏸", "text": "", "type": 1, "order": 4278, "group": 6, "subgroup": 62, "version": 1 }, { "label": "boxing glove", "hexcode": "1F94A", "tags": [ "boxing", "glove" ], "emoji": "🥊", "text": "", "type": 1, "order": 4279, "group": 6, "subgroup": 62, "version": 3 }, { "label": "martial arts uniform", "hexcode": "1F94B", "tags": [ "arts", "judo", "karate", "martial", "taekwondo", "uniform" ], "emoji": "🥋", "text": "", "type": 1, "order": 4280, "group": 6, "subgroup": 62, "version": 3 }, { "label": "goal net", "hexcode": "1F945", "tags": [ "goal", "net" ], "emoji": "🥅", "text": "", "type": 1, "order": 4281, "group": 6, "subgroup": 62, "version": 3 }, { "label": "flag in hole", "hexcode": "26F3", "tags": [ "flag", "golf", "hole", "sport" ], "emoji": "⛳️", "text": "⛳︎", "type": 1, "order": 4282, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "ice skate", "hexcode": "26F8", "tags": [ "ice", "skate", "skating" ], "emoji": "⛸️", "text": "⛸︎", "type": 0, "order": 4284, "group": 6, "subgroup": 62, "version": 0.7 }, { "label": "fishing pole", "hexcode": "1F3A3", "tags": [ "entertainment", "fish", "fishing", "pole", "sport" ], "emoji": "🎣", "text": "", "type": 1, "order": 4285, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "diving mask", "hexcode": "1F93F", "tags": [ "diving", "mask", "scuba", "snorkeling" ], "emoji": "🤿", "text": "", "type": 1, "order": 4286, "group": 6, "subgroup": 62, "version": 12 }, { "label": "running shirt", "hexcode": "1F3BD", "tags": [ "athletics", "running", "sash", "shirt" ], "emoji": "🎽", "text": "", "type": 1, "order": 4287, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "skis", "hexcode": "1F3BF", "tags": [ "ski", "snow", "sport" ], "emoji": "🎿", "text": "", "type": 1, "order": 4288, "group": 6, "subgroup": 62, "version": 0.6 }, { "label": "sled", "hexcode": "1F6F7", "tags": [ "luge", "sledge", "sleigh", "snow", "toboggan" ], "emoji": "🛷", "text": "", "type": 1, "order": 4289, "group": 6, "subgroup": 62, "version": 5 }, { "label": "curling stone", "hexcode": "1F94C", "tags": [ "curling", "game", "rock", "stone" ], "emoji": "🥌", "text": "", "type": 1, "order": 4290, "group": 6, "subgroup": 62, "version": 5 }, { "label": "bullseye", "hexcode": "1F3AF", "tags": [ "bull", "dart", "direct", "entertainment", "game", "hit", "target" ], "emoji": "🎯", "text": "", "type": 1, "order": 4291, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "yo-yo", "hexcode": "1FA80", "tags": [ "fluctuate", "toy" ], "emoji": "🪀", "text": "", "type": 1, "order": 4292, "group": 6, "subgroup": 63, "version": 12 }, { "label": "kite", "hexcode": "1FA81", "tags": [ "fly", "soar" ], "emoji": "🪁", "text": "", "type": 1, "order": 4293, "group": 6, "subgroup": 63, "version": 12 }, { "label": "water pistol", "hexcode": "1F52B", "tags": [ "gun", "handgun", "pistol", "revolver", "tool", "water", "weapon" ], "emoji": "🔫", "text": "", "type": 1, "order": 4294, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "pool 8 ball", "hexcode": "1F3B1", "tags": [ "8", "8ball", "ball", "billiard", "eight", "game", "pool" ], "emoji": "🎱", "text": "", "type": 1, "order": 4295, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "crystal ball", "hexcode": "1F52E", "tags": [ "ball", "crystal", "fairy", "fairytale", "fantasy", "fortune", "future", "magic", "tale", "tool" ], "emoji": "🔮", "text": "", "type": 1, "order": 4296, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "magic wand", "hexcode": "1FA84", "tags": [ "magic", "magician", "wand", "witch", "wizard" ], "emoji": "🪄", "text": "", "type": 1, "order": 4297, "group": 6, "subgroup": 63, "version": 13 }, { "label": "video game", "hexcode": "1F3AE", "tags": [ "controller", "entertainment", "game", "video" ], "emoji": "🎮️", "text": "🎮︎", "type": 1, "order": 4298, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "joystick", "hexcode": "1F579", "tags": [ "game", "video", "videogame" ], "emoji": "🕹️", "text": "🕹︎", "type": 0, "order": 4300, "group": 6, "subgroup": 63, "version": 0.7 }, { "label": "slot machine", "hexcode": "1F3B0", "tags": [ "casino", "gamble", "gambling", "game", "machine", "slot", "slots" ], "emoji": "🎰", "text": "", "type": 1, "order": 4301, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "game die", "hexcode": "1F3B2", "tags": [ "dice", "die", "entertainment", "game" ], "emoji": "🎲", "text": "", "type": 1, "order": 4302, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "puzzle piece", "hexcode": "1F9E9", "tags": [ "clue", "interlocking", "jigsaw", "piece", "puzzle" ], "emoji": "🧩", "text": "", "type": 1, "order": 4303, "group": 6, "subgroup": 63, "version": 11 }, { "label": "teddy bear", "hexcode": "1F9F8", "tags": [ "bear", "plaything", "plush", "stuffed", "teddy", "toy" ], "emoji": "🧸", "text": "", "type": 1, "order": 4304, "group": 6, "subgroup": 63, "version": 11 }, { "label": "piñata", "hexcode": "1FA85", "tags": [ "candy", "celebrate", "celebration", "cinco", "de", "festive", "mayo", "party", "pinada", "pinata" ], "emoji": "🪅", "text": "", "type": 1, "order": 4305, "group": 6, "subgroup": 63, "version": 13 }, { "label": "mirror ball", "hexcode": "1FAA9", "tags": [ "ball", "dance", "disco", "glitter", "mirror", "party" ], "emoji": "🪩", "text": "", "type": 1, "order": 4306, "group": 6, "subgroup": 63, "version": 14 }, { "label": "nesting dolls", "hexcode": "1FA86", "tags": [ "babooshka", "baboushka", "babushka", "doll", "dolls", "matryoshka", "nesting", "russia" ], "emoji": "🪆", "text": "", "type": 1, "order": 4307, "group": 6, "subgroup": 63, "version": 13 }, { "label": "spade suit", "hexcode": "2660", "tags": [ "card", "game", "spade", "suit" ], "emoji": "♠️", "text": "♠︎", "type": 0, "order": 4309, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "heart suit", "hexcode": "2665", "tags": [ "card", "emotion", "game", "heart", "hearts", "suit" ], "emoji": "♥️", "text": "♥︎", "type": 0, "order": 4311, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "diamond suit", "hexcode": "2666", "tags": [ "card", "diamond", "game", "suit" ], "emoji": "♦️", "text": "♦︎", "type": 0, "order": 4313, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "club suit", "hexcode": "2663", "tags": [ "card", "club", "clubs", "game", "suit" ], "emoji": "♣️", "text": "♣︎", "type": 0, "order": 4315, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "chess pawn", "hexcode": "265F", "tags": [ "chess", "dupe", "expendable", "pawn" ], "emoji": "♟️", "text": "♟︎", "type": 0, "order": 4317, "group": 6, "subgroup": 63, "version": 11 }, { "label": "joker", "hexcode": "1F0CF", "tags": [ "card", "game", "wildcard" ], "emoji": "🃏", "text": "", "type": 1, "order": 4318, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "mahjong red dragon", "hexcode": "1F004", "tags": [ "dragon", "game", "mahjong", "red" ], "emoji": "🀄️", "text": "🀄︎", "type": 1, "order": 4319, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "flower playing cards", "hexcode": "1F3B4", "tags": [ "card", "cards", "flower", "game", "japanese", "playing" ], "emoji": "🎴", "text": "", "type": 1, "order": 4320, "group": 6, "subgroup": 63, "version": 0.6 }, { "label": "performing arts", "hexcode": "1F3AD", "tags": [ "actor", "actress", "art", "arts", "entertainment", "mask", "performing", "theater", "theatre", "thespian" ], "emoji": "🎭️", "text": "🎭︎", "type": 1, "order": 4321, "group": 6, "subgroup": 64, "version": 0.6 }, { "label": "framed picture", "hexcode": "1F5BC", "tags": [ "art", "frame", "framed", "museum", "painting", "picture" ], "emoji": "🖼️", "text": "🖼︎", "type": 0, "order": 4323, "group": 6, "subgroup": 64, "version": 0.7 }, { "label": "artist palette", "hexcode": "1F3A8", "tags": [ "art", "artist", "artsy", "arty", "colorful", "creative", "entertainment", "museum", "painter", "painting", "palette" ], "emoji": "🎨", "text": "", "type": 1, "order": 4324, "group": 6, "subgroup": 64, "version": 0.6 }, { "label": "thread", "hexcode": "1F9F5", "tags": [ "needle", "sewing", "spool", "string" ], "emoji": "🧵", "text": "", "type": 1, "order": 4325, "group": 6, "subgroup": 64, "version": 11 }, { "label": "sewing needle", "hexcode": "1FAA1", "tags": [ "embroidery", "needle", "sew", "sewing", "stitches", "sutures", "tailoring", "thread" ], "emoji": "🪡", "text": "", "type": 1, "order": 4326, "group": 6, "subgroup": 64, "version": 13 }, { "label": "yarn", "hexcode": "1F9F6", "tags": [ "ball", "crochet", "knit" ], "emoji": "🧶", "text": "", "type": 1, "order": 4327, "group": 6, "subgroup": 64, "version": 11 }, { "label": "knot", "hexcode": "1FAA2", "tags": [ "cord", "rope", "tangled", "tie", "twine", "twist" ], "emoji": "🪢", "text": "", "type": 1, "order": 4328, "group": 6, "subgroup": 64, "version": 13 }, { "label": "glasses", "hexcode": "1F453", "tags": [ "clothing", "eye", "eyeglasses", "eyewear" ], "emoji": "👓️", "text": "👓︎", "type": 1, "order": 4329, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "sunglasses", "hexcode": "1F576", "tags": [ "dark", "eye", "eyewear", "glasses" ], "emoji": "🕶️", "text": "🕶︎", "type": 0, "order": 4331, "group": 7, "subgroup": 65, "version": 0.7 }, { "label": "goggles", "hexcode": "1F97D", "tags": [ "dive", "eye", "protection", "scuba", "swimming", "welding" ], "emoji": "🥽", "text": "", "type": 1, "order": 4332, "group": 7, "subgroup": 65, "version": 11 }, { "label": "lab coat", "hexcode": "1F97C", "tags": [ "clothes", "coat", "doctor", "dr", "experiment", "jacket", "lab", "scientist", "white" ], "emoji": "🥼", "text": "", "type": 1, "order": 4333, "group": 7, "subgroup": 65, "version": 11 }, { "label": "safety vest", "hexcode": "1F9BA", "tags": [ "emergency", "safety", "vest" ], "emoji": "🦺", "text": "", "type": 1, "order": 4334, "group": 7, "subgroup": 65, "version": 12 }, { "label": "necktie", "hexcode": "1F454", "tags": [ "clothing", "employed", "serious", "shirt", "tie" ], "emoji": "👔", "text": "", "type": 1, "order": 4335, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "t-shirt", "hexcode": "1F455", "tags": [ "blue", "casual", "clothes", "clothing", "collar", "dressed", "shirt", "shopping", "tshirt", "weekend" ], "emoji": "👕", "text": "", "type": 1, "order": 4336, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "jeans", "hexcode": "1F456", "tags": [ "blue", "casual", "clothes", "clothing", "denim", "dressed", "pants", "shopping", "trousers", "weekend" ], "emoji": "👖", "text": "", "type": 1, "order": 4337, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "scarf", "hexcode": "1F9E3", "tags": [ "bundle", "cold", "neck", "up" ], "emoji": "🧣", "text": "", "type": 1, "order": 4338, "group": 7, "subgroup": 65, "version": 5 }, { "label": "gloves", "hexcode": "1F9E4", "tags": [ "hand" ], "emoji": "🧤", "text": "", "type": 1, "order": 4339, "group": 7, "subgroup": 65, "version": 5 }, { "label": "coat", "hexcode": "1F9E5", "tags": [ "brr", "bundle", "cold", "jacket", "up" ], "emoji": "🧥", "text": "", "type": 1, "order": 4340, "group": 7, "subgroup": 65, "version": 5 }, { "label": "socks", "hexcode": "1F9E6", "tags": [ "stocking" ], "emoji": "🧦", "text": "", "type": 1, "order": 4341, "group": 7, "subgroup": 65, "version": 5 }, { "label": "dress", "hexcode": "1F457", "tags": [ "clothes", "clothing", "dressed", "fancy", "shopping" ], "emoji": "👗", "text": "", "type": 1, "order": 4342, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "kimono", "hexcode": "1F458", "tags": [ "clothing", "comfortable" ], "emoji": "👘", "text": "", "type": 1, "order": 4343, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "sari", "hexcode": "1F97B", "tags": [ "clothing", "dress" ], "emoji": "🥻", "text": "", "type": 1, "order": 4344, "group": 7, "subgroup": 65, "version": 12 }, { "label": "one-piece swimsuit", "hexcode": "1FA71", "tags": [ "bathing", "one-piece", "suit", "swimsuit" ], "emoji": "🩱", "text": "", "type": 1, "order": 4345, "group": 7, "subgroup": 65, "version": 12 }, { "label": "briefs", "hexcode": "1FA72", "tags": [ "bathing", "one-piece", "suit", "swimsuit", "underwear" ], "emoji": "🩲", "text": "", "type": 1, "order": 4346, "group": 7, "subgroup": 65, "version": 12 }, { "label": "shorts", "hexcode": "1FA73", "tags": [ "bathing", "pants", "suit", "swimsuit", "underwear" ], "emoji": "🩳", "text": "", "type": 1, "order": 4347, "group": 7, "subgroup": 65, "version": 12 }, { "label": "bikini", "hexcode": "1F459", "tags": [ "bathing", "beach", "clothing", "pool", "suit", "swim" ], "emoji": "👙", "text": "", "type": 1, "order": 4348, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "woman’s clothes", "hexcode": "1F45A", "tags": [ "blouse", "clothes", "clothing", "collar", "dress", "dressed", "lady", "shirt", "shopping", "woman", "woman’s" ], "emoji": "👚", "text": "", "type": 1, "order": 4349, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "folding hand fan", "hexcode": "1FAAD", "tags": [ "clack", "clap", "cool", "cooling", "dance", "fan", "flirt", "flutter", "folding", "hand", "hot", "shy" ], "emoji": "🪭", "text": "", "type": 1, "order": 4350, "group": 7, "subgroup": 65, "version": 15 }, { "label": "purse", "hexcode": "1F45B", "tags": [ "clothes", "clothing", "coin", "dress", "fancy", "handbag", "shopping" ], "emoji": "👛", "text": "", "type": 1, "order": 4351, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "handbag", "hexcode": "1F45C", "tags": [ "bag", "clothes", "clothing", "dress", "lady", "purse", "shopping" ], "emoji": "👜", "text": "", "type": 1, "order": 4352, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "clutch bag", "hexcode": "1F45D", "tags": [ "bag", "clothes", "clothing", "clutch", "dress", "handbag", "pouch", "purse" ], "emoji": "👝", "text": "", "type": 1, "order": 4353, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "shopping bags", "hexcode": "1F6CD", "tags": [ "bag", "bags", "hotel", "shopping" ], "emoji": "🛍️", "text": "🛍︎", "type": 0, "order": 4355, "group": 7, "subgroup": 65, "version": 0.7 }, { "label": "backpack", "hexcode": "1F392", "tags": [ "backpacking", "bag", "bookbag", "education", "rucksack", "satchel", "school" ], "emoji": "🎒", "text": "", "type": 1, "order": 4356, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "thong sandal", "hexcode": "1FA74", "tags": [ "beach", "flip", "flop", "sandal", "sandals", "shoe", "thong", "thongs", "zōri" ], "emoji": "🩴", "text": "", "type": 1, "order": 4357, "group": 7, "subgroup": 65, "version": 13 }, { "label": "man’s shoe", "hexcode": "1F45E", "tags": [ "brown", "clothes", "clothing", "feet", "foot", "kick", "man", "man’s", "shoe", "shoes", "shopping" ], "emoji": "👞", "text": "", "type": 1, "order": 4358, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "running shoe", "hexcode": "1F45F", "tags": [ "athletic", "clothes", "clothing", "fast", "kick", "running", "shoe", "shoes", "shopping", "sneaker", "tennis" ], "emoji": "👟", "text": "", "type": 1, "order": 4359, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "hiking boot", "hexcode": "1F97E", "tags": [ "backpacking", "boot", "brown", "camping", "hiking", "outdoors", "shoe" ], "emoji": "🥾", "text": "", "type": 1, "order": 4360, "group": 7, "subgroup": 65, "version": 11 }, { "label": "flat shoe", "hexcode": "1F97F", "tags": [ "ballet", "comfy", "flat", "flats", "shoe", "slip-on", "slipper" ], "emoji": "🥿", "text": "", "type": 1, "order": 4361, "group": 7, "subgroup": 65, "version": 11 }, { "label": "high-heeled shoe", "hexcode": "1F460", "tags": [ "clothes", "clothing", "dress", "fashion", "heel", "heels", "high-heeled", "shoe", "shoes", "shopping", "stiletto", "woman" ], "emoji": "👠", "text": "", "type": 1, "order": 4362, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "woman’s sandal", "hexcode": "1F461", "tags": [ "clothing", "sandal", "shoe", "woman", "woman’s" ], "emoji": "👡", "text": "", "type": 1, "order": 4363, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "ballet shoes", "hexcode": "1FA70", "tags": [ "ballet", "dance", "shoes" ], "emoji": "🩰", "text": "", "type": 1, "order": 4364, "group": 7, "subgroup": 65, "version": 12 }, { "label": "woman’s boot", "hexcode": "1F462", "tags": [ "boot", "clothes", "clothing", "dress", "shoe", "shoes", "shopping", "woman", "woman’s" ], "emoji": "👢", "text": "", "type": 1, "order": 4365, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "hair pick", "hexcode": "1FAAE", "tags": [ "afro", "comb", "groom", "hair", "pick" ], "emoji": "🪮", "text": "", "type": 1, "order": 4366, "group": 7, "subgroup": 65, "version": 15 }, { "label": "crown", "hexcode": "1F451", "tags": [ "clothing", "family", "king", "medieval", "queen", "royal", "royalty", "win" ], "emoji": "👑", "text": "", "type": 1, "order": 4367, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "woman’s hat", "hexcode": "1F452", "tags": [ "clothes", "clothing", "garden", "hat", "hats", "party", "woman", "woman’s" ], "emoji": "👒", "text": "", "type": 1, "order": 4368, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "top hat", "hexcode": "1F3A9", "tags": [ "clothes", "clothing", "fancy", "formal", "hat", "magic", "top", "tophat" ], "emoji": "🎩", "text": "", "type": 1, "order": 4369, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "graduation cap", "hexcode": "1F393", "tags": [ "cap", "celebration", "clothing", "education", "graduation", "hat", "scholar" ], "emoji": "🎓️", "text": "🎓︎", "type": 1, "order": 4370, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "billed cap", "hexcode": "1F9E2", "tags": [ "baseball", "bent", "billed", "cap", "dad", "hat" ], "emoji": "🧢", "text": "", "type": 1, "order": 4371, "group": 7, "subgroup": 65, "version": 5 }, { "label": "military helmet", "hexcode": "1FA96", "tags": [ "army", "helmet", "military", "soldier", "war", "warrior" ], "emoji": "🪖", "text": "", "type": 1, "order": 4372, "group": 7, "subgroup": 65, "version": 13 }, { "label": "rescue worker’s helmet", "hexcode": "26D1", "tags": [ "aid", "cross", "face", "hat", "helmet", "rescue", "worker’s" ], "emoji": "⛑️", "text": "⛑︎", "type": 0, "order": 4374, "group": 7, "subgroup": 65, "version": 0.7 }, { "label": "prayer beads", "hexcode": "1F4FF", "tags": [ "beads", "clothing", "necklace", "prayer", "religion" ], "emoji": "📿", "text": "", "type": 1, "order": 4375, "group": 7, "subgroup": 65, "version": 1 }, { "label": "lipstick", "hexcode": "1F484", "tags": [ "cosmetics", "date", "makeup" ], "emoji": "💄", "text": "", "type": 1, "order": 4376, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "ring", "hexcode": "1F48D", "tags": [ "diamond", "engaged", "engagement", "married", "romance", "shiny", "sparkling", "wedding" ], "emoji": "💍", "text": "", "type": 1, "order": 4377, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "gem stone", "hexcode": "1F48E", "tags": [ "diamond", "engagement", "gem", "jewel", "money", "romance", "stone", "wedding" ], "emoji": "💎", "text": "", "type": 1, "order": 4378, "group": 7, "subgroup": 65, "version": 0.6 }, { "label": "muted speaker", "hexcode": "1F507", "tags": [ "mute", "muted", "quiet", "silent", "sound", "speaker" ], "emoji": "🔇", "text": "", "type": 1, "order": 4379, "group": 7, "subgroup": 66, "version": 1 }, { "label": "speaker low volume", "hexcode": "1F508", "tags": [ "low", "soft", "sound", "speaker", "volume" ], "emoji": "🔈️", "text": "🔈︎", "type": 1, "order": 4380, "group": 7, "subgroup": 66, "version": 0.7 }, { "label": "speaker medium volume", "hexcode": "1F509", "tags": [ "medium", "sound", "speaker", "volume" ], "emoji": "🔉", "text": "", "type": 1, "order": 4381, "group": 7, "subgroup": 66, "version": 1 }, { "label": "speaker high volume", "hexcode": "1F50A", "tags": [ "high", "loud", "music", "sound", "speaker", "volume" ], "emoji": "🔊", "text": "", "type": 1, "order": 4382, "group": 7, "subgroup": 66, "version": 0.6 }, { "label": "loudspeaker", "hexcode": "1F4E2", "tags": [ "address", "communication", "loud", "public", "sound" ], "emoji": "📢", "text": "", "type": 1, "order": 4383, "group": 7, "subgroup": 66, "version": 0.6 }, { "label": "megaphone", "hexcode": "1F4E3", "tags": [ "cheering", "sound" ], "emoji": "📣", "text": "", "type": 1, "order": 4384, "group": 7, "subgroup": 66, "version": 0.6 }, { "label": "postal horn", "hexcode": "1F4EF", "tags": [ "horn", "post", "postal" ], "emoji": "📯", "text": "", "type": 1, "order": 4385, "group": 7, "subgroup": 66, "version": 1 }, { "label": "bell", "hexcode": "1F514", "tags": [ "break", "church", "sound" ], "emoji": "🔔", "text": "", "type": 1, "order": 4386, "group": 7, "subgroup": 66, "version": 0.6 }, { "label": "bell with slash", "hexcode": "1F515", "tags": [ "bell", "forbidden", "mute", "no", "not", "prohibited", "quiet", "silent", "slash", "sound" ], "emoji": "🔕", "text": "", "type": 1, "order": 4387, "group": 7, "subgroup": 66, "version": 1 }, { "label": "musical score", "hexcode": "1F3BC", "tags": [ "music", "musical", "note", "score" ], "emoji": "🎼", "text": "", "type": 1, "order": 4388, "group": 7, "subgroup": 67, "version": 0.6 }, { "label": "musical note", "hexcode": "1F3B5", "tags": [ "music", "musical", "note", "sound" ], "emoji": "🎵", "text": "", "type": 1, "order": 4389, "group": 7, "subgroup": 67, "version": 0.6 }, { "label": "musical notes", "hexcode": "1F3B6", "tags": [ "music", "musical", "note", "notes", "sound" ], "emoji": "🎶", "text": "", "type": 1, "order": 4390, "group": 7, "subgroup": 67, "version": 0.6 }, { "label": "studio microphone", "hexcode": "1F399", "tags": [ "mic", "microphone", "music", "studio" ], "emoji": "🎙️", "text": "🎙︎", "type": 0, "order": 4392, "group": 7, "subgroup": 67, "version": 0.7 }, { "label": "level slider", "hexcode": "1F39A", "tags": [ "level", "music", "slider" ], "emoji": "🎚️", "text": "🎚︎", "type": 0, "order": 4394, "group": 7, "subgroup": 67, "version": 0.7 }, { "label": "control knobs", "hexcode": "1F39B", "tags": [ "control", "knobs", "music" ], "emoji": "🎛️", "text": "🎛︎", "type": 0, "order": 4396, "group": 7, "subgroup": 67, "version": 0.7 }, { "label": "microphone", "hexcode": "1F3A4", "tags": [ "karaoke", "mic", "music", "sing", "sound" ], "emoji": "🎤", "text": "", "type": 1, "order": 4397, "group": 7, "subgroup": 67, "version": 0.6 }, { "label": "headphone", "hexcode": "1F3A7", "tags": [ "earbud", "sound" ], "emoji": "🎧️", "text": "🎧︎", "type": 1, "order": 4398, "group": 7, "subgroup": 67, "version": 0.6 }, { "label": "radio", "hexcode": "1F4FB", "tags": [ "entertainment", "tbt", "video" ], "emoji": "📻️", "text": "📻︎", "type": 1, "order": 4399, "group": 7, "subgroup": 67, "version": 0.6 }, { "label": "saxophone", "hexcode": "1F3B7", "tags": [ "instrument", "music", "sax" ], "emoji": "🎷", "text": "", "type": 1, "order": 4400, "group": 7, "subgroup": 68, "version": 0.6 }, { "label": "trumpet", "hexcode": "1F3BA", "tags": [ "instrument", "music" ], "emoji": "🎺", "text": "", "type": 1, "order": 4401, "group": 7, "subgroup": 68, "version": 0.6 }, { "label": "trombone", "hexcode": "1FA8A", "tags": [ "brass", "instrument", "jazz", "music", "sad", "slide" ], "emoji": "🪊", "text": "", "type": 1, "order": 4402, "group": 7, "subgroup": 68, "version": 17 }, { "label": "accordion", "hexcode": "1FA97", "tags": [ "box", "concertina", "instrument", "music", "squeeze", "squeezebox" ], "emoji": "🪗", "text": "", "type": 1, "order": 4403, "group": 7, "subgroup": 68, "version": 13 }, { "label": "guitar", "hexcode": "1F3B8", "tags": [ "instrument", "music", "strat" ], "emoji": "🎸", "text": "", "type": 1, "order": 4404, "group": 7, "subgroup": 68, "version": 0.6 }, { "label": "musical keyboard", "hexcode": "1F3B9", "tags": [ "instrument", "keyboard", "music", "musical", "piano" ], "emoji": "🎹", "text": "", "type": 1, "order": 4405, "group": 7, "subgroup": 68, "version": 0.6 }, { "label": "violin", "hexcode": "1F3BB", "tags": [ "instrument", "music" ], "emoji": "🎻", "text": "", "type": 1, "order": 4406, "group": 7, "subgroup": 68, "version": 0.6 }, { "label": "banjo", "hexcode": "1FA95", "tags": [ "music", "stringed" ], "emoji": "🪕", "text": "", "type": 1, "order": 4407, "group": 7, "subgroup": 68, "version": 12 }, { "label": "drum", "hexcode": "1F941", "tags": [ "drumsticks", "music" ], "emoji": "🥁", "text": "", "type": 1, "order": 4408, "group": 7, "subgroup": 68, "version": 3 }, { "label": "long drum", "hexcode": "1FA98", "tags": [ "beat", "conga", "drum", "instrument", "long", "rhythm" ], "emoji": "🪘", "text": "", "type": 1, "order": 4409, "group": 7, "subgroup": 68, "version": 13 }, { "label": "maracas", "hexcode": "1FA87", "tags": [ "cha", "dance", "instrument", "music", "party", "percussion", "rattle", "shake", "shaker" ], "emoji": "🪇", "text": "", "type": 1, "order": 4410, "group": 7, "subgroup": 68, "version": 15 }, { "label": "flute", "hexcode": "1FA88", "tags": [ "band", "fife", "flautist", "instrument", "marching", "music", "orchestra", "piccolo", "pipe", "recorder", "woodwind" ], "emoji": "🪈", "text": "", "type": 1, "order": 4411, "group": 7, "subgroup": 68, "version": 15 }, { "label": "harp", "hexcode": "1FA89", "tags": [ "cupid", "instrument", "love", "music", "orchestra" ], "emoji": "🪉", "text": "", "type": 1, "order": 4412, "group": 7, "subgroup": 68, "version": 16 }, { "label": "mobile phone", "hexcode": "1F4F1", "tags": [ "cell", "communication", "mobile", "phone", "telephone" ], "emoji": "📱", "text": "", "type": 1, "order": 4413, "group": 7, "subgroup": 69, "version": 0.6 }, { "label": "mobile phone with arrow", "hexcode": "1F4F2", "tags": [ "arrow", "build", "call", "cell", "communication", "mobile", "phone", "receive", "telephone" ], "emoji": "📲", "text": "", "type": 1, "order": 4414, "group": 7, "subgroup": 69, "version": 0.6 }, { "label": "telephone", "hexcode": "260E", "tags": [ "phone" ], "emoji": "☎️", "text": "☎︎", "type": 0, "order": 4416, "group": 7, "subgroup": 69, "version": 0.6 }, { "label": "telephone receiver", "hexcode": "1F4DE", "tags": [ "communication", "phone", "receiver", "telephone", "voip" ], "emoji": "📞", "text": "", "type": 1, "order": 4417, "group": 7, "subgroup": 69, "version": 0.6 }, { "label": "pager", "hexcode": "1F4DF", "tags": [ "communication" ], "emoji": "📟️", "text": "📟︎", "type": 1, "order": 4418, "group": 7, "subgroup": 69, "version": 0.6 }, { "label": "fax machine", "hexcode": "1F4E0", "tags": [ "communication", "fax", "machine" ], "emoji": "📠", "text": "", "type": 1, "order": 4419, "group": 7, "subgroup": 69, "version": 0.6 }, { "label": "battery", "hexcode": "1F50B", "tags": [ "battery" ], "emoji": "🔋", "text": "", "type": 1, "order": 4420, "group": 7, "subgroup": 70, "version": 0.6 }, { "label": "low battery", "hexcode": "1FAAB", "tags": [ "battery", "drained", "electronic", "energy", "low", "power" ], "emoji": "🪫", "text": "", "type": 1, "order": 4421, "group": 7, "subgroup": 70, "version": 14 }, { "label": "electric plug", "hexcode": "1F50C", "tags": [ "electric", "electricity", "plug" ], "emoji": "🔌", "text": "", "type": 1, "order": 4422, "group": 7, "subgroup": 70, "version": 0.6 }, { "label": "laptop", "hexcode": "1F4BB", "tags": [ "computer", "office", "pc", "personal" ], "emoji": "💻️", "text": "💻︎", "type": 1, "order": 4423, "group": 7, "subgroup": 70, "version": 0.6 }, { "label": "desktop computer", "hexcode": "1F5A5", "tags": [ "computer", "desktop", "monitor" ], "emoji": "🖥️", "text": "🖥︎", "type": 0, "order": 4425, "group": 7, "subgroup": 70, "version": 0.7 }, { "label": "printer", "hexcode": "1F5A8", "tags": [ "computer" ], "emoji": "🖨️", "text": "🖨︎", "type": 0, "order": 4427, "group": 7, "subgroup": 70, "version": 0.7 }, { "label": "keyboard", "hexcode": "2328", "tags": [ "computer" ], "emoji": "⌨️", "text": "⌨︎", "type": 0, "order": 4429, "group": 7, "subgroup": 70, "version": 1 }, { "label": "computer mouse", "hexcode": "1F5B1", "tags": [ "computer", "mouse" ], "emoji": "🖱️", "text": "🖱︎", "type": 0, "order": 4431, "group": 7, "subgroup": 70, "version": 0.7 }, { "label": "trackball", "hexcode": "1F5B2", "tags": [ "computer" ], "emoji": "🖲️", "text": "🖲︎", "type": 0, "order": 4433, "group": 7, "subgroup": 70, "version": 0.7 }, { "label": "computer disk", "hexcode": "1F4BD", "tags": [ "computer", "disk", "minidisk", "optical" ], "emoji": "💽", "text": "", "type": 1, "order": 4434, "group": 7, "subgroup": 70, "version": 0.6 }, { "label": "floppy disk", "hexcode": "1F4BE", "tags": [ "computer", "disk", "floppy" ], "emoji": "💾", "text": "", "type": 1, "order": 4435, "group": 7, "subgroup": 70, "version": 0.6 }, { "label": "optical disk", "hexcode": "1F4BF", "tags": [ "blu-ray", "cd", "computer", "disk", "dvd", "optical" ], "emoji": "💿️", "text": "💿︎", "type": 1, "order": 4436, "group": 7, "subgroup": 70, "version": 0.6 }, { "label": "dvd", "hexcode": "1F4C0", "tags": [ "blu-ray", "cd", "computer", "disk", "optical" ], "emoji": "📀", "text": "", "type": 1, "order": 4437, "group": 7, "subgroup": 70, "version": 0.6 }, { "label": "abacus", "hexcode": "1F9EE", "tags": [ "calculation", "calculator" ], "emoji": "🧮", "text": "", "type": 1, "order": 4438, "group": 7, "subgroup": 70, "version": 11 }, { "label": "movie camera", "hexcode": "1F3A5", "tags": [ "bollywood", "camera", "cinema", "film", "hollywood", "movie", "record" ], "emoji": "🎥", "text": "", "type": 1, "order": 4439, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "film frames", "hexcode": "1F39E", "tags": [ "cinema", "film", "frames", "movie" ], "emoji": "🎞️", "text": "🎞︎", "type": 0, "order": 4441, "group": 7, "subgroup": 71, "version": 0.7 }, { "label": "film projector", "hexcode": "1F4FD", "tags": [ "cinema", "film", "movie", "projector", "video" ], "emoji": "📽️", "text": "📽︎", "type": 0, "order": 4443, "group": 7, "subgroup": 71, "version": 0.7 }, { "label": "clapper board", "hexcode": "1F3AC", "tags": [ "action", "board", "clapper", "movie" ], "emoji": "🎬️", "text": "🎬︎", "type": 1, "order": 4444, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "television", "hexcode": "1F4FA", "tags": [ "tv", "video" ], "emoji": "📺️", "text": "📺︎", "type": 1, "order": 4445, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "camera", "hexcode": "1F4F7", "tags": [ "photo", "selfie", "snap", "tbt", "trip", "video" ], "emoji": "📷️", "text": "📷︎", "type": 1, "order": 4446, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "camera with flash", "hexcode": "1F4F8", "tags": [ "camera", "flash", "video" ], "emoji": "📸", "text": "", "type": 1, "order": 4447, "group": 7, "subgroup": 71, "version": 1 }, { "label": "video camera", "hexcode": "1F4F9", "tags": [ "camcorder", "camera", "tbt", "video" ], "emoji": "📹️", "text": "📹︎", "type": 1, "order": 4448, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "videocassette", "hexcode": "1F4FC", "tags": [ "old", "school", "tape", "vcr", "vhs", "video" ], "emoji": "📼", "text": "", "type": 1, "order": 4449, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "magnifying glass tilted left", "hexcode": "1F50D", "tags": [ "glass", "lab", "left", "left-pointing", "magnifying", "science", "search", "tilted", "tool" ], "emoji": "🔍️", "text": "🔍︎", "type": 1, "order": 4450, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "magnifying glass tilted right", "hexcode": "1F50E", "tags": [ "contact", "glass", "lab", "magnifying", "right", "right-pointing", "science", "search", "tilted", "tool" ], "emoji": "🔎", "text": "", "type": 1, "order": 4451, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "candle", "hexcode": "1F56F", "tags": [ "light" ], "emoji": "🕯️", "text": "🕯︎", "type": 0, "order": 4453, "group": 7, "subgroup": 71, "version": 0.7 }, { "label": "light bulb", "hexcode": "1F4A1", "tags": [ "bulb", "comic", "electric", "idea", "light" ], "emoji": "💡", "text": "", "type": 1, "order": 4454, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "flashlight", "hexcode": "1F526", "tags": [ "electric", "light", "tool", "torch" ], "emoji": "🔦", "text": "", "type": 1, "order": 4455, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "red paper lantern", "hexcode": "1F3EE", "tags": [ "bar", "lantern", "light", "paper", "red", "restaurant" ], "emoji": "🏮", "text": "", "type": 1, "order": 4456, "group": 7, "subgroup": 71, "version": 0.6 }, { "label": "diya lamp", "hexcode": "1FA94", "tags": [ "diya", "lamp", "light", "oil" ], "emoji": "🪔", "text": "", "type": 1, "order": 4457, "group": 7, "subgroup": 71, "version": 12 }, { "label": "notebook with decorative cover", "hexcode": "1F4D4", "tags": [ "book", "cover", "decorated", "decorative", "education", "notebook", "school", "writing" ], "emoji": "📔", "text": "", "type": 1, "order": 4458, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "closed book", "hexcode": "1F4D5", "tags": [ "book", "closed", "education" ], "emoji": "📕", "text": "", "type": 1, "order": 4459, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "open book", "hexcode": "1F4D6", "tags": [ "book", "education", "fantasy", "knowledge", "library", "novels", "open", "reading" ], "emoji": "📖", "text": "", "type": 1, "order": 4460, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "green book", "hexcode": "1F4D7", "tags": [ "book", "education", "fantasy", "green", "library", "reading" ], "emoji": "📗", "text": "", "type": 1, "order": 4461, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "blue book", "hexcode": "1F4D8", "tags": [ "blue", "book", "education", "fantasy", "library", "reading" ], "emoji": "📘", "text": "", "type": 1, "order": 4462, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "orange book", "hexcode": "1F4D9", "tags": [ "book", "education", "fantasy", "library", "orange", "reading" ], "emoji": "📙", "text": "", "type": 1, "order": 4463, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "books", "hexcode": "1F4DA", "tags": [ "book", "education", "fantasy", "knowledge", "library", "novels", "reading", "school", "study" ], "emoji": "📚️", "text": "📚︎", "type": 1, "order": 4464, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "notebook", "hexcode": "1F4D3", "tags": [ "notebook" ], "emoji": "📓", "text": "", "type": 1, "order": 4465, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "ledger", "hexcode": "1F4D2", "tags": [ "notebook" ], "emoji": "📒", "text": "", "type": 1, "order": 4466, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "page with curl", "hexcode": "1F4C3", "tags": [ "curl", "document", "page", "paper" ], "emoji": "📃", "text": "", "type": 1, "order": 4467, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "scroll", "hexcode": "1F4DC", "tags": [ "paper" ], "emoji": "📜", "text": "", "type": 1, "order": 4468, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "page facing up", "hexcode": "1F4C4", "tags": [ "document", "facing", "page", "paper", "up" ], "emoji": "📄", "text": "", "type": 1, "order": 4469, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "newspaper", "hexcode": "1F4F0", "tags": [ "communication", "news", "paper" ], "emoji": "📰", "text": "", "type": 1, "order": 4470, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "rolled-up newspaper", "hexcode": "1F5DE", "tags": [ "news", "newspaper", "paper", "rolled", "rolled-up" ], "emoji": "🗞️", "text": "🗞︎", "type": 0, "order": 4472, "group": 7, "subgroup": 72, "version": 0.7 }, { "label": "bookmark tabs", "hexcode": "1F4D1", "tags": [ "bookmark", "mark", "marker", "tabs" ], "emoji": "📑", "text": "", "type": 1, "order": 4473, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "bookmark", "hexcode": "1F516", "tags": [ "mark" ], "emoji": "🔖", "text": "", "type": 1, "order": 4474, "group": 7, "subgroup": 72, "version": 0.6 }, { "label": "label", "hexcode": "1F3F7", "tags": [ "tag" ], "emoji": "🏷️", "text": "🏷︎", "type": 0, "order": 4476, "group": 7, "subgroup": 72, "version": 0.7 }, { "label": "coin", "hexcode": "1FA99", "tags": [ "dollar", "euro", "gold", "metal", "money", "rich", "silver", "treasure" ], "emoji": "🪙", "text": "", "type": 1, "order": 4477, "group": 7, "subgroup": 73, "version": 13 }, { "label": "money bag", "hexcode": "1F4B0", "tags": [ "bag", "bank", "bet", "billion", "cash", "cost", "dollar", "gold", "million", "money", "moneybag", "paid", "paying", "pot", "rich", "win" ], "emoji": "💰️", "text": "💰︎", "type": 1, "order": 4478, "group": 7, "subgroup": 73, "version": 0.6 }, { "label": "treasure chest", "hexcode": "1FA8E", "tags": [ "gem", "gold", "jewels", "loot", "money", "prize", "silver", "valuables", "wealth" ], "emoji": "🪎", "text": "", "type": 1, "order": 4479, "group": 7, "subgroup": 73, "version": 17 }, { "label": "yen banknote", "hexcode": "1F4B4", "tags": [ "bank", "banknote", "bill", "currency", "money", "note", "yen" ], "emoji": "💴", "text": "", "type": 1, "order": 4480, "group": 7, "subgroup": 73, "version": 0.6 }, { "label": "dollar banknote", "hexcode": "1F4B5", "tags": [ "bank", "banknote", "bill", "currency", "dollar", "money", "note" ], "emoji": "💵", "text": "", "type": 1, "order": 4481, "group": 7, "subgroup": 73, "version": 0.6 }, { "label": "euro banknote", "hexcode": "1F4B6", "tags": [ "100", "bank", "banknote", "bill", "currency", "euro", "money", "note", "rich" ], "emoji": "💶", "text": "", "type": 1, "order": 4482, "group": 7, "subgroup": 73, "version": 1 }, { "label": "pound banknote", "hexcode": "1F4B7", "tags": [ "bank", "banknote", "bill", "billion", "cash", "currency", "money", "note", "pound", "pounds" ], "emoji": "💷", "text": "", "type": 1, "order": 4483, "group": 7, "subgroup": 73, "version": 1 }, { "label": "money with wings", "hexcode": "1F4B8", "tags": [ "bank", "banknote", "bill", "billion", "cash", "dollar", "fly", "million", "money", "note", "pay", "wings" ], "emoji": "💸", "text": "", "type": 1, "order": 4484, "group": 7, "subgroup": 73, "version": 0.6 }, { "label": "credit card", "hexcode": "1F4B3", "tags": [ "bank", "card", "cash", "charge", "credit", "money", "pay" ], "emoji": "💳️", "text": "💳︎", "type": 1, "order": 4485, "group": 7, "subgroup": 73, "version": 0.6 }, { "label": "receipt", "hexcode": "1F9FE", "tags": [ "accounting", "bookkeeping", "evidence", "invoice", "proof" ], "emoji": "🧾", "text": "", "type": 1, "order": 4486, "group": 7, "subgroup": 73, "version": 11 }, { "label": "chart increasing with yen", "hexcode": "1F4B9", "tags": [ "bank", "chart", "currency", "graph", "growth", "increasing", "market", "money", "rise", "trend", "upward", "yen" ], "emoji": "💹", "text": "", "type": 1, "order": 4487, "group": 7, "subgroup": 73, "version": 0.6 }, { "label": "envelope", "hexcode": "2709", "tags": [ "e-mail", "email", "letter" ], "emoji": "✉️", "text": "✉︎", "type": 0, "order": 4489, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "e-mail", "hexcode": "1F4E7", "tags": [ "email", "letter", "mail" ], "emoji": "📧", "text": "", "type": 1, "order": 4490, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "incoming envelope", "hexcode": "1F4E8", "tags": [ "delivering", "e-mail", "email", "envelope", "incoming", "letter", "mail", "receive", "sent" ], "emoji": "📨", "text": "", "type": 1, "order": 4491, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "envelope with arrow", "hexcode": "1F4E9", "tags": [ "arrow", "communication", "down", "e-mail", "email", "envelope", "letter", "mail", "outgoing", "send", "sent" ], "emoji": "📩", "text": "", "type": 1, "order": 4492, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "outbox tray", "hexcode": "1F4E4", "tags": [ "box", "email", "letter", "mail", "outbox", "sent", "tray" ], "emoji": "📤️", "text": "📤︎", "type": 1, "order": 4493, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "inbox tray", "hexcode": "1F4E5", "tags": [ "box", "email", "inbox", "letter", "mail", "receive", "tray", "zero" ], "emoji": "📥️", "text": "📥︎", "type": 1, "order": 4494, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "package", "hexcode": "1F4E6", "tags": [ "box", "communication", "delivery", "parcel", "shipping" ], "emoji": "📦️", "text": "📦︎", "type": 1, "order": 4495, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "closed mailbox with raised flag", "hexcode": "1F4EB", "tags": [ "closed", "communication", "flag", "mail", "mailbox", "postbox", "raised" ], "emoji": "📫️", "text": "📫︎", "type": 1, "order": 4496, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "closed mailbox with lowered flag", "hexcode": "1F4EA", "tags": [ "closed", "flag", "lowered", "mail", "mailbox", "postbox" ], "emoji": "📪️", "text": "📪︎", "type": 1, "order": 4497, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "open mailbox with raised flag", "hexcode": "1F4EC", "tags": [ "flag", "mail", "mailbox", "open", "postbox", "raised" ], "emoji": "📬️", "text": "📬︎", "type": 1, "order": 4498, "group": 7, "subgroup": 74, "version": 0.7 }, { "label": "open mailbox with lowered flag", "hexcode": "1F4ED", "tags": [ "flag", "lowered", "mail", "mailbox", "open", "postbox" ], "emoji": "📭️", "text": "📭︎", "type": 1, "order": 4499, "group": 7, "subgroup": 74, "version": 0.7 }, { "label": "postbox", "hexcode": "1F4EE", "tags": [ "mail", "mailbox" ], "emoji": "📮", "text": "", "type": 1, "order": 4500, "group": 7, "subgroup": 74, "version": 0.6 }, { "label": "ballot box with ballot", "hexcode": "1F5F3", "tags": [ "ballot", "box" ], "emoji": "🗳️", "text": "🗳︎", "type": 0, "order": 4502, "group": 7, "subgroup": 74, "version": 0.7 }, { "label": "pencil", "hexcode": "270F", "tags": [ "pencil" ], "emoji": "✏️", "text": "✏︎", "type": 0, "order": 4504, "group": 7, "subgroup": 75, "version": 0.6 }, { "label": "black nib", "hexcode": "2712", "tags": [ "black", "nib", "pen" ], "emoji": "✒️", "text": "✒︎", "type": 0, "order": 4506, "group": 7, "subgroup": 75, "version": 0.6 }, { "label": "fountain pen", "hexcode": "1F58B", "tags": [ "fountain", "pen" ], "emoji": "🖋️", "text": "🖋︎", "type": 0, "order": 4508, "group": 7, "subgroup": 75, "version": 0.7 }, { "label": "pen", "hexcode": "1F58A", "tags": [ "ballpoint" ], "emoji": "🖊️", "text": "🖊︎", "type": 0, "order": 4510, "group": 7, "subgroup": 75, "version": 0.7 }, { "label": "paintbrush", "hexcode": "1F58C", "tags": [ "painting" ], "emoji": "🖌️", "text": "🖌︎", "type": 0, "order": 4512, "group": 7, "subgroup": 75, "version": 0.7 }, { "label": "crayon", "hexcode": "1F58D", "tags": [ "crayon" ], "emoji": "🖍️", "text": "🖍︎", "type": 0, "order": 4514, "group": 7, "subgroup": 75, "version": 0.7 }, { "label": "memo", "hexcode": "1F4DD", "tags": [ "communication", "media", "notes", "pencil" ], "emoji": "📝", "text": "", "type": 1, "order": 4515, "group": 7, "subgroup": 75, "version": 0.6 }, { "label": "briefcase", "hexcode": "1F4BC", "tags": [ "office" ], "emoji": "💼", "text": "", "type": 1, "order": 4516, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "file folder", "hexcode": "1F4C1", "tags": [ "file", "folder" ], "emoji": "📁", "text": "", "type": 1, "order": 4517, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "open file folder", "hexcode": "1F4C2", "tags": [ "file", "folder", "open" ], "emoji": "📂", "text": "", "type": 1, "order": 4518, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "card index dividers", "hexcode": "1F5C2", "tags": [ "card", "dividers", "index" ], "emoji": "🗂️", "text": "🗂︎", "type": 0, "order": 4520, "group": 7, "subgroup": 76, "version": 0.7 }, { "label": "calendar", "hexcode": "1F4C5", "tags": [ "date" ], "emoji": "📅", "text": "", "type": 1, "order": 4521, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "tear-off calendar", "hexcode": "1F4C6", "tags": [ "calendar", "tear-off" ], "emoji": "📆", "text": "", "type": 1, "order": 4522, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "spiral notepad", "hexcode": "1F5D2", "tags": [ "note", "notepad", "pad", "spiral" ], "emoji": "🗒️", "text": "🗒︎", "type": 0, "order": 4524, "group": 7, "subgroup": 76, "version": 0.7 }, { "label": "spiral calendar", "hexcode": "1F5D3", "tags": [ "calendar", "pad", "spiral" ], "emoji": "🗓️", "text": "🗓︎", "type": 0, "order": 4526, "group": 7, "subgroup": 76, "version": 0.7 }, { "label": "card index", "hexcode": "1F4C7", "tags": [ "card", "index", "old", "rolodex", "school" ], "emoji": "📇", "text": "", "type": 1, "order": 4527, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "chart increasing", "hexcode": "1F4C8", "tags": [ "chart", "data", "graph", "growth", "increasing", "right", "trend", "up", "upward" ], "emoji": "📈", "text": "", "type": 1, "order": 4528, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "chart decreasing", "hexcode": "1F4C9", "tags": [ "chart", "data", "decreasing", "down", "downward", "graph", "negative", "trend" ], "emoji": "📉", "text": "", "type": 1, "order": 4529, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "bar chart", "hexcode": "1F4CA", "tags": [ "bar", "chart", "data", "graph" ], "emoji": "📊", "text": "", "type": 1, "order": 4530, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "clipboard", "hexcode": "1F4CB", "tags": [ "do", "list", "notes" ], "emoji": "📋️", "text": "📋︎", "type": 1, "order": 4531, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "pushpin", "hexcode": "1F4CC", "tags": [ "collage", "pin" ], "emoji": "📌", "text": "", "type": 1, "order": 4532, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "round pushpin", "hexcode": "1F4CD", "tags": [ "location", "map", "pin", "pushpin", "round" ], "emoji": "📍", "text": "", "type": 1, "order": 4533, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "paperclip", "hexcode": "1F4CE", "tags": [ "paperclip" ], "emoji": "📎", "text": "", "type": 1, "order": 4534, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "linked paperclips", "hexcode": "1F587", "tags": [ "link", "linked", "paperclip", "paperclips" ], "emoji": "🖇️", "text": "🖇︎", "type": 0, "order": 4536, "group": 7, "subgroup": 76, "version": 0.7 }, { "label": "straight ruler", "hexcode": "1F4CF", "tags": [ "angle", "edge", "math", "ruler", "straight", "straightedge" ], "emoji": "📏", "text": "", "type": 1, "order": 4537, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "triangular ruler", "hexcode": "1F4D0", "tags": [ "angle", "math", "rule", "ruler", "set", "slide", "triangle", "triangular" ], "emoji": "📐", "text": "", "type": 1, "order": 4538, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "scissors", "hexcode": "2702", "tags": [ "cut", "cutting", "paper", "tool" ], "emoji": "✂️", "text": "✂︎", "type": 0, "order": 4540, "group": 7, "subgroup": 76, "version": 0.6 }, { "label": "card file box", "hexcode": "1F5C3", "tags": [ "box", "card", "file" ], "emoji": "🗃️", "text": "🗃︎", "type": 0, "order": 4542, "group": 7, "subgroup": 76, "version": 0.7 }, { "label": "file cabinet", "hexcode": "1F5C4", "tags": [ "cabinet", "file", "filing", "paper" ], "emoji": "🗄️", "text": "🗄︎", "type": 0, "order": 4544, "group": 7, "subgroup": 76, "version": 0.7 }, { "label": "wastebasket", "hexcode": "1F5D1", "tags": [ "can", "garbage", "trash", "waste" ], "emoji": "🗑️", "text": "🗑︎", "type": 0, "order": 4546, "group": 7, "subgroup": 76, "version": 0.7 }, { "label": "locked", "hexcode": "1F512", "tags": [ "closed", "lock", "private" ], "emoji": "🔒️", "text": "🔒︎", "type": 1, "order": 4547, "group": 7, "subgroup": 77, "version": 0.6 }, { "label": "unlocked", "hexcode": "1F513", "tags": [ "cracked", "lock", "open", "unlock" ], "emoji": "🔓️", "text": "🔓︎", "type": 1, "order": 4548, "group": 7, "subgroup": 77, "version": 0.6 }, { "label": "locked with pen", "hexcode": "1F50F", "tags": [ "ink", "lock", "locked", "nib", "pen", "privacy" ], "emoji": "🔏", "text": "", "type": 1, "order": 4549, "group": 7, "subgroup": 77, "version": 0.6 }, { "label": "locked with key", "hexcode": "1F510", "tags": [ "bike", "closed", "key", "lock", "locked", "secure" ], "emoji": "🔐", "text": "", "type": 1, "order": 4550, "group": 7, "subgroup": 77, "version": 0.6 }, { "label": "key", "hexcode": "1F511", "tags": [ "keys", "lock", "major", "password", "unlock" ], "emoji": "🔑", "text": "", "type": 1, "order": 4551, "group": 7, "subgroup": 77, "version": 0.6 }, { "label": "old key", "hexcode": "1F5DD", "tags": [ "clue", "key", "lock", "old" ], "emoji": "🗝️", "text": "🗝︎", "type": 0, "order": 4553, "group": 7, "subgroup": 77, "version": 0.7 }, { "label": "hammer", "hexcode": "1F528", "tags": [ "home", "improvement", "repairs", "tool" ], "emoji": "🔨", "text": "", "type": 1, "order": 4554, "group": 7, "subgroup": 78, "version": 0.6 }, { "label": "axe", "hexcode": "1FA93", "tags": [ "ax", "chop", "hatchet", "split", "wood" ], "emoji": "🪓", "text": "", "type": 1, "order": 4555, "group": 7, "subgroup": 78, "version": 12 }, { "label": "pick", "hexcode": "26CF", "tags": [ "hammer", "mining", "tool" ], "emoji": "⛏️", "text": "⛏︎", "type": 0, "order": 4557, "group": 7, "subgroup": 78, "version": 0.7 }, { "label": "hammer and pick", "hexcode": "2692", "tags": [ "hammer", "pick", "tool" ], "emoji": "⚒️", "text": "⚒︎", "type": 0, "order": 4559, "group": 7, "subgroup": 78, "version": 1 }, { "label": "hammer and wrench", "hexcode": "1F6E0", "tags": [ "hammer", "spanner", "tool", "wrench" ], "emoji": "🛠️", "text": "🛠︎", "type": 0, "order": 4561, "group": 7, "subgroup": 78, "version": 0.7 }, { "label": "dagger", "hexcode": "1F5E1", "tags": [ "knife", "weapon" ], "emoji": "🗡️", "text": "🗡︎", "type": 0, "order": 4563, "group": 7, "subgroup": 78, "version": 0.7 }, { "label": "crossed swords", "hexcode": "2694", "tags": [ "crossed", "swords", "weapon" ], "emoji": "⚔️", "text": "⚔︎", "type": 0, "order": 4565, "group": 7, "subgroup": 78, "version": 1 }, { "label": "bomb", "hexcode": "1F4A3", "tags": [ "boom", "comic", "dangerous", "explosion", "hot" ], "emoji": "💣️", "text": "💣︎", "type": 1, "order": 4566, "group": 7, "subgroup": 78, "version": 0.6 }, { "label": "boomerang", "hexcode": "1FA83", "tags": [ "rebound", "repercussion", "weapon" ], "emoji": "🪃", "text": "", "type": 1, "order": 4567, "group": 7, "subgroup": 78, "version": 13 }, { "label": "bow and arrow", "hexcode": "1F3F9", "tags": [ "archer", "archery", "arrow", "bow", "sagittarius", "tool", "weapon", "zodiac" ], "emoji": "🏹", "text": "", "type": 1, "order": 4568, "group": 7, "subgroup": 78, "version": 1 }, { "label": "shield", "hexcode": "1F6E1", "tags": [ "weapon" ], "emoji": "🛡️", "text": "🛡︎", "type": 0, "order": 4570, "group": 7, "subgroup": 78, "version": 0.7 }, { "label": "carpentry saw", "hexcode": "1FA9A", "tags": [ "carpenter", "carpentry", "cut", "lumber", "saw", "tool", "trim" ], "emoji": "🪚", "text": "", "type": 1, "order": 4571, "group": 7, "subgroup": 78, "version": 13 }, { "label": "wrench", "hexcode": "1F527", "tags": [ "home", "improvement", "spanner", "tool" ], "emoji": "🔧", "text": "", "type": 1, "order": 4572, "group": 7, "subgroup": 78, "version": 0.6 }, { "label": "screwdriver", "hexcode": "1FA9B", "tags": [ "flathead", "handy", "screw", "tool" ], "emoji": "🪛", "text": "", "type": 1, "order": 4573, "group": 7, "subgroup": 78, "version": 13 }, { "label": "nut and bolt", "hexcode": "1F529", "tags": [ "bolt", "home", "improvement", "nut", "tool" ], "emoji": "🔩", "text": "", "type": 1, "order": 4574, "group": 7, "subgroup": 78, "version": 0.6 }, { "label": "gear", "hexcode": "2699", "tags": [ "cog", "cogwheel", "tool" ], "emoji": "⚙️", "text": "⚙︎", "type": 0, "order": 4576, "group": 7, "subgroup": 78, "version": 1 }, { "label": "clamp", "hexcode": "1F5DC", "tags": [ "compress", "tool", "vice" ], "emoji": "🗜️", "text": "🗜︎", "type": 0, "order": 4578, "group": 7, "subgroup": 78, "version": 0.7 }, { "label": "balance scale", "hexcode": "2696", "tags": [ "balance", "justice", "libra", "scale", "scales", "tool", "weight", "zodiac" ], "emoji": "⚖️", "text": "⚖︎", "type": 0, "order": 4580, "group": 7, "subgroup": 78, "version": 1 }, { "label": "white cane", "hexcode": "1F9AF", "tags": [ "accessibility", "blind", "cane", "probing", "white" ], "emoji": "🦯", "text": "", "type": 1, "order": 4581, "group": 7, "subgroup": 78, "version": 12 }, { "label": "link", "hexcode": "1F517", "tags": [ "links" ], "emoji": "🔗", "text": "", "type": 1, "order": 4582, "group": 7, "subgroup": 78, "version": 0.6 }, { "label": "broken chain", "hexcode": "26D3-FE0F-200D-1F4A5", "tags": [ "break", "breaking", "broken", "chain", "cuffs", "freedom" ], "emoji": "⛓️‍💥", "text": "", "type": 1, "order": 4583, "group": 7, "subgroup": 78, "version": 15.1 }, { "label": "chains", "hexcode": "26D3", "tags": [ "chain" ], "emoji": "⛓️", "text": "⛓︎", "type": 0, "order": 4586, "group": 7, "subgroup": 78, "version": 0.7 }, { "label": "hook", "hexcode": "1FA9D", "tags": [ "catch", "crook", "curve", "ensnare", "point", "selling" ], "emoji": "🪝", "text": "", "type": 1, "order": 4587, "group": 7, "subgroup": 78, "version": 13 }, { "label": "toolbox", "hexcode": "1F9F0", "tags": [ "box", "chest", "mechanic", "red", "tool" ], "emoji": "🧰", "text": "", "type": 1, "order": 4588, "group": 7, "subgroup": 78, "version": 11 }, { "label": "magnet", "hexcode": "1F9F2", "tags": [ "attraction", "horseshoe", "magnetic", "negative", "positive", "shape", "u" ], "emoji": "🧲", "text": "", "type": 1, "order": 4589, "group": 7, "subgroup": 78, "version": 11 }, { "label": "ladder", "hexcode": "1FA9C", "tags": [ "climb", "rung", "step" ], "emoji": "🪜", "text": "", "type": 1, "order": 4590, "group": 7, "subgroup": 78, "version": 13 }, { "label": "shovel", "hexcode": "1FA8F", "tags": [ "bury", "dig", "garden", "hole", "plant", "scoop", "snow", "spade" ], "emoji": "🪏", "text": "", "type": 1, "order": 4591, "group": 7, "subgroup": 78, "version": 16 }, { "label": "alembic", "hexcode": "2697", "tags": [ "chemistry", "tool" ], "emoji": "⚗️", "text": "⚗︎", "type": 0, "order": 4593, "group": 7, "subgroup": 79, "version": 1 }, { "label": "test tube", "hexcode": "1F9EA", "tags": [ "chemist", "chemistry", "experiment", "lab", "science", "test", "tube" ], "emoji": "🧪", "text": "", "type": 1, "order": 4594, "group": 7, "subgroup": 79, "version": 11 }, { "label": "petri dish", "hexcode": "1F9EB", "tags": [ "bacteria", "biologist", "biology", "culture", "dish", "lab", "petri" ], "emoji": "🧫", "text": "", "type": 1, "order": 4595, "group": 7, "subgroup": 79, "version": 11 }, { "label": "dna", "hexcode": "1F9EC", "tags": [ "biologist", "evolution", "gene", "genetics", "life" ], "emoji": "🧬", "text": "", "type": 1, "order": 4596, "group": 7, "subgroup": 79, "version": 11 }, { "label": "microscope", "hexcode": "1F52C", "tags": [ "experiment", "lab", "science", "tool" ], "emoji": "🔬", "text": "", "type": 1, "order": 4597, "group": 7, "subgroup": 79, "version": 1 }, { "label": "telescope", "hexcode": "1F52D", "tags": [ "contact", "extraterrestrial", "science", "tool" ], "emoji": "🔭", "text": "", "type": 1, "order": 4598, "group": 7, "subgroup": 79, "version": 1 }, { "label": "satellite antenna", "hexcode": "1F4E1", "tags": [ "aliens", "antenna", "contact", "dish", "satellite", "science" ], "emoji": "📡", "text": "", "type": 1, "order": 4599, "group": 7, "subgroup": 79, "version": 0.6 }, { "label": "syringe", "hexcode": "1F489", "tags": [ "doctor", "flu", "medicine", "needle", "shot", "sick", "tool", "vaccination" ], "emoji": "💉", "text": "", "type": 1, "order": 4600, "group": 7, "subgroup": 80, "version": 0.6 }, { "label": "drop of blood", "hexcode": "1FA78", "tags": [ "bleed", "blood", "donation", "drop", "injury", "medicine", "menstruation" ], "emoji": "🩸", "text": "", "type": 1, "order": 4601, "group": 7, "subgroup": 80, "version": 12 }, { "label": "pill", "hexcode": "1F48A", "tags": [ "doctor", "drugs", "medicated", "medicine", "pills", "sick", "vitamin" ], "emoji": "💊", "text": "", "type": 1, "order": 4602, "group": 7, "subgroup": 80, "version": 0.6 }, { "label": "adhesive bandage", "hexcode": "1FA79", "tags": [ "adhesive", "bandage" ], "emoji": "🩹", "text": "", "type": 1, "order": 4603, "group": 7, "subgroup": 80, "version": 12 }, { "label": "crutch", "hexcode": "1FA7C", "tags": [ "aid", "cane", "disability", "help", "hurt", "injured", "mobility", "stick" ], "emoji": "🩼", "text": "", "type": 1, "order": 4604, "group": 7, "subgroup": 80, "version": 14 }, { "label": "stethoscope", "hexcode": "1FA7A", "tags": [ "doctor", "heart", "medicine" ], "emoji": "🩺", "text": "", "type": 1, "order": 4605, "group": 7, "subgroup": 80, "version": 12 }, { "label": "x-ray", "hexcode": "1FA7B", "tags": [ "bones", "doctor", "medical", "skeleton", "skull", "xray" ], "emoji": "🩻", "text": "", "type": 1, "order": 4606, "group": 7, "subgroup": 80, "version": 14 }, { "label": "door", "hexcode": "1F6AA", "tags": [ "back", "closet", "front" ], "emoji": "🚪", "text": "", "type": 1, "order": 4607, "group": 7, "subgroup": 81, "version": 0.6 }, { "label": "elevator", "hexcode": "1F6D7", "tags": [ "accessibility", "hoist", "lift" ], "emoji": "🛗", "text": "", "type": 1, "order": 4608, "group": 7, "subgroup": 81, "version": 13 }, { "label": "mirror", "hexcode": "1FA9E", "tags": [ "makeup", "reflection", "reflector", "speculum" ], "emoji": "🪞", "text": "", "type": 1, "order": 4609, "group": 7, "subgroup": 81, "version": 13 }, { "label": "window", "hexcode": "1FA9F", "tags": [ "air", "frame", "fresh", "opening", "transparent", "view" ], "emoji": "🪟", "text": "", "type": 1, "order": 4610, "group": 7, "subgroup": 81, "version": 13 }, { "label": "bed", "hexcode": "1F6CF", "tags": [ "hotel", "sleep" ], "emoji": "🛏️", "text": "🛏︎", "type": 0, "order": 4612, "group": 7, "subgroup": 81, "version": 0.7 }, { "label": "couch and lamp", "hexcode": "1F6CB", "tags": [ "couch", "hotel", "lamp" ], "emoji": "🛋️", "text": "🛋︎", "type": 0, "order": 4614, "group": 7, "subgroup": 81, "version": 0.7 }, { "label": "chair", "hexcode": "1FA91", "tags": [ "seat", "sit" ], "emoji": "🪑", "text": "", "type": 1, "order": 4615, "group": 7, "subgroup": 81, "version": 12 }, { "label": "toilet", "hexcode": "1F6BD", "tags": [ "bathroom" ], "emoji": "🚽", "text": "", "type": 1, "order": 4616, "group": 7, "subgroup": 81, "version": 0.6 }, { "label": "plunger", "hexcode": "1FAA0", "tags": [ "cup", "force", "plumber", "poop", "suction", "toilet" ], "emoji": "🪠", "text": "", "type": 1, "order": 4617, "group": 7, "subgroup": 81, "version": 13 }, { "label": "shower", "hexcode": "1F6BF", "tags": [ "water" ], "emoji": "🚿", "text": "", "type": 1, "order": 4618, "group": 7, "subgroup": 81, "version": 1 }, { "label": "bathtub", "hexcode": "1F6C1", "tags": [ "bath" ], "emoji": "🛁", "text": "", "type": 1, "order": 4619, "group": 7, "subgroup": 81, "version": 1 }, { "label": "mouse trap", "hexcode": "1FAA4", "tags": [ "bait", "cheese", "lure", "mouse", "mousetrap", "snare", "trap" ], "emoji": "🪤", "text": "", "type": 1, "order": 4620, "group": 7, "subgroup": 81, "version": 13 }, { "label": "razor", "hexcode": "1FA92", "tags": [ "sharp", "shave" ], "emoji": "🪒", "text": "", "type": 1, "order": 4621, "group": 7, "subgroup": 81, "version": 12 }, { "label": "lotion bottle", "hexcode": "1F9F4", "tags": [ "bottle", "lotion", "moisturizer", "shampoo", "sunscreen" ], "emoji": "🧴", "text": "", "type": 1, "order": 4622, "group": 7, "subgroup": 81, "version": 11 }, { "label": "safety pin", "hexcode": "1F9F7", "tags": [ "diaper", "pin", "punk", "rock", "safety" ], "emoji": "🧷", "text": "", "type": 1, "order": 4623, "group": 7, "subgroup": 81, "version": 11 }, { "label": "broom", "hexcode": "1F9F9", "tags": [ "cleaning", "sweeping", "witch" ], "emoji": "🧹", "text": "", "type": 1, "order": 4624, "group": 7, "subgroup": 81, "version": 11 }, { "label": "basket", "hexcode": "1F9FA", "tags": [ "farming", "laundry", "picnic" ], "emoji": "🧺", "text": "", "type": 1, "order": 4625, "group": 7, "subgroup": 81, "version": 11 }, { "label": "roll of paper", "hexcode": "1F9FB", "tags": [ "paper", "roll", "toilet", "towels" ], "emoji": "🧻", "text": "", "type": 1, "order": 4626, "group": 7, "subgroup": 81, "version": 11 }, { "label": "bucket", "hexcode": "1FAA3", "tags": [ "cask", "pail", "vat" ], "emoji": "🪣", "text": "", "type": 1, "order": 4627, "group": 7, "subgroup": 81, "version": 13 }, { "label": "soap", "hexcode": "1F9FC", "tags": [ "bar", "bathing", "clean", "cleaning", "lather", "soapdish" ], "emoji": "🧼", "text": "", "type": 1, "order": 4628, "group": 7, "subgroup": 81, "version": 11 }, { "label": "bubbles", "hexcode": "1FAE7", "tags": [ "bubble", "burp", "clean", "floating", "pearl", "soap", "underwater" ], "emoji": "🫧", "text": "", "type": 1, "order": 4629, "group": 7, "subgroup": 81, "version": 14 }, { "label": "toothbrush", "hexcode": "1FAA5", "tags": [ "bathroom", "brush", "clean", "dental", "hygiene", "teeth", "toiletry" ], "emoji": "🪥", "text": "", "type": 1, "order": 4630, "group": 7, "subgroup": 81, "version": 13 }, { "label": "sponge", "hexcode": "1F9FD", "tags": [ "absorbing", "cleaning", "porous", "soak" ], "emoji": "🧽", "text": "", "type": 1, "order": 4631, "group": 7, "subgroup": 81, "version": 11 }, { "label": "fire extinguisher", "hexcode": "1F9EF", "tags": [ "extinguish", "extinguisher", "fire", "quench" ], "emoji": "🧯", "text": "", "type": 1, "order": 4632, "group": 7, "subgroup": 81, "version": 11 }, { "label": "shopping cart", "hexcode": "1F6D2", "tags": [ "cart", "shopping", "trolley" ], "emoji": "🛒", "text": "", "type": 1, "order": 4633, "group": 7, "subgroup": 81, "version": 3 }, { "label": "cigarette", "hexcode": "1F6AC", "tags": [ "smoking" ], "emoji": "🚬", "text": "", "type": 1, "order": 4634, "group": 7, "subgroup": 82, "version": 0.6 }, { "label": "coffin", "hexcode": "26B0", "tags": [ "dead", "death", "vampire" ], "emoji": "⚰️", "text": "⚰︎", "type": 0, "order": 4636, "group": 7, "subgroup": 82, "version": 1 }, { "label": "headstone", "hexcode": "1FAA6", "tags": [ "cemetery", "dead", "grave", "graveyard", "memorial", "rip", "tomb", "tombstone" ], "emoji": "🪦", "text": "", "type": 1, "order": 4637, "group": 7, "subgroup": 82, "version": 13 }, { "label": "funeral urn", "hexcode": "26B1", "tags": [ "ashes", "death", "funeral", "urn" ], "emoji": "⚱️", "text": "⚱︎", "type": 0, "order": 4639, "group": 7, "subgroup": 82, "version": 1 }, { "label": "nazar amulet", "hexcode": "1F9FF", "tags": [ "amulet", "bead", "blue", "charm", "evil-eye", "nazar", "talisman" ], "emoji": "🧿", "text": "", "type": 1, "order": 4640, "group": 7, "subgroup": 82, "version": 11 }, { "label": "hamsa", "hexcode": "1FAAC", "tags": [ "amulet", "fatima", "fortune", "guide", "hand", "mary", "miriam", "palm", "protect", "protection" ], "emoji": "🪬", "text": "", "type": 1, "order": 4641, "group": 7, "subgroup": 82, "version": 14 }, { "label": "moai", "hexcode": "1F5FF", "tags": [ "face", "moyai", "statue", "stoneface", "travel" ], "emoji": "🗿", "text": "", "type": 1, "order": 4642, "group": 7, "subgroup": 82, "version": 0.6 }, { "label": "placard", "hexcode": "1FAA7", "tags": [ "card", "demonstration", "notice", "picket", "plaque", "protest", "sign" ], "emoji": "🪧", "text": "", "type": 1, "order": 4643, "group": 7, "subgroup": 82, "version": 13 }, { "label": "identification card", "hexcode": "1FAAA", "tags": [ "card", "credentials", "document", "id", "identification", "license", "security" ], "emoji": "🪪", "text": "", "type": 1, "order": 4644, "group": 7, "subgroup": 82, "version": 14 }, { "label": "ATM sign", "hexcode": "1F3E7", "tags": [ "atm", "automated", "bank", "cash", "money", "sign", "teller" ], "emoji": "🏧", "text": "", "type": 1, "order": 4645, "group": 8, "subgroup": 83, "version": 0.6 }, { "label": "litter in bin sign", "hexcode": "1F6AE", "tags": [ "bin", "litter", "litterbin", "sign" ], "emoji": "🚮", "text": "", "type": 1, "order": 4646, "group": 8, "subgroup": 83, "version": 1 }, { "label": "potable water", "hexcode": "1F6B0", "tags": [ "drinking", "potable", "water" ], "emoji": "🚰", "text": "", "type": 1, "order": 4647, "group": 8, "subgroup": 83, "version": 1 }, { "label": "wheelchair symbol", "hexcode": "267F", "tags": [ "access", "handicap", "symbol", "wheelchair" ], "emoji": "♿️", "text": "♿︎", "type": 1, "order": 4648, "group": 8, "subgroup": 83, "version": 0.6 }, { "label": "men’s room", "hexcode": "1F6B9", "tags": [ "bathroom", "lavatory", "man", "men’s", "restroom", "room", "toilet", "wc" ], "emoji": "🚹️", "text": "🚹︎", "type": 1, "order": 4649, "group": 8, "subgroup": 83, "version": 0.6 }, { "label": "women’s room", "hexcode": "1F6BA", "tags": [ "bathroom", "lavatory", "restroom", "room", "toilet", "wc", "woman", "women’s" ], "emoji": "🚺️", "text": "🚺︎", "type": 1, "order": 4650, "group": 8, "subgroup": 83, "version": 0.6 }, { "label": "restroom", "hexcode": "1F6BB", "tags": [ "bathroom", "lavatory", "toilet", "wc" ], "emoji": "🚻", "text": "", "type": 1, "order": 4651, "group": 8, "subgroup": 83, "version": 0.6 }, { "label": "baby symbol", "hexcode": "1F6BC", "tags": [ "baby", "changing", "symbol" ], "emoji": "🚼️", "text": "🚼︎", "type": 1, "order": 4652, "group": 8, "subgroup": 83, "version": 0.6 }, { "label": "water closet", "hexcode": "1F6BE", "tags": [ "bathroom", "closet", "lavatory", "restroom", "toilet", "water", "wc" ], "emoji": "🚾", "text": "", "type": 1, "order": 4653, "group": 8, "subgroup": 83, "version": 0.6 }, { "label": "passport control", "hexcode": "1F6C2", "tags": [ "control", "passport" ], "emoji": "🛂", "text": "", "type": 1, "order": 4654, "group": 8, "subgroup": 83, "version": 1 }, { "label": "customs", "hexcode": "1F6C3", "tags": [ "packing" ], "emoji": "🛃", "text": "", "type": 1, "order": 4655, "group": 8, "subgroup": 83, "version": 1 }, { "label": "baggage claim", "hexcode": "1F6C4", "tags": [ "arrived", "baggage", "bags", "case", "checked", "claim", "journey", "packing", "plane", "ready", "travel", "trip" ], "emoji": "🛄", "text": "", "type": 1, "order": 4656, "group": 8, "subgroup": 83, "version": 1 }, { "label": "left luggage", "hexcode": "1F6C5", "tags": [ "baggage", "case", "left", "locker", "luggage" ], "emoji": "🛅", "text": "", "type": 1, "order": 4657, "group": 8, "subgroup": 83, "version": 1 }, { "label": "warning", "hexcode": "26A0", "tags": [ "caution" ], "emoji": "⚠️", "text": "⚠︎", "type": 0, "order": 4659, "group": 8, "subgroup": 84, "version": 0.6 }, { "label": "children crossing", "hexcode": "1F6B8", "tags": [ "child", "children", "crossing", "pedestrian", "traffic" ], "emoji": "🚸", "text": "", "type": 1, "order": 4660, "group": 8, "subgroup": 84, "version": 1 }, { "label": "no entry", "hexcode": "26D4", "tags": [ "do", "entry", "fail", "forbidden", "no", "not", "pass", "prohibited", "traffic" ], "emoji": "⛔️", "text": "⛔︎", "type": 1, "order": 4661, "group": 8, "subgroup": 84, "version": 0.6 }, { "label": "prohibited", "hexcode": "1F6AB", "tags": [ "entry", "forbidden", "no", "not", "smoke" ], "emoji": "🚫", "text": "", "type": 1, "order": 4662, "group": 8, "subgroup": 84, "version": 0.6 }, { "label": "no bicycles", "hexcode": "1F6B3", "tags": [ "bicycle", "bicycles", "bike", "forbidden", "no", "not", "prohibited" ], "emoji": "🚳", "text": "", "type": 1, "order": 4663, "group": 8, "subgroup": 84, "version": 1 }, { "label": "no smoking", "hexcode": "1F6AD", "tags": [ "forbidden", "no", "not", "prohibited", "smoke", "smoking" ], "emoji": "🚭️", "text": "🚭︎", "type": 1, "order": 4664, "group": 8, "subgroup": 84, "version": 0.6 }, { "label": "no littering", "hexcode": "1F6AF", "tags": [ "forbidden", "litter", "littering", "no", "not", "prohibited" ], "emoji": "🚯", "text": "", "type": 1, "order": 4665, "group": 8, "subgroup": 84, "version": 1 }, { "label": "non-potable water", "hexcode": "1F6B1", "tags": [ "dry", "non-drinking", "non-potable", "prohibited", "water" ], "emoji": "🚱", "text": "", "type": 1, "order": 4666, "group": 8, "subgroup": 84, "version": 1 }, { "label": "no pedestrians", "hexcode": "1F6B7", "tags": [ "forbidden", "no", "not", "pedestrian", "pedestrians", "prohibited" ], "emoji": "🚷", "text": "", "type": 1, "order": 4667, "group": 8, "subgroup": 84, "version": 1 }, { "label": "no mobile phones", "hexcode": "1F4F5", "tags": [ "cell", "forbidden", "mobile", "no", "not", "phone", "phones", "prohibited", "telephone" ], "emoji": "📵", "text": "", "type": 1, "order": 4668, "group": 8, "subgroup": 84, "version": 1 }, { "label": "no one under eighteen", "hexcode": "1F51E", "tags": [ "18", "age", "eighteen", "forbidden", "no", "not", "one", "prohibited", "restriction", "underage" ], "emoji": "🔞", "text": "", "type": 1, "order": 4669, "group": 8, "subgroup": 84, "version": 0.6 }, { "label": "radioactive", "hexcode": "2622", "tags": [ "sign" ], "emoji": "☢️", "text": "☢︎", "type": 0, "order": 4671, "group": 8, "subgroup": 84, "version": 1 }, { "label": "biohazard", "hexcode": "2623", "tags": [ "sign" ], "emoji": "☣️", "text": "☣︎", "type": 0, "order": 4673, "group": 8, "subgroup": 84, "version": 1 }, { "label": "up arrow", "hexcode": "2B06", "tags": [ "arrow", "cardinal", "direction", "north", "up" ], "emoji": "⬆️", "text": "⬆︎", "type": 0, "order": 4675, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "up-right arrow", "hexcode": "2197", "tags": [ "arrow", "direction", "intercardinal", "northeast", "up-right" ], "emoji": "↗️", "text": "↗︎", "type": 0, "order": 4677, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "right arrow", "hexcode": "27A1", "tags": [ "arrow", "cardinal", "direction", "east", "right" ], "emoji": "➡️", "text": "➡︎", "type": 0, "order": 4679, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "down-right arrow", "hexcode": "2198", "tags": [ "arrow", "direction", "down-right", "intercardinal", "southeast" ], "emoji": "↘️", "text": "↘︎", "type": 0, "order": 4681, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "down arrow", "hexcode": "2B07", "tags": [ "arrow", "cardinal", "direction", "down", "south" ], "emoji": "⬇️", "text": "⬇︎", "type": 0, "order": 4683, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "down-left arrow", "hexcode": "2199", "tags": [ "arrow", "direction", "down-left", "intercardinal", "southwest" ], "emoji": "↙️", "text": "↙︎", "type": 0, "order": 4685, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "left arrow", "hexcode": "2B05", "tags": [ "arrow", "cardinal", "direction", "left", "west" ], "emoji": "⬅️", "text": "⬅︎", "type": 0, "order": 4687, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "up-left arrow", "hexcode": "2196", "tags": [ "arrow", "direction", "intercardinal", "northwest", "up-left" ], "emoji": "↖️", "text": "↖︎", "type": 0, "order": 4689, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "up-down arrow", "hexcode": "2195", "tags": [ "arrow", "up-down" ], "emoji": "↕️", "text": "↕︎", "type": 0, "order": 4691, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "left-right arrow", "hexcode": "2194", "tags": [ "arrow", "left-right" ], "emoji": "↔️", "text": "↔︎", "type": 0, "order": 4693, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "right arrow curving left", "hexcode": "21A9", "tags": [ "arrow", "curving", "left", "right" ], "emoji": "↩️", "text": "↩︎", "type": 0, "order": 4695, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "left arrow curving right", "hexcode": "21AA", "tags": [ "arrow", "curving", "left", "right" ], "emoji": "↪️", "text": "↪︎", "type": 0, "order": 4697, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "right arrow curving up", "hexcode": "2934", "tags": [ "arrow", "curving", "right", "up" ], "emoji": "⤴️", "text": "⤴︎", "type": 0, "order": 4699, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "right arrow curving down", "hexcode": "2935", "tags": [ "arrow", "curving", "down", "right" ], "emoji": "⤵️", "text": "⤵︎", "type": 0, "order": 4701, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "clockwise vertical arrows", "hexcode": "1F503", "tags": [ "arrow", "arrows", "clockwise", "refresh", "reload", "vertical" ], "emoji": "🔃", "text": "", "type": 1, "order": 4702, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "counterclockwise arrows button", "hexcode": "1F504", "tags": [ "again", "anticlockwise", "arrow", "arrows", "button", "counterclockwise", "deja", "refresh", "rewindershins", "vu" ], "emoji": "🔄", "text": "", "type": 1, "order": 4703, "group": 8, "subgroup": 85, "version": 1 }, { "label": "BACK arrow", "hexcode": "1F519", "tags": [ "arrow", "back" ], "emoji": "🔙", "text": "", "type": 1, "order": 4704, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "END arrow", "hexcode": "1F51A", "tags": [ "arrow", "end" ], "emoji": "🔚", "text": "", "type": 1, "order": 4705, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "ON! arrow", "hexcode": "1F51B", "tags": [ "arrow", "mark", "on!" ], "emoji": "🔛", "text": "", "type": 1, "order": 4706, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "SOON arrow", "hexcode": "1F51C", "tags": [ "arrow", "brb", "omw", "soon" ], "emoji": "🔜", "text": "", "type": 1, "order": 4707, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "TOP arrow", "hexcode": "1F51D", "tags": [ "arrow", "homie", "top", "up" ], "emoji": "🔝", "text": "", "type": 1, "order": 4708, "group": 8, "subgroup": 85, "version": 0.6 }, { "label": "place of worship", "hexcode": "1F6D0", "tags": [ "place", "pray", "religion", "worship" ], "emoji": "🛐", "text": "", "type": 1, "order": 4709, "group": 8, "subgroup": 86, "version": 1 }, { "label": "atom symbol", "hexcode": "269B", "tags": [ "atheist", "atom", "symbol" ], "emoji": "⚛️", "text": "⚛︎", "type": 0, "order": 4711, "group": 8, "subgroup": 86, "version": 1 }, { "label": "om", "hexcode": "1F549", "tags": [ "hindu", "religion" ], "emoji": "🕉️", "text": "🕉︎", "type": 0, "order": 4713, "group": 8, "subgroup": 86, "version": 0.7 }, { "label": "star of David", "hexcode": "2721", "tags": [ "david", "jew", "jewish", "judaism", "religion", "star" ], "emoji": "✡️", "text": "✡︎", "type": 0, "order": 4715, "group": 8, "subgroup": 86, "version": 0.7 }, { "label": "wheel of dharma", "hexcode": "2638", "tags": [ "buddhist", "dharma", "religion", "wheel" ], "emoji": "☸️", "text": "☸︎", "type": 0, "order": 4717, "group": 8, "subgroup": 86, "version": 0.7 }, { "label": "yin yang", "hexcode": "262F", "tags": [ "difficult", "lives", "religion", "tao", "taoist", "total", "yang", "yin", "yinyang" ], "emoji": "☯️", "text": "☯︎", "type": 0, "order": 4719, "group": 8, "subgroup": 86, "version": 0.7 }, { "label": "latin cross", "hexcode": "271D", "tags": [ "christ", "christian", "cross", "latin", "religion" ], "emoji": "✝️", "text": "✝︎", "type": 0, "order": 4721, "group": 8, "subgroup": 86, "version": 0.7 }, { "label": "orthodox cross", "hexcode": "2626", "tags": [ "christian", "cross", "orthodox", "religion" ], "emoji": "☦️", "text": "☦︎", "type": 0, "order": 4723, "group": 8, "subgroup": 86, "version": 1 }, { "label": "star and crescent", "hexcode": "262A", "tags": [ "crescent", "islam", "muslim", "ramadan", "religion", "star" ], "emoji": "☪️", "text": "☪︎", "type": 0, "order": 4725, "group": 8, "subgroup": 86, "version": 0.7 }, { "label": "peace symbol", "hexcode": "262E", "tags": [ "healing", "peace", "peaceful", "symbol" ], "emoji": "☮️", "text": "☮︎", "type": 0, "order": 4727, "group": 8, "subgroup": 86, "version": 1 }, { "label": "menorah", "hexcode": "1F54E", "tags": [ "candelabrum", "candlestick", "hanukkah", "jewish", "judaism", "religion" ], "emoji": "🕎", "text": "", "type": 1, "order": 4728, "group": 8, "subgroup": 86, "version": 1 }, { "label": "dotted six-pointed star", "hexcode": "1F52F", "tags": [ "dotted", "fortune", "jewish", "judaism", "six-pointed", "star" ], "emoji": "🔯", "text": "", "type": 1, "order": 4729, "group": 8, "subgroup": 86, "version": 0.6 }, { "label": "khanda", "hexcode": "1FAAF", "tags": [ "deg", "fateh", "khalsa", "religion", "sikh", "sikhism", "tegh" ], "emoji": "🪯", "text": "", "type": 1, "order": 4730, "group": 8, "subgroup": 86, "version": 15 }, { "label": "Aries", "hexcode": "2648", "tags": [ "aries", "horoscope", "ram", "zodiac" ], "emoji": "♈️", "text": "♈︎", "type": 1, "order": 4731, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Taurus", "hexcode": "2649", "tags": [ "bull", "horoscope", "ox", "taurus", "zodiac" ], "emoji": "♉️", "text": "♉︎", "type": 1, "order": 4732, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Gemini", "hexcode": "264A", "tags": [ "gemini", "horoscope", "twins", "zodiac" ], "emoji": "♊️", "text": "♊︎", "type": 1, "order": 4733, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Cancer", "hexcode": "264B", "tags": [ "cancer", "crab", "horoscope", "zodiac" ], "emoji": "♋️", "text": "♋︎", "type": 1, "order": 4734, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Leo", "hexcode": "264C", "tags": [ "horoscope", "leo", "lion", "zodiac" ], "emoji": "♌️", "text": "♌︎", "type": 1, "order": 4735, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Virgo", "hexcode": "264D", "tags": [ "horoscope", "virgo", "zodiac" ], "emoji": "♍️", "text": "♍︎", "type": 1, "order": 4736, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Libra", "hexcode": "264E", "tags": [ "balance", "horoscope", "justice", "libra", "scales", "zodiac" ], "emoji": "♎️", "text": "♎︎", "type": 1, "order": 4737, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Scorpio", "hexcode": "264F", "tags": [ "horoscope", "scorpio", "scorpion", "scorpius", "zodiac" ], "emoji": "♏️", "text": "♏︎", "type": 1, "order": 4738, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Sagittarius", "hexcode": "2650", "tags": [ "archer", "horoscope", "sagittarius", "zodiac" ], "emoji": "♐️", "text": "♐︎", "type": 1, "order": 4739, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Capricorn", "hexcode": "2651", "tags": [ "capricorn", "goat", "horoscope", "zodiac" ], "emoji": "♑️", "text": "♑︎", "type": 1, "order": 4740, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Aquarius", "hexcode": "2652", "tags": [ "aquarius", "bearer", "horoscope", "water", "zodiac" ], "emoji": "♒️", "text": "♒︎", "type": 1, "order": 4741, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Pisces", "hexcode": "2653", "tags": [ "fish", "horoscope", "pisces", "zodiac" ], "emoji": "♓️", "text": "♓︎", "type": 1, "order": 4742, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "Ophiuchus", "hexcode": "26CE", "tags": [ "bearer", "ophiuchus", "serpent", "snake", "zodiac" ], "emoji": "⛎️", "text": "⛎︎", "type": 1, "order": 4743, "group": 8, "subgroup": 87, "version": 0.6 }, { "label": "shuffle tracks button", "hexcode": "1F500", "tags": [ "arrow", "button", "crossed", "shuffle", "tracks" ], "emoji": "🔀", "text": "", "type": 1, "order": 4744, "group": 8, "subgroup": 88, "version": 1 }, { "label": "repeat button", "hexcode": "1F501", "tags": [ "arrow", "button", "clockwise", "repeat" ], "emoji": "🔁", "text": "", "type": 1, "order": 4745, "group": 8, "subgroup": 88, "version": 1 }, { "label": "repeat single button", "hexcode": "1F502", "tags": [ "arrow", "button", "clockwise", "once", "repeat", "single" ], "emoji": "🔂", "text": "", "type": 1, "order": 4746, "group": 8, "subgroup": 88, "version": 1 }, { "label": "play button", "hexcode": "25B6", "tags": [ "arrow", "button", "play", "right", "triangle" ], "emoji": "▶️", "text": "▶︎", "type": 0, "order": 4748, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "fast-forward button", "hexcode": "23E9", "tags": [ "arrow", "button", "double", "fast", "fast-forward", "forward" ], "emoji": "⏩️", "text": "⏩︎", "type": 1, "order": 4749, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "next track button", "hexcode": "23ED", "tags": [ "arrow", "button", "next", "scene", "track", "triangle" ], "emoji": "⏭️", "text": "⏭︎", "type": 0, "order": 4751, "group": 8, "subgroup": 88, "version": 0.7 }, { "label": "play or pause button", "hexcode": "23EF", "tags": [ "arrow", "button", "pause", "play", "right", "triangle" ], "emoji": "⏯️", "text": "⏯︎", "type": 0, "order": 4753, "group": 8, "subgroup": 88, "version": 1 }, { "label": "reverse button", "hexcode": "25C0", "tags": [ "arrow", "button", "left", "reverse", "triangle" ], "emoji": "◀️", "text": "◀︎", "type": 0, "order": 4755, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "fast reverse button", "hexcode": "23EA", "tags": [ "arrow", "button", "double", "fast", "reverse", "rewind" ], "emoji": "⏪️", "text": "⏪︎", "type": 1, "order": 4756, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "last track button", "hexcode": "23EE", "tags": [ "arrow", "button", "last", "previous", "scene", "track", "triangle" ], "emoji": "⏮️", "text": "⏮︎", "type": 0, "order": 4758, "group": 8, "subgroup": 88, "version": 0.7 }, { "label": "upwards button", "hexcode": "1F53C", "tags": [ "arrow", "button", "red", "up", "upwards" ], "emoji": "🔼", "text": "", "type": 1, "order": 4759, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "fast up button", "hexcode": "23EB", "tags": [ "arrow", "button", "double", "fast", "up" ], "emoji": "⏫️", "text": "⏫︎", "type": 1, "order": 4760, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "downwards button", "hexcode": "1F53D", "tags": [ "arrow", "button", "down", "downwards", "red" ], "emoji": "🔽", "text": "", "type": 1, "order": 4761, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "fast down button", "hexcode": "23EC", "tags": [ "arrow", "button", "double", "down", "fast" ], "emoji": "⏬️", "text": "⏬︎", "type": 1, "order": 4762, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "pause button", "hexcode": "23F8", "tags": [ "bar", "button", "double", "pause", "vertical" ], "emoji": "⏸️", "text": "⏸︎", "type": 0, "order": 4764, "group": 8, "subgroup": 88, "version": 0.7 }, { "label": "stop button", "hexcode": "23F9", "tags": [ "button", "square", "stop" ], "emoji": "⏹️", "text": "⏹︎", "type": 0, "order": 4766, "group": 8, "subgroup": 88, "version": 0.7 }, { "label": "record button", "hexcode": "23FA", "tags": [ "button", "circle", "record" ], "emoji": "⏺️", "text": "⏺︎", "type": 0, "order": 4768, "group": 8, "subgroup": 88, "version": 0.7 }, { "label": "eject button", "hexcode": "23CF", "tags": [ "button", "eject" ], "emoji": "⏏️", "text": "⏏︎", "type": 0, "order": 4770, "group": 8, "subgroup": 88, "version": 1 }, { "label": "cinema", "hexcode": "1F3A6", "tags": [ "camera", "film", "movie" ], "emoji": "🎦", "text": "", "type": 1, "order": 4771, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "dim button", "hexcode": "1F505", "tags": [ "brightness", "button", "dim", "low" ], "emoji": "🔅", "text": "", "type": 1, "order": 4772, "group": 8, "subgroup": 88, "version": 1 }, { "label": "bright button", "hexcode": "1F506", "tags": [ "bright", "brightness", "button", "light" ], "emoji": "🔆", "text": "", "type": 1, "order": 4773, "group": 8, "subgroup": 88, "version": 1 }, { "label": "antenna bars", "hexcode": "1F4F6", "tags": [ "antenna", "bar", "bars", "cell", "communication", "mobile", "phone", "signal", "telephone" ], "emoji": "📶", "text": "", "type": 1, "order": 4774, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "wireless", "hexcode": "1F6DC", "tags": [ "broadband", "computer", "connectivity", "hotspot", "internet", "network", "router", "smartphone", "wi-fi", "wifi", "wlan" ], "emoji": "🛜", "text": "", "type": 1, "order": 4775, "group": 8, "subgroup": 88, "version": 15 }, { "label": "vibration mode", "hexcode": "1F4F3", "tags": [ "cell", "communication", "mobile", "mode", "phone", "telephone", "vibration" ], "emoji": "📳", "text": "", "type": 1, "order": 4776, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "mobile phone off", "hexcode": "1F4F4", "tags": [ "cell", "mobile", "off", "phone", "telephone" ], "emoji": "📴", "text": "", "type": 1, "order": 4777, "group": 8, "subgroup": 88, "version": 0.6 }, { "label": "female sign", "hexcode": "2640", "tags": [ "female", "sign", "woman" ], "emoji": "♀️", "text": "♀︎", "type": 0, "order": 4779, "group": 8, "subgroup": 89, "version": 4 }, { "label": "male sign", "hexcode": "2642", "tags": [ "male", "man", "sign" ], "emoji": "♂️", "text": "♂︎", "type": 0, "order": 4781, "group": 8, "subgroup": 89, "version": 4 }, { "label": "transgender symbol", "hexcode": "26A7", "tags": [ "symbol", "transgender" ], "emoji": "⚧️", "text": "⚧︎", "type": 0, "order": 4783, "group": 8, "subgroup": 89, "version": 13 }, { "label": "multiply", "hexcode": "2716", "tags": [ "cancel", "multiplication", "sign", "x", "×" ], "emoji": "✖️", "text": "✖︎", "type": 0, "order": 4785, "group": 8, "subgroup": 90, "version": 0.6 }, { "label": "plus", "hexcode": "2795", "tags": [ "+" ], "emoji": "➕️", "text": "➕︎", "type": 1, "order": 4786, "group": 8, "subgroup": 90, "version": 0.6 }, { "label": "minus", "hexcode": "2796", "tags": [ "-", "heavy", "math", "sign", "−" ], "emoji": "➖️", "text": "➖︎", "type": 1, "order": 4787, "group": 8, "subgroup": 90, "version": 0.6 }, { "label": "divide", "hexcode": "2797", "tags": [ "division", "heavy", "math", "sign", "÷" ], "emoji": "➗️", "text": "➗︎", "type": 1, "order": 4788, "group": 8, "subgroup": 90, "version": 0.6 }, { "label": "heavy equals sign", "hexcode": "1F7F0", "tags": [ "answer", "equal", "equality", "equals", "heavy", "math", "sign" ], "emoji": "🟰", "text": "", "type": 1, "order": 4789, "group": 8, "subgroup": 90, "version": 14 }, { "label": "infinity", "hexcode": "267E", "tags": [ "forever", "unbounded", "universal" ], "emoji": "♾️", "text": "♾︎", "type": 0, "order": 4791, "group": 8, "subgroup": 90, "version": 11 }, { "label": "double exclamation mark", "hexcode": "203C", "tags": [ "!", "!!", "bangbang", "double", "exclamation", "mark", "punctuation" ], "emoji": "‼️", "text": "‼︎", "type": 0, "order": 4793, "group": 8, "subgroup": 91, "version": 0.6 }, { "label": "exclamation question mark", "hexcode": "2049", "tags": [ "!", "!?", "?", "exclamation", "interrobang", "mark", "punctuation", "question" ], "emoji": "⁉️", "text": "⁉︎", "type": 0, "order": 4795, "group": 8, "subgroup": 91, "version": 0.6 }, { "label": "red question mark", "hexcode": "2753", "tags": [ "?", "mark", "punctuation", "question", "red" ], "emoji": "❓️", "text": "❓︎", "type": 1, "order": 4796, "group": 8, "subgroup": 91, "version": 0.6 }, { "label": "white question mark", "hexcode": "2754", "tags": [ "?", "mark", "outlined", "punctuation", "question", "white" ], "emoji": "❔️", "text": "❔︎", "type": 1, "order": 4797, "group": 8, "subgroup": 91, "version": 0.6 }, { "label": "white exclamation mark", "hexcode": "2755", "tags": [ "!", "exclamation", "mark", "outlined", "punctuation", "white" ], "emoji": "❕️", "text": "❕︎", "type": 1, "order": 4798, "group": 8, "subgroup": 91, "version": 0.6 }, { "label": "red exclamation mark", "hexcode": "2757", "tags": [ "!", "exclamation", "mark", "punctuation", "red" ], "emoji": "❗️", "text": "❗︎", "type": 1, "order": 4799, "group": 8, "subgroup": 91, "version": 0.6 }, { "label": "wavy dash", "hexcode": "3030", "tags": [ "dash", "punctuation", "wavy" ], "emoji": "〰️", "text": "〰︎", "type": 0, "order": 4801, "group": 8, "subgroup": 91, "version": 0.6 }, { "label": "currency exchange", "hexcode": "1F4B1", "tags": [ "bank", "currency", "exchange", "money" ], "emoji": "💱", "text": "", "type": 1, "order": 4802, "group": 8, "subgroup": 92, "version": 0.6 }, { "label": "heavy dollar sign", "hexcode": "1F4B2", "tags": [ "billion", "cash", "charge", "currency", "dollar", "heavy", "million", "money", "pay", "sign" ], "emoji": "💲", "text": "", "type": 1, "order": 4803, "group": 8, "subgroup": 92, "version": 0.6 }, { "label": "medical symbol", "hexcode": "2695", "tags": [ "aesculapius", "medical", "medicine", "staff", "symbol" ], "emoji": "⚕️", "text": "⚕︎", "type": 0, "order": 4805, "group": 8, "subgroup": 93, "version": 4 }, { "label": "recycling symbol", "hexcode": "267B", "tags": [ "recycle", "recycling", "symbol" ], "emoji": "♻️", "text": "♻︎", "type": 0, "order": 4807, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "fleur-de-lis", "hexcode": "269C", "tags": [ "knights" ], "emoji": "⚜️", "text": "⚜︎", "type": 0, "order": 4809, "group": 8, "subgroup": 93, "version": 1 }, { "label": "trident emblem", "hexcode": "1F531", "tags": [ "anchor", "emblem", "poseidon", "ship", "tool", "trident" ], "emoji": "🔱", "text": "", "type": 1, "order": 4810, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "name badge", "hexcode": "1F4DB", "tags": [ "badge", "name" ], "emoji": "📛", "text": "", "type": 1, "order": 4811, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "Japanese symbol for beginner", "hexcode": "1F530", "tags": [ "beginner", "chevron", "green", "japanese", "leaf", "symbol", "tool", "yellow" ], "emoji": "🔰", "text": "", "type": 1, "order": 4812, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "hollow red circle", "hexcode": "2B55", "tags": [ "circle", "heavy", "hollow", "large", "o", "red" ], "emoji": "⭕️", "text": "⭕︎", "type": 1, "order": 4813, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "check mark button", "hexcode": "2705", "tags": [ "button", "check", "checked", "checkmark", "complete", "completed", "done", "fixed", "mark", "tick", "✓" ], "emoji": "✅️", "text": "✅︎", "type": 1, "order": 4814, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "check box with check", "hexcode": "2611", "tags": [ "ballot", "box", "check", "checked", "done", "off", "tick", "✓" ], "emoji": "☑️", "text": "☑︎", "type": 0, "order": 4816, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "check mark", "hexcode": "2714", "tags": [ "check", "checked", "checkmark", "done", "heavy", "mark", "tick", "✓" ], "emoji": "✔️", "text": "✔︎", "type": 0, "order": 4818, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "cross mark", "hexcode": "274C", "tags": [ "cancel", "cross", "mark", "multiplication", "multiply", "x", "×" ], "emoji": "❌️", "text": "❌︎", "type": 1, "order": 4819, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "cross mark button", "hexcode": "274E", "tags": [ "button", "cross", "mark", "multiplication", "multiply", "square", "x", "×" ], "emoji": "❎️", "text": "❎︎", "type": 1, "order": 4820, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "curly loop", "hexcode": "27B0", "tags": [ "curl", "curly", "loop" ], "emoji": "➰️", "text": "➰︎", "type": 1, "order": 4821, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "double curly loop", "hexcode": "27BF", "tags": [ "curl", "curly", "double", "loop" ], "emoji": "➿️", "text": "➿︎", "type": 1, "order": 4822, "group": 8, "subgroup": 93, "version": 1 }, { "label": "part alternation mark", "hexcode": "303D", "tags": [ "alternation", "mark", "part" ], "emoji": "〽️", "text": "〽︎", "type": 0, "order": 4824, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "eight-spoked asterisk", "hexcode": "2733", "tags": [ "*", "asterisk", "eight-spoked" ], "emoji": "✳️", "text": "✳︎", "type": 0, "order": 4826, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "eight-pointed star", "hexcode": "2734", "tags": [ "*", "eight-pointed", "star" ], "emoji": "✴️", "text": "✴︎", "type": 0, "order": 4828, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "sparkle", "hexcode": "2747", "tags": [ "*" ], "emoji": "❇️", "text": "❇︎", "type": 0, "order": 4830, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "copyright", "hexcode": "00A9", "tags": [ "c" ], "emoji": "©️", "text": "©︎", "type": 0, "order": 4832, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "registered", "hexcode": "00AE", "tags": [ "r" ], "emoji": "®️", "text": "®︎", "type": 0, "order": 4834, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "trade mark", "hexcode": "2122", "tags": [ "mark", "tm", "trade", "trademark" ], "emoji": "™️", "text": "™︎", "type": 0, "order": 4836, "group": 8, "subgroup": 93, "version": 0.6 }, { "label": "splatter", "hexcode": "1FADF", "tags": [ "drip", "holi", "ink", "liquid", "mess", "paint", "spill", "stain" ], "emoji": "🫟", "text": "", "type": 1, "order": 4837, "group": 8, "subgroup": 93, "version": 16 }, { "label": "keycap: #", "hexcode": "0023-FE0F-20E3", "tags": [ "keycap" ], "emoji": "#️⃣", "text": "", "type": 1, "order": 4838, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: *", "hexcode": "002A-FE0F-20E3", "tags": [ "keycap" ], "emoji": "*️⃣", "text": "", "type": 1, "order": 4840, "group": 8, "subgroup": 94, "version": 2 }, { "label": "keycap: 0", "hexcode": "0030-FE0F-20E3", "tags": [ "0", "keycap", "zero" ], "emoji": "0️⃣", "text": "", "type": 1, "order": 4842, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 1", "hexcode": "0031-FE0F-20E3", "tags": [ "1", "keycap", "one" ], "emoji": "1️⃣", "text": "", "type": 1, "order": 4844, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 2", "hexcode": "0032-FE0F-20E3", "tags": [ "2", "keycap", "two" ], "emoji": "2️⃣", "text": "", "type": 1, "order": 4846, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 3", "hexcode": "0033-FE0F-20E3", "tags": [ "3", "keycap", "three" ], "emoji": "3️⃣", "text": "", "type": 1, "order": 4848, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 4", "hexcode": "0034-FE0F-20E3", "tags": [ "4", "four", "keycap" ], "emoji": "4️⃣", "text": "", "type": 1, "order": 4850, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 5", "hexcode": "0035-FE0F-20E3", "tags": [ "5", "five", "keycap" ], "emoji": "5️⃣", "text": "", "type": 1, "order": 4852, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 6", "hexcode": "0036-FE0F-20E3", "tags": [ "6", "keycap", "six" ], "emoji": "6️⃣", "text": "", "type": 1, "order": 4854, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 7", "hexcode": "0037-FE0F-20E3", "tags": [ "7", "keycap", "seven" ], "emoji": "7️⃣", "text": "", "type": 1, "order": 4856, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 8", "hexcode": "0038-FE0F-20E3", "tags": [ "8", "eight", "keycap" ], "emoji": "8️⃣", "text": "", "type": 1, "order": 4858, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 9", "hexcode": "0039-FE0F-20E3", "tags": [ "9", "keycap", "nine" ], "emoji": "9️⃣", "text": "", "type": 1, "order": 4860, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "keycap: 10", "hexcode": "1F51F", "tags": [ "keycap" ], "emoji": "🔟", "text": "", "type": 1, "order": 4862, "group": 8, "subgroup": 94, "version": 0.6 }, { "label": "input latin uppercase", "hexcode": "1F520", "tags": [ "abcd", "input", "latin", "letters", "uppercase" ], "emoji": "🔠", "text": "", "type": 1, "order": 4863, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "input latin lowercase", "hexcode": "1F521", "tags": [ "abcd", "input", "latin", "letters", "lowercase" ], "emoji": "🔡", "text": "", "type": 1, "order": 4864, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "input numbers", "hexcode": "1F522", "tags": [ "1234", "input", "numbers" ], "emoji": "🔢", "text": "", "type": 1, "order": 4865, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "input symbols", "hexcode": "1F523", "tags": [ "%", "&", "input", "symbols", "♪", "〒" ], "emoji": "🔣", "text": "", "type": 1, "order": 4866, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "input latin letters", "hexcode": "1F524", "tags": [ "abc", "alphabet", "input", "latin", "letters" ], "emoji": "🔤", "text": "", "type": 1, "order": 4867, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "A button (blood type)", "hexcode": "1F170", "tags": [ "blood", "button", "type" ], "emoji": "🅰️", "text": "🅰︎", "type": 0, "order": 4869, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "AB button (blood type)", "hexcode": "1F18E", "tags": [ "ab", "blood", "button", "type" ], "emoji": "🆎", "text": "", "type": 1, "order": 4870, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "B button (blood type)", "hexcode": "1F171", "tags": [ "b", "blood", "button", "type" ], "emoji": "🅱️", "text": "🅱︎", "type": 0, "order": 4872, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "CL button", "hexcode": "1F191", "tags": [ "button", "cl" ], "emoji": "🆑", "text": "", "type": 1, "order": 4873, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "COOL button", "hexcode": "1F192", "tags": [ "button", "cool" ], "emoji": "🆒", "text": "", "type": 1, "order": 4874, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "FREE button", "hexcode": "1F193", "tags": [ "button", "free" ], "emoji": "🆓", "text": "", "type": 1, "order": 4875, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "information", "hexcode": "2139", "tags": [ "i" ], "emoji": "ℹ️", "text": "ℹ︎", "type": 0, "order": 4877, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "ID button", "hexcode": "1F194", "tags": [ "button", "id", "identity" ], "emoji": "🆔", "text": "", "type": 1, "order": 4878, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "circled M", "hexcode": "24C2", "tags": [ "circle", "circled", "m" ], "emoji": "Ⓜ️", "text": "Ⓜ︎", "type": 0, "order": 4880, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "NEW button", "hexcode": "1F195", "tags": [ "button", "new" ], "emoji": "🆕", "text": "", "type": 1, "order": 4881, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "NG button", "hexcode": "1F196", "tags": [ "button", "ng" ], "emoji": "🆖", "text": "", "type": 1, "order": 4882, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "O button (blood type)", "hexcode": "1F17E", "tags": [ "blood", "button", "o", "type" ], "emoji": "🅾️", "text": "🅾︎", "type": 0, "order": 4884, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "OK button", "hexcode": "1F197", "tags": [ "button", "ok", "okay" ], "emoji": "🆗", "text": "", "type": 1, "order": 4885, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "P button", "hexcode": "1F17F", "tags": [ "button", "p", "parking" ], "emoji": "🅿️", "text": "🅿︎", "type": 0, "order": 4887, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "SOS button", "hexcode": "1F198", "tags": [ "button", "help", "sos" ], "emoji": "🆘", "text": "", "type": 1, "order": 4888, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "UP! button", "hexcode": "1F199", "tags": [ "button", "mark", "up", "up!" ], "emoji": "🆙", "text": "", "type": 1, "order": 4889, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "VS button", "hexcode": "1F19A", "tags": [ "button", "versus", "vs" ], "emoji": "🆚", "text": "", "type": 1, "order": 4890, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “here” button", "hexcode": "1F201", "tags": [ "button", "here", "japanese", "katakana" ], "emoji": "🈁", "text": "", "type": 1, "order": 4891, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “service charge” button", "hexcode": "1F202", "tags": [ "button", "charge", "japanese", "katakana", "service" ], "emoji": "🈂️", "text": "🈂︎", "type": 0, "order": 4893, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “monthly amount” button", "hexcode": "1F237", "tags": [ "amount", "button", "ideograph", "japanese", "monthly" ], "emoji": "🈷️", "text": "🈷︎", "type": 0, "order": 4895, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “not free of charge” button", "hexcode": "1F236", "tags": [ "button", "charge", "free", "ideograph", "japanese", "not" ], "emoji": "🈶", "text": "", "type": 1, "order": 4896, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “reserved” button", "hexcode": "1F22F", "tags": [ "button", "ideograph", "japanese", "reserved" ], "emoji": "🈯️", "text": "🈯︎", "type": 1, "order": 4897, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “bargain” button", "hexcode": "1F250", "tags": [ "bargain", "button", "ideograph", "japanese" ], "emoji": "🉐", "text": "", "type": 1, "order": 4898, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “discount” button", "hexcode": "1F239", "tags": [ "button", "discount", "ideograph", "japanese" ], "emoji": "🈹", "text": "", "type": 1, "order": 4899, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “free of charge” button", "hexcode": "1F21A", "tags": [ "button", "charge", "free", "ideograph", "japanese" ], "emoji": "🈚️", "text": "🈚︎", "type": 1, "order": 4900, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “prohibited” button", "hexcode": "1F232", "tags": [ "button", "ideograph", "japanese", "prohibited" ], "emoji": "🈲", "text": "", "type": 1, "order": 4901, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “acceptable” button", "hexcode": "1F251", "tags": [ "acceptable", "button", "ideograph", "japanese" ], "emoji": "🉑", "text": "", "type": 1, "order": 4902, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “application” button", "hexcode": "1F238", "tags": [ "application", "button", "ideograph", "japanese" ], "emoji": "🈸", "text": "", "type": 1, "order": 4903, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “passing grade” button", "hexcode": "1F234", "tags": [ "button", "grade", "ideograph", "japanese", "passing" ], "emoji": "🈴", "text": "", "type": 1, "order": 4904, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “vacancy” button", "hexcode": "1F233", "tags": [ "button", "ideograph", "japanese", "vacancy" ], "emoji": "🈳", "text": "", "type": 1, "order": 4905, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “congratulations” button", "hexcode": "3297", "tags": [ "button", "congratulations", "ideograph", "japanese" ], "emoji": "㊗️", "text": "㊗︎", "type": 0, "order": 4907, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “secret” button", "hexcode": "3299", "tags": [ "button", "ideograph", "japanese", "secret" ], "emoji": "㊙️", "text": "㊙︎", "type": 0, "order": 4909, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “open for business” button", "hexcode": "1F23A", "tags": [ "business", "button", "ideograph", "japanese", "open" ], "emoji": "🈺", "text": "", "type": 1, "order": 4910, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "Japanese “no vacancy” button", "hexcode": "1F235", "tags": [ "button", "ideograph", "japanese", "no", "vacancy" ], "emoji": "🈵", "text": "", "type": 1, "order": 4911, "group": 8, "subgroup": 95, "version": 0.6 }, { "label": "red circle", "hexcode": "1F534", "tags": [ "circle", "geometric", "red" ], "emoji": "🔴", "text": "", "type": 1, "order": 4912, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "orange circle", "hexcode": "1F7E0", "tags": [ "circle", "orange" ], "emoji": "🟠", "text": "", "type": 1, "order": 4913, "group": 8, "subgroup": 96, "version": 12 }, { "label": "yellow circle", "hexcode": "1F7E1", "tags": [ "circle", "yellow" ], "emoji": "🟡", "text": "", "type": 1, "order": 4914, "group": 8, "subgroup": 96, "version": 12 }, { "label": "green circle", "hexcode": "1F7E2", "tags": [ "circle", "green" ], "emoji": "🟢", "text": "", "type": 1, "order": 4915, "group": 8, "subgroup": 96, "version": 12 }, { "label": "blue circle", "hexcode": "1F535", "tags": [ "blue", "circle", "geometric" ], "emoji": "🔵", "text": "", "type": 1, "order": 4916, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "purple circle", "hexcode": "1F7E3", "tags": [ "circle", "purple" ], "emoji": "🟣", "text": "", "type": 1, "order": 4917, "group": 8, "subgroup": 96, "version": 12 }, { "label": "brown circle", "hexcode": "1F7E4", "tags": [ "brown", "circle" ], "emoji": "🟤", "text": "", "type": 1, "order": 4918, "group": 8, "subgroup": 96, "version": 12 }, { "label": "black circle", "hexcode": "26AB", "tags": [ "black", "circle", "geometric" ], "emoji": "⚫️", "text": "⚫︎", "type": 1, "order": 4919, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "white circle", "hexcode": "26AA", "tags": [ "circle", "geometric", "white" ], "emoji": "⚪️", "text": "⚪︎", "type": 1, "order": 4920, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "red square", "hexcode": "1F7E5", "tags": [ "card", "penalty", "red", "square" ], "emoji": "🟥", "text": "", "type": 1, "order": 4921, "group": 8, "subgroup": 96, "version": 12 }, { "label": "orange square", "hexcode": "1F7E7", "tags": [ "orange", "square" ], "emoji": "🟧", "text": "", "type": 1, "order": 4922, "group": 8, "subgroup": 96, "version": 12 }, { "label": "yellow square", "hexcode": "1F7E8", "tags": [ "card", "penalty", "square", "yellow" ], "emoji": "🟨", "text": "", "type": 1, "order": 4923, "group": 8, "subgroup": 96, "version": 12 }, { "label": "green square", "hexcode": "1F7E9", "tags": [ "green", "square" ], "emoji": "🟩", "text": "", "type": 1, "order": 4924, "group": 8, "subgroup": 96, "version": 12 }, { "label": "blue square", "hexcode": "1F7E6", "tags": [ "blue", "square" ], "emoji": "🟦", "text": "", "type": 1, "order": 4925, "group": 8, "subgroup": 96, "version": 12 }, { "label": "purple square", "hexcode": "1F7EA", "tags": [ "purple", "square" ], "emoji": "🟪", "text": "", "type": 1, "order": 4926, "group": 8, "subgroup": 96, "version": 12 }, { "label": "brown square", "hexcode": "1F7EB", "tags": [ "brown", "square" ], "emoji": "🟫", "text": "", "type": 1, "order": 4927, "group": 8, "subgroup": 96, "version": 12 }, { "label": "black large square", "hexcode": "2B1B", "tags": [ "black", "geometric", "large", "square" ], "emoji": "⬛️", "text": "⬛︎", "type": 1, "order": 4928, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "white large square", "hexcode": "2B1C", "tags": [ "geometric", "large", "square", "white" ], "emoji": "⬜️", "text": "⬜︎", "type": 1, "order": 4929, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "black medium square", "hexcode": "25FC", "tags": [ "black", "geometric", "medium", "square" ], "emoji": "◼️", "text": "◼︎", "type": 0, "order": 4931, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "white medium square", "hexcode": "25FB", "tags": [ "geometric", "medium", "square", "white" ], "emoji": "◻️", "text": "◻︎", "type": 0, "order": 4933, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "black medium-small square", "hexcode": "25FE", "tags": [ "black", "geometric", "medium-small", "square" ], "emoji": "◾️", "text": "◾︎", "type": 1, "order": 4934, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "white medium-small square", "hexcode": "25FD", "tags": [ "geometric", "medium-small", "square", "white" ], "emoji": "◽️", "text": "◽︎", "type": 1, "order": 4935, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "black small square", "hexcode": "25AA", "tags": [ "black", "geometric", "small", "square" ], "emoji": "▪️", "text": "▪︎", "type": 0, "order": 4937, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "white small square", "hexcode": "25AB", "tags": [ "geometric", "small", "square", "white" ], "emoji": "▫️", "text": "▫︎", "type": 0, "order": 4939, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "large orange diamond", "hexcode": "1F536", "tags": [ "diamond", "geometric", "large", "orange" ], "emoji": "🔶", "text": "", "type": 1, "order": 4940, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "large blue diamond", "hexcode": "1F537", "tags": [ "blue", "diamond", "geometric", "large" ], "emoji": "🔷", "text": "", "type": 1, "order": 4941, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "small orange diamond", "hexcode": "1F538", "tags": [ "diamond", "geometric", "orange", "small" ], "emoji": "🔸", "text": "", "type": 1, "order": 4942, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "small blue diamond", "hexcode": "1F539", "tags": [ "blue", "diamond", "geometric", "small" ], "emoji": "🔹", "text": "", "type": 1, "order": 4943, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "red triangle pointed up", "hexcode": "1F53A", "tags": [ "geometric", "pointed", "red", "triangle", "up" ], "emoji": "🔺", "text": "", "type": 1, "order": 4944, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "red triangle pointed down", "hexcode": "1F53B", "tags": [ "down", "geometric", "pointed", "red", "triangle" ], "emoji": "🔻", "text": "", "type": 1, "order": 4945, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "diamond with a dot", "hexcode": "1F4A0", "tags": [ "comic", "diamond", "dot", "geometric" ], "emoji": "💠", "text": "", "type": 1, "order": 4946, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "radio button", "hexcode": "1F518", "tags": [ "button", "geometric", "radio" ], "emoji": "🔘", "text": "", "type": 1, "order": 4947, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "white square button", "hexcode": "1F533", "tags": [ "button", "geometric", "outlined", "square", "white" ], "emoji": "🔳", "text": "", "type": 1, "order": 4948, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "black square button", "hexcode": "1F532", "tags": [ "black", "button", "geometric", "square" ], "emoji": "🔲", "text": "", "type": 1, "order": 4949, "group": 8, "subgroup": 96, "version": 0.6 }, { "label": "chequered flag", "hexcode": "1F3C1", "tags": [ "checkered", "chequered", "finish", "flag", "flags", "game", "race", "racing", "sport", "win" ], "emoji": "🏁", "text": "", "type": 1, "order": 4950, "group": 9, "subgroup": 97, "version": 0.6 }, { "label": "triangular flag", "hexcode": "1F6A9", "tags": [ "construction", "flag", "golf", "post", "triangular" ], "emoji": "🚩", "text": "", "type": 1, "order": 4951, "group": 9, "subgroup": 97, "version": 0.6 }, { "label": "crossed flags", "hexcode": "1F38C", "tags": [ "celebration", "cross", "crossed", "flags", "japanese" ], "emoji": "🎌", "text": "", "type": 1, "order": 4952, "group": 9, "subgroup": 97, "version": 0.6 }, { "label": "black flag", "hexcode": "1F3F4", "tags": [ "black", "flag", "waving" ], "emoji": "🏴", "text": "", "type": 1, "order": 4953, "group": 9, "subgroup": 97, "version": 1 }, { "label": "white flag", "hexcode": "1F3F3", "tags": [ "flag", "waving", "white" ], "emoji": "🏳️", "text": "🏳︎", "type": 0, "order": 4955, "group": 9, "subgroup": 97, "version": 0.7 }, { "label": "rainbow flag", "hexcode": "1F3F3-FE0F-200D-1F308", "tags": [ "bisexual", "flag", "gay", "genderqueer", "glbt", "glbtq", "lesbian", "lgbt", "lgbtq", "lgbtqia", "pride", "queer", "rainbow", "trans", "transgender" ], "emoji": "🏳️‍🌈", "text": "", "type": 1, "order": 4956, "group": 9, "subgroup": 97, "version": 4 }, { "label": "transgender flag", "hexcode": "1F3F3-FE0F-200D-26A7-FE0F", "tags": [ "blue", "flag", "light", "pink", "transgender", "white" ], "emoji": "🏳️‍⚧️", "text": "", "type": 1, "order": 4958, "group": 9, "subgroup": 97, "version": 13 }, { "label": "pirate flag", "hexcode": "1F3F4-200D-2620-FE0F", "tags": [ "flag", "jolly", "pirate", "plunder", "roger", "treasure" ], "emoji": "🏴‍☠️", "text": "", "type": 1, "order": 4962, "group": 9, "subgroup": 97, "version": 11 }, { "label": "flag: Ascension Island", "hexcode": "1F1E6-1F1E8", "tags": [ "AC", "flag" ], "emoji": "🇦🇨", "text": "", "type": 1, "order": 4964, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Andorra", "hexcode": "1F1E6-1F1E9", "tags": [ "AD", "flag" ], "emoji": "🇦🇩", "text": "", "type": 1, "order": 4965, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: United Arab Emirates", "hexcode": "1F1E6-1F1EA", "tags": [ "AE", "flag" ], "emoji": "🇦🇪", "text": "", "type": 1, "order": 4966, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Afghanistan", "hexcode": "1F1E6-1F1EB", "tags": [ "AF", "flag" ], "emoji": "🇦🇫", "text": "", "type": 1, "order": 4967, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Antigua & Barbuda", "hexcode": "1F1E6-1F1EC", "tags": [ "AG", "flag" ], "emoji": "🇦🇬", "text": "", "type": 1, "order": 4968, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Anguilla", "hexcode": "1F1E6-1F1EE", "tags": [ "AI", "flag" ], "emoji": "🇦🇮", "text": "", "type": 1, "order": 4969, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Albania", "hexcode": "1F1E6-1F1F1", "tags": [ "AL", "flag" ], "emoji": "🇦🇱", "text": "", "type": 1, "order": 4970, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Armenia", "hexcode": "1F1E6-1F1F2", "tags": [ "AM", "flag" ], "emoji": "🇦🇲", "text": "", "type": 1, "order": 4971, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Angola", "hexcode": "1F1E6-1F1F4", "tags": [ "AO", "flag" ], "emoji": "🇦🇴", "text": "", "type": 1, "order": 4972, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Antarctica", "hexcode": "1F1E6-1F1F6", "tags": [ "AQ", "flag" ], "emoji": "🇦🇶", "text": "", "type": 1, "order": 4973, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Argentina", "hexcode": "1F1E6-1F1F7", "tags": [ "AR", "flag" ], "emoji": "🇦🇷", "text": "", "type": 1, "order": 4974, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: American Samoa", "hexcode": "1F1E6-1F1F8", "tags": [ "AS", "flag" ], "emoji": "🇦🇸", "text": "", "type": 1, "order": 4975, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Austria", "hexcode": "1F1E6-1F1F9", "tags": [ "AT", "flag" ], "emoji": "🇦🇹", "text": "", "type": 1, "order": 4976, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Australia", "hexcode": "1F1E6-1F1FA", "tags": [ "AU", "flag" ], "emoji": "🇦🇺", "text": "", "type": 1, "order": 4977, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Aruba", "hexcode": "1F1E6-1F1FC", "tags": [ "AW", "flag" ], "emoji": "🇦🇼", "text": "", "type": 1, "order": 4978, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Åland Islands", "hexcode": "1F1E6-1F1FD", "tags": [ "AX", "flag" ], "emoji": "🇦🇽", "text": "", "type": 1, "order": 4979, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Azerbaijan", "hexcode": "1F1E6-1F1FF", "tags": [ "AZ", "flag" ], "emoji": "🇦🇿", "text": "", "type": 1, "order": 4980, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bosnia & Herzegovina", "hexcode": "1F1E7-1F1E6", "tags": [ "BA", "flag" ], "emoji": "🇧🇦", "text": "", "type": 1, "order": 4981, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Barbados", "hexcode": "1F1E7-1F1E7", "tags": [ "BB", "flag" ], "emoji": "🇧🇧", "text": "", "type": 1, "order": 4982, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bangladesh", "hexcode": "1F1E7-1F1E9", "tags": [ "BD", "flag" ], "emoji": "🇧🇩", "text": "", "type": 1, "order": 4983, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Belgium", "hexcode": "1F1E7-1F1EA", "tags": [ "BE", "flag" ], "emoji": "🇧🇪", "text": "", "type": 1, "order": 4984, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Burkina Faso", "hexcode": "1F1E7-1F1EB", "tags": [ "BF", "flag" ], "emoji": "🇧🇫", "text": "", "type": 1, "order": 4985, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bulgaria", "hexcode": "1F1E7-1F1EC", "tags": [ "BG", "flag" ], "emoji": "🇧🇬", "text": "", "type": 1, "order": 4986, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bahrain", "hexcode": "1F1E7-1F1ED", "tags": [ "BH", "flag" ], "emoji": "🇧🇭", "text": "", "type": 1, "order": 4987, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Burundi", "hexcode": "1F1E7-1F1EE", "tags": [ "BI", "flag" ], "emoji": "🇧🇮", "text": "", "type": 1, "order": 4988, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Benin", "hexcode": "1F1E7-1F1EF", "tags": [ "BJ", "flag" ], "emoji": "🇧🇯", "text": "", "type": 1, "order": 4989, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: St. Barthélemy", "hexcode": "1F1E7-1F1F1", "tags": [ "BL", "flag" ], "emoji": "🇧🇱", "text": "", "type": 1, "order": 4990, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bermuda", "hexcode": "1F1E7-1F1F2", "tags": [ "BM", "flag" ], "emoji": "🇧🇲", "text": "", "type": 1, "order": 4991, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Brunei", "hexcode": "1F1E7-1F1F3", "tags": [ "BN", "flag" ], "emoji": "🇧🇳", "text": "", "type": 1, "order": 4992, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bolivia", "hexcode": "1F1E7-1F1F4", "tags": [ "BO", "flag" ], "emoji": "🇧🇴", "text": "", "type": 1, "order": 4993, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Caribbean Netherlands", "hexcode": "1F1E7-1F1F6", "tags": [ "BQ", "flag" ], "emoji": "🇧🇶", "text": "", "type": 1, "order": 4994, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Brazil", "hexcode": "1F1E7-1F1F7", "tags": [ "BR", "flag" ], "emoji": "🇧🇷", "text": "", "type": 1, "order": 4995, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bahamas", "hexcode": "1F1E7-1F1F8", "tags": [ "BS", "flag" ], "emoji": "🇧🇸", "text": "", "type": 1, "order": 4996, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bhutan", "hexcode": "1F1E7-1F1F9", "tags": [ "BT", "flag" ], "emoji": "🇧🇹", "text": "", "type": 1, "order": 4997, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Bouvet Island", "hexcode": "1F1E7-1F1FB", "tags": [ "BV", "flag" ], "emoji": "🇧🇻", "text": "", "type": 1, "order": 4998, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Botswana", "hexcode": "1F1E7-1F1FC", "tags": [ "BW", "flag" ], "emoji": "🇧🇼", "text": "", "type": 1, "order": 4999, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Belarus", "hexcode": "1F1E7-1F1FE", "tags": [ "BY", "flag" ], "emoji": "🇧🇾", "text": "", "type": 1, "order": 5000, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Belize", "hexcode": "1F1E7-1F1FF", "tags": [ "BZ", "flag" ], "emoji": "🇧🇿", "text": "", "type": 1, "order": 5001, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Canada", "hexcode": "1F1E8-1F1E6", "tags": [ "CA", "flag" ], "emoji": "🇨🇦", "text": "", "type": 1, "order": 5002, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Cocos (Keeling) Islands", "hexcode": "1F1E8-1F1E8", "tags": [ "CC", "flag" ], "emoji": "🇨🇨", "text": "", "type": 1, "order": 5003, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Congo - Kinshasa", "hexcode": "1F1E8-1F1E9", "tags": [ "CD", "flag" ], "emoji": "🇨🇩", "text": "", "type": 1, "order": 5004, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Central African Republic", "hexcode": "1F1E8-1F1EB", "tags": [ "CF", "flag" ], "emoji": "🇨🇫", "text": "", "type": 1, "order": 5005, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Congo - Brazzaville", "hexcode": "1F1E8-1F1EC", "tags": [ "CG", "flag" ], "emoji": "🇨🇬", "text": "", "type": 1, "order": 5006, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Switzerland", "hexcode": "1F1E8-1F1ED", "tags": [ "CH", "flag" ], "emoji": "🇨🇭", "text": "", "type": 1, "order": 5007, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Côte d’Ivoire", "hexcode": "1F1E8-1F1EE", "tags": [ "CI", "flag" ], "emoji": "🇨🇮", "text": "", "type": 1, "order": 5008, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Cook Islands", "hexcode": "1F1E8-1F1F0", "tags": [ "CK", "flag" ], "emoji": "🇨🇰", "text": "", "type": 1, "order": 5009, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Chile", "hexcode": "1F1E8-1F1F1", "tags": [ "CL", "flag" ], "emoji": "🇨🇱", "text": "", "type": 1, "order": 5010, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Cameroon", "hexcode": "1F1E8-1F1F2", "tags": [ "CM", "flag" ], "emoji": "🇨🇲", "text": "", "type": 1, "order": 5011, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: China", "hexcode": "1F1E8-1F1F3", "tags": [ "CN", "flag" ], "emoji": "🇨🇳", "text": "", "type": 1, "order": 5012, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Colombia", "hexcode": "1F1E8-1F1F4", "tags": [ "CO", "flag" ], "emoji": "🇨🇴", "text": "", "type": 1, "order": 5013, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Clipperton Island", "hexcode": "1F1E8-1F1F5", "tags": [ "CP", "flag" ], "emoji": "🇨🇵", "text": "", "type": 1, "order": 5014, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Sark", "hexcode": "1F1E8-1F1F6", "tags": [ "CQ", "flag" ], "emoji": "🇨🇶", "text": "", "type": 1, "order": 5015, "group": 9, "subgroup": 98, "version": 16 }, { "label": "flag: Costa Rica", "hexcode": "1F1E8-1F1F7", "tags": [ "CR", "flag" ], "emoji": "🇨🇷", "text": "", "type": 1, "order": 5016, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Cuba", "hexcode": "1F1E8-1F1FA", "tags": [ "CU", "flag" ], "emoji": "🇨🇺", "text": "", "type": 1, "order": 5017, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Cape Verde", "hexcode": "1F1E8-1F1FB", "tags": [ "CV", "flag" ], "emoji": "🇨🇻", "text": "", "type": 1, "order": 5018, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Curaçao", "hexcode": "1F1E8-1F1FC", "tags": [ "CW", "flag" ], "emoji": "🇨🇼", "text": "", "type": 1, "order": 5019, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Christmas Island", "hexcode": "1F1E8-1F1FD", "tags": [ "CX", "flag" ], "emoji": "🇨🇽", "text": "", "type": 1, "order": 5020, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Cyprus", "hexcode": "1F1E8-1F1FE", "tags": [ "CY", "flag" ], "emoji": "🇨🇾", "text": "", "type": 1, "order": 5021, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Czechia", "hexcode": "1F1E8-1F1FF", "tags": [ "CZ", "flag" ], "emoji": "🇨🇿", "text": "", "type": 1, "order": 5022, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Germany", "hexcode": "1F1E9-1F1EA", "tags": [ "DE", "flag" ], "emoji": "🇩🇪", "text": "", "type": 1, "order": 5023, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Diego Garcia", "hexcode": "1F1E9-1F1EC", "tags": [ "DG", "flag" ], "emoji": "🇩🇬", "text": "", "type": 1, "order": 5024, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Djibouti", "hexcode": "1F1E9-1F1EF", "tags": [ "DJ", "flag" ], "emoji": "🇩🇯", "text": "", "type": 1, "order": 5025, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Denmark", "hexcode": "1F1E9-1F1F0", "tags": [ "DK", "flag" ], "emoji": "🇩🇰", "text": "", "type": 1, "order": 5026, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Dominica", "hexcode": "1F1E9-1F1F2", "tags": [ "DM", "flag" ], "emoji": "🇩🇲", "text": "", "type": 1, "order": 5027, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Dominican Republic", "hexcode": "1F1E9-1F1F4", "tags": [ "DO", "flag" ], "emoji": "🇩🇴", "text": "", "type": 1, "order": 5028, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Algeria", "hexcode": "1F1E9-1F1FF", "tags": [ "DZ", "flag" ], "emoji": "🇩🇿", "text": "", "type": 1, "order": 5029, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Ceuta & Melilla", "hexcode": "1F1EA-1F1E6", "tags": [ "EA", "flag" ], "emoji": "🇪🇦", "text": "", "type": 1, "order": 5030, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Ecuador", "hexcode": "1F1EA-1F1E8", "tags": [ "EC", "flag" ], "emoji": "🇪🇨", "text": "", "type": 1, "order": 5031, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Estonia", "hexcode": "1F1EA-1F1EA", "tags": [ "EE", "flag" ], "emoji": "🇪🇪", "text": "", "type": 1, "order": 5032, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Egypt", "hexcode": "1F1EA-1F1EC", "tags": [ "EG", "flag" ], "emoji": "🇪🇬", "text": "", "type": 1, "order": 5033, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Western Sahara", "hexcode": "1F1EA-1F1ED", "tags": [ "EH", "flag" ], "emoji": "🇪🇭", "text": "", "type": 1, "order": 5034, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Eritrea", "hexcode": "1F1EA-1F1F7", "tags": [ "ER", "flag" ], "emoji": "🇪🇷", "text": "", "type": 1, "order": 5035, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Spain", "hexcode": "1F1EA-1F1F8", "tags": [ "ES", "flag" ], "emoji": "🇪🇸", "text": "", "type": 1, "order": 5036, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Ethiopia", "hexcode": "1F1EA-1F1F9", "tags": [ "ET", "flag" ], "emoji": "🇪🇹", "text": "", "type": 1, "order": 5037, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: European Union", "hexcode": "1F1EA-1F1FA", "tags": [ "EU", "flag" ], "emoji": "🇪🇺", "text": "", "type": 1, "order": 5038, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Finland", "hexcode": "1F1EB-1F1EE", "tags": [ "FI", "flag" ], "emoji": "🇫🇮", "text": "", "type": 1, "order": 5039, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Fiji", "hexcode": "1F1EB-1F1EF", "tags": [ "FJ", "flag" ], "emoji": "🇫🇯", "text": "", "type": 1, "order": 5040, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Falkland Islands", "hexcode": "1F1EB-1F1F0", "tags": [ "FK", "flag" ], "emoji": "🇫🇰", "text": "", "type": 1, "order": 5041, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Micronesia", "hexcode": "1F1EB-1F1F2", "tags": [ "FM", "flag" ], "emoji": "🇫🇲", "text": "", "type": 1, "order": 5042, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Faroe Islands", "hexcode": "1F1EB-1F1F4", "tags": [ "FO", "flag" ], "emoji": "🇫🇴", "text": "", "type": 1, "order": 5043, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: France", "hexcode": "1F1EB-1F1F7", "tags": [ "FR", "flag" ], "emoji": "🇫🇷", "text": "", "type": 1, "order": 5044, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Gabon", "hexcode": "1F1EC-1F1E6", "tags": [ "GA", "flag" ], "emoji": "🇬🇦", "text": "", "type": 1, "order": 5045, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: United Kingdom", "hexcode": "1F1EC-1F1E7", "tags": [ "GB", "flag" ], "emoji": "🇬🇧", "text": "", "type": 1, "order": 5046, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Grenada", "hexcode": "1F1EC-1F1E9", "tags": [ "GD", "flag" ], "emoji": "🇬🇩", "text": "", "type": 1, "order": 5047, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Georgia", "hexcode": "1F1EC-1F1EA", "tags": [ "GE", "flag" ], "emoji": "🇬🇪", "text": "", "type": 1, "order": 5048, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: French Guiana", "hexcode": "1F1EC-1F1EB", "tags": [ "GF", "flag" ], "emoji": "🇬🇫", "text": "", "type": 1, "order": 5049, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Guernsey", "hexcode": "1F1EC-1F1EC", "tags": [ "GG", "flag" ], "emoji": "🇬🇬", "text": "", "type": 1, "order": 5050, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Ghana", "hexcode": "1F1EC-1F1ED", "tags": [ "GH", "flag" ], "emoji": "🇬🇭", "text": "", "type": 1, "order": 5051, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Gibraltar", "hexcode": "1F1EC-1F1EE", "tags": [ "GI", "flag" ], "emoji": "🇬🇮", "text": "", "type": 1, "order": 5052, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Greenland", "hexcode": "1F1EC-1F1F1", "tags": [ "GL", "flag" ], "emoji": "🇬🇱", "text": "", "type": 1, "order": 5053, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Gambia", "hexcode": "1F1EC-1F1F2", "tags": [ "GM", "flag" ], "emoji": "🇬🇲", "text": "", "type": 1, "order": 5054, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Guinea", "hexcode": "1F1EC-1F1F3", "tags": [ "GN", "flag" ], "emoji": "🇬🇳", "text": "", "type": 1, "order": 5055, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Guadeloupe", "hexcode": "1F1EC-1F1F5", "tags": [ "GP", "flag" ], "emoji": "🇬🇵", "text": "", "type": 1, "order": 5056, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Equatorial Guinea", "hexcode": "1F1EC-1F1F6", "tags": [ "GQ", "flag" ], "emoji": "🇬🇶", "text": "", "type": 1, "order": 5057, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Greece", "hexcode": "1F1EC-1F1F7", "tags": [ "GR", "flag" ], "emoji": "🇬🇷", "text": "", "type": 1, "order": 5058, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: South Georgia & South Sandwich Islands", "hexcode": "1F1EC-1F1F8", "tags": [ "GS", "flag" ], "emoji": "🇬🇸", "text": "", "type": 1, "order": 5059, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Guatemala", "hexcode": "1F1EC-1F1F9", "tags": [ "GT", "flag" ], "emoji": "🇬🇹", "text": "", "type": 1, "order": 5060, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Guam", "hexcode": "1F1EC-1F1FA", "tags": [ "GU", "flag" ], "emoji": "🇬🇺", "text": "", "type": 1, "order": 5061, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Guinea-Bissau", "hexcode": "1F1EC-1F1FC", "tags": [ "GW", "flag" ], "emoji": "🇬🇼", "text": "", "type": 1, "order": 5062, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Guyana", "hexcode": "1F1EC-1F1FE", "tags": [ "GY", "flag" ], "emoji": "🇬🇾", "text": "", "type": 1, "order": 5063, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Hong Kong SAR China", "hexcode": "1F1ED-1F1F0", "tags": [ "HK", "flag" ], "emoji": "🇭🇰", "text": "", "type": 1, "order": 5064, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Heard & McDonald Islands", "hexcode": "1F1ED-1F1F2", "tags": [ "HM", "flag" ], "emoji": "🇭🇲", "text": "", "type": 1, "order": 5065, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Honduras", "hexcode": "1F1ED-1F1F3", "tags": [ "HN", "flag" ], "emoji": "🇭🇳", "text": "", "type": 1, "order": 5066, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Croatia", "hexcode": "1F1ED-1F1F7", "tags": [ "HR", "flag" ], "emoji": "🇭🇷", "text": "", "type": 1, "order": 5067, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Haiti", "hexcode": "1F1ED-1F1F9", "tags": [ "HT", "flag" ], "emoji": "🇭🇹", "text": "", "type": 1, "order": 5068, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Hungary", "hexcode": "1F1ED-1F1FA", "tags": [ "HU", "flag" ], "emoji": "🇭🇺", "text": "", "type": 1, "order": 5069, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Canary Islands", "hexcode": "1F1EE-1F1E8", "tags": [ "IC", "flag" ], "emoji": "🇮🇨", "text": "", "type": 1, "order": 5070, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Indonesia", "hexcode": "1F1EE-1F1E9", "tags": [ "ID", "flag" ], "emoji": "🇮🇩", "text": "", "type": 1, "order": 5071, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Ireland", "hexcode": "1F1EE-1F1EA", "tags": [ "IE", "flag" ], "emoji": "🇮🇪", "text": "", "type": 1, "order": 5072, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Israel", "hexcode": "1F1EE-1F1F1", "tags": [ "IL", "flag" ], "emoji": "🇮🇱", "text": "", "type": 1, "order": 5073, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Isle of Man", "hexcode": "1F1EE-1F1F2", "tags": [ "IM", "flag" ], "emoji": "🇮🇲", "text": "", "type": 1, "order": 5074, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: India", "hexcode": "1F1EE-1F1F3", "tags": [ "IN", "flag" ], "emoji": "🇮🇳", "text": "", "type": 1, "order": 5075, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: British Indian Ocean Territory", "hexcode": "1F1EE-1F1F4", "tags": [ "IO", "flag" ], "emoji": "🇮🇴", "text": "", "type": 1, "order": 5076, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Iraq", "hexcode": "1F1EE-1F1F6", "tags": [ "IQ", "flag" ], "emoji": "🇮🇶", "text": "", "type": 1, "order": 5077, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Iran", "hexcode": "1F1EE-1F1F7", "tags": [ "IR", "flag" ], "emoji": "🇮🇷", "text": "", "type": 1, "order": 5078, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Iceland", "hexcode": "1F1EE-1F1F8", "tags": [ "IS", "flag" ], "emoji": "🇮🇸", "text": "", "type": 1, "order": 5079, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Italy", "hexcode": "1F1EE-1F1F9", "tags": [ "IT", "flag" ], "emoji": "🇮🇹", "text": "", "type": 1, "order": 5080, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Jersey", "hexcode": "1F1EF-1F1EA", "tags": [ "JE", "flag" ], "emoji": "🇯🇪", "text": "", "type": 1, "order": 5081, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Jamaica", "hexcode": "1F1EF-1F1F2", "tags": [ "JM", "flag" ], "emoji": "🇯🇲", "text": "", "type": 1, "order": 5082, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Jordan", "hexcode": "1F1EF-1F1F4", "tags": [ "JO", "flag" ], "emoji": "🇯🇴", "text": "", "type": 1, "order": 5083, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Japan", "hexcode": "1F1EF-1F1F5", "tags": [ "JP", "flag" ], "emoji": "🇯🇵", "text": "", "type": 1, "order": 5084, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Kenya", "hexcode": "1F1F0-1F1EA", "tags": [ "KE", "flag" ], "emoji": "🇰🇪", "text": "", "type": 1, "order": 5085, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Kyrgyzstan", "hexcode": "1F1F0-1F1EC", "tags": [ "KG", "flag" ], "emoji": "🇰🇬", "text": "", "type": 1, "order": 5086, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Cambodia", "hexcode": "1F1F0-1F1ED", "tags": [ "KH", "flag" ], "emoji": "🇰🇭", "text": "", "type": 1, "order": 5087, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Kiribati", "hexcode": "1F1F0-1F1EE", "tags": [ "KI", "flag" ], "emoji": "🇰🇮", "text": "", "type": 1, "order": 5088, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Comoros", "hexcode": "1F1F0-1F1F2", "tags": [ "KM", "flag" ], "emoji": "🇰🇲", "text": "", "type": 1, "order": 5089, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: St. Kitts & Nevis", "hexcode": "1F1F0-1F1F3", "tags": [ "KN", "flag" ], "emoji": "🇰🇳", "text": "", "type": 1, "order": 5090, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: North Korea", "hexcode": "1F1F0-1F1F5", "tags": [ "KP", "flag" ], "emoji": "🇰🇵", "text": "", "type": 1, "order": 5091, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: South Korea", "hexcode": "1F1F0-1F1F7", "tags": [ "KR", "flag" ], "emoji": "🇰🇷", "text": "", "type": 1, "order": 5092, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Kuwait", "hexcode": "1F1F0-1F1FC", "tags": [ "KW", "flag" ], "emoji": "🇰🇼", "text": "", "type": 1, "order": 5093, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Cayman Islands", "hexcode": "1F1F0-1F1FE", "tags": [ "KY", "flag" ], "emoji": "🇰🇾", "text": "", "type": 1, "order": 5094, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Kazakhstan", "hexcode": "1F1F0-1F1FF", "tags": [ "KZ", "flag" ], "emoji": "🇰🇿", "text": "", "type": 1, "order": 5095, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Laos", "hexcode": "1F1F1-1F1E6", "tags": [ "LA", "flag" ], "emoji": "🇱🇦", "text": "", "type": 1, "order": 5096, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Lebanon", "hexcode": "1F1F1-1F1E7", "tags": [ "LB", "flag" ], "emoji": "🇱🇧", "text": "", "type": 1, "order": 5097, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: St. Lucia", "hexcode": "1F1F1-1F1E8", "tags": [ "LC", "flag" ], "emoji": "🇱🇨", "text": "", "type": 1, "order": 5098, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Liechtenstein", "hexcode": "1F1F1-1F1EE", "tags": [ "LI", "flag" ], "emoji": "🇱🇮", "text": "", "type": 1, "order": 5099, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Sri Lanka", "hexcode": "1F1F1-1F1F0", "tags": [ "LK", "flag" ], "emoji": "🇱🇰", "text": "", "type": 1, "order": 5100, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Liberia", "hexcode": "1F1F1-1F1F7", "tags": [ "LR", "flag" ], "emoji": "🇱🇷", "text": "", "type": 1, "order": 5101, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Lesotho", "hexcode": "1F1F1-1F1F8", "tags": [ "LS", "flag" ], "emoji": "🇱🇸", "text": "", "type": 1, "order": 5102, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Lithuania", "hexcode": "1F1F1-1F1F9", "tags": [ "LT", "flag" ], "emoji": "🇱🇹", "text": "", "type": 1, "order": 5103, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Luxembourg", "hexcode": "1F1F1-1F1FA", "tags": [ "LU", "flag" ], "emoji": "🇱🇺", "text": "", "type": 1, "order": 5104, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Latvia", "hexcode": "1F1F1-1F1FB", "tags": [ "LV", "flag" ], "emoji": "🇱🇻", "text": "", "type": 1, "order": 5105, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Libya", "hexcode": "1F1F1-1F1FE", "tags": [ "LY", "flag" ], "emoji": "🇱🇾", "text": "", "type": 1, "order": 5106, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Morocco", "hexcode": "1F1F2-1F1E6", "tags": [ "MA", "flag" ], "emoji": "🇲🇦", "text": "", "type": 1, "order": 5107, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Monaco", "hexcode": "1F1F2-1F1E8", "tags": [ "MC", "flag" ], "emoji": "🇲🇨", "text": "", "type": 1, "order": 5108, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Moldova", "hexcode": "1F1F2-1F1E9", "tags": [ "MD", "flag" ], "emoji": "🇲🇩", "text": "", "type": 1, "order": 5109, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Montenegro", "hexcode": "1F1F2-1F1EA", "tags": [ "ME", "flag" ], "emoji": "🇲🇪", "text": "", "type": 1, "order": 5110, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: St. Martin", "hexcode": "1F1F2-1F1EB", "tags": [ "MF", "flag" ], "emoji": "🇲🇫", "text": "", "type": 1, "order": 5111, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Madagascar", "hexcode": "1F1F2-1F1EC", "tags": [ "MG", "flag" ], "emoji": "🇲🇬", "text": "", "type": 1, "order": 5112, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Marshall Islands", "hexcode": "1F1F2-1F1ED", "tags": [ "MH", "flag" ], "emoji": "🇲🇭", "text": "", "type": 1, "order": 5113, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: North Macedonia", "hexcode": "1F1F2-1F1F0", "tags": [ "MK", "flag" ], "emoji": "🇲🇰", "text": "", "type": 1, "order": 5114, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Mali", "hexcode": "1F1F2-1F1F1", "tags": [ "ML", "flag" ], "emoji": "🇲🇱", "text": "", "type": 1, "order": 5115, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Myanmar (Burma)", "hexcode": "1F1F2-1F1F2", "tags": [ "MM", "flag" ], "emoji": "🇲🇲", "text": "", "type": 1, "order": 5116, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Mongolia", "hexcode": "1F1F2-1F1F3", "tags": [ "MN", "flag" ], "emoji": "🇲🇳", "text": "", "type": 1, "order": 5117, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Macao SAR China", "hexcode": "1F1F2-1F1F4", "tags": [ "MO", "flag" ], "emoji": "🇲🇴", "text": "", "type": 1, "order": 5118, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Northern Mariana Islands", "hexcode": "1F1F2-1F1F5", "tags": [ "MP", "flag" ], "emoji": "🇲🇵", "text": "", "type": 1, "order": 5119, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Martinique", "hexcode": "1F1F2-1F1F6", "tags": [ "MQ", "flag" ], "emoji": "🇲🇶", "text": "", "type": 1, "order": 5120, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Mauritania", "hexcode": "1F1F2-1F1F7", "tags": [ "MR", "flag" ], "emoji": "🇲🇷", "text": "", "type": 1, "order": 5121, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Montserrat", "hexcode": "1F1F2-1F1F8", "tags": [ "MS", "flag" ], "emoji": "🇲🇸", "text": "", "type": 1, "order": 5122, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Malta", "hexcode": "1F1F2-1F1F9", "tags": [ "MT", "flag" ], "emoji": "🇲🇹", "text": "", "type": 1, "order": 5123, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Mauritius", "hexcode": "1F1F2-1F1FA", "tags": [ "MU", "flag" ], "emoji": "🇲🇺", "text": "", "type": 1, "order": 5124, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Maldives", "hexcode": "1F1F2-1F1FB", "tags": [ "MV", "flag" ], "emoji": "🇲🇻", "text": "", "type": 1, "order": 5125, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Malawi", "hexcode": "1F1F2-1F1FC", "tags": [ "MW", "flag" ], "emoji": "🇲🇼", "text": "", "type": 1, "order": 5126, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Mexico", "hexcode": "1F1F2-1F1FD", "tags": [ "MX", "flag" ], "emoji": "🇲🇽", "text": "", "type": 1, "order": 5127, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Malaysia", "hexcode": "1F1F2-1F1FE", "tags": [ "MY", "flag" ], "emoji": "🇲🇾", "text": "", "type": 1, "order": 5128, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Mozambique", "hexcode": "1F1F2-1F1FF", "tags": [ "MZ", "flag" ], "emoji": "🇲🇿", "text": "", "type": 1, "order": 5129, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Namibia", "hexcode": "1F1F3-1F1E6", "tags": [ "NA", "flag" ], "emoji": "🇳🇦", "text": "", "type": 1, "order": 5130, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: New Caledonia", "hexcode": "1F1F3-1F1E8", "tags": [ "NC", "flag" ], "emoji": "🇳🇨", "text": "", "type": 1, "order": 5131, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Niger", "hexcode": "1F1F3-1F1EA", "tags": [ "NE", "flag" ], "emoji": "🇳🇪", "text": "", "type": 1, "order": 5132, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Norfolk Island", "hexcode": "1F1F3-1F1EB", "tags": [ "NF", "flag" ], "emoji": "🇳🇫", "text": "", "type": 1, "order": 5133, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Nigeria", "hexcode": "1F1F3-1F1EC", "tags": [ "NG", "flag" ], "emoji": "🇳🇬", "text": "", "type": 1, "order": 5134, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Nicaragua", "hexcode": "1F1F3-1F1EE", "tags": [ "NI", "flag" ], "emoji": "🇳🇮", "text": "", "type": 1, "order": 5135, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Netherlands", "hexcode": "1F1F3-1F1F1", "tags": [ "NL", "flag" ], "emoji": "🇳🇱", "text": "", "type": 1, "order": 5136, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Norway", "hexcode": "1F1F3-1F1F4", "tags": [ "NO", "flag" ], "emoji": "🇳🇴", "text": "", "type": 1, "order": 5137, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Nepal", "hexcode": "1F1F3-1F1F5", "tags": [ "NP", "flag" ], "emoji": "🇳🇵", "text": "", "type": 1, "order": 5138, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Nauru", "hexcode": "1F1F3-1F1F7", "tags": [ "NR", "flag" ], "emoji": "🇳🇷", "text": "", "type": 1, "order": 5139, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Niue", "hexcode": "1F1F3-1F1FA", "tags": [ "NU", "flag" ], "emoji": "🇳🇺", "text": "", "type": 1, "order": 5140, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: New Zealand", "hexcode": "1F1F3-1F1FF", "tags": [ "NZ", "flag" ], "emoji": "🇳🇿", "text": "", "type": 1, "order": 5141, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Oman", "hexcode": "1F1F4-1F1F2", "tags": [ "OM", "flag" ], "emoji": "🇴🇲", "text": "", "type": 1, "order": 5142, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Panama", "hexcode": "1F1F5-1F1E6", "tags": [ "PA", "flag" ], "emoji": "🇵🇦", "text": "", "type": 1, "order": 5143, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Peru", "hexcode": "1F1F5-1F1EA", "tags": [ "PE", "flag" ], "emoji": "🇵🇪", "text": "", "type": 1, "order": 5144, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: French Polynesia", "hexcode": "1F1F5-1F1EB", "tags": [ "PF", "flag" ], "emoji": "🇵🇫", "text": "", "type": 1, "order": 5145, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Papua New Guinea", "hexcode": "1F1F5-1F1EC", "tags": [ "PG", "flag" ], "emoji": "🇵🇬", "text": "", "type": 1, "order": 5146, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Philippines", "hexcode": "1F1F5-1F1ED", "tags": [ "PH", "flag" ], "emoji": "🇵🇭", "text": "", "type": 1, "order": 5147, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Pakistan", "hexcode": "1F1F5-1F1F0", "tags": [ "PK", "flag" ], "emoji": "🇵🇰", "text": "", "type": 1, "order": 5148, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Poland", "hexcode": "1F1F5-1F1F1", "tags": [ "PL", "flag" ], "emoji": "🇵🇱", "text": "", "type": 1, "order": 5149, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: St. Pierre & Miquelon", "hexcode": "1F1F5-1F1F2", "tags": [ "PM", "flag" ], "emoji": "🇵🇲", "text": "", "type": 1, "order": 5150, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Pitcairn Islands", "hexcode": "1F1F5-1F1F3", "tags": [ "PN", "flag" ], "emoji": "🇵🇳", "text": "", "type": 1, "order": 5151, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Puerto Rico", "hexcode": "1F1F5-1F1F7", "tags": [ "PR", "flag" ], "emoji": "🇵🇷", "text": "", "type": 1, "order": 5152, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Palestinian Territories", "hexcode": "1F1F5-1F1F8", "tags": [ "PS", "flag" ], "emoji": "🇵🇸", "text": "", "type": 1, "order": 5153, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Portugal", "hexcode": "1F1F5-1F1F9", "tags": [ "PT", "flag" ], "emoji": "🇵🇹", "text": "", "type": 1, "order": 5154, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Palau", "hexcode": "1F1F5-1F1FC", "tags": [ "PW", "flag" ], "emoji": "🇵🇼", "text": "", "type": 1, "order": 5155, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Paraguay", "hexcode": "1F1F5-1F1FE", "tags": [ "PY", "flag" ], "emoji": "🇵🇾", "text": "", "type": 1, "order": 5156, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Qatar", "hexcode": "1F1F6-1F1E6", "tags": [ "QA", "flag" ], "emoji": "🇶🇦", "text": "", "type": 1, "order": 5157, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Réunion", "hexcode": "1F1F7-1F1EA", "tags": [ "RE", "flag" ], "emoji": "🇷🇪", "text": "", "type": 1, "order": 5158, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Romania", "hexcode": "1F1F7-1F1F4", "tags": [ "RO", "flag" ], "emoji": "🇷🇴", "text": "", "type": 1, "order": 5159, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Serbia", "hexcode": "1F1F7-1F1F8", "tags": [ "RS", "flag" ], "emoji": "🇷🇸", "text": "", "type": 1, "order": 5160, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Russia", "hexcode": "1F1F7-1F1FA", "tags": [ "RU", "flag" ], "emoji": "🇷🇺", "text": "", "type": 1, "order": 5161, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Rwanda", "hexcode": "1F1F7-1F1FC", "tags": [ "RW", "flag" ], "emoji": "🇷🇼", "text": "", "type": 1, "order": 5162, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Saudi Arabia", "hexcode": "1F1F8-1F1E6", "tags": [ "SA", "flag" ], "emoji": "🇸🇦", "text": "", "type": 1, "order": 5163, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Solomon Islands", "hexcode": "1F1F8-1F1E7", "tags": [ "SB", "flag" ], "emoji": "🇸🇧", "text": "", "type": 1, "order": 5164, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Seychelles", "hexcode": "1F1F8-1F1E8", "tags": [ "SC", "flag" ], "emoji": "🇸🇨", "text": "", "type": 1, "order": 5165, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Sudan", "hexcode": "1F1F8-1F1E9", "tags": [ "SD", "flag" ], "emoji": "🇸🇩", "text": "", "type": 1, "order": 5166, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Sweden", "hexcode": "1F1F8-1F1EA", "tags": [ "SE", "flag" ], "emoji": "🇸🇪", "text": "", "type": 1, "order": 5167, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Singapore", "hexcode": "1F1F8-1F1EC", "tags": [ "SG", "flag" ], "emoji": "🇸🇬", "text": "", "type": 1, "order": 5168, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: St. Helena", "hexcode": "1F1F8-1F1ED", "tags": [ "SH", "flag" ], "emoji": "🇸🇭", "text": "", "type": 1, "order": 5169, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Slovenia", "hexcode": "1F1F8-1F1EE", "tags": [ "SI", "flag" ], "emoji": "🇸🇮", "text": "", "type": 1, "order": 5170, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Svalbard & Jan Mayen", "hexcode": "1F1F8-1F1EF", "tags": [ "SJ", "flag" ], "emoji": "🇸🇯", "text": "", "type": 1, "order": 5171, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Slovakia", "hexcode": "1F1F8-1F1F0", "tags": [ "SK", "flag" ], "emoji": "🇸🇰", "text": "", "type": 1, "order": 5172, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Sierra Leone", "hexcode": "1F1F8-1F1F1", "tags": [ "SL", "flag" ], "emoji": "🇸🇱", "text": "", "type": 1, "order": 5173, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: San Marino", "hexcode": "1F1F8-1F1F2", "tags": [ "SM", "flag" ], "emoji": "🇸🇲", "text": "", "type": 1, "order": 5174, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Senegal", "hexcode": "1F1F8-1F1F3", "tags": [ "SN", "flag" ], "emoji": "🇸🇳", "text": "", "type": 1, "order": 5175, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Somalia", "hexcode": "1F1F8-1F1F4", "tags": [ "SO", "flag" ], "emoji": "🇸🇴", "text": "", "type": 1, "order": 5176, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Suriname", "hexcode": "1F1F8-1F1F7", "tags": [ "SR", "flag" ], "emoji": "🇸🇷", "text": "", "type": 1, "order": 5177, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: South Sudan", "hexcode": "1F1F8-1F1F8", "tags": [ "SS", "flag" ], "emoji": "🇸🇸", "text": "", "type": 1, "order": 5178, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: São Tomé & Príncipe", "hexcode": "1F1F8-1F1F9", "tags": [ "ST", "flag" ], "emoji": "🇸🇹", "text": "", "type": 1, "order": 5179, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: El Salvador", "hexcode": "1F1F8-1F1FB", "tags": [ "SV", "flag" ], "emoji": "🇸🇻", "text": "", "type": 1, "order": 5180, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Sint Maarten", "hexcode": "1F1F8-1F1FD", "tags": [ "SX", "flag" ], "emoji": "🇸🇽", "text": "", "type": 1, "order": 5181, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Syria", "hexcode": "1F1F8-1F1FE", "tags": [ "SY", "flag" ], "emoji": "🇸🇾", "text": "", "type": 1, "order": 5182, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Eswatini", "hexcode": "1F1F8-1F1FF", "tags": [ "SZ", "flag" ], "emoji": "🇸🇿", "text": "", "type": 1, "order": 5183, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Tristan da Cunha", "hexcode": "1F1F9-1F1E6", "tags": [ "TA", "flag" ], "emoji": "🇹🇦", "text": "", "type": 1, "order": 5184, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Turks & Caicos Islands", "hexcode": "1F1F9-1F1E8", "tags": [ "TC", "flag" ], "emoji": "🇹🇨", "text": "", "type": 1, "order": 5185, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Chad", "hexcode": "1F1F9-1F1E9", "tags": [ "TD", "flag" ], "emoji": "🇹🇩", "text": "", "type": 1, "order": 5186, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: French Southern Territories", "hexcode": "1F1F9-1F1EB", "tags": [ "TF", "flag" ], "emoji": "🇹🇫", "text": "", "type": 1, "order": 5187, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Togo", "hexcode": "1F1F9-1F1EC", "tags": [ "TG", "flag" ], "emoji": "🇹🇬", "text": "", "type": 1, "order": 5188, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Thailand", "hexcode": "1F1F9-1F1ED", "tags": [ "TH", "flag" ], "emoji": "🇹🇭", "text": "", "type": 1, "order": 5189, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Tajikistan", "hexcode": "1F1F9-1F1EF", "tags": [ "TJ", "flag" ], "emoji": "🇹🇯", "text": "", "type": 1, "order": 5190, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Tokelau", "hexcode": "1F1F9-1F1F0", "tags": [ "TK", "flag" ], "emoji": "🇹🇰", "text": "", "type": 1, "order": 5191, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Timor-Leste", "hexcode": "1F1F9-1F1F1", "tags": [ "TL", "flag" ], "emoji": "🇹🇱", "text": "", "type": 1, "order": 5192, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Turkmenistan", "hexcode": "1F1F9-1F1F2", "tags": [ "TM", "flag" ], "emoji": "🇹🇲", "text": "", "type": 1, "order": 5193, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Tunisia", "hexcode": "1F1F9-1F1F3", "tags": [ "TN", "flag" ], "emoji": "🇹🇳", "text": "", "type": 1, "order": 5194, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Tonga", "hexcode": "1F1F9-1F1F4", "tags": [ "TO", "flag" ], "emoji": "🇹🇴", "text": "", "type": 1, "order": 5195, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Türkiye", "hexcode": "1F1F9-1F1F7", "tags": [ "TR", "flag" ], "emoji": "🇹🇷", "text": "", "type": 1, "order": 5196, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Trinidad & Tobago", "hexcode": "1F1F9-1F1F9", "tags": [ "TT", "flag" ], "emoji": "🇹🇹", "text": "", "type": 1, "order": 5197, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Tuvalu", "hexcode": "1F1F9-1F1FB", "tags": [ "TV", "flag" ], "emoji": "🇹🇻", "text": "", "type": 1, "order": 5198, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Taiwan", "hexcode": "1F1F9-1F1FC", "tags": [ "TW", "flag" ], "emoji": "🇹🇼", "text": "", "type": 1, "order": 5199, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Tanzania", "hexcode": "1F1F9-1F1FF", "tags": [ "TZ", "flag" ], "emoji": "🇹🇿", "text": "", "type": 1, "order": 5200, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Ukraine", "hexcode": "1F1FA-1F1E6", "tags": [ "UA", "flag" ], "emoji": "🇺🇦", "text": "", "type": 1, "order": 5201, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Uganda", "hexcode": "1F1FA-1F1EC", "tags": [ "UG", "flag" ], "emoji": "🇺🇬", "text": "", "type": 1, "order": 5202, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: U.S. Outlying Islands", "hexcode": "1F1FA-1F1F2", "tags": [ "UM", "flag" ], "emoji": "🇺🇲", "text": "", "type": 1, "order": 5203, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: United Nations", "hexcode": "1F1FA-1F1F3", "tags": [ "UN", "flag" ], "emoji": "🇺🇳", "text": "", "type": 1, "order": 5204, "group": 9, "subgroup": 98, "version": 4 }, { "label": "flag: United States", "hexcode": "1F1FA-1F1F8", "tags": [ "US", "flag" ], "emoji": "🇺🇸", "text": "", "type": 1, "order": 5205, "group": 9, "subgroup": 98, "version": 0.6 }, { "label": "flag: Uruguay", "hexcode": "1F1FA-1F1FE", "tags": [ "UY", "flag" ], "emoji": "🇺🇾", "text": "", "type": 1, "order": 5206, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Uzbekistan", "hexcode": "1F1FA-1F1FF", "tags": [ "UZ", "flag" ], "emoji": "🇺🇿", "text": "", "type": 1, "order": 5207, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Vatican City", "hexcode": "1F1FB-1F1E6", "tags": [ "VA", "flag" ], "emoji": "🇻🇦", "text": "", "type": 1, "order": 5208, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: St. Vincent & Grenadines", "hexcode": "1F1FB-1F1E8", "tags": [ "VC", "flag" ], "emoji": "🇻🇨", "text": "", "type": 1, "order": 5209, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Venezuela", "hexcode": "1F1FB-1F1EA", "tags": [ "VE", "flag" ], "emoji": "🇻🇪", "text": "", "type": 1, "order": 5210, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: British Virgin Islands", "hexcode": "1F1FB-1F1EC", "tags": [ "VG", "flag" ], "emoji": "🇻🇬", "text": "", "type": 1, "order": 5211, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: U.S. Virgin Islands", "hexcode": "1F1FB-1F1EE", "tags": [ "VI", "flag" ], "emoji": "🇻🇮", "text": "", "type": 1, "order": 5212, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Vietnam", "hexcode": "1F1FB-1F1F3", "tags": [ "VN", "flag" ], "emoji": "🇻🇳", "text": "", "type": 1, "order": 5213, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Vanuatu", "hexcode": "1F1FB-1F1FA", "tags": [ "VU", "flag" ], "emoji": "🇻🇺", "text": "", "type": 1, "order": 5214, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Wallis & Futuna", "hexcode": "1F1FC-1F1EB", "tags": [ "WF", "flag" ], "emoji": "🇼🇫", "text": "", "type": 1, "order": 5215, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Samoa", "hexcode": "1F1FC-1F1F8", "tags": [ "WS", "flag" ], "emoji": "🇼🇸", "text": "", "type": 1, "order": 5216, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Kosovo", "hexcode": "1F1FD-1F1F0", "tags": [ "XK", "flag" ], "emoji": "🇽🇰", "text": "", "type": 1, "order": 5217, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Yemen", "hexcode": "1F1FE-1F1EA", "tags": [ "YE", "flag" ], "emoji": "🇾🇪", "text": "", "type": 1, "order": 5218, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Mayotte", "hexcode": "1F1FE-1F1F9", "tags": [ "YT", "flag" ], "emoji": "🇾🇹", "text": "", "type": 1, "order": 5219, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: South Africa", "hexcode": "1F1FF-1F1E6", "tags": [ "ZA", "flag" ], "emoji": "🇿🇦", "text": "", "type": 1, "order": 5220, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Zambia", "hexcode": "1F1FF-1F1F2", "tags": [ "ZM", "flag" ], "emoji": "🇿🇲", "text": "", "type": 1, "order": 5221, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: Zimbabwe", "hexcode": "1F1FF-1F1FC", "tags": [ "ZW", "flag" ], "emoji": "🇿🇼", "text": "", "type": 1, "order": 5222, "group": 9, "subgroup": 98, "version": 2 }, { "label": "flag: England", "hexcode": "1F3F4-E0067-E0062-E0065-E006E-E0067-E007F", "tags": [ "flag", "gbeng" ], "emoji": "🏴󠁧󠁢󠁥󠁮󠁧󠁿", "text": "", "type": 1, "order": 5223, "group": 9, "subgroup": 99, "version": 5 }, { "label": "flag: Scotland", "hexcode": "1F3F4-E0067-E0062-E0073-E0063-E0074-E007F", "tags": [ "flag", "gbsct" ], "emoji": "🏴󠁧󠁢󠁳󠁣󠁴󠁿", "text": "", "type": 1, "order": 5224, "group": 9, "subgroup": 99, "version": 5 }, { "label": "flag: Wales", "hexcode": "1F3F4-E0067-E0062-E0077-E006C-E0073-E007F", "tags": [ "flag", "gbwls" ], "emoji": "🏴󠁧󠁢󠁷󠁬󠁳󠁿", "text": "", "type": 1, "order": 5225, "group": 9, "subgroup": 99, "version": 5 } ] ================================================ FILE: src/Spectre.Console/Data/spinners_default.json ================================================ { "Default": { "interval": 100, "unicode": true, "frames": [ "⣷", "⣯", "⣟", "⡿", "⢿", "⣻", "⣽", "⣾" ] }, "Ascii": { "interval": 100, "unicode": true, "frames": [ "-", "\\", "|", "/", "-", "\\", "|", "/" ] } } ================================================ FILE: src/Spectre.Console/Data/spinners_sindresorhus.json ================================================ { "dots": { "interval": 80, "unicode": true, "frames": [ "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏" ] }, "dots2": { "interval": 80, "unicode": true, "frames": [ "⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷" ] }, "dots3": { "interval": 80, "unicode": true, "frames": [ "⠋", "⠙", "⠚", "⠞", "⠖", "⠦", "⠴", "⠲", "⠳", "⠓" ] }, "dots4": { "interval": 80, "unicode": true, "frames": [ "⠄", "⠆", "⠇", "⠋", "⠙", "⠸", "⠰", "⠠", "⠰", "⠸", "⠙", "⠋", "⠇", "⠆" ] }, "dots5": { "interval": 80, "unicode": true, "frames": [ "⠋", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋" ] }, "dots6": { "interval": 80, "unicode": true, "frames": [ "⠁", "⠉", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠤", "⠄", "⠄", "⠤", "⠴", "⠲", "⠒", "⠂", "⠂", "⠒", "⠚", "⠙", "⠉", "⠁" ] }, "dots7": { "interval": 80, "unicode": true, "frames": [ "⠈", "⠉", "⠋", "⠓", "⠒", "⠐", "⠐", "⠒", "⠖", "⠦", "⠤", "⠠", "⠠", "⠤", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋", "⠉", "⠈" ] }, "dots8": { "interval": 80, "unicode": true, "frames": [ "⠁", "⠁", "⠉", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠤", "⠄", "⠄", "⠤", "⠠", "⠠", "⠤", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋", "⠉", "⠈", "⠈" ] }, "dots9": { "interval": 80, "unicode": true, "frames": [ "⢹", "⢺", "⢼", "⣸", "⣇", "⡧", "⡗", "⡏" ] }, "dots10": { "interval": 80, "unicode": true, "frames": [ "⢄", "⢂", "⢁", "⡁", "⡈", "⡐", "⡠" ] }, "dots11": { "interval": 100, "unicode": true, "frames": [ "⠁", "⠂", "⠄", "⡀", "⢀", "⠠", "⠐", "⠈" ] }, "dots12": { "interval": 80, "unicode": true, "frames": [ "⢀⠀", "⡀⠀", "⠄⠀", "⢂⠀", "⡂⠀", "⠅⠀", "⢃⠀", "⡃⠀", "⠍⠀", "⢋⠀", "⡋⠀", "⠍⠁", "⢋⠁", "⡋⠁", "⠍⠉", "⠋⠉", "⠋⠉", "⠉⠙", "⠉⠙", "⠉⠩", "⠈⢙", "⠈⡙", "⢈⠩", "⡀⢙", "⠄⡙", "⢂⠩", "⡂⢘", "⠅⡘", "⢃⠨", "⡃⢐", "⠍⡐", "⢋⠠", "⡋⢀", "⠍⡁", "⢋⠁", "⡋⠁", "⠍⠉", "⠋⠉", "⠋⠉", "⠉⠙", "⠉⠙", "⠉⠩", "⠈⢙", "⠈⡙", "⠈⠩", "⠀⢙", "⠀⡙", "⠀⠩", "⠀⢘", "⠀⡘", "⠀⠨", "⠀⢐", "⠀⡐", "⠀⠠", "⠀⢀", "⠀⡀" ] }, "dots13": { "interval": 80, "unicode": true, "frames": [ "⣼", "⣹", "⢻", "⠿", "⡟", "⣏", "⣧", "⣶" ] }, "dots14": { "interval": 80, "unicode": true, "frames": [ "⠉⠉", "⠈⠙", "⠀⠹", "⠀⢸", "⠀⣰", "⢀⣠", "⣀⣀", "⣄⡀", "⣆⠀", "⡇⠀", "⠏⠀", "⠋⠁" ] }, "dots8Bit": { "interval": 80, "unicode": true, "frames": [ "⠀", "⠁", "⠂", "⠃", "⠄", "⠅", "⠆", "⠇", "⡀", "⡁", "⡂", "⡃", "⡄", "⡅", "⡆", "⡇", "⠈", "⠉", "⠊", "⠋", "⠌", "⠍", "⠎", "⠏", "⡈", "⡉", "⡊", "⡋", "⡌", "⡍", "⡎", "⡏", "⠐", "⠑", "⠒", "⠓", "⠔", "⠕", "⠖", "⠗", "⡐", "⡑", "⡒", "⡓", "⡔", "⡕", "⡖", "⡗", "⠘", "⠙", "⠚", "⠛", "⠜", "⠝", "⠞", "⠟", "⡘", "⡙", "⡚", "⡛", "⡜", "⡝", "⡞", "⡟", "⠠", "⠡", "⠢", "⠣", "⠤", "⠥", "⠦", "⠧", "⡠", "⡡", "⡢", "⡣", "⡤", "⡥", "⡦", "⡧", "⠨", "⠩", "⠪", "⠫", "⠬", "⠭", "⠮", "⠯", "⡨", "⡩", "⡪", "⡫", "⡬", "⡭", "⡮", "⡯", "⠰", "⠱", "⠲", "⠳", "⠴", "⠵", "⠶", "⠷", "⡰", "⡱", "⡲", "⡳", "⡴", "⡵", "⡶", "⡷", "⠸", "⠹", "⠺", "⠻", "⠼", "⠽", "⠾", "⠿", "⡸", "⡹", "⡺", "⡻", "⡼", "⡽", "⡾", "⡿", "⢀", "⢁", "⢂", "⢃", "⢄", "⢅", "⢆", "⢇", "⣀", "⣁", "⣂", "⣃", "⣄", "⣅", "⣆", "⣇", "⢈", "⢉", "⢊", "⢋", "⢌", "⢍", "⢎", "⢏", "⣈", "⣉", "⣊", "⣋", "⣌", "⣍", "⣎", "⣏", "⢐", "⢑", "⢒", "⢓", "⢔", "⢕", "⢖", "⢗", "⣐", "⣑", "⣒", "⣓", "⣔", "⣕", "⣖", "⣗", "⢘", "⢙", "⢚", "⢛", "⢜", "⢝", "⢞", "⢟", "⣘", "⣙", "⣚", "⣛", "⣜", "⣝", "⣞", "⣟", "⢠", "⢡", "⢢", "⢣", "⢤", "⢥", "⢦", "⢧", "⣠", "⣡", "⣢", "⣣", "⣤", "⣥", "⣦", "⣧", "⢨", "⢩", "⢪", "⢫", "⢬", "⢭", "⢮", "⢯", "⣨", "⣩", "⣪", "⣫", "⣬", "⣭", "⣮", "⣯", "⢰", "⢱", "⢲", "⢳", "⢴", "⢵", "⢶", "⢷", "⣰", "⣱", "⣲", "⣳", "⣴", "⣵", "⣶", "⣷", "⢸", "⢹", "⢺", "⢻", "⢼", "⢽", "⢾", "⢿", "⣸", "⣹", "⣺", "⣻", "⣼", "⣽", "⣾", "⣿" ] }, "dotsCircle": { "interval": 80, "unicode": true, "frames": [ "⢎ ", "⠎⠁", "⠊⠑", "⠈⠱", " ⡱", "⢀⡰", "⢄⡠", "⢆⡀" ] }, "sand": { "interval": 80, "unicode": true, "frames": [ "⠁", "⠂", "⠄", "⡀", "⡈", "⡐", "⡠", "⣀", "⣁", "⣂", "⣄", "⣌", "⣔", "⣤", "⣥", "⣦", "⣮", "⣶", "⣷", "⣿", "⡿", "⠿", "⢟", "⠟", "⡛", "⠛", "⠫", "⢋", "⠋", "⠍", "⡉", "⠉", "⠑", "⠡", "⢁" ] }, "line": { "interval": 130, "unicode": false, "frames": [ "-", "\\", "|", "/" ] }, "line2": { "interval": 100, "unicode": false, "frames": [ "⠂", "-", "–", "—", "–", "-" ] }, "pipe": { "interval": 100, "unicode": false, "frames": [ "┤", "┘", "┴", "└", "├", "┌", "┬", "┐" ] }, "simpleDots": { "interval": 400, "unicode": false, "frames": [ ". ", ".. ", "...", " " ] }, "simpleDotsScrolling": { "interval": 200, "unicode": false, "frames": [ ". ", ".. ", "...", " ..", " .", " " ] }, "star": { "interval": 70, "unicode": true, "frames": [ "✶", "✸", "✹", "✺", "✹", "✷" ] }, "star2": { "interval": 80, "unicode": false, "frames": [ "+", "x", "*" ] }, "flip": { "interval": 70, "unicode": false, "frames": [ "_", "_", "_", "-", "`", "`", "'", "´", "-", "_", "_", "_" ] }, "hamburger": { "interval": 100, "unicode": true, "frames": [ "☱", "☲", "☴" ] }, "growVertical": { "interval": 120, "unicode": true, "frames": [ "▁", "▃", "▄", "▅", "▆", "▇", "▆", "▅", "▄", "▃" ] }, "growHorizontal": { "interval": 120, "unicode": true, "frames": [ "▏", "▎", "▍", "▌", "▋", "▊", "▉", "▊", "▋", "▌", "▍", "▎" ] }, "balloon": { "interval": 140, "unicode": false, "frames": [ " ", ".", "o", "O", "@", "*", " " ] }, "balloon2": { "interval": 120, "unicode": false, "frames": [ ".", "o", "O", "°", "O", "o", "." ] }, "noise": { "interval": 100, "unicode": true, "frames": [ "▓", "▒", "░" ] }, "bounce": { "interval": 120, "unicode": true, "frames": [ "⠁", "⠂", "⠄", "⠂" ] }, "boxBounce": { "interval": 120, "unicode": true, "frames": [ "▖", "▘", "▝", "▗" ] }, "boxBounce2": { "interval": 100, "unicode": true, "frames": [ "▌", "▀", "▐", "▄" ] }, "triangle": { "interval": 50, "unicode": true, "frames": [ "◢", "◣", "◤", "◥" ] }, "binary": { "interval": 80, "unicode": false, "frames": [ "010010", "001100", "100101", "111010", "111101", "010111", "101011", "111000", "110011", "110101" ] }, "arc": { "interval": 100, "unicode": true, "frames": [ "◜", "◠", "◝", "◞", "◡", "◟" ] }, "circle": { "interval": 120, "unicode": true, "frames": [ "◡", "⊙", "◠" ] }, "squareCorners": { "interval": 180, "unicode": true, "frames": [ "◰", "◳", "◲", "◱" ] }, "circleQuarters": { "interval": 120, "unicode": true, "frames": [ "◴", "◷", "◶", "◵" ] }, "circleHalves": { "interval": 50, "unicode": true, "frames": [ "◐", "◓", "◑", "◒" ] }, "squish": { "interval": 100, "unicode": true, "frames": [ "╫", "╪" ] }, "toggle": { "interval": 250, "unicode": true, "frames": [ "⊶", "⊷" ] }, "toggle2": { "interval": 80, "unicode": true, "frames": [ "▫", "▪" ] }, "toggle3": { "interval": 120, "unicode": true, "frames": [ "□", "■" ] }, "toggle4": { "interval": 100, "unicode": true, "frames": [ "■", "□", "▪", "▫" ] }, "toggle5": { "interval": 100, "unicode": true, "frames": [ "▮", "▯" ] }, "toggle6": { "interval": 300, "unicode": true, "frames": [ "ဝ", "၀" ] }, "toggle7": { "interval": 80, "unicode": true, "frames": [ "⦾", "⦿" ] }, "toggle8": { "interval": 100, "unicode": true, "frames": [ "◍", "◌" ] }, "toggle9": { "interval": 100, "unicode": true, "frames": [ "◉", "◎" ] }, "toggle10": { "interval": 100, "unicode": true, "frames": [ "㊂", "㊀", "㊁" ] }, "toggle11": { "interval": 50, "unicode": true, "frames": [ "⧇", "⧆" ] }, "toggle12": { "interval": 120, "unicode": true, "frames": [ "☗", "☖" ] }, "toggle13": { "interval": 80, "unicode": false, "frames": [ "=", "*", "-" ] }, "arrow": { "interval": 100, "unicode": true, "frames": [ "←", "↖", "↑", "↗", "→", "↘", "↓", "↙" ] }, "arrow2": { "interval": 80, "unicode": true, "frames": [ "⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ " ] }, "arrow3": { "interval": 120, "unicode": true, "frames": [ "▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸" ] }, "bouncingBar": { "interval": 80, "unicode": true, "frames": [ "[ ]", "[= ]", "[== ]", "[=== ]", "[====]", "[ ===]", "[ ==]", "[ =]", "[ ]", "[ =]", "[ ==]", "[ ===]", "[====]", "[=== ]", "[== ]", "[= ]" ] }, "bouncingBall": { "interval": 80, "unicode": true, "frames": [ "( ● )", "( ● )", "( ● )", "( ● )", "( ●)", "( ● )", "( ● )", "( ● )", "( ● )", "(● )" ] }, "smiley": { "interval": 200, "unicode": true, "frames": [ "😄 ", "😝 " ] }, "monkey": { "interval": 300, "unicode": true, "frames": [ "🙈 ", "🙈 ", "🙉 ", "🙊 " ] }, "hearts": { "interval": 100, "unicode": true, "frames": [ "💛 ", "💙 ", "💜 ", "💚 ", "❤️ " ] }, "clock": { "interval": 100, "unicode": true, "frames": [ "🕛 ", "🕐 ", "🕑 ", "🕒 ", "🕓 ", "🕔 ", "🕕 ", "🕖 ", "🕗 ", "🕘 ", "🕙 ", "🕚 " ] }, "earth": { "interval": 180, "unicode": true, "frames": [ "🌍 ", "🌎 ", "🌏 " ] }, "material": { "interval": 17, "unicode": true, "frames": [ "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", "████████▁▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "██████████▁▁▁▁▁▁▁▁▁▁", "███████████▁▁▁▁▁▁▁▁▁", "█████████████▁▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁▁██████████████▁▁▁▁", "▁▁▁██████████████▁▁▁", "▁▁▁▁█████████████▁▁▁", "▁▁▁▁██████████████▁▁", "▁▁▁▁██████████████▁▁", "▁▁▁▁▁██████████████▁", "▁▁▁▁▁██████████████▁", "▁▁▁▁▁██████████████▁", "▁▁▁▁▁▁██████████████", "▁▁▁▁▁▁██████████████", "▁▁▁▁▁▁▁█████████████", "▁▁▁▁▁▁▁█████████████", "▁▁▁▁▁▁▁▁████████████", "▁▁▁▁▁▁▁▁████████████", "▁▁▁▁▁▁▁▁▁███████████", "▁▁▁▁▁▁▁▁▁███████████", "▁▁▁▁▁▁▁▁▁▁██████████", "▁▁▁▁▁▁▁▁▁▁██████████", "▁▁▁▁▁▁▁▁▁▁▁▁████████", "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", "████████▁▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "███████████▁▁▁▁▁▁▁▁▁", "████████████▁▁▁▁▁▁▁▁", "████████████▁▁▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁▁▁█████████████▁▁▁▁", "▁▁▁▁▁████████████▁▁▁", "▁▁▁▁▁████████████▁▁▁", "▁▁▁▁▁▁███████████▁▁▁", "▁▁▁▁▁▁▁▁█████████▁▁▁", "▁▁▁▁▁▁▁▁█████████▁▁▁", "▁▁▁▁▁▁▁▁▁█████████▁▁", "▁▁▁▁▁▁▁▁▁█████████▁▁", "▁▁▁▁▁▁▁▁▁▁█████████▁", "▁▁▁▁▁▁▁▁▁▁▁████████▁", "▁▁▁▁▁▁▁▁▁▁▁████████▁", "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁" ] }, "moon": { "interval": 80, "unicode": true, "frames": [ "🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 " ] }, "runner": { "interval": 140, "unicode": true, "frames": [ "🚶 ", "🏃 " ] }, "pong": { "interval": 80, "unicode": true, "frames": [ "▐⠂ ▌", "▐⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂▌", "▐ ⠠▌", "▐ ⡀▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐⠠ ▌" ] }, "shark": { "interval": 120, "unicode": true, "frames": [ "▐|\\____________▌", "▐_|\\___________▌", "▐__|\\__________▌", "▐___|\\_________▌", "▐____|\\________▌", "▐_____|\\_______▌", "▐______|\\______▌", "▐_______|\\_____▌", "▐________|\\____▌", "▐_________|\\___▌", "▐__________|\\__▌", "▐___________|\\_▌", "▐____________|\\▌", "▐____________/|▌", "▐___________/|_▌", "▐__________/|__▌", "▐_________/|___▌", "▐________/|____▌", "▐_______/|_____▌", "▐______/|______▌", "▐_____/|_______▌", "▐____/|________▌", "▐___/|_________▌", "▐__/|__________▌", "▐_/|___________▌", "▐/|____________▌" ] }, "dqpb": { "interval": 100, "unicode": false, "frames": [ "d", "q", "p", "b" ] }, "weather": { "interval": 100, "unicode": true, "frames": [ "☀️ ", "☀️ ", "☀️ ", "🌤 ", "⛅️ ", "🌥 ", "☁️ ", "🌧 ", "🌨 ", "🌧 ", "🌨 ", "🌧 ", "🌨 ", "⛈ ", "🌨 ", "🌧 ", "🌨 ", "☁️ ", "🌥 ", "⛅️ ", "🌤 ", "☀️ ", "☀️ " ] }, "christmas": { "interval": 400, "unicode": true, "frames": [ "🌲", "🎄" ] }, "grenade": { "interval": 80, "unicode": true, "frames": [ "، ", "′ ", " ´ ", " ‾ ", " ⸌", " ⸊", " |", " ⁎", " ⁕", " ෴ ", " ⁓", " ", " ", " " ] }, "point": { "interval": 125, "unicode": true, "frames": [ "∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙" ] }, "layer": { "interval": 150, "unicode": true, "frames": [ "-", "=", "≡" ] }, "betaWave": { "interval": 80, "unicode": true, "frames": [ "ρββββββ", "βρβββββ", "ββρββββ", "βββρβββ", "ββββρββ", "βββββρβ", "ββββββρ" ] }, "fingerDance": { "interval": 160, "unicode": true, "frames": [ "🤘 ", "🤟 ", "🖖 ", "✋ ", "🤚 ", "👆 " ] }, "fistBump": { "interval": 80, "unicode": true, "frames": [ "🤜\u3000\u3000\u3000\u3000🤛 ", "🤜\u3000\u3000\u3000\u3000🤛 ", "🤜\u3000\u3000\u3000\u3000🤛 ", "\u3000🤜\u3000\u3000🤛\u3000 ", "\u3000\u3000🤜🤛\u3000\u3000 ", "\u3000🤜✨🤛\u3000\u3000 ", "🤜\u3000✨\u3000🤛\u3000 " ] }, "soccerHeader": { "interval": 80, "unicode": true, "frames": [ " 🧑⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 " ] }, "mindblown": { "interval": 160, "unicode": true, "frames": [ "😐 ", "😐 ", "😮 ", "😮 ", "😦 ", "😦 ", "😧 ", "😧 ", "🤯 ", "💥 ", "✨ ", "\u3000 ", "\u3000 ", "\u3000 " ] }, "speaker": { "interval": 160, "unicode": true, "frames": [ "🔈 ", "🔉 ", "🔊 ", "🔉 " ] }, "orangePulse": { "interval": 100, "unicode": true, "frames": [ "🔸 ", "🔶 ", "🟠 ", "🟠 ", "🔶 " ] }, "bluePulse": { "interval": 100, "unicode": true, "frames": [ "🔹 ", "🔷 ", "🔵 ", "🔵 ", "🔷 " ] }, "orangeBluePulse": { "interval": 100, "unicode": true, "frames": [ "🔸 ", "🔶 ", "🟠 ", "🟠 ", "🔶 ", "🔹 ", "🔷 ", "🔵 ", "🔵 ", "🔷 " ] }, "timeTravel": { "interval": 100, "unicode": true, "frames": [ "🕛 ", "🕚 ", "🕙 ", "🕘 ", "🕗 ", "🕖 ", "🕕 ", "🕔 ", "🕓 ", "🕒 ", "🕑 ", "🕐 " ] }, "aesthetic": { "interval": 80, "unicode": true, "frames": [ "▰▱▱▱▱▱▱", "▰▰▱▱▱▱▱", "▰▰▰▱▱▱▱", "▰▰▰▰▱▱▱", "▰▰▰▰▰▱▱", "▰▰▰▰▰▰▱", "▰▰▰▰▰▰▰", "▰▱▱▱▱▱▱" ] }, "dwarfFortress": { "interval": 80, "unicode": true, "frames": [ " ██████£££ ", "☺██████£££ ", "☺██████£££ ", "☺▓█████£££ ", "☺▓█████£££ ", "☺▒█████£££ ", "☺▒█████£££ ", "☺░█████£££ ", "☺░█████£££ ", "☺ █████£££ ", " ☺█████£££ ", " ☺█████£££ ", " ☺▓████£££ ", " ☺▓████£££ ", " ☺▒████£££ ", " ☺▒████£££ ", " ☺░████£££ ", " ☺░████£££ ", " ☺ ████£££ ", " ☺████£££ ", " ☺████£££ ", " ☺▓███£££ ", " ☺▓███£££ ", " ☺▒███£££ ", " ☺▒███£££ ", " ☺░███£££ ", " ☺░███£££ ", " ☺ ███£££ ", " ☺███£££ ", " ☺███£££ ", " ☺▓██£££ ", " ☺▓██£££ ", " ☺▒██£££ ", " ☺▒██£££ ", " ☺░██£££ ", " ☺░██£££ ", " ☺ ██£££ ", " ☺██£££ ", " ☺██£££ ", " ☺▓█£££ ", " ☺▓█£££ ", " ☺▒█£££ ", " ☺▒█£££ ", " ☺░█£££ ", " ☺░█£££ ", " ☺ █£££ ", " ☺█£££ ", " ☺█£££ ", " ☺▓£££ ", " ☺▓£££ ", " ☺▒£££ ", " ☺▒£££ ", " ☺░£££ ", " ☺░£££ ", " ☺ £££ ", " ☺£££ ", " ☺£££ ", " ☺▓££ ", " ☺▓££ ", " ☺▒££ ", " ☺▒££ ", " ☺░££ ", " ☺░££ ", " ☺ ££ ", " ☺££ ", " ☺££ ", " ☺▓£ ", " ☺▓£ ", " ☺▒£ ", " ☺▒£ ", " ☺░£ ", " ☺░£ ", " ☺ £ ", " ☺£ ", " ☺£ ", " ☺▓ ", " ☺▓ ", " ☺▒ ", " ☺▒ ", " ☺░ ", " ☺░ ", " ☺ ", " ☺ &", " ☺ ☼&", " ☺ ☼ &", " ☺☼ &", " ☺☼ & ", " ‼ & ", " ☺ & ", " ‼ & ", " ☺ & ", " ‼ & ", " ☺ & ", "‼ & ", " & ", " & ", " & ░ ", " & ▒ ", " & ▓ ", " & £ ", " & ░£ ", " & ▒£ ", " & ▓£ ", " & ££ ", " & ░££ ", " & ▒££ ", "& ▓££ ", "& £££ ", " ░£££ ", " ▒£££ ", " ▓£££ ", " █£££ ", " ░█£££ ", " ▒█£££ ", " ▓█£££ ", " ██£££ ", " ░██£££ ", " ▒██£££ ", " ▓██£££ ", " ███£££ ", " ░███£££ ", " ▒███£££ ", " ▓███£££ ", " ████£££ ", " ░████£££ ", " ▒████£££ ", " ▓████£££ ", " █████£££ ", " ░█████£££ ", " ▒█████£££ ", " ▓█████£££ ", " ██████£££ ", " ██████£££ " ] } } ================================================ FILE: src/Spectre.Console/Emoji.cs ================================================ namespace Spectre.Console; /// /// Utility for working with emojis. /// public static partial class Emoji { private static readonly Dictionary _remappings; static Emoji() { _remappings = new Dictionary(StringComparer.OrdinalIgnoreCase); } /// /// Remaps a specific emoji tag with a new emoji. /// /// The emoji tag. /// The emoji. public static void Remap(string tag, string emoji) { ArgumentNullException.ThrowIfNull(tag); ArgumentNullException.ThrowIfNull(emoji); tag = tag.TrimStart(':').TrimEnd(':'); emoji = emoji.TrimStart(':').TrimEnd(':'); _remappings[tag] = emoji; } /// /// Replaces emoji markup with corresponding unicode characters. /// /// A string with emojis codes, e.g. "Hello :smiley:!". /// A string with emoji codes replaced with actual emoji. public static string Replace(string value) { var colonPos = value.IndexOf(':'); if (colonPos == -1) { // No colons, no emoji. return what was passed in with no changes. return value; } var span = value.AsSpan(); StringBuilder? output = null; var index = colonPos + 1; int nextColonPos; while ((nextColonPos = span.IndexOf(':', index)) != -1) { var emojiKey = span.Slice(index, nextColonPos - index).ToString(); if (TryGetEmoji(emojiKey, out var emojiValue)) { output ??= new StringBuilder(); output.AppendSpan(span[..(index - 1)]); output.Append(emojiValue); span = span.Slice(nextColonPos + 1); index = 0; } else { index = nextColonPos + 1; } } if (output == null) { return value; } output.AppendSpan(span); return output.ToString(); } private static bool TryGetEmoji(string emoji, out string value) { if (_remappings.TryGetValue(emoji, out var remappedEmojiValue)) { value = remappedEmojiValue; return true; } if (_emojis.TryGetValue(emoji, out var emojiValue)) { value = emojiValue; return true; } value = string.Empty; return false; } private static int IndexOf(this ReadOnlySpan span, char value, int startIndex) { var indexInSlice = span.Slice(startIndex).IndexOf(value); if (indexInSlice == -1) { return -1; } return startIndex + indexInSlice; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/AppVeyorEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class AppVeyorEnricher : IProfileEnricher { public string Name => "AppVeyor"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("APPVEYOR"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/AzurePipelinesEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class AzurePipelinesEnricher : IProfileEnricher { public string Name => "AzurePipeline"; public bool Enabled(IDictionary environmentVariables) { environmentVariables.TryGetValue("TF_BUILD", out var environmentValue); return !string.IsNullOrWhiteSpace(environmentValue); } public void Enrich(Profile profile) { profile.Capabilities.Ansi = true; profile.Capabilities.Interactive = false; profile.Capabilities.Links = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/BambooEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class BambooEnricher : IProfileEnricher { public string Name => "Bamboo"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("bamboo_buildNumber"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/BitbucketEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class BitbucketEnricher : IProfileEnricher { public string Name => "Bitbucket"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("BITBUCKET_REPO_OWNER") || environmentVariables.ContainsKey("BITBUCKET_REPO_SLUG") || environmentVariables.ContainsKey("BITBUCKET_COMMIT"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/BitriseEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class BitriseEnricher : IProfileEnricher { public string Name => "Bitrise"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("BITRISE_BUILD_URL"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/ContinuaEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class ContinuaEnricher : IProfileEnricher { public string Name => "ContinuaCI"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("ContinuaCI.Version"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/GitHubEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class GitHubEnricher : IProfileEnricher { public string Name => "GitHub"; public bool Enabled(IDictionary environmentVariables) { if (environmentVariables.TryGetValue("GITHUB_ACTIONS", out var value)) { return value?.Equals("true", StringComparison.OrdinalIgnoreCase) ?? false; } return false; } public void Enrich(Profile profile) { profile.Capabilities.Ansi = true; profile.Capabilities.Interactive = false; profile.Capabilities.Links = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/GitLabEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class GitLabEnricher : IProfileEnricher { public string Name => "GitLab"; public bool Enabled(IDictionary environmentVariables) { if (environmentVariables.TryGetValue("CI_SERVER", out var value)) { return value?.Equals("yes", StringComparison.OrdinalIgnoreCase) ?? false; } return false; } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/GoCDEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class GoCDEnricher : IProfileEnricher { public string Name => "GoCD"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("GO_SERVER_URL"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/JenkinsEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class JenkinsEnricher : IProfileEnricher { public string Name => "Jenkins"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("JENKINS_URL"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/MyGetEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class MyGetEnricher : IProfileEnricher { public string Name => "MyGet"; public bool Enabled(IDictionary environmentVariables) { if (environmentVariables.TryGetValue("BuildRunner", out var value)) { return value?.Equals("MyGet", StringComparison.OrdinalIgnoreCase) ?? false; } return false; } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/TeamCityEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class TeamCityEnricher : IProfileEnricher { public string Name => "TeamCity"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("TEAMCITY_VERSION"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/TfsEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class TfsEnricher : IProfileEnricher { public string Name => "TFS"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("TF_BUILD"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/CI/TravisEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal sealed class TravisEnricher : IProfileEnricher { public string Name => "Travis"; public bool Enabled(IDictionary environmentVariables) { return environmentVariables.ContainsKey("TRAVIS"); } public void Enrich(Profile profile) { profile.Capabilities.Interactive = false; } } ================================================ FILE: src/Spectre.Console/Enrichment/ProfileEnricher.cs ================================================ namespace Spectre.Console.Enrichment; internal static class ProfileEnricher { private static readonly List _defaultEnrichers = [ new AppVeyorEnricher(), new AzurePipelinesEnricher(), new BambooEnricher(), new BitbucketEnricher(), new BitriseEnricher(), new ContinuaEnricher(), new GitHubEnricher(), new GitLabEnricher(), new GoCDEnricher(), new JenkinsEnricher(), new MyGetEnricher(), new TeamCityEnricher(), new TfsEnricher(), new TravisEnricher() ]; public static void Enrich( Profile profile, ProfileEnrichment settings, IDictionary? environmentVariables) { ArgumentNullException.ThrowIfNull(profile); settings ??= new ProfileEnrichment(); var variables = GetEnvironmentVariables(environmentVariables); foreach (var enricher in GetEnrichers(settings)) { if (string.IsNullOrWhiteSpace(enricher.Name)) { throw new InvalidOperationException($"Profile enricher of type '{enricher.GetType().FullName}' does not have a name."); } if (enricher.Enabled(variables)) { enricher.Enrich(profile); profile.AddEnricher(enricher.Name); } } } private static List GetEnrichers(ProfileEnrichment settings) { var enrichers = new List(); if (settings.UseDefaultEnrichers) { enrichers.AddRange(_defaultEnrichers); } if (settings.Enrichers?.Count > 0) { enrichers.AddRange(settings.Enrichers); } return enrichers; } private static IDictionary GetEnvironmentVariables(IDictionary? variables) { if (variables != null) { return new Dictionary(variables, StringComparer.OrdinalIgnoreCase); } return Environment.GetEnvironmentVariables() .Cast() .Aggregate( new Dictionary(StringComparer.OrdinalIgnoreCase), (dictionary, entry) => { var key = (string)entry.Key; if (!dictionary.TryGetValue(key, out _)) { dictionary.Add(key, entry.Value as string ?? string.Empty); } return dictionary; }, dictionary => dictionary); } } ================================================ FILE: src/Spectre.Console/Enrichment/ProfileEnrichment.cs ================================================ namespace Spectre.Console; /// /// Contains settings for profile enrichment. /// public sealed class ProfileEnrichment { /// /// Gets or sets a value indicating whether or not /// any default enrichers should be added. /// /// Defaults to true. public bool UseDefaultEnrichers { get; set; } = true; /// /// Gets or sets the list of custom enrichers to use. /// public List? Enrichers { get; set; } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Ansi.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Writes a VT/Ansi control code sequence to the console (if supported). /// /// The console to write to. /// The VT/Ansi control code sequence to write. public static void WriteAnsi(this IAnsiConsole console, string sequence) { ArgumentNullException.ThrowIfNull(console); if (console.Profile.Capabilities.Ansi) { console.Write(new ControlCode(sequence)); } } /// /// Gets the VT/ANSI control code sequence for a . /// /// The console. /// The renderable to the VT/ANSI control code sequence for. /// The VT/ANSI control code sequence. public static string ToAnsi(this IAnsiConsole console, IRenderable renderable) { ArgumentNullException.ThrowIfNull(console); // TODO: Make this a bit more efficient var buffer = new StringWriter(); var ansi = new AnsiWriter(buffer, console.Profile.Capabilities); ansi.Write(console, renderable); return buffer.ToString(); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Async.cs ================================================ namespace Spectre.Console; /// /// Provides extension methods for running tasks with a spinner animation. /// public static class SpinnerExtensions { /// /// Runs a task with a spinner animation. /// /// The task to run. /// The spinner to use. /// The style to apply to the spinner. /// The console to write to. /// The result of the task. public static async Task Spinner(this Task task, Spinner? spinner = null, Style? style = null, IAnsiConsole? ansiConsole = null) { ArgumentNullException.ThrowIfNull(task); await SpinnerInternal(task, spinner ?? Console.Spinner.Known.Default, style, ansiConsole); } /// /// Runs a task with a spinner animation. /// /// The type of the task result. /// The task to run. /// The spinner to use. /// The style to apply to the spinner. /// The console to write to. /// The result of the task. public static async Task Spinner(this Task task, Spinner? spinner = null, Style? style = null, IAnsiConsole? ansiConsole = null) { ArgumentNullException.ThrowIfNull(task); return (await SpinnerInternal(task, spinner ?? Console.Spinner.Known.Default, style, ansiConsole))!; } private static async Task SpinnerInternal(Task task, Spinner spinner, Style? style = null, IAnsiConsole? ansiConsole = null) { ansiConsole ??= AnsiConsole.Console; style ??= Style.Plain; var currentFrame = 0; var cancellationTokenSource = new CancellationTokenSource(); // Start spinner animation in background var spinnerTask = Task.Run( async () => { while (!cancellationTokenSource.Token.IsCancellationRequested) { ansiConsole.Cursor.Show(false); var spinnerFrame = spinner.Frames[currentFrame]; // Write the spinner frame ansiConsole.Write(new Text(spinnerFrame, style)); ansiConsole.WriteAnsi(w => w.CursorLeft(spinnerFrame.Length)); currentFrame = (currentFrame + 1) % spinner.Frames.Count; await Task.Delay(spinner.Interval, cancellationTokenSource.Token); } }, cancellationTokenSource.Token); try { // Wait for the actual task to complete if (task is Task taskWithResult) { var result = await taskWithResult; await cancellationTokenSource.CancelAsync(); await spinnerTask.ContinueWith(_ => { }, TaskContinuationOptions.OnlyOnCanceled); return result; } else { await task; await cancellationTokenSource.CancelAsync(); await spinnerTask.ContinueWith(_ => { }, TaskContinuationOptions.OnlyOnCanceled); return default; } } finally { var spinnerFrame = spinner.Frames[currentFrame]; ansiConsole.Write(new string(' ', spinnerFrame.Length)); ansiConsole.WriteAnsi(w => w.CursorLeft(spinnerFrame.Length)); ansiConsole.Cursor.Show(); await cancellationTokenSource.CancelAsync(); } } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Exceptions.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Writes an exception to the console. /// /// The console. /// The exception to write to the console. /// The exception format options. [RequiresDynamicCode(ExceptionFormatter.AotWarning)] public static void WriteException(this IAnsiConsole console, Exception exception, ExceptionFormats format = ExceptionFormats.Default) { ArgumentNullException.ThrowIfNull(console); console.Write(exception.GetRenderable(format)); } /// /// Writes an exception to the console. /// /// The console. /// The exception to write to the console. /// The exception settings. [RequiresDynamicCode(ExceptionFormatter.AotWarning)] public static void WriteException(this IAnsiConsole console, Exception exception, ExceptionSettings settings) { ArgumentNullException.ThrowIfNull(console); console.Write(exception.GetRenderable(settings)); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Exclusive.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Runs the specified function in exclusive mode. /// /// The result type. /// The console. /// The func to run in exclusive mode. /// The result of the function. public static T RunExclusive(this IAnsiConsole console, Func func) { ArgumentNullException.ThrowIfNull(console); return console.ExclusivityMode.Run(func); } /// /// Runs the specified function in exclusive mode asynchronously. /// /// The result type. /// The console. /// The func to run in exclusive mode. /// The result of the function. public static Task RunExclusive(this IAnsiConsole console, Func> func) { ArgumentNullException.ThrowIfNull(console); return console.ExclusivityMode.RunAsync(func); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Input.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { internal static async Task ReadLine(this IAnsiConsole console, Style? style, bool secret, char? mask, IEnumerable? items = null, CancellationToken cancellationToken = default, string? initialInput = null) { ArgumentNullException.ThrowIfNull(console); style ??= Style.Plain; var text = string.Empty; var autocomplete = new List(items ?? []); Queue? injectedQueue = null; if (!string.IsNullOrEmpty(initialInput)) { injectedQueue = new Queue(); foreach (var ch in initialInput) { var control = char.IsUpper(ch); injectedQueue.Enqueue(new ConsoleKeyInfo(ch, (ConsoleKey)ch, false, false, control)); } } while (true) { cancellationToken.ThrowIfCancellationRequested(); ConsoleKeyInfo? rawKey; if (injectedQueue != null && injectedQueue.Count > 0) { rawKey = injectedQueue.Dequeue(); } else { rawKey = await console.Input.ReadKeyAsync(true, cancellationToken).ConfigureAwait(false); } if (rawKey == null) { continue; } var key = rawKey.Value; if (key.Key == ConsoleKey.Enter) { return text; } if (key.Key == ConsoleKey.Tab && autocomplete.Count > 0) { var autoCompleteDirection = key.Modifiers.HasFlag(ConsoleModifiers.Shift) ? AutoCompleteDirection.Backward : AutoCompleteDirection.Forward; var replace = AutoComplete(autocomplete, text, autoCompleteDirection); if (!string.IsNullOrEmpty(replace)) { // Render the suggestion console.Write("\b \b".Repeat(text.Length), style); console.Write(replace); text = replace; continue; } } if (key.Key == ConsoleKey.Backspace) { if (text.Length > 0) { var lastChar = text.Last(); text = text.Substring(0, text.Length - 1); if (mask != null) { if (UnicodeCalculator.GetWidth(lastChar) == 1) { console.Write("\b \b"); } else if (UnicodeCalculator.GetWidth(lastChar) == 2) { console.Write("\b \b\b \b"); } } } continue; } if (!char.IsControl(key.KeyChar)) { text += key.KeyChar.ToString(); var output = key.KeyChar.ToString(); console.Write(secret ? output.Mask(mask) : output, style); } } } private static string AutoComplete(List autocomplete, string text, AutoCompleteDirection autoCompleteDirection) { var found = autocomplete.Find(i => i == text); var replace = string.Empty; if (found == null) { // Get the closest match var next = autocomplete.Find(i => i.StartsWith(text, true, CultureInfo.InvariantCulture)); if (next != null) { replace = next; } else if (string.IsNullOrEmpty(text)) { // Use the first item replace = autocomplete[0]; } } else { // Get the next match replace = GetAutocompleteValue(autoCompleteDirection, autocomplete, found); } return replace; } private static string GetAutocompleteValue(AutoCompleteDirection autoCompleteDirection, IList autocomplete, string found) { var foundAutocompleteIndex = autocomplete.IndexOf(found); var index = autoCompleteDirection switch { AutoCompleteDirection.Forward => foundAutocompleteIndex + 1, AutoCompleteDirection.Backward => foundAutocompleteIndex - 1, _ => throw new ArgumentOutOfRangeException(nameof(autoCompleteDirection), autoCompleteDirection, null), }; if (index >= autocomplete.Count) { index = 0; } if (index < 0) { index = autocomplete.Count - 1; } return autocomplete[index]; } private enum AutoCompleteDirection { Forward, Backward, } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Live.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Creates a new instance for the console. /// /// The console. /// The target renderable to update. /// A instance. public static LiveDisplay Live(this IAnsiConsole console, IRenderable target) { ArgumentNullException.ThrowIfNull(console); ArgumentNullException.ThrowIfNull(target); return new LiveDisplay(console, target); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Markup.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Writes the specified markup to the console. /// /// The console to write to. /// A composite format string. /// An array of objects to write. public static void Markup(this IAnsiConsole console, string format, params object[] args) { ArgumentNullException.ThrowIfNull(console); Markup(console, CultureInfo.CurrentCulture, format, args); } /// /// Writes the specified markup to the console. /// /// All interpolation holes which contain a string are automatically escaped. /// /// /// /// string input = args[0]; /// string output = Process(input); /// console.MarkupInterpolated($"[blue]{input}[/] -> [green]{output}[/]"); /// /// /// The console to write to. /// The interpolated string value to write. public static void MarkupInterpolated(this IAnsiConsole console, FormattableString value) { ArgumentNullException.ThrowIfNull(console); MarkupInterpolated(console, CultureInfo.CurrentCulture, value); } /// /// Writes the specified markup to the console. /// /// The console to write to. /// An object that supplies culture-specific formatting information. /// A composite format string. /// An array of objects to write. public static void Markup(this IAnsiConsole console, IFormatProvider provider, string format, params object[] args) { ArgumentNullException.ThrowIfNull(console); Markup(console, string.Format(provider, format, args)); } /// /// Writes the specified markup to the console. /// /// All interpolation holes which contain a string are automatically escaped. /// /// /// /// string input = args[0]; /// string output = Process(input); /// console.MarkupInterpolated(CultureInfo.InvariantCulture, $"[blue]{input}[/] -> [green]{output}[/]"); /// /// /// The console to write to. /// An object that supplies culture-specific formatting information. /// The interpolated string value to write. public static void MarkupInterpolated(this IAnsiConsole console, IFormatProvider provider, FormattableString value) { ArgumentNullException.ThrowIfNull(console); Markup(console, Console.Markup.EscapeInterpolated(provider, value)); } /// /// Writes the specified markup to the console. /// /// The console to write to. /// The value to write. public static void Markup(this IAnsiConsole console, string value) { ArgumentNullException.ThrowIfNull(console); console.Write(new Markup(value)); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// The console to write to. /// A composite format string. /// An array of objects to write. public static void MarkupLine(this IAnsiConsole console, string format, params object[] args) { ArgumentNullException.ThrowIfNull(console); MarkupLine(console, CultureInfo.CurrentCulture, format, args); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// All interpolation holes which contain a string are automatically escaped. /// /// /// /// string input = args[0]; /// string output = Process(input); /// console.MarkupLineInterpolated($"[blue]{input}[/] -> [green]{output}[/]"); /// /// /// The console to write to. /// The interpolated string value to write. public static void MarkupLineInterpolated(this IAnsiConsole console, FormattableString value) { ArgumentNullException.ThrowIfNull(console); MarkupLineInterpolated(console, CultureInfo.CurrentCulture, value); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// The console to write to. /// The value to write. public static void MarkupLine(this IAnsiConsole console, string value) { ArgumentNullException.ThrowIfNull(console); Markup(console, value + Environment.NewLine); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// The console to write to. /// An object that supplies culture-specific formatting information. /// A composite format string. /// An array of objects to write. public static void MarkupLine(this IAnsiConsole console, IFormatProvider provider, string format, params object[] args) { ArgumentNullException.ThrowIfNull(console); Markup(console, provider, format + Environment.NewLine, args); } /// /// Writes the specified markup, followed by the current line terminator, to the console. /// /// All interpolation holes which contain a string are automatically escaped. /// /// /// /// string input = args[0]; /// string output = Process(input); /// console.MarkupLineInterpolated(CultureInfo.InvariantCulture, $"[blue]{input}[/] -> [green]{output}[/]"); /// /// /// The console to write to. /// An object that supplies culture-specific formatting information. /// The interpolated string value to write. public static void MarkupLineInterpolated(this IAnsiConsole console, IFormatProvider provider, FormattableString value) { ArgumentNullException.ThrowIfNull(console); MarkupLine(console, Console.Markup.EscapeInterpolated(provider, value)); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Progress.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Creates a new instance for the console. /// /// The console. /// A instance. public static Progress Progress(this IAnsiConsole console) { ArgumentNullException.ThrowIfNull(console); return new Progress(console); } /// /// Creates a new instance for the console. /// /// The console. /// A instance. public static Status Status(this IAnsiConsole console) { ArgumentNullException.ThrowIfNull(console); return new Status(console); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Prompt.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Displays a prompt to the user. /// /// The prompt result type. /// The console. /// The prompt to display. /// The prompt input result. public static T Prompt(this IAnsiConsole console, IPrompt prompt) { ArgumentNullException.ThrowIfNull(prompt); return prompt.Show(console); } /// /// Displays a prompt to the user. /// /// The prompt result type. /// The console. /// The prompt markup text. /// The prompt input result. public static T Ask(this IAnsiConsole console, string prompt) { ArgumentNullException.ThrowIfNull(console); return new TextPrompt(prompt).Show(console); } /// /// Displays a prompt to the user. /// /// The prompt result type. /// The console. /// The prompt markup text. /// Specific CultureInfo to use when converting input. /// The prompt input result. public static T Ask(this IAnsiConsole console, string prompt, CultureInfo? culture) { ArgumentNullException.ThrowIfNull(console); var textPrompt = new TextPrompt(prompt); textPrompt.Culture = culture; return textPrompt.Show(console); } /// /// Displays a prompt with two choices, yes or no. /// /// The console. /// The prompt markup text. /// Specifies the default answer. /// true if the user selected "yes", otherwise false. public static bool Confirm(this IAnsiConsole console, string prompt, bool defaultValue = true) { ArgumentNullException.ThrowIfNull(console); return new ConfirmationPrompt(prompt) { DefaultValue = defaultValue, } .Show(console); } /// /// Displays a prompt to the user. /// /// The prompt result type. /// The console. /// The prompt to display. /// The token to monitor for cancellation requests. /// The prompt input result. public static Task PromptAsync(this IAnsiConsole console, IPrompt prompt, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(console); ArgumentNullException.ThrowIfNull(prompt); return prompt.ShowAsync(console, cancellationToken); } /// /// Displays a prompt to the user. /// /// The prompt result type. /// The console. /// The prompt markup text. /// The token to monitor for cancellation requests. /// The prompt input result. public static Task AskAsync(this IAnsiConsole console, string prompt, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(console); return new TextPrompt(prompt).ShowAsync(console, cancellationToken); } /// /// Displays a prompt to the user. /// /// The prompt result type. /// The console. /// The prompt markup text. /// Specific CultureInfo to use when converting input. /// The token to monitor for cancellation requests. /// The prompt input result. public static Task AskAsync(this IAnsiConsole console, string prompt, CultureInfo? culture, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(console); var textPrompt = new TextPrompt(prompt); textPrompt.Culture = culture; return textPrompt.ShowAsync(console, cancellationToken); } /// /// Displays a prompt with two choices, yes or no. /// /// The console. /// The prompt markup text. /// Specifies the default answer. /// The token to monitor for cancellation requests. /// true if the user selected "yes", otherwise false. public static Task ConfirmAsync(this IAnsiConsole console, string prompt, bool defaultValue = true, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(console); return new ConfirmationPrompt(prompt) { DefaultValue = defaultValue, } .ShowAsync(console, cancellationToken); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Recording.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Creates a recorder for the specified console. /// /// The console to record. /// A recorder for the specified console. public static Recorder CreateRecorder(this IAnsiConsole console) { ArgumentNullException.ThrowIfNull(console); return new Recorder(console); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Screen.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Switches to an alternate screen buffer if the terminal supports it. /// /// The console. /// The action to execute within the alternate screen buffer. public static void AlternateScreen(this IAnsiConsole console, Action action) { ArgumentNullException.ThrowIfNull(console); if (!console.Profile.Capabilities.Ansi) { throw new NotSupportedException("Alternate buffers are not supported since your terminal does not support ANSI."); } if (!console.Profile.Capabilities.AlternateBuffer) { throw new NotSupportedException("Alternate buffers are not supported by your terminal."); } // Switch to alternate screen console.WriteAnsi(w => { w.EnterAltScreen(); w.CursorHome(); }); try { // Execute custom action action(); } finally { // Switch back to primary screen console.WriteAnsi(w => w.ExitAltScreen()); } } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.Write.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Writes the specified string value to the console. /// /// The console to write to. /// The text to write. public static void Write(this IAnsiConsole console, string text) { ArgumentNullException.ThrowIfNull(console); ArgumentNullException.ThrowIfNull(text); console.Write(new Text(text, Style.Plain)); } /// /// Writes the specified string value to the console. /// /// The console to write to. /// The text to write. /// The text style or if . public static void Write(this IAnsiConsole console, string text, Style? style) { ArgumentNullException.ThrowIfNull(console); ArgumentNullException.ThrowIfNull(text); console.Write(new Text(text, style)); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.WriteLine.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Writes an empty line to the console. /// /// The console to write to. public static void WriteLine(this IAnsiConsole console) { ArgumentNullException.ThrowIfNull(console); console.Write(Text.NewLine); } /// /// Writes the specified string value, followed by the current line terminator, to the console. /// /// The console to write to. /// The text to write. public static void WriteLine(this IAnsiConsole console, string text) { ArgumentNullException.ThrowIfNull(console); ArgumentNullException.ThrowIfNull(text); WriteLine(console, text, Style.Plain); } /// /// Writes the specified string value, followed by the current line terminator, to the console. /// /// The console to write to. /// The text to write. /// The text style or if . public static void WriteLine(this IAnsiConsole console, string text, Style? style) { ArgumentNullException.ThrowIfNull(console); ArgumentNullException.ThrowIfNull(text); console.Write(text + Environment.NewLine, style); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiConsoleExtensions.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class AnsiConsoleExtensions { /// /// Clears the console. /// /// The console to clear. public static void Clear(this IAnsiConsole console) { ArgumentNullException.ThrowIfNull(console); console.Clear(true); } } ================================================ FILE: src/Spectre.Console/Extensions/AnsiWriterExtensions.cs ================================================ namespace Spectre.Console; internal static class AnsiWriterExtensions { public static void Write(this AnsiWriter writer, IAnsiConsole console, IRenderable? renderable) { ArgumentNullException.ThrowIfNull(writer); ArgumentNullException.ThrowIfNull(console); if (renderable == null) { return; } foreach (var segment in renderable.GetSegments(console)) { if (segment.IsControlCode) { writer.Write(segment.Text); continue; } var parts = segment.Text.NormalizeNewLines().Split(['\n']); foreach (var (_, _, last, part) in parts.Enumerate()) { if (!string.IsNullOrEmpty(part)) { writer.Write(part, segment.Style, segment.Link); } if (!last) { writer.WriteLine(); } } } } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/CharExtensions.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static partial class CharExtensions { #if WCWIDTH /// /// Gets the cell width of a character. /// /// The character to get the cell width of. /// The cell width of the character. public static int GetCellWidth(this char character) { return Cell.GetCellLength(character); } #endif internal static bool IsDigit(this char character, int min = 0) { return char.IsDigit(character) && character >= (char)min; } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/DayOfWeekExtensions.cs ================================================ namespace Spectre.Console; internal static class DayOfWeekExtensions { public static string GetAbbreviatedDayName(this DayOfWeek day, CultureInfo culture) { culture ??= CultureInfo.InvariantCulture; return culture.DateTimeFormat .GetAbbreviatedDayName(day) .CapitalizeFirstLetter(culture); } public static DayOfWeek GetNextWeekDay(this DayOfWeek day) { var next = (int)day + 1; if (next > (int)DayOfWeek.Saturday) { return DayOfWeek.Sunday; } return (DayOfWeek)next; } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/DictionaryExtensions.cs ================================================ namespace Spectre.Console; internal static class DictionaryExtensions { public static void Deconstruct(this KeyValuePair tuple, out T1 key, out T2 value) { key = tuple.Key; value = tuple.Value; } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/EnumerableExtensions.cs ================================================ namespace Spectre.Console; internal static class EnumerableExtensions { // List.Reverse clashes with IEnumerable.Reverse, so this method only exists // so we won't have to cast List to IEnumerable. public static IEnumerable ReverseEnumerable(this IEnumerable source) { ArgumentNullException.ThrowIfNull(source); return source.Reverse(); } public static bool None(this IEnumerable source, Func predicate) { return !source.Any(predicate); } public static IEnumerable Repeat(this IEnumerable source, int count) { while (count-- > 0) { foreach (var item in source) { yield return item; } } } public static int IndexOf(this IEnumerable source, T item) { var index = 0; foreach (var candidate in source) { if (Equals(candidate, item)) { return index; } index++; } return -1; } public static int GetCount(this IEnumerable source) { if (source is IList list) { return list.Count; } if (source is T[] array) { return array.Length; } return source.Count(); } public static void ForEach(this IEnumerable source, Action action) { foreach (var item in source) { action(item); } } public static bool AnyTrue(this IEnumerable source) { return source.Any(b => b); } public static IEnumerable<(int Index, bool First, bool Last, T Item)> Enumerate(this IEnumerable source) { ArgumentNullException.ThrowIfNull(source); return Enumerate(source.GetEnumerator()); } public static IEnumerable<(int Index, bool First, bool Last, T Item)> Enumerate(this IEnumerator source) { ArgumentNullException.ThrowIfNull(source); var first = true; var last = !source.MoveNext(); T current; for (var index = 0; !last; index++) { current = source.Current; last = !source.MoveNext(); yield return (index, first, last, current); first = false; } } public static IEnumerable SelectIndex(this IEnumerable source, Func func) { return source.Select((value, index) => func(value, index)); } #if !NET6_0_OR_GREATER public static IEnumerable<(TFirst First, TSecond Second)> Zip( this IEnumerable source, IEnumerable first) { return source.Zip(first, (first, second) => (first, second)); } #endif public static IEnumerable<(TFirst First, TSecond Second, TThird Third)> ZipThree( this IEnumerable first, IEnumerable second, IEnumerable third) { return first.Zip(second, (a, b) => (a, b)) .Zip(third, (a, b) => (a.a, a.b, b)); } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/ExceptionExtensions.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static class ExceptionExtensions { /// /// Gets a representation of the exception. /// /// The exception to format. /// The exception format options. /// A representing the exception. [RequiresDynamicCode(ExceptionFormatter.AotWarning)] public static IRenderable GetRenderable(this Exception exception, ExceptionFormats format = ExceptionFormats.Default) { ArgumentNullException.ThrowIfNull(exception); return GetRenderable(exception, new ExceptionSettings { Format = format, }); } /// /// Gets a representation of the exception. /// /// The exception to format. /// The exception settings. /// A representing the exception. [RequiresDynamicCode(ExceptionFormatter.AotWarning)] public static IRenderable GetRenderable(this Exception exception, ExceptionSettings settings) { ArgumentNullException.ThrowIfNull(exception); ArgumentNullException.ThrowIfNull(settings); return ExceptionFormatter.Format(exception, settings); } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/Int32Extensions.cs ================================================ namespace Spectre.Console; internal static class Int32Extensions { public static int Clamp(this int value, int min, int max) { if (value <= min) { return min; } if (value >= max) { return max; } return value; } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/ListExtensions.cs ================================================ namespace Spectre.Console; internal static class ListExtensions { public static void RemoveLast(this List list) { ArgumentNullException.ThrowIfNull(list); if (list.Count > 0) { list.RemoveAt(list.Count - 1); } } public static void AddOrReplaceLast(this List list, T item) { ArgumentNullException.ThrowIfNull(list); if (list.Count == 0) { list.Add(item); } else { list[list.Count - 1] = item; } } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/StackExtensions.cs ================================================ namespace Spectre.Console; internal static class StackExtensions { public static void PushRange(this Stack stack, IEnumerable source) { ArgumentNullException.ThrowIfNull(stack); if (source != null) { foreach (var item in source) { stack.Push(item); } } } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/StringBuilderExtensions.cs ================================================ namespace Spectre.Console; internal static class StringBuilderExtensions { public static StringBuilder AppendWithStyle(this StringBuilder builder, Style? style, int? value) { return AppendWithStyle(builder, style, value?.ToString(CultureInfo.InvariantCulture)); } public static StringBuilder AppendWithStyle(this StringBuilder builder, Style? style, string? value) { value ??= string.Empty; if (style != null) { return builder.Append('[') .Append(style.Value.ToMarkup()) .Append(']') .Append(value.EscapeMarkup()) .Append("[/]"); } return builder.Append(value); } public static void AppendSpan(this StringBuilder builder, ReadOnlySpan span) { // NetStandard 2 lacks the override for StringBuilder to add the span. We'll need to convert the span // to a string for it, but for .NET 6.0 or newer we'll use the override. #if NETSTANDARD2_0 builder.Append(span.ToString()); #else builder.Append(span); #endif } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/StringExtensions.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static class StringExtensions { // Cache whether or not internally normalized line endings // already are normalized. No reason to do yet another replace if it is. private static readonly bool _alreadyNormalized = Environment.NewLine.Equals("\n", StringComparison.OrdinalIgnoreCase); /// /// Gets the cell width of the specified text. /// /// The text to get the cell width of. /// The cell width of the text. public static int GetCellWidth(this string text) { return Cell.GetCellLength(text); } internal static string CapitalizeFirstLetter(this string? text, CultureInfo? culture = null) { if (text == null) { return string.Empty; } culture ??= CultureInfo.InvariantCulture; if (text.Length > 0 && char.IsLower(text[0])) { text = string.Format(culture, "{0}{1}", char.ToUpper(text[0], culture), text.Substring(1)); } return text; } internal static string? RemoveNewLines(this string? text) { return text?.ReplaceExact("\r\n", string.Empty) ?.ReplaceExact("\n", string.Empty); } internal static string NormalizeNewLines(this string? text, bool native = false) { text = text?.ReplaceExact("\r\n", "\n"); text ??= string.Empty; if (native && !_alreadyNormalized) { text = text.ReplaceExact("\n", Environment.NewLine); } return text; } internal static string[] SplitLines(this string text) { var result = text?.NormalizeNewLines()?.Split(['\n'], StringSplitOptions.None); return result ?? []; } internal static string[] SplitWords(this string word, StringSplitOptions options = StringSplitOptions.None) { var result = new List(); static string Read(StringBuffer reader, Func criteria) { var buffer = new StringBuilder(); while (!reader.Eof) { var current = reader.Peek(); if (!criteria(current)) { break; } buffer.Append(reader.Read()); } return buffer.ToString(); } using (var reader = new StringBuffer(word)) { while (!reader.Eof) { var current = reader.Peek(); if (char.IsWhiteSpace(current)) { var x = Read(reader, c => char.IsWhiteSpace(c)); if (options != StringSplitOptions.RemoveEmptyEntries) { result.Add(x); } } else { result.Add(Read(reader, c => !char.IsWhiteSpace(c))); } } } return result.ToArray(); } internal static string Repeat(this string text, int count) { ArgumentNullException.ThrowIfNull(text); if (count <= 0) { return string.Empty; } if (count == 1) { return text; } return string.Concat(Enumerable.Repeat(text, count)); } internal static string ReplaceExact(this string text, string oldValue, string? newValue) { #if NETSTANDARD2_0 return text.Replace(oldValue, newValue); #else return text.Replace(oldValue, newValue, StringComparison.Ordinal); #endif } internal static bool ContainsExact(this string text, string value) { #if NETSTANDARD2_0 return text.Contains(value); #else return text.Contains(value, StringComparison.Ordinal); #endif } #if NETSTANDARD2_0 internal static bool Contains(this string target, string value, System.StringComparison comparisonType) { return target.IndexOf(value, comparisonType) != -1; } #endif /// /// "Masks" every character in a string. /// /// String value to mask. /// Character to use for masking. /// Masked string. public static string Mask(this string value, char? mask) { if (mask is null) { return string.Empty; } return new string(mask.Value, value.Length); } } ================================================ FILE: src/Spectre.Console/Extensions/Bcl/TextWriterExtensions.cs ================================================ namespace Spectre.Console; internal static class TextWriterExtensions { public static bool IsStandardOut(this TextWriter writer) { try { return writer == System.Console.Out; } catch { return false; } } public static bool IsStandardError(this TextWriter writer) { try { return writer == System.Console.Error; } catch { return false; } } } ================================================ FILE: src/Spectre.Console/Generated/Backport.System.Threading.Lock.SourceGenerator/Backport.System.Threading.Lock.SourceGenerator.Generator/Backport.System.Threading.Lock.SourceGenerator.AssemblyInfo.cs ================================================ // Copyright (c) All contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #define SOURCE_GENERATOR #pragma warning disable RS0016 using System.Security; #if NET9_0_OR_GREATER using System.Runtime.CompilerServices; [assembly: TypeForwardedTo(typeof(System.Threading.Lock))] #endif #if !SOURCE_GENERATOR [assembly: SecurityTransparent] #endif #pragma warning restore RS0016 ================================================ FILE: src/Spectre.Console/Generated/Backport.System.Threading.Lock.SourceGenerator/Backport.System.Threading.Lock.SourceGenerator.Generator/Backport.System.Threading.Lock.SourceGenerator.Lock.cs ================================================ // Copyright (c) All contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #define SOURCE_GENERATOR #pragma warning disable SA1625 // ElementDocumentationMustNotBeCopiedAndPasted #pragma warning disable SA1649 // SA1649FileNameMustMatchTypeName #if (NETSTANDARD2_1_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER) && !NET9_0_OR_GREATER using System.Runtime.CompilerServices; #pragma warning disable IDE0130 // Namespace does not match folder structure namespace System.Threading; #pragma warning restore IDE0130 // Namespace does not match folder structure /// /// A backport of .NET 9.0+'s System.Threading.Lock. Provides a way to get mutual exclusion in regions of code between different threads. /// A lock may be held by one thread at a time. /// /// /// Threads that cannot immediately enter the lock may wait for the lock to be exited or until a specified timeout. A thread /// that holds a lock may enter the lock repeatedly without exiting it, such as recursively, in which case the thread should /// eventually exit the lock the same number of times to fully exit the lock and allow other threads to enter the lock. /// #if SOURCE_GENERATOR internal #else public #endif sealed class Lock { #pragma warning disable CS9216 // A value of type 'System.Threading.Lock' converted to a different type will use likely unintended monitor-based locking in 'lock' statement. /// /// Determines whether the current thread holds this lock. /// /// /// true if the current thread holds this lock; otherwise, false. /// #pragma warning disable SA1623 // Property summary documentation should match accessors public bool IsHeldByCurrentThread => Monitor.IsEntered(this); #pragma warning restore SA1623 // Property summary documentation should match accessors /// /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Enter() => Monitor.Enter(this); /// /// /// /// /// /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool TryEnter() => Monitor.TryEnter(this); /// /// /// /// /// /// /// A representing the amount of time to wait for the lock. /// A value of -1 millisecond specifies an infinite wait. /// The value of timeout in milliseconds is negative and is not equal to /// (-1 millisecond), or is greater than . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool TryEnter(TimeSpan timeout) => Monitor.TryEnter(this, timeout); /// /// /// /// /// /// /// The number of milliseconds to wait for the lock. /// millisecondsTimeout is negative, and not equal to . [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool TryEnter(int millisecondsTimeout) => Monitor.TryEnter(this, millisecondsTimeout); /// /// /// /// The current thread does not own the lock for the specified object. [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Exit() => Monitor.Exit(this); #pragma warning restore CS9216 // A value of type 'System.Threading.Lock' converted to a different type will use likely unintended monitor-based locking in 'lock' statement. /// /// Enters the lock and returns a that may be disposed to exit the lock. Once the method returns, /// the calling thread would be the only thread that holds the lock. This method is intended to be used along with a /// language construct that would automatically dispose the , such as with the C# using statement. /// /// /// A that may be disposed to exit the lock. /// /// /// If the lock cannot be entered immediately, the calling thread waits for the lock to be exited. If the lock is /// already held by the calling thread, the lock is entered again. The calling thread should exit the lock, such as by /// disposing the returned , as many times as it had entered the lock to fully exit the lock and /// allow other threads to enter the lock. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public Scope EnterScope() { this.Enter(); return new Scope(this); } /// /// A disposable structure that is returned by , which when disposed, exits the lock. /// public ref struct Scope(Lock @lock) { /// /// Exits the lock. /// /// /// If the calling thread holds the lock multiple times, such as recursively, the lock is exited only once. The /// calling thread should ensure that each enter is matched with an exit. /// /// /// The calling thread does not hold the lock. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public readonly void Dispose() => @lock.Exit(); } } #endif #pragma warning restore SA1649 // SA1649FileNameMustMatchTypeName #pragma warning restore SA1625 // ElementDocumentationMustNotBeCopiedAndPasted ================================================ FILE: src/Spectre.Console/Generated/Backport.System.Threading.Lock.SourceGenerator/Backport.System.Threading.Lock.SourceGenerator.Generator/Backport.System.Threading.Lock.SourceGenerator.LockFactory.cs ================================================ // Copyright (c) All contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #define SOURCE_GENERATOR #pragma warning disable SA1649 // SA1649FileNameMustMatchTypeName #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER using System.Runtime.CompilerServices; #endif #if NET9_0_OR_GREATER using FrameworkNamespace = System.Threading; #endif #pragma warning disable IDE0130 // Namespace does not match folder structure namespace Backport.System.Threading; #pragma warning restore IDE0130 // Namespace does not match folder structure #if NET9_0_OR_GREATER /// /// Represents a factory class for backporting .NET 9.0's System.Threading.Lock to prior framework versions. /// If your project does not target anything in the .NET Framework (including .NET Standard 2.0), you do not need to use this; simply use . /// public static class LockFactory { /// /// Creates a new instance of . On frameworks prior to .NET 9.0, a different backported class is returned. /// If your project does not target anything in the .NET Framework (including .NET Standard 2.0), you do not need to use this; simply use . /// /// An instance of . [MethodImpl(MethodImplOptions.AggressiveInlining)] public static FrameworkNamespace.Lock Create() => new(); } #else /// /// Represents a factory class for backporting .NET 9.0's System.Threading.Lock to prior framework versions. /// If your project does not target anything in the .NET Framework (including .NET Standard 2.0), you do not need to use this; simply use System.Threading.Lock. /// #if SOURCE_GENERATOR internal #else public #endif static class LockFactory { /// /// Creates a new instance of . On .NET 9.0 or later, an instance of System.Threading.Lock is returned. /// If your project does not target anything in the .NET Framework (including .NET Standard 2.0), you do not need to use this; simply use System.Threading.Lock. /// /// An instance of . #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public static Lock Create() => new(); } #endif #pragma warning restore SA1649 // SA1649FileNameMustMatchTypeName ================================================ FILE: src/Spectre.Console/Generated/Backport.System.Threading.Lock.SourceGenerator/Backport.System.Threading.Lock.SourceGenerator.Generator/Backport.System.Threading.Lock.SourceGenerator.ThreadAbortableLock.cs ================================================ // Copyright (c) All contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. #define SOURCE_GENERATOR #pragma warning disable SA1625 // ElementDocumentationMustNotBeCopiedAndPasted #pragma warning disable SA1649 // SA1649FileNameMustMatchTypeName #if !NET9_0_OR_GREATER using System; #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER using System.Runtime.CompilerServices; #endif using System.Threading; #pragma warning disable IDE0130 // Namespace does not match folder structure namespace Backport.System.Threading; #pragma warning restore IDE0130 // Namespace does not match folder structure /// /// A backport of .NET 9.0+'s System.Threading.Lock. Provides a way to get mutual exclusion in regions of code between different threads. /// A lock may be held by one thread at a time. Do not try and create an instance of this class; use . /// /// /// Threads that cannot immediately enter the lock may wait for the lock to be exited or until a specified timeout. A thread /// that holds a lock may enter the lock repeatedly without exiting it, such as recursively, in which case the thread should /// eventually exit the lock the same number of times to fully exit the lock and allow other threads to enter the lock. /// #pragma warning disable SA1649 // SA1649FileNameMustMatchTypeName #if SOURCE_GENERATOR internal #else public #endif sealed class Lock #pragma warning restore SA1649 // SA1649FileNameMustMatchTypeName { #pragma warning disable SA1642 // ConstructorSummaryDocumentationMustBeginWithStandardText /// /// Use instead. /// #pragma warning restore SA1642 // ConstructorSummaryDocumentationMustBeginWithStandardText internal Lock() { } #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER /// /// Determines whether the current thread holds this lock. /// /// /// true if the current thread holds this lock; otherwise, false. /// /// #pragma warning disable SA1623 // Property summary documentation should match accessors public bool IsHeldByCurrentThread => Monitor.IsEntered(this); #pragma warning restore SA1623 // Property summary documentation should match accessors #endif /// /// /// #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public void Enter() => Monitor.Enter(this); /// /// /// /// /// /// #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public bool TryEnter() => Monitor.TryEnter(this); /// /// /// /// /// /// /// A representing the amount of time to wait for the lock. /// A value of -1 millisecond specifies an infinite wait. /// The value of timeout in milliseconds is negative and is not equal to /// (-1 millisecond), or is greater than . #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public bool TryEnter(TimeSpan timeout) => Monitor.TryEnter(this, timeout); /// /// /// /// /// /// /// The number of milliseconds to wait for the lock. /// millisecondsTimeout is negative, and not equal to . #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public bool TryEnter(int millisecondsTimeout) => Monitor.TryEnter(this, millisecondsTimeout); /// /// /// /// #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public void Exit() => Monitor.Exit(this); /// /// Enters the lock and returns a that may be disposed to exit the lock. Once the method returns, /// the calling thread would be the only thread that holds the lock. This method is intended to be used along with a /// language construct that would automatically dispose the , such as with the C# using statement. /// /// /// A that may be disposed to exit the lock. /// /// /// If the lock cannot be entered immediately, the calling thread waits for the lock to be exited. If the lock is /// already held by the calling thread, the lock is entered again. The calling thread should exit the lock, such as by /// disposing the returned , as many times as it had entered the lock to fully exit the lock and /// allow other threads to enter the lock. /// #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif #if (NET40_OR_GREATER || NETSTANDARD2_0_OR_GREATER) && !NET5_0_OR_GREATER [Obsolete("This method is a best-effort at hardening against thread aborts, but can theoretically retain lock on pre-.NET 5.0. Use with caution.")] public Scope EnterScope() { bool lockTaken = false; try { Monitor.Enter(this, ref lockTaken); return new Scope(this); } catch (ThreadAbortException) { if (lockTaken) { Monitor.Exit(this); } throw; } } #else public Scope EnterScope() { Monitor.Enter(this); return new Scope(this); } #endif /// /// A disposable structure that is returned by , which when disposed, exits the lock. /// public ref struct Scope(Lock @lock) { /// /// Exits the lock. /// /// /// If the calling thread holds the lock multiple times, such as recursively, the lock is exited only once. The /// calling thread should ensure that each enter is matched with an exit. /// /// /// The calling thread does not hold the lock. /// #if NET45_OR_GREATER || NETSTANDARD1_0_OR_GREATER || NETCOREAPP1_0_OR_GREATER || NET5_0_OR_GREATER [MethodImpl(MethodImplOptions.AggressiveInlining)] #endif public readonly void Dispose() => @lock.Exit(); } } #endif #pragma warning restore SA1649 // SA1649FileNameMustMatchTypeName #pragma warning restore SA1625 // ElementDocumentationMustNotBeCopiedAndPasted ================================================ FILE: src/Spectre.Console/Generated/Spectre.Console.SourceGenerator/Spectre.Console.SourceGenerator.Colors.ColorGenerator/Color.Generated.g.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ using System.Diagnostics.CodeAnalysis; namespace Spectre.Console { /// /// Represents a color. /// public partial struct Color { internal Color(byte number, byte red, byte green, byte blue, bool isDefault = false) : this(red, green, blue) { Number = number; IsDefault = isDefault; } /// /// Gets the color "Black" (RGB 0,0,0). /// public static Color Black { get; } = new Color(0, 0, 0, 0); /// /// Gets the color "Maroon" (RGB 128,0,0). /// public static Color Maroon { get; } = new Color(1, 128, 0, 0); /// /// Gets the color "Green" (RGB 0,128,0). /// public static Color Green { get; } = new Color(2, 0, 128, 0); /// /// Gets the color "Olive" (RGB 128,128,0). /// public static Color Olive { get; } = new Color(3, 128, 128, 0); /// /// Gets the color "Navy" (RGB 0,0,128). /// public static Color Navy { get; } = new Color(4, 0, 0, 128); /// /// Gets the color "Purple" (RGB 128,0,128). /// public static Color Purple { get; } = new Color(5, 128, 0, 128); /// /// Gets the color "Teal" (RGB 0,128,128). /// public static Color Teal { get; } = new Color(6, 0, 128, 128); /// /// Gets the color "Silver" (RGB 192,192,192). /// public static Color Silver { get; } = new Color(7, 192, 192, 192); /// /// Gets the color "Grey" (RGB 128,128,128). /// public static Color Grey { get; } = new Color(8, 128, 128, 128); /// /// Gets the color "Gray" (RGB 128,128,128). /// public static Color Gray { get; } = new Color(8, 128, 128, 128); /// /// Gets the color "Red" (RGB 255,0,0). /// public static Color Red { get; } = new Color(9, 255, 0, 0); /// /// Gets the color "Lime" (RGB 0,255,0). /// public static Color Lime { get; } = new Color(10, 0, 255, 0); /// /// Gets the color "Yellow" (RGB 255,255,0). /// public static Color Yellow { get; } = new Color(11, 255, 255, 0); /// /// Gets the color "Blue" (RGB 0,0,255). /// public static Color Blue { get; } = new Color(12, 0, 0, 255); /// /// Gets the color "Fuchsia" (RGB 255,0,255). /// public static Color Fuchsia { get; } = new Color(13, 255, 0, 255); /// /// Gets the color "Magenta" (RGB 255,0,255). /// public static Color Magenta { get; } = new Color(13, 255, 0, 255); /// /// Gets the color "Aqua" (RGB 0,255,255). /// public static Color Aqua { get; } = new Color(14, 0, 255, 255); /// /// Gets the color "Cyan" (RGB 0,255,255). /// public static Color Cyan { get; } = new Color(14, 0, 255, 255); /// /// Gets the color "White" (RGB 255,255,255). /// public static Color White { get; } = new Color(15, 255, 255, 255); /// /// Gets the color "Grey0" (RGB 0,0,0). /// public static Color Grey0 { get; } = new Color(16, 0, 0, 0); /// /// Gets the color "Gray0" (RGB 0,0,0). /// public static Color Gray0 { get; } = new Color(16, 0, 0, 0); /// /// Gets the color "NavyBlue" (RGB 0,0,95). /// public static Color NavyBlue { get; } = new Color(17, 0, 0, 95); /// /// Gets the color "DarkBlue" (RGB 0,0,135). /// public static Color DarkBlue { get; } = new Color(18, 0, 0, 135); /// /// Gets the color "Blue3" (RGB 0,0,175). /// public static Color Blue3 { get; } = new Color(19, 0, 0, 175); /// /// Gets the color "Blue3_1" (RGB 0,0,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Blue3_1 { get; } = new Color(20, 0, 0, 215); /// /// Gets the color "Blue1" (RGB 0,0,255). /// public static Color Blue1 { get; } = new Color(21, 0, 0, 255); /// /// Gets the color "DarkGreen" (RGB 0,95,0). /// public static Color DarkGreen { get; } = new Color(22, 0, 95, 0); /// /// Gets the color "DeepSkyBlue4" (RGB 0,95,95). /// public static Color DeepSkyBlue4 { get; } = new Color(23, 0, 95, 95); /// /// Gets the color "DeepSkyBlue4_1" (RGB 0,95,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DeepSkyBlue4_1 { get; } = new Color(24, 0, 95, 135); /// /// Gets the color "DeepSkyBlue4_2" (RGB 0,95,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DeepSkyBlue4_2 { get; } = new Color(25, 0, 95, 175); /// /// Gets the color "DodgerBlue3" (RGB 0,95,215). /// public static Color DodgerBlue3 { get; } = new Color(26, 0, 95, 215); /// /// Gets the color "DodgerBlue2" (RGB 0,95,255). /// public static Color DodgerBlue2 { get; } = new Color(27, 0, 95, 255); /// /// Gets the color "Green4" (RGB 0,135,0). /// public static Color Green4 { get; } = new Color(28, 0, 135, 0); /// /// Gets the color "SpringGreen4" (RGB 0,135,95). /// public static Color SpringGreen4 { get; } = new Color(29, 0, 135, 95); /// /// Gets the color "Turquoise4" (RGB 0,135,135). /// public static Color Turquoise4 { get; } = new Color(30, 0, 135, 135); /// /// Gets the color "DeepSkyBlue3" (RGB 0,135,175). /// public static Color DeepSkyBlue3 { get; } = new Color(31, 0, 135, 175); /// /// Gets the color "DeepSkyBlue3_1" (RGB 0,135,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DeepSkyBlue3_1 { get; } = new Color(32, 0, 135, 215); /// /// Gets the color "DodgerBlue1" (RGB 0,135,255). /// public static Color DodgerBlue1 { get; } = new Color(33, 0, 135, 255); /// /// Gets the color "Green3" (RGB 0,175,0). /// public static Color Green3 { get; } = new Color(34, 0, 175, 0); /// /// Gets the color "SpringGreen3" (RGB 0,175,95). /// public static Color SpringGreen3 { get; } = new Color(35, 0, 175, 95); /// /// Gets the color "DarkCyan" (RGB 0,175,135). /// public static Color DarkCyan { get; } = new Color(36, 0, 175, 135); /// /// Gets the color "LightSeaGreen" (RGB 0,175,175). /// public static Color LightSeaGreen { get; } = new Color(37, 0, 175, 175); /// /// Gets the color "DeepSkyBlue2" (RGB 0,175,215). /// public static Color DeepSkyBlue2 { get; } = new Color(38, 0, 175, 215); /// /// Gets the color "DeepSkyBlue1" (RGB 0,175,255). /// public static Color DeepSkyBlue1 { get; } = new Color(39, 0, 175, 255); /// /// Gets the color "Green3_1" (RGB 0,215,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Green3_1 { get; } = new Color(40, 0, 215, 0); /// /// Gets the color "SpringGreen3_1" (RGB 0,215,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color SpringGreen3_1 { get; } = new Color(41, 0, 215, 95); /// /// Gets the color "SpringGreen2" (RGB 0,215,135). /// public static Color SpringGreen2 { get; } = new Color(42, 0, 215, 135); /// /// Gets the color "Cyan3" (RGB 0,215,175). /// public static Color Cyan3 { get; } = new Color(43, 0, 215, 175); /// /// Gets the color "DarkTurquoise" (RGB 0,215,215). /// public static Color DarkTurquoise { get; } = new Color(44, 0, 215, 215); /// /// Gets the color "Turquoise2" (RGB 0,215,255). /// public static Color Turquoise2 { get; } = new Color(45, 0, 215, 255); /// /// Gets the color "Green1" (RGB 0,255,0). /// public static Color Green1 { get; } = new Color(46, 0, 255, 0); /// /// Gets the color "SpringGreen2_1" (RGB 0,255,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color SpringGreen2_1 { get; } = new Color(47, 0, 255, 95); /// /// Gets the color "SpringGreen1" (RGB 0,255,135). /// public static Color SpringGreen1 { get; } = new Color(48, 0, 255, 135); /// /// Gets the color "MediumSpringGreen" (RGB 0,255,175). /// public static Color MediumSpringGreen { get; } = new Color(49, 0, 255, 175); /// /// Gets the color "Cyan2" (RGB 0,255,215). /// public static Color Cyan2 { get; } = new Color(50, 0, 255, 215); /// /// Gets the color "Cyan1" (RGB 0,255,255). /// public static Color Cyan1 { get; } = new Color(51, 0, 255, 255); /// /// Gets the color "DarkRed" (RGB 95,0,0). /// public static Color DarkRed { get; } = new Color(52, 95, 0, 0); /// /// Gets the color "DeepPink4" (RGB 95,0,95). /// public static Color DeepPink4 { get; } = new Color(53, 95, 0, 95); /// /// Gets the color "Purple4" (RGB 95,0,135). /// public static Color Purple4 { get; } = new Color(54, 95, 0, 135); /// /// Gets the color "Purple4_1" (RGB 95,0,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Purple4_1 { get; } = new Color(55, 95, 0, 175); /// /// Gets the color "Purple3" (RGB 95,0,215). /// public static Color Purple3 { get; } = new Color(56, 95, 0, 215); /// /// Gets the color "BlueViolet" (RGB 95,0,255). /// public static Color BlueViolet { get; } = new Color(57, 95, 0, 255); /// /// Gets the color "Orange4" (RGB 95,95,0). /// public static Color Orange4 { get; } = new Color(58, 95, 95, 0); /// /// Gets the color "Grey37" (RGB 95,95,95). /// public static Color Grey37 { get; } = new Color(59, 95, 95, 95); /// /// Gets the color "Gray37" (RGB 95,95,95). /// public static Color Gray37 { get; } = new Color(59, 95, 95, 95); /// /// Gets the color "MediumPurple4" (RGB 95,95,135). /// public static Color MediumPurple4 { get; } = new Color(60, 95, 95, 135); /// /// Gets the color "SlateBlue3" (RGB 95,95,175). /// public static Color SlateBlue3 { get; } = new Color(61, 95, 95, 175); /// /// Gets the color "SlateBlue3_1" (RGB 95,95,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color SlateBlue3_1 { get; } = new Color(62, 95, 95, 215); /// /// Gets the color "RoyalBlue1" (RGB 95,95,255). /// public static Color RoyalBlue1 { get; } = new Color(63, 95, 95, 255); /// /// Gets the color "Chartreuse4" (RGB 95,135,0). /// public static Color Chartreuse4 { get; } = new Color(64, 95, 135, 0); /// /// Gets the color "DarkSeaGreen4" (RGB 95,135,95). /// public static Color DarkSeaGreen4 { get; } = new Color(65, 95, 135, 95); /// /// Gets the color "PaleTurquoise4" (RGB 95,135,135). /// public static Color PaleTurquoise4 { get; } = new Color(66, 95, 135, 135); /// /// Gets the color "SteelBlue" (RGB 95,135,175). /// public static Color SteelBlue { get; } = new Color(67, 95, 135, 175); /// /// Gets the color "SteelBlue3" (RGB 95,135,215). /// public static Color SteelBlue3 { get; } = new Color(68, 95, 135, 215); /// /// Gets the color "CornflowerBlue" (RGB 95,135,255). /// public static Color CornflowerBlue { get; } = new Color(69, 95, 135, 255); /// /// Gets the color "Chartreuse3" (RGB 95,175,0). /// public static Color Chartreuse3 { get; } = new Color(70, 95, 175, 0); /// /// Gets the color "DarkSeaGreen4_1" (RGB 95,175,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkSeaGreen4_1 { get; } = new Color(71, 95, 175, 95); /// /// Gets the color "CadetBlue" (RGB 95,175,135). /// public static Color CadetBlue { get; } = new Color(72, 95, 175, 135); /// /// Gets the color "CadetBlue_1" (RGB 95,175,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color CadetBlue_1 { get; } = new Color(73, 95, 175, 175); /// /// Gets the color "SkyBlue3" (RGB 95,175,215). /// public static Color SkyBlue3 { get; } = new Color(74, 95, 175, 215); /// /// Gets the color "SteelBlue1" (RGB 95,175,255). /// public static Color SteelBlue1 { get; } = new Color(75, 95, 175, 255); /// /// Gets the color "Chartreuse3_1" (RGB 95,215,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Chartreuse3_1 { get; } = new Color(76, 95, 215, 0); /// /// Gets the color "PaleGreen3" (RGB 95,215,95). /// public static Color PaleGreen3 { get; } = new Color(77, 95, 215, 95); /// /// Gets the color "SeaGreen3" (RGB 95,215,135). /// public static Color SeaGreen3 { get; } = new Color(78, 95, 215, 135); /// /// Gets the color "Aquamarine3" (RGB 95,215,175). /// public static Color Aquamarine3 { get; } = new Color(79, 95, 215, 175); /// /// Gets the color "MediumTurquoise" (RGB 95,215,215). /// public static Color MediumTurquoise { get; } = new Color(80, 95, 215, 215); /// /// Gets the color "SteelBlue1_1" (RGB 95,215,255). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color SteelBlue1_1 { get; } = new Color(81, 95, 215, 255); /// /// Gets the color "Chartreuse2" (RGB 95,255,0). /// public static Color Chartreuse2 { get; } = new Color(82, 95, 255, 0); /// /// Gets the color "SeaGreen2" (RGB 95,255,95). /// public static Color SeaGreen2 { get; } = new Color(83, 95, 255, 95); /// /// Gets the color "SeaGreen1" (RGB 95,255,135). /// public static Color SeaGreen1 { get; } = new Color(84, 95, 255, 135); /// /// Gets the color "SeaGreen1_1" (RGB 95,255,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color SeaGreen1_1 { get; } = new Color(85, 95, 255, 175); /// /// Gets the color "Aquamarine1" (RGB 95,255,215). /// public static Color Aquamarine1 { get; } = new Color(86, 95, 255, 215); /// /// Gets the color "DarkSlateGray2" (RGB 95,255,255). /// public static Color DarkSlateGray2 { get; } = new Color(87, 95, 255, 255); /// /// Gets the color "DarkRed_1" (RGB 135,0,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkRed_1 { get; } = new Color(88, 135, 0, 0); /// /// Gets the color "DeepPink4_1" (RGB 135,0,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DeepPink4_1 { get; } = new Color(89, 135, 0, 95); /// /// Gets the color "DarkMagenta" (RGB 135,0,135). /// public static Color DarkMagenta { get; } = new Color(90, 135, 0, 135); /// /// Gets the color "DarkMagenta_1" (RGB 135,0,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkMagenta_1 { get; } = new Color(91, 135, 0, 175); /// /// Gets the color "DarkViolet" (RGB 135,0,215). /// public static Color DarkViolet { get; } = new Color(92, 135, 0, 215); /// /// Gets the color "Purple_1" (RGB 135,0,255). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Purple_1 { get; } = new Color(93, 135, 0, 255); /// /// Gets the color "Orange4_1" (RGB 135,95,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Orange4_1 { get; } = new Color(94, 135, 95, 0); /// /// Gets the color "LightPink4" (RGB 135,95,95). /// public static Color LightPink4 { get; } = new Color(95, 135, 95, 95); /// /// Gets the color "Plum4" (RGB 135,95,135). /// public static Color Plum4 { get; } = new Color(96, 135, 95, 135); /// /// Gets the color "MediumPurple3" (RGB 135,95,175). /// public static Color MediumPurple3 { get; } = new Color(97, 135, 95, 175); /// /// Gets the color "MediumPurple3_1" (RGB 135,95,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color MediumPurple3_1 { get; } = new Color(98, 135, 95, 215); /// /// Gets the color "SlateBlue1" (RGB 135,95,255). /// public static Color SlateBlue1 { get; } = new Color(99, 135, 95, 255); /// /// Gets the color "Yellow4" (RGB 135,135,0). /// public static Color Yellow4 { get; } = new Color(100, 135, 135, 0); /// /// Gets the color "Wheat4" (RGB 135,135,95). /// public static Color Wheat4 { get; } = new Color(101, 135, 135, 95); /// /// Gets the color "Grey53" (RGB 135,135,135). /// public static Color Grey53 { get; } = new Color(102, 135, 135, 135); /// /// Gets the color "Gray53" (RGB 135,135,135). /// public static Color Gray53 { get; } = new Color(102, 135, 135, 135); /// /// Gets the color "LightSlateGrey" (RGB 135,135,175). /// public static Color LightSlateGrey { get; } = new Color(103, 135, 135, 175); /// /// Gets the color "MediumPurple" (RGB 135,135,215). /// public static Color MediumPurple { get; } = new Color(104, 135, 135, 215); /// /// Gets the color "LightSlateBlue" (RGB 135,135,255). /// public static Color LightSlateBlue { get; } = new Color(105, 135, 135, 255); /// /// Gets the color "Yellow4_1" (RGB 135,175,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Yellow4_1 { get; } = new Color(106, 135, 175, 0); /// /// Gets the color "DarkOliveGreen3" (RGB 135,175,95). /// public static Color DarkOliveGreen3 { get; } = new Color(107, 135, 175, 95); /// /// Gets the color "DarkSeaGreen" (RGB 135,175,135). /// public static Color DarkSeaGreen { get; } = new Color(108, 135, 175, 135); /// /// Gets the color "LightSkyBlue3" (RGB 135,175,175). /// public static Color LightSkyBlue3 { get; } = new Color(109, 135, 175, 175); /// /// Gets the color "LightSkyBlue3_1" (RGB 135,175,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color LightSkyBlue3_1 { get; } = new Color(110, 135, 175, 215); /// /// Gets the color "SkyBlue2" (RGB 135,175,255). /// public static Color SkyBlue2 { get; } = new Color(111, 135, 175, 255); /// /// Gets the color "Chartreuse2_1" (RGB 135,215,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Chartreuse2_1 { get; } = new Color(112, 135, 215, 0); /// /// Gets the color "DarkOliveGreen3_1" (RGB 135,215,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkOliveGreen3_1 { get; } = new Color(113, 135, 215, 95); /// /// Gets the color "PaleGreen3_1" (RGB 135,215,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color PaleGreen3_1 { get; } = new Color(114, 135, 215, 135); /// /// Gets the color "DarkSeaGreen3" (RGB 135,215,175). /// public static Color DarkSeaGreen3 { get; } = new Color(115, 135, 215, 175); /// /// Gets the color "DarkSlateGray3" (RGB 135,215,215). /// public static Color DarkSlateGray3 { get; } = new Color(116, 135, 215, 215); /// /// Gets the color "SkyBlue1" (RGB 135,215,255). /// public static Color SkyBlue1 { get; } = new Color(117, 135, 215, 255); /// /// Gets the color "Chartreuse1" (RGB 135,255,0). /// public static Color Chartreuse1 { get; } = new Color(118, 135, 255, 0); /// /// Gets the color "LightGreen" (RGB 135,255,95). /// public static Color LightGreen { get; } = new Color(119, 135, 255, 95); /// /// Gets the color "LightGreen_1" (RGB 135,255,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color LightGreen_1 { get; } = new Color(120, 135, 255, 135); /// /// Gets the color "PaleGreen1" (RGB 135,255,175). /// public static Color PaleGreen1 { get; } = new Color(121, 135, 255, 175); /// /// Gets the color "Aquamarine1_1" (RGB 135,255,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Aquamarine1_1 { get; } = new Color(122, 135, 255, 215); /// /// Gets the color "DarkSlateGray1" (RGB 135,255,255). /// public static Color DarkSlateGray1 { get; } = new Color(123, 135, 255, 255); /// /// Gets the color "Red3" (RGB 175,0,0). /// public static Color Red3 { get; } = new Color(124, 175, 0, 0); /// /// Gets the color "DeepPink4_2" (RGB 175,0,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DeepPink4_2 { get; } = new Color(125, 175, 0, 95); /// /// Gets the color "MediumVioletRed" (RGB 175,0,135). /// public static Color MediumVioletRed { get; } = new Color(126, 175, 0, 135); /// /// Gets the color "Magenta3" (RGB 175,0,175). /// public static Color Magenta3 { get; } = new Color(127, 175, 0, 175); /// /// Gets the color "DarkViolet_1" (RGB 175,0,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkViolet_1 { get; } = new Color(128, 175, 0, 215); /// /// Gets the color "Purple_2" (RGB 175,0,255). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Purple_2 { get; } = new Color(129, 175, 0, 255); /// /// Gets the color "DarkOrange3" (RGB 175,95,0). /// public static Color DarkOrange3 { get; } = new Color(130, 175, 95, 0); /// /// Gets the color "IndianRed" (RGB 175,95,95). /// public static Color IndianRed { get; } = new Color(131, 175, 95, 95); /// /// Gets the color "HotPink3" (RGB 175,95,135). /// public static Color HotPink3 { get; } = new Color(132, 175, 95, 135); /// /// Gets the color "MediumOrchid3" (RGB 175,95,175). /// public static Color MediumOrchid3 { get; } = new Color(133, 175, 95, 175); /// /// Gets the color "MediumOrchid" (RGB 175,95,215). /// public static Color MediumOrchid { get; } = new Color(134, 175, 95, 215); /// /// Gets the color "MediumPurple2" (RGB 175,95,255). /// public static Color MediumPurple2 { get; } = new Color(135, 175, 95, 255); /// /// Gets the color "DarkGoldenrod" (RGB 175,135,0). /// public static Color DarkGoldenrod { get; } = new Color(136, 175, 135, 0); /// /// Gets the color "LightSalmon3" (RGB 175,135,95). /// public static Color LightSalmon3 { get; } = new Color(137, 175, 135, 95); /// /// Gets the color "RosyBrown" (RGB 175,135,135). /// public static Color RosyBrown { get; } = new Color(138, 175, 135, 135); /// /// Gets the color "Grey63" (RGB 175,135,175). /// public static Color Grey63 { get; } = new Color(139, 175, 135, 175); /// /// Gets the color "Gray63" (RGB 175,135,175). /// public static Color Gray63 { get; } = new Color(139, 175, 135, 175); /// /// Gets the color "MediumPurple2_1" (RGB 175,135,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color MediumPurple2_1 { get; } = new Color(140, 175, 135, 215); /// /// Gets the color "MediumPurple1" (RGB 175,135,255). /// public static Color MediumPurple1 { get; } = new Color(141, 175, 135, 255); /// /// Gets the color "Gold3" (RGB 175,175,0). /// public static Color Gold3 { get; } = new Color(142, 175, 175, 0); /// /// Gets the color "DarkKhaki" (RGB 175,175,95). /// public static Color DarkKhaki { get; } = new Color(143, 175, 175, 95); /// /// Gets the color "NavajoWhite3" (RGB 175,175,135). /// public static Color NavajoWhite3 { get; } = new Color(144, 175, 175, 135); /// /// Gets the color "Grey69" (RGB 175,175,175). /// public static Color Grey69 { get; } = new Color(145, 175, 175, 175); /// /// Gets the color "Gray69" (RGB 175,175,175). /// public static Color Gray69 { get; } = new Color(145, 175, 175, 175); /// /// Gets the color "LightSteelBlue3" (RGB 175,175,215). /// public static Color LightSteelBlue3 { get; } = new Color(146, 175, 175, 215); /// /// Gets the color "LightSteelBlue" (RGB 175,175,255). /// public static Color LightSteelBlue { get; } = new Color(147, 175, 175, 255); /// /// Gets the color "Yellow3" (RGB 175,215,0). /// public static Color Yellow3 { get; } = new Color(148, 175, 215, 0); /// /// Gets the color "DarkOliveGreen3_2" (RGB 175,215,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkOliveGreen3_2 { get; } = new Color(149, 175, 215, 95); /// /// Gets the color "DarkSeaGreen3_1" (RGB 175,215,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkSeaGreen3_1 { get; } = new Color(150, 175, 215, 135); /// /// Gets the color "DarkSeaGreen2" (RGB 175,215,175). /// public static Color DarkSeaGreen2 { get; } = new Color(151, 175, 215, 175); /// /// Gets the color "LightCyan3" (RGB 175,215,215). /// public static Color LightCyan3 { get; } = new Color(152, 175, 215, 215); /// /// Gets the color "LightSkyBlue1" (RGB 175,215,255). /// public static Color LightSkyBlue1 { get; } = new Color(153, 175, 215, 255); /// /// Gets the color "GreenYellow" (RGB 175,255,0). /// public static Color GreenYellow { get; } = new Color(154, 175, 255, 0); /// /// Gets the color "DarkOliveGreen2" (RGB 175,255,95). /// public static Color DarkOliveGreen2 { get; } = new Color(155, 175, 255, 95); /// /// Gets the color "PaleGreen1_1" (RGB 175,255,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color PaleGreen1_1 { get; } = new Color(156, 175, 255, 135); /// /// Gets the color "DarkSeaGreen2_1" (RGB 175,255,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkSeaGreen2_1 { get; } = new Color(157, 175, 255, 175); /// /// Gets the color "DarkSeaGreen1" (RGB 175,255,215). /// public static Color DarkSeaGreen1 { get; } = new Color(158, 175, 255, 215); /// /// Gets the color "PaleTurquoise1" (RGB 175,255,255). /// public static Color PaleTurquoise1 { get; } = new Color(159, 175, 255, 255); /// /// Gets the color "Red3_1" (RGB 215,0,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Red3_1 { get; } = new Color(160, 215, 0, 0); /// /// Gets the color "DeepPink3" (RGB 215,0,95). /// public static Color DeepPink3 { get; } = new Color(161, 215, 0, 95); /// /// Gets the color "DeepPink3_1" (RGB 215,0,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DeepPink3_1 { get; } = new Color(162, 215, 0, 135); /// /// Gets the color "Magenta3_1" (RGB 215,0,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Magenta3_1 { get; } = new Color(163, 215, 0, 175); /// /// Gets the color "Magenta3_2" (RGB 215,0,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Magenta3_2 { get; } = new Color(164, 215, 0, 215); /// /// Gets the color "Magenta2" (RGB 215,0,255). /// public static Color Magenta2 { get; } = new Color(165, 215, 0, 255); /// /// Gets the color "DarkOrange3_1" (RGB 215,95,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkOrange3_1 { get; } = new Color(166, 215, 95, 0); /// /// Gets the color "IndianRed_1" (RGB 215,95,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color IndianRed_1 { get; } = new Color(167, 215, 95, 95); /// /// Gets the color "HotPink3_1" (RGB 215,95,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color HotPink3_1 { get; } = new Color(168, 215, 95, 135); /// /// Gets the color "HotPink2" (RGB 215,95,175). /// public static Color HotPink2 { get; } = new Color(169, 215, 95, 175); /// /// Gets the color "Orchid" (RGB 215,95,215). /// public static Color Orchid { get; } = new Color(170, 215, 95, 215); /// /// Gets the color "MediumOrchid1" (RGB 215,95,255). /// public static Color MediumOrchid1 { get; } = new Color(171, 215, 95, 255); /// /// Gets the color "Orange3" (RGB 215,135,0). /// public static Color Orange3 { get; } = new Color(172, 215, 135, 0); /// /// Gets the color "LightSalmon3_1" (RGB 215,135,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color LightSalmon3_1 { get; } = new Color(173, 215, 135, 95); /// /// Gets the color "LightPink3" (RGB 215,135,135). /// public static Color LightPink3 { get; } = new Color(174, 215, 135, 135); /// /// Gets the color "Pink3" (RGB 215,135,175). /// public static Color Pink3 { get; } = new Color(175, 215, 135, 175); /// /// Gets the color "Plum3" (RGB 215,135,215). /// public static Color Plum3 { get; } = new Color(176, 215, 135, 215); /// /// Gets the color "Violet" (RGB 215,135,255). /// public static Color Violet { get; } = new Color(177, 215, 135, 255); /// /// Gets the color "Gold3_1" (RGB 215,175,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Gold3_1 { get; } = new Color(178, 215, 175, 0); /// /// Gets the color "LightGoldenrod3" (RGB 215,175,95). /// public static Color LightGoldenrod3 { get; } = new Color(179, 215, 175, 95); /// /// Gets the color "Tan" (RGB 215,175,135). /// public static Color Tan { get; } = new Color(180, 215, 175, 135); /// /// Gets the color "MistyRose3" (RGB 215,175,175). /// public static Color MistyRose3 { get; } = new Color(181, 215, 175, 175); /// /// Gets the color "Thistle3" (RGB 215,175,215). /// public static Color Thistle3 { get; } = new Color(182, 215, 175, 215); /// /// Gets the color "Plum2" (RGB 215,175,255). /// public static Color Plum2 { get; } = new Color(183, 215, 175, 255); /// /// Gets the color "Yellow3_1" (RGB 215,215,0). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Yellow3_1 { get; } = new Color(184, 215, 215, 0); /// /// Gets the color "Khaki3" (RGB 215,215,95). /// public static Color Khaki3 { get; } = new Color(185, 215, 215, 95); /// /// Gets the color "LightGoldenrod2" (RGB 215,215,135). /// public static Color LightGoldenrod2 { get; } = new Color(186, 215, 215, 135); /// /// Gets the color "LightYellow3" (RGB 215,215,175). /// public static Color LightYellow3 { get; } = new Color(187, 215, 215, 175); /// /// Gets the color "Grey84" (RGB 215,215,215). /// public static Color Grey84 { get; } = new Color(188, 215, 215, 215); /// /// Gets the color "Gray84" (RGB 215,215,215). /// public static Color Gray84 { get; } = new Color(188, 215, 215, 215); /// /// Gets the color "LightSteelBlue1" (RGB 215,215,255). /// public static Color LightSteelBlue1 { get; } = new Color(189, 215, 215, 255); /// /// Gets the color "Yellow2" (RGB 215,255,0). /// public static Color Yellow2 { get; } = new Color(190, 215, 255, 0); /// /// Gets the color "DarkOliveGreen1" (RGB 215,255,95). /// public static Color DarkOliveGreen1 { get; } = new Color(191, 215, 255, 95); /// /// Gets the color "DarkOliveGreen1_1" (RGB 215,255,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkOliveGreen1_1 { get; } = new Color(192, 215, 255, 135); /// /// Gets the color "DarkSeaGreen1_1" (RGB 215,255,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DarkSeaGreen1_1 { get; } = new Color(193, 215, 255, 175); /// /// Gets the color "Honeydew2" (RGB 215,255,215). /// public static Color Honeydew2 { get; } = new Color(194, 215, 255, 215); /// /// Gets the color "LightCyan1" (RGB 215,255,255). /// public static Color LightCyan1 { get; } = new Color(195, 215, 255, 255); /// /// Gets the color "Red1" (RGB 255,0,0). /// public static Color Red1 { get; } = new Color(196, 255, 0, 0); /// /// Gets the color "DeepPink2" (RGB 255,0,95). /// public static Color DeepPink2 { get; } = new Color(197, 255, 0, 95); /// /// Gets the color "DeepPink1" (RGB 255,0,135). /// public static Color DeepPink1 { get; } = new Color(198, 255, 0, 135); /// /// Gets the color "DeepPink1_1" (RGB 255,0,175). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color DeepPink1_1 { get; } = new Color(199, 255, 0, 175); /// /// Gets the color "Magenta2_1" (RGB 255,0,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color Magenta2_1 { get; } = new Color(200, 255, 0, 215); /// /// Gets the color "Magenta1" (RGB 255,0,255). /// public static Color Magenta1 { get; } = new Color(201, 255, 0, 255); /// /// Gets the color "OrangeRed1" (RGB 255,95,0). /// public static Color OrangeRed1 { get; } = new Color(202, 255, 95, 0); /// /// Gets the color "IndianRed1" (RGB 255,95,95). /// public static Color IndianRed1 { get; } = new Color(203, 255, 95, 95); /// /// Gets the color "IndianRed1_1" (RGB 255,95,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color IndianRed1_1 { get; } = new Color(204, 255, 95, 135); /// /// Gets the color "HotPink" (RGB 255,95,175). /// public static Color HotPink { get; } = new Color(205, 255, 95, 175); /// /// Gets the color "HotPink_1" (RGB 255,95,215). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color HotPink_1 { get; } = new Color(206, 255, 95, 215); /// /// Gets the color "MediumOrchid1_1" (RGB 255,95,255). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color MediumOrchid1_1 { get; } = new Color(207, 255, 95, 255); /// /// Gets the color "DarkOrange" (RGB 255,135,0). /// public static Color DarkOrange { get; } = new Color(208, 255, 135, 0); /// /// Gets the color "Salmon1" (RGB 255,135,95). /// public static Color Salmon1 { get; } = new Color(209, 255, 135, 95); /// /// Gets the color "LightCoral" (RGB 255,135,135). /// public static Color LightCoral { get; } = new Color(210, 255, 135, 135); /// /// Gets the color "PaleVioletRed1" (RGB 255,135,175). /// public static Color PaleVioletRed1 { get; } = new Color(211, 255, 135, 175); /// /// Gets the color "Orchid2" (RGB 255,135,215). /// public static Color Orchid2 { get; } = new Color(212, 255, 135, 215); /// /// Gets the color "Orchid1" (RGB 255,135,255). /// public static Color Orchid1 { get; } = new Color(213, 255, 135, 255); /// /// Gets the color "Orange1" (RGB 255,175,0). /// public static Color Orange1 { get; } = new Color(214, 255, 175, 0); /// /// Gets the color "SandyBrown" (RGB 255,175,95). /// public static Color SandyBrown { get; } = new Color(215, 255, 175, 95); /// /// Gets the color "LightSalmon1" (RGB 255,175,135). /// public static Color LightSalmon1 { get; } = new Color(216, 255, 175, 135); /// /// Gets the color "LightPink1" (RGB 255,175,175). /// public static Color LightPink1 { get; } = new Color(217, 255, 175, 175); /// /// Gets the color "Pink1" (RGB 255,175,215). /// public static Color Pink1 { get; } = new Color(218, 255, 175, 215); /// /// Gets the color "Plum1" (RGB 255,175,255). /// public static Color Plum1 { get; } = new Color(219, 255, 175, 255); /// /// Gets the color "Gold1" (RGB 255,215,0). /// public static Color Gold1 { get; } = new Color(220, 255, 215, 0); /// /// Gets the color "LightGoldenrod2_1" (RGB 255,215,95). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color LightGoldenrod2_1 { get; } = new Color(221, 255, 215, 95); /// /// Gets the color "LightGoldenrod2_2" (RGB 255,215,135). /// [SuppressMessage("Naming", "CA1707:Identifiers should not contain underscores")] public static Color LightGoldenrod2_2 { get; } = new Color(222, 255, 215, 135); /// /// Gets the color "NavajoWhite1" (RGB 255,215,175). /// public static Color NavajoWhite1 { get; } = new Color(223, 255, 215, 175); /// /// Gets the color "MistyRose1" (RGB 255,215,215). /// public static Color MistyRose1 { get; } = new Color(224, 255, 215, 215); /// /// Gets the color "Thistle1" (RGB 255,215,255). /// public static Color Thistle1 { get; } = new Color(225, 255, 215, 255); /// /// Gets the color "Yellow1" (RGB 255,255,0). /// public static Color Yellow1 { get; } = new Color(226, 255, 255, 0); /// /// Gets the color "LightGoldenrod1" (RGB 255,255,95). /// public static Color LightGoldenrod1 { get; } = new Color(227, 255, 255, 95); /// /// Gets the color "Khaki1" (RGB 255,255,135). /// public static Color Khaki1 { get; } = new Color(228, 255, 255, 135); /// /// Gets the color "Wheat1" (RGB 255,255,175). /// public static Color Wheat1 { get; } = new Color(229, 255, 255, 175); /// /// Gets the color "Cornsilk1" (RGB 255,255,215). /// public static Color Cornsilk1 { get; } = new Color(230, 255, 255, 215); /// /// Gets the color "Grey100" (RGB 255,255,255). /// public static Color Grey100 { get; } = new Color(231, 255, 255, 255); /// /// Gets the color "Gray100" (RGB 255,255,255). /// public static Color Gray100 { get; } = new Color(231, 255, 255, 255); /// /// Gets the color "Grey3" (RGB 8,8,8). /// public static Color Grey3 { get; } = new Color(232, 8, 8, 8); /// /// Gets the color "Gray3" (RGB 8,8,8). /// public static Color Gray3 { get; } = new Color(232, 8, 8, 8); /// /// Gets the color "Grey7" (RGB 18,18,18). /// public static Color Grey7 { get; } = new Color(233, 18, 18, 18); /// /// Gets the color "Gray7" (RGB 18,18,18). /// public static Color Gray7 { get; } = new Color(233, 18, 18, 18); /// /// Gets the color "Grey11" (RGB 28,28,28). /// public static Color Grey11 { get; } = new Color(234, 28, 28, 28); /// /// Gets the color "Gray11" (RGB 28,28,28). /// public static Color Gray11 { get; } = new Color(234, 28, 28, 28); /// /// Gets the color "Grey15" (RGB 38,38,38). /// public static Color Grey15 { get; } = new Color(235, 38, 38, 38); /// /// Gets the color "Gray15" (RGB 38,38,38). /// public static Color Gray15 { get; } = new Color(235, 38, 38, 38); /// /// Gets the color "Grey19" (RGB 48,48,48). /// public static Color Grey19 { get; } = new Color(236, 48, 48, 48); /// /// Gets the color "Gray19" (RGB 48,48,48). /// public static Color Gray19 { get; } = new Color(236, 48, 48, 48); /// /// Gets the color "Grey23" (RGB 58,58,58). /// public static Color Grey23 { get; } = new Color(237, 58, 58, 58); /// /// Gets the color "Gray23" (RGB 58,58,58). /// public static Color Gray23 { get; } = new Color(237, 58, 58, 58); /// /// Gets the color "Grey27" (RGB 68,68,68). /// public static Color Grey27 { get; } = new Color(238, 68, 68, 68); /// /// Gets the color "Gray27" (RGB 68,68,68). /// public static Color Gray27 { get; } = new Color(238, 68, 68, 68); /// /// Gets the color "Grey30" (RGB 78,78,78). /// public static Color Grey30 { get; } = new Color(239, 78, 78, 78); /// /// Gets the color "Gray30" (RGB 78,78,78). /// public static Color Gray30 { get; } = new Color(239, 78, 78, 78); /// /// Gets the color "Grey35" (RGB 88,88,88). /// public static Color Grey35 { get; } = new Color(240, 88, 88, 88); /// /// Gets the color "Gray35" (RGB 88,88,88). /// public static Color Gray35 { get; } = new Color(240, 88, 88, 88); /// /// Gets the color "Grey39" (RGB 98,98,98). /// public static Color Grey39 { get; } = new Color(241, 98, 98, 98); /// /// Gets the color "Gray39" (RGB 98,98,98). /// public static Color Gray39 { get; } = new Color(241, 98, 98, 98); /// /// Gets the color "Grey42" (RGB 108,108,108). /// public static Color Grey42 { get; } = new Color(242, 108, 108, 108); /// /// Gets the color "Gray42" (RGB 108,108,108). /// public static Color Gray42 { get; } = new Color(242, 108, 108, 108); /// /// Gets the color "Grey46" (RGB 118,118,118). /// public static Color Grey46 { get; } = new Color(243, 118, 118, 118); /// /// Gets the color "Gray46" (RGB 118,118,118). /// public static Color Gray46 { get; } = new Color(243, 118, 118, 118); /// /// Gets the color "Grey50" (RGB 128,128,128). /// public static Color Grey50 { get; } = new Color(244, 128, 128, 128); /// /// Gets the color "Gray50" (RGB 128,128,128). /// public static Color Gray50 { get; } = new Color(244, 128, 128, 128); /// /// Gets the color "Grey54" (RGB 138,138,138). /// public static Color Grey54 { get; } = new Color(245, 138, 138, 138); /// /// Gets the color "Gray54" (RGB 138,138,138). /// public static Color Gray54 { get; } = new Color(245, 138, 138, 138); /// /// Gets the color "Grey58" (RGB 148,148,148). /// public static Color Grey58 { get; } = new Color(246, 148, 148, 148); /// /// Gets the color "Gray58" (RGB 148,148,148). /// public static Color Gray58 { get; } = new Color(246, 148, 148, 148); /// /// Gets the color "Grey62" (RGB 158,158,158). /// public static Color Grey62 { get; } = new Color(247, 158, 158, 158); /// /// Gets the color "Gray62" (RGB 158,158,158). /// public static Color Gray62 { get; } = new Color(247, 158, 158, 158); /// /// Gets the color "Grey66" (RGB 168,168,168). /// public static Color Grey66 { get; } = new Color(248, 168, 168, 168); /// /// Gets the color "Gray66" (RGB 168,168,168). /// public static Color Gray66 { get; } = new Color(248, 168, 168, 168); /// /// Gets the color "Grey70" (RGB 178,178,178). /// public static Color Grey70 { get; } = new Color(249, 178, 178, 178); /// /// Gets the color "Gray70" (RGB 178,178,178). /// public static Color Gray70 { get; } = new Color(249, 178, 178, 178); /// /// Gets the color "Grey74" (RGB 188,188,188). /// public static Color Grey74 { get; } = new Color(250, 188, 188, 188); /// /// Gets the color "Gray74" (RGB 188,188,188). /// public static Color Gray74 { get; } = new Color(250, 188, 188, 188); /// /// Gets the color "Grey78" (RGB 198,198,198). /// public static Color Grey78 { get; } = new Color(251, 198, 198, 198); /// /// Gets the color "Gray78" (RGB 198,198,198). /// public static Color Gray78 { get; } = new Color(251, 198, 198, 198); /// /// Gets the color "Grey82" (RGB 208,208,208). /// public static Color Grey82 { get; } = new Color(252, 208, 208, 208); /// /// Gets the color "Gray82" (RGB 208,208,208). /// public static Color Gray82 { get; } = new Color(252, 208, 208, 208); /// /// Gets the color "Grey85" (RGB 218,218,218). /// public static Color Grey85 { get; } = new Color(253, 218, 218, 218); /// /// Gets the color "Gray85" (RGB 218,218,218). /// public static Color Gray85 { get; } = new Color(253, 218, 218, 218); /// /// Gets the color "Grey89" (RGB 228,228,228). /// public static Color Grey89 { get; } = new Color(254, 228, 228, 228); /// /// Gets the color "Gray89" (RGB 228,228,228). /// public static Color Gray89 { get; } = new Color(254, 228, 228, 228); /// /// Gets the color "Grey93" (RGB 238,238,238). /// public static Color Grey93 { get; } = new Color(255, 238, 238, 238); /// /// Gets the color "Gray93" (RGB 238,238,238). /// public static Color Gray93 { get; } = new Color(255, 238, 238, 238); } } ================================================ FILE: src/Spectre.Console/Generated/Spectre.Console.SourceGenerator/Spectre.Console.SourceGenerator.Colors.ColorGenerator/ColorPalette.Generated.g.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ using System.Collections.Generic; namespace Spectre.Console { internal static partial class ColorPalette { private static List GenerateLegacyPalette() { return new List { Color.Black, Color.Maroon, Color.Green, Color.Olive, Color.Navy, Color.Purple, Color.Teal, Color.Silver, }; } private static List GenerateStandardPalette(IReadOnlyList legacy) { return new List(legacy) { Color.Grey, Color.Red, Color.Lime, Color.Yellow, Color.Blue, Color.Fuchsia, Color.Aqua, Color.White, }; } private static List GenerateEightBitPalette(IReadOnlyList standard) { return new List(standard) { Color.Grey0, Color.NavyBlue, Color.DarkBlue, Color.Blue3, Color.Blue3_1, Color.Blue1, Color.DarkGreen, Color.DeepSkyBlue4, Color.DeepSkyBlue4_1, Color.DeepSkyBlue4_2, Color.DodgerBlue3, Color.DodgerBlue2, Color.Green4, Color.SpringGreen4, Color.Turquoise4, Color.DeepSkyBlue3, Color.DeepSkyBlue3_1, Color.DodgerBlue1, Color.Green3, Color.SpringGreen3, Color.DarkCyan, Color.LightSeaGreen, Color.DeepSkyBlue2, Color.DeepSkyBlue1, Color.Green3_1, Color.SpringGreen3_1, Color.SpringGreen2, Color.Cyan3, Color.DarkTurquoise, Color.Turquoise2, Color.Green1, Color.SpringGreen2_1, Color.SpringGreen1, Color.MediumSpringGreen, Color.Cyan2, Color.Cyan1, Color.DarkRed, Color.DeepPink4, Color.Purple4, Color.Purple4_1, Color.Purple3, Color.BlueViolet, Color.Orange4, Color.Grey37, Color.MediumPurple4, Color.SlateBlue3, Color.SlateBlue3_1, Color.RoyalBlue1, Color.Chartreuse4, Color.DarkSeaGreen4, Color.PaleTurquoise4, Color.SteelBlue, Color.SteelBlue3, Color.CornflowerBlue, Color.Chartreuse3, Color.DarkSeaGreen4_1, Color.CadetBlue, Color.CadetBlue_1, Color.SkyBlue3, Color.SteelBlue1, Color.Chartreuse3_1, Color.PaleGreen3, Color.SeaGreen3, Color.Aquamarine3, Color.MediumTurquoise, Color.SteelBlue1_1, Color.Chartreuse2, Color.SeaGreen2, Color.SeaGreen1, Color.SeaGreen1_1, Color.Aquamarine1, Color.DarkSlateGray2, Color.DarkRed_1, Color.DeepPink4_1, Color.DarkMagenta, Color.DarkMagenta_1, Color.DarkViolet, Color.Purple_1, Color.Orange4_1, Color.LightPink4, Color.Plum4, Color.MediumPurple3, Color.MediumPurple3_1, Color.SlateBlue1, Color.Yellow4, Color.Wheat4, Color.Grey53, Color.LightSlateGrey, Color.MediumPurple, Color.LightSlateBlue, Color.Yellow4_1, Color.DarkOliveGreen3, Color.DarkSeaGreen, Color.LightSkyBlue3, Color.LightSkyBlue3_1, Color.SkyBlue2, Color.Chartreuse2_1, Color.DarkOliveGreen3_1, Color.PaleGreen3_1, Color.DarkSeaGreen3, Color.DarkSlateGray3, Color.SkyBlue1, Color.Chartreuse1, Color.LightGreen, Color.LightGreen_1, Color.PaleGreen1, Color.Aquamarine1_1, Color.DarkSlateGray1, Color.Red3, Color.DeepPink4_2, Color.MediumVioletRed, Color.Magenta3, Color.DarkViolet_1, Color.Purple_2, Color.DarkOrange3, Color.IndianRed, Color.HotPink3, Color.MediumOrchid3, Color.MediumOrchid, Color.MediumPurple2, Color.DarkGoldenrod, Color.LightSalmon3, Color.RosyBrown, Color.Grey63, Color.MediumPurple2_1, Color.MediumPurple1, Color.Gold3, Color.DarkKhaki, Color.NavajoWhite3, Color.Grey69, Color.LightSteelBlue3, Color.LightSteelBlue, Color.Yellow3, Color.DarkOliveGreen3_2, Color.DarkSeaGreen3_1, Color.DarkSeaGreen2, Color.LightCyan3, Color.LightSkyBlue1, Color.GreenYellow, Color.DarkOliveGreen2, Color.PaleGreen1_1, Color.DarkSeaGreen2_1, Color.DarkSeaGreen1, Color.PaleTurquoise1, Color.Red3_1, Color.DeepPink3, Color.DeepPink3_1, Color.Magenta3_1, Color.Magenta3_2, Color.Magenta2, Color.DarkOrange3_1, Color.IndianRed_1, Color.HotPink3_1, Color.HotPink2, Color.Orchid, Color.MediumOrchid1, Color.Orange3, Color.LightSalmon3_1, Color.LightPink3, Color.Pink3, Color.Plum3, Color.Violet, Color.Gold3_1, Color.LightGoldenrod3, Color.Tan, Color.MistyRose3, Color.Thistle3, Color.Plum2, Color.Yellow3_1, Color.Khaki3, Color.LightGoldenrod2, Color.LightYellow3, Color.Grey84, Color.LightSteelBlue1, Color.Yellow2, Color.DarkOliveGreen1, Color.DarkOliveGreen1_1, Color.DarkSeaGreen1_1, Color.Honeydew2, Color.LightCyan1, Color.Red1, Color.DeepPink2, Color.DeepPink1, Color.DeepPink1_1, Color.Magenta2_1, Color.Magenta1, Color.OrangeRed1, Color.IndianRed1, Color.IndianRed1_1, Color.HotPink, Color.HotPink_1, Color.MediumOrchid1_1, Color.DarkOrange, Color.Salmon1, Color.LightCoral, Color.PaleVioletRed1, Color.Orchid2, Color.Orchid1, Color.Orange1, Color.SandyBrown, Color.LightSalmon1, Color.LightPink1, Color.Pink1, Color.Plum1, Color.Gold1, Color.LightGoldenrod2_1, Color.LightGoldenrod2_2, Color.NavajoWhite1, Color.MistyRose1, Color.Thistle1, Color.Yellow1, Color.LightGoldenrod1, Color.Khaki1, Color.Wheat1, Color.Cornsilk1, Color.Grey100, Color.Grey3, Color.Grey7, Color.Grey11, Color.Grey15, Color.Grey19, Color.Grey23, Color.Grey27, Color.Grey30, Color.Grey35, Color.Grey39, Color.Grey42, Color.Grey46, Color.Grey50, Color.Grey54, Color.Grey58, Color.Grey62, Color.Grey66, Color.Grey70, Color.Grey74, Color.Grey78, Color.Grey82, Color.Grey85, Color.Grey89, Color.Grey93, }; } } } ================================================ FILE: src/Spectre.Console/Generated/Spectre.Console.SourceGenerator/Spectre.Console.SourceGenerator.Colors.ColorGenerator/ColorTable.Generated.g.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ using System; using System.Collections.Generic; namespace Spectre.Console { internal static partial class ColorTable { private static Dictionary GenerateTable() { return new Dictionary(StringComparer.OrdinalIgnoreCase) { { "black", 0 }, { "maroon", 1 }, { "green", 2 }, { "olive", 3 }, { "navy", 4 }, { "purple", 5 }, { "teal", 6 }, { "silver", 7 }, { "grey", 8 }, { "gray", 8 }, { "red", 9 }, { "lime", 10 }, { "yellow", 11 }, { "blue", 12 }, { "fuchsia", 13 }, { "magenta", 13 }, { "aqua", 14 }, { "cyan", 14 }, { "white", 15 }, { "grey0", 16 }, { "gray0", 16 }, { "navyblue", 17 }, { "darkblue", 18 }, { "blue3", 19 }, { "blue3_1", 20 }, { "blue1", 21 }, { "darkgreen", 22 }, { "deepskyblue4", 23 }, { "deepskyblue4_1", 24 }, { "deepskyblue4_2", 25 }, { "dodgerblue3", 26 }, { "dodgerblue2", 27 }, { "green4", 28 }, { "springgreen4", 29 }, { "turquoise4", 30 }, { "deepskyblue3", 31 }, { "deepskyblue3_1", 32 }, { "dodgerblue1", 33 }, { "green3", 34 }, { "springgreen3", 35 }, { "darkcyan", 36 }, { "lightseagreen", 37 }, { "deepskyblue2", 38 }, { "deepskyblue1", 39 }, { "green3_1", 40 }, { "springgreen3_1", 41 }, { "springgreen2", 42 }, { "cyan3", 43 }, { "darkturquoise", 44 }, { "turquoise2", 45 }, { "green1", 46 }, { "springgreen2_1", 47 }, { "springgreen1", 48 }, { "mediumspringgreen", 49 }, { "cyan2", 50 }, { "cyan1", 51 }, { "darkred", 52 }, { "deeppink4", 53 }, { "purple4", 54 }, { "purple4_1", 55 }, { "purple3", 56 }, { "blueviolet", 57 }, { "orange4", 58 }, { "grey37", 59 }, { "gray37", 59 }, { "mediumpurple4", 60 }, { "slateblue3", 61 }, { "slateblue3_1", 62 }, { "royalblue1", 63 }, { "chartreuse4", 64 }, { "darkseagreen4", 65 }, { "paleturquoise4", 66 }, { "steelblue", 67 }, { "steelblue3", 68 }, { "cornflowerblue", 69 }, { "chartreuse3", 70 }, { "darkseagreen4_1", 71 }, { "cadetblue", 72 }, { "cadetblue_1", 73 }, { "skyblue3", 74 }, { "steelblue1", 75 }, { "chartreuse3_1", 76 }, { "palegreen3", 77 }, { "seagreen3", 78 }, { "aquamarine3", 79 }, { "mediumturquoise", 80 }, { "steelblue1_1", 81 }, { "chartreuse2", 82 }, { "seagreen2", 83 }, { "seagreen1", 84 }, { "seagreen1_1", 85 }, { "aquamarine1", 86 }, { "darkslategray2", 87 }, { "darkred_1", 88 }, { "deeppink4_1", 89 }, { "darkmagenta", 90 }, { "darkmagenta_1", 91 }, { "darkviolet", 92 }, { "purple_1", 93 }, { "orange4_1", 94 }, { "lightpink4", 95 }, { "plum4", 96 }, { "mediumpurple3", 97 }, { "mediumpurple3_1", 98 }, { "slateblue1", 99 }, { "yellow4", 100 }, { "wheat4", 101 }, { "grey53", 102 }, { "gray53", 102 }, { "lightslategrey", 103 }, { "mediumpurple", 104 }, { "lightslateblue", 105 }, { "yellow4_1", 106 }, { "darkolivegreen3", 107 }, { "darkseagreen", 108 }, { "lightskyblue3", 109 }, { "lightskyblue3_1", 110 }, { "skyblue2", 111 }, { "chartreuse2_1", 112 }, { "darkolivegreen3_1", 113 }, { "palegreen3_1", 114 }, { "darkseagreen3", 115 }, { "darkslategray3", 116 }, { "skyblue1", 117 }, { "chartreuse1", 118 }, { "lightgreen", 119 }, { "lightgreen_1", 120 }, { "palegreen1", 121 }, { "aquamarine1_1", 122 }, { "darkslategray1", 123 }, { "red3", 124 }, { "deeppink4_2", 125 }, { "mediumvioletred", 126 }, { "magenta3", 127 }, { "darkviolet_1", 128 }, { "purple_2", 129 }, { "darkorange3", 130 }, { "indianred", 131 }, { "hotpink3", 132 }, { "mediumorchid3", 133 }, { "mediumorchid", 134 }, { "mediumpurple2", 135 }, { "darkgoldenrod", 136 }, { "lightsalmon3", 137 }, { "rosybrown", 138 }, { "grey63", 139 }, { "gray63", 139 }, { "mediumpurple2_1", 140 }, { "mediumpurple1", 141 }, { "gold3", 142 }, { "darkkhaki", 143 }, { "navajowhite3", 144 }, { "grey69", 145 }, { "gray69", 145 }, { "lightsteelblue3", 146 }, { "lightsteelblue", 147 }, { "yellow3", 148 }, { "darkolivegreen3_2", 149 }, { "darkseagreen3_1", 150 }, { "darkseagreen2", 151 }, { "lightcyan3", 152 }, { "lightskyblue1", 153 }, { "greenyellow", 154 }, { "darkolivegreen2", 155 }, { "palegreen1_1", 156 }, { "darkseagreen2_1", 157 }, { "darkseagreen1", 158 }, { "paleturquoise1", 159 }, { "red3_1", 160 }, { "deeppink3", 161 }, { "deeppink3_1", 162 }, { "magenta3_1", 163 }, { "magenta3_2", 164 }, { "magenta2", 165 }, { "darkorange3_1", 166 }, { "indianred_1", 167 }, { "hotpink3_1", 168 }, { "hotpink2", 169 }, { "orchid", 170 }, { "mediumorchid1", 171 }, { "orange3", 172 }, { "lightsalmon3_1", 173 }, { "lightpink3", 174 }, { "pink3", 175 }, { "plum3", 176 }, { "violet", 177 }, { "gold3_1", 178 }, { "lightgoldenrod3", 179 }, { "tan", 180 }, { "mistyrose3", 181 }, { "thistle3", 182 }, { "plum2", 183 }, { "yellow3_1", 184 }, { "khaki3", 185 }, { "lightgoldenrod2", 186 }, { "lightyellow3", 187 }, { "grey84", 188 }, { "gray84", 188 }, { "lightsteelblue1", 189 }, { "yellow2", 190 }, { "darkolivegreen1", 191 }, { "darkolivegreen1_1", 192 }, { "darkseagreen1_1", 193 }, { "honeydew2", 194 }, { "lightcyan1", 195 }, { "red1", 196 }, { "deeppink2", 197 }, { "deeppink1", 198 }, { "deeppink1_1", 199 }, { "magenta2_1", 200 }, { "magenta1", 201 }, { "orangered1", 202 }, { "indianred1", 203 }, { "indianred1_1", 204 }, { "hotpink", 205 }, { "hotpink_1", 206 }, { "mediumorchid1_1", 207 }, { "darkorange", 208 }, { "salmon1", 209 }, { "lightcoral", 210 }, { "palevioletred1", 211 }, { "orchid2", 212 }, { "orchid1", 213 }, { "orange1", 214 }, { "sandybrown", 215 }, { "lightsalmon1", 216 }, { "lightpink1", 217 }, { "pink1", 218 }, { "plum1", 219 }, { "gold1", 220 }, { "lightgoldenrod2_1", 221 }, { "lightgoldenrod2_2", 222 }, { "navajowhite1", 223 }, { "mistyrose1", 224 }, { "thistle1", 225 }, { "yellow1", 226 }, { "lightgoldenrod1", 227 }, { "khaki1", 228 }, { "wheat1", 229 }, { "cornsilk1", 230 }, { "grey100", 231 }, { "gray100", 231 }, { "grey3", 232 }, { "gray3", 232 }, { "grey7", 233 }, { "gray7", 233 }, { "grey11", 234 }, { "gray11", 234 }, { "grey15", 235 }, { "gray15", 235 }, { "grey19", 236 }, { "gray19", 236 }, { "grey23", 237 }, { "gray23", 237 }, { "grey27", 238 }, { "gray27", 238 }, { "grey30", 239 }, { "gray30", 239 }, { "grey35", 240 }, { "gray35", 240 }, { "grey39", 241 }, { "gray39", 241 }, { "grey42", 242 }, { "gray42", 242 }, { "grey46", 243 }, { "gray46", 243 }, { "grey50", 244 }, { "gray50", 244 }, { "grey54", 245 }, { "gray54", 245 }, { "grey58", 246 }, { "gray58", 246 }, { "grey62", 247 }, { "gray62", 247 }, { "grey66", 248 }, { "gray66", 248 }, { "grey70", 249 }, { "gray70", 249 }, { "grey74", 250 }, { "gray74", 250 }, { "grey78", 251 }, { "gray78", 251 }, { "grey82", 252 }, { "gray82", 252 }, { "grey85", 253 }, { "gray85", 253 }, { "grey89", 254 }, { "gray89", 254 }, { "grey93", 255 }, { "gray93", 255 }, }; } } } ================================================ FILE: src/Spectre.Console/Generated/Spectre.Console.SourceGenerator/Spectre.Console.SourceGenerator.Emojis.EmojiGenerator/Emoji.Generated.g.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ using System; using System.Collections.Generic; namespace Spectre.Console { /// /// Utility for working with emojis. /// public static partial class Emoji { private static readonly Dictionary _emojis = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "abacus", Emoji.Known.Abacus }, { "ab_button_blood_type", Emoji.Known.AbButtonBloodType }, { "a_button_blood_type", Emoji.Known.AButtonBloodType }, { "accordion", Emoji.Known.Accordion }, { "adhesive_bandage", Emoji.Known.AdhesiveBandage }, { "admission_tickets", Emoji.Known.AdmissionTickets }, { "aerial_tramway", Emoji.Known.AerialTramway }, { "airplane", Emoji.Known.Airplane }, { "airplane_arrival", Emoji.Known.AirplaneArrival }, { "airplane_departure", Emoji.Known.AirplaneDeparture }, { "alarm_clock", Emoji.Known.AlarmClock }, { "alembic", Emoji.Known.Alembic }, { "alien", Emoji.Known.Alien }, { "alien_monster", Emoji.Known.AlienMonster }, { "ambulance", Emoji.Known.Ambulance }, { "american_football", Emoji.Known.AmericanFootball }, { "amphora", Emoji.Known.Amphora }, { "anatomical_heart", Emoji.Known.AnatomicalHeart }, { "anchor", Emoji.Known.Anchor }, { "anger_symbol", Emoji.Known.AngerSymbol }, { "angry_face", Emoji.Known.AngryFace }, { "angry_face_with_horns", Emoji.Known.AngryFaceWithHorns }, { "anguished_face", Emoji.Known.AnguishedFace }, { "ant", Emoji.Known.Ant }, { "antenna_bars", Emoji.Known.AntennaBars }, { "anxious_face_with_sweat", Emoji.Known.AnxiousFaceWithSweat }, { "aquarius", Emoji.Known.Aquarius }, { "aries", Emoji.Known.Aries }, { "articulated_lorry", Emoji.Known.ArticulatedLorry }, { "artist_palette", Emoji.Known.ArtistPalette }, { "astonished_face", Emoji.Known.AstonishedFace }, { "atm_sign", Emoji.Known.AtmSign }, { "atom_symbol", Emoji.Known.AtomSymbol }, { "automobile", Emoji.Known.Automobile }, { "auto_rickshaw", Emoji.Known.AutoRickshaw }, { "avocado", Emoji.Known.Avocado }, { "axe", Emoji.Known.Axe }, { "baby", Emoji.Known.Baby }, { "baby_angel", Emoji.Known.BabyAngel }, { "baby_bottle", Emoji.Known.BabyBottle }, { "baby_chick", Emoji.Known.BabyChick }, { "baby_symbol", Emoji.Known.BabySymbol }, { "back_arrow", Emoji.Known.BackArrow }, { "backhand_index_pointing_down", Emoji.Known.BackhandIndexPointingDown }, { "backhand_index_pointing_left", Emoji.Known.BackhandIndexPointingLeft }, { "backhand_index_pointing_right", Emoji.Known.BackhandIndexPointingRight }, { "backhand_index_pointing_up", Emoji.Known.BackhandIndexPointingUp }, { "backpack", Emoji.Known.Backpack }, { "bacon", Emoji.Known.Bacon }, { "badger", Emoji.Known.Badger }, { "badminton", Emoji.Known.Badminton }, { "bagel", Emoji.Known.Bagel }, { "baggage_claim", Emoji.Known.BaggageClaim }, { "baguette_bread", Emoji.Known.BaguetteBread }, { "balance_scale", Emoji.Known.BalanceScale }, { "bald", Emoji.Known.Bald }, { "ballet_shoes", Emoji.Known.BalletShoes }, { "balloon", Emoji.Known.Balloon }, { "ballot_box_with_ballot", Emoji.Known.BallotBoxWithBallot }, { "banana", Emoji.Known.Banana }, { "banjo", Emoji.Known.Banjo }, { "bank", Emoji.Known.Bank }, { "barber_pole", Emoji.Known.BarberPole }, { "bar_chart", Emoji.Known.BarChart }, { "baseball", Emoji.Known.Baseball }, { "basket", Emoji.Known.Basket }, { "basketball", Emoji.Known.Basketball }, { "bat", Emoji.Known.Bat }, { "bathtub", Emoji.Known.Bathtub }, { "battery", Emoji.Known.Battery }, { "b_button_blood_type", Emoji.Known.BButtonBloodType }, { "beach_with_umbrella", Emoji.Known.BeachWithUmbrella }, { "beaming_face_with_smiling_eyes", Emoji.Known.BeamingFaceWithSmilingEyes }, { "beans", Emoji.Known.Beans }, { "bear", Emoji.Known.Bear }, { "beating_heart", Emoji.Known.BeatingHeart }, { "beaver", Emoji.Known.Beaver }, { "bed", Emoji.Known.Bed }, { "beer_mug", Emoji.Known.BeerMug }, { "beetle", Emoji.Known.Beetle }, { "bell", Emoji.Known.Bell }, { "bellhop_bell", Emoji.Known.BellhopBell }, { "bell_pepper", Emoji.Known.BellPepper }, { "bell_with_slash", Emoji.Known.BellWithSlash }, { "bento_box", Emoji.Known.BentoBox }, { "beverage_box", Emoji.Known.BeverageBox }, { "bicycle", Emoji.Known.Bicycle }, { "bikini", Emoji.Known.Bikini }, { "billed_cap", Emoji.Known.BilledCap }, { "biohazard", Emoji.Known.Biohazard }, { "bird", Emoji.Known.Bird }, { "birthday_cake", Emoji.Known.BirthdayCake }, { "bison", Emoji.Known.Bison }, { "biting_lip", Emoji.Known.BitingLip }, { "black_circle", Emoji.Known.BlackCircle }, { "black_flag", Emoji.Known.BlackFlag }, { "black_heart", Emoji.Known.BlackHeart }, { "black_large_square", Emoji.Known.BlackLargeSquare }, { "black_medium_small_square", Emoji.Known.BlackMediumSmallSquare }, { "black_medium_square", Emoji.Known.BlackMediumSquare }, { "black_nib", Emoji.Known.BlackNib }, { "black_small_square", Emoji.Known.BlackSmallSquare }, { "black_square_button", Emoji.Known.BlackSquareButton }, { "blossom", Emoji.Known.Blossom }, { "blowfish", Emoji.Known.Blowfish }, { "blueberries", Emoji.Known.Blueberries }, { "blue_book", Emoji.Known.BlueBook }, { "blue_circle", Emoji.Known.BlueCircle }, { "blue_heart", Emoji.Known.BlueHeart }, { "blue_square", Emoji.Known.BlueSquare }, { "boar", Emoji.Known.Boar }, { "bomb", Emoji.Known.Bomb }, { "bone", Emoji.Known.Bone }, { "bookmark", Emoji.Known.Bookmark }, { "bookmark_tabs", Emoji.Known.BookmarkTabs }, { "books", Emoji.Known.Books }, { "boomerang", Emoji.Known.Boomerang }, { "bottle_with_popping_cork", Emoji.Known.BottleWithPoppingCork }, { "bouquet", Emoji.Known.Bouquet }, { "bow_and_arrow", Emoji.Known.BowAndArrow }, { "bowling", Emoji.Known.Bowling }, { "bowl_with_spoon", Emoji.Known.BowlWithSpoon }, { "boxing_glove", Emoji.Known.BoxingGlove }, { "boy", Emoji.Known.Boy }, { "brain", Emoji.Known.Brain }, { "bread", Emoji.Known.Bread }, { "breast_feeding", Emoji.Known.BreastFeeding }, { "brick", Emoji.Known.Brick }, { "bridge_at_night", Emoji.Known.BridgeAtNight }, { "briefcase", Emoji.Known.Briefcase }, { "briefs", Emoji.Known.Briefs }, { "bright_button", Emoji.Known.BrightButton }, { "broccoli", Emoji.Known.Broccoli }, { "broken_heart", Emoji.Known.BrokenHeart }, { "broom", Emoji.Known.Broom }, { "brown_circle", Emoji.Known.BrownCircle }, { "brown_heart", Emoji.Known.BrownHeart }, { "brown_square", Emoji.Known.BrownSquare }, { "bubbles", Emoji.Known.Bubbles }, { "bubble_tea", Emoji.Known.BubbleTea }, { "bucket", Emoji.Known.Bucket }, { "bug", Emoji.Known.Bug }, { "building_construction", Emoji.Known.BuildingConstruction }, { "bullet_train", Emoji.Known.BulletTrain }, { "bullseye", Emoji.Known.Bullseye }, { "burrito", Emoji.Known.Burrito }, { "bus", Emoji.Known.Bus }, { "bus_stop", Emoji.Known.BusStop }, { "bust_in_silhouette", Emoji.Known.BustInSilhouette }, { "busts_in_silhouette", Emoji.Known.BustsInSilhouette }, { "butter", Emoji.Known.Butter }, { "butterfly", Emoji.Known.Butterfly }, { "cactus", Emoji.Known.Cactus }, { "calendar", Emoji.Known.Calendar }, { "call_me_hand", Emoji.Known.CallMeHand }, { "camel", Emoji.Known.Camel }, { "camera", Emoji.Known.Camera }, { "camera_with_flash", Emoji.Known.CameraWithFlash }, { "camping", Emoji.Known.Camping }, { "cancer", Emoji.Known.Cancer }, { "candle", Emoji.Known.Candle }, { "candy", Emoji.Known.Candy }, { "canned_food", Emoji.Known.CannedFood }, { "canoe", Emoji.Known.Canoe }, { "capricorn", Emoji.Known.Capricorn }, { "card_file_box", Emoji.Known.CardFileBox }, { "card_index", Emoji.Known.CardIndex }, { "card_index_dividers", Emoji.Known.CardIndexDividers }, { "carousel_horse", Emoji.Known.CarouselHorse }, { "carpentry_saw", Emoji.Known.CarpentrySaw }, { "carp_streamer", Emoji.Known.CarpStreamer }, { "carrot", Emoji.Known.Carrot }, { "castle", Emoji.Known.Castle }, { "cat", Emoji.Known.Cat }, { "cat_face", Emoji.Known.CatFace }, { "cat_with_tears_of_joy", Emoji.Known.CatWithTearsOfJoy }, { "cat_with_wry_smile", Emoji.Known.CatWithWrySmile }, { "chains", Emoji.Known.Chains }, { "chair", Emoji.Known.Chair }, { "chart_decreasing", Emoji.Known.ChartDecreasing }, { "chart_increasing", Emoji.Known.ChartIncreasing }, { "chart_increasing_with_yen", Emoji.Known.ChartIncreasingWithYen }, { "check_box_with_check", Emoji.Known.CheckBoxWithCheck }, { "check_mark", Emoji.Known.CheckMark }, { "check_mark_button", Emoji.Known.CheckMarkButton }, { "cheese_wedge", Emoji.Known.CheeseWedge }, { "chequered_flag", Emoji.Known.ChequeredFlag }, { "cherries", Emoji.Known.Cherries }, { "cherry_blossom", Emoji.Known.CherryBlossom }, { "chess_pawn", Emoji.Known.ChessPawn }, { "chestnut", Emoji.Known.Chestnut }, { "chicken", Emoji.Known.Chicken }, { "child", Emoji.Known.Child }, { "children_crossing", Emoji.Known.ChildrenCrossing }, { "chipmunk", Emoji.Known.Chipmunk }, { "chocolate_bar", Emoji.Known.ChocolateBar }, { "chopsticks", Emoji.Known.Chopsticks }, { "christmas_tree", Emoji.Known.ChristmasTree }, { "church", Emoji.Known.Church }, { "cigarette", Emoji.Known.Cigarette }, { "cinema", Emoji.Known.Cinema }, { "circled_m", Emoji.Known.CircledM }, { "circus_tent", Emoji.Known.CircusTent }, { "cityscape", Emoji.Known.Cityscape }, { "cityscape_at_dusk", Emoji.Known.CityscapeAtDusk }, { "clamp", Emoji.Known.Clamp }, { "clapper_board", Emoji.Known.ClapperBoard }, { "clapping_hands", Emoji.Known.ClappingHands }, { "classical_building", Emoji.Known.ClassicalBuilding }, { "cl_button", Emoji.Known.ClButton }, { "clinking_beer_mugs", Emoji.Known.ClinkingBeerMugs }, { "clinking_glasses", Emoji.Known.ClinkingGlasses }, { "clipboard", Emoji.Known.Clipboard }, { "clockwise_vertical_arrows", Emoji.Known.ClockwiseVerticalArrows }, { "closed_book", Emoji.Known.ClosedBook }, { "closed_mailbox_with_lowered_flag", Emoji.Known.ClosedMailboxWithLoweredFlag }, { "closed_mailbox_with_raised_flag", Emoji.Known.ClosedMailboxWithRaisedFlag }, { "closed_umbrella", Emoji.Known.ClosedUmbrella }, { "cloud", Emoji.Known.Cloud }, { "cloud_with_lightning", Emoji.Known.CloudWithLightning }, { "cloud_with_lightning_and_rain", Emoji.Known.CloudWithLightningAndRain }, { "cloud_with_rain", Emoji.Known.CloudWithRain }, { "cloud_with_snow", Emoji.Known.CloudWithSnow }, { "clown_face", Emoji.Known.ClownFace }, { "club_suit", Emoji.Known.ClubSuit }, { "clutch_bag", Emoji.Known.ClutchBag }, { "coat", Emoji.Known.Coat }, { "cockroach", Emoji.Known.Cockroach }, { "cocktail_glass", Emoji.Known.CocktailGlass }, { "coconut", Emoji.Known.Coconut }, { "coffin", Emoji.Known.Coffin }, { "coin", Emoji.Known.Coin }, { "cold_face", Emoji.Known.ColdFace }, { "collision", Emoji.Known.Collision }, { "comet", Emoji.Known.Comet }, { "compass", Emoji.Known.Compass }, { "computer_disk", Emoji.Known.ComputerDisk }, { "computer_mouse", Emoji.Known.ComputerMouse }, { "confetti_ball", Emoji.Known.ConfettiBall }, { "confounded_face", Emoji.Known.ConfoundedFace }, { "confused_face", Emoji.Known.ConfusedFace }, { "construction", Emoji.Known.Construction }, { "construction_worker", Emoji.Known.ConstructionWorker }, { "control_knobs", Emoji.Known.ControlKnobs }, { "convenience_store", Emoji.Known.ConvenienceStore }, { "cooked_rice", Emoji.Known.CookedRice }, { "cookie", Emoji.Known.Cookie }, { "cooking", Emoji.Known.Cooking }, { "cool_button", Emoji.Known.CoolButton }, { "copyright", Emoji.Known.Copyright }, { "coral", Emoji.Known.Coral }, { "couch_and_lamp", Emoji.Known.CouchAndLamp }, { "counterclockwise_arrows_button", Emoji.Known.CounterclockwiseArrowsButton }, { "couple_with_heart", Emoji.Known.CoupleWithHeart }, { "cow", Emoji.Known.Cow }, { "cowboy_hat_face", Emoji.Known.CowboyHatFace }, { "cow_face", Emoji.Known.CowFace }, { "crab", Emoji.Known.Crab }, { "crayon", Emoji.Known.Crayon }, { "credit_card", Emoji.Known.CreditCard }, { "crescent_moon", Emoji.Known.CrescentMoon }, { "cricket", Emoji.Known.Cricket }, { "cricket_game", Emoji.Known.CricketGame }, { "crocodile", Emoji.Known.Crocodile }, { "croissant", Emoji.Known.Croissant }, { "crossed_fingers", Emoji.Known.CrossedFingers }, { "crossed_flags", Emoji.Known.CrossedFlags }, { "crossed_swords", Emoji.Known.CrossedSwords }, { "cross_mark", Emoji.Known.CrossMark }, { "cross_mark_button", Emoji.Known.CrossMarkButton }, { "crown", Emoji.Known.Crown }, { "crutch", Emoji.Known.Crutch }, { "crying_cat", Emoji.Known.CryingCat }, { "crying_face", Emoji.Known.CryingFace }, { "crystal_ball", Emoji.Known.CrystalBall }, { "cucumber", Emoji.Known.Cucumber }, { "cupcake", Emoji.Known.Cupcake }, { "cup_with_straw", Emoji.Known.CupWithStraw }, { "curling_stone", Emoji.Known.CurlingStone }, { "curly_hair", Emoji.Known.CurlyHair }, { "curly_loop", Emoji.Known.CurlyLoop }, { "currency_exchange", Emoji.Known.CurrencyExchange }, { "curry_rice", Emoji.Known.CurryRice }, { "custard", Emoji.Known.Custard }, { "customs", Emoji.Known.Customs }, { "cut_of_meat", Emoji.Known.CutOfMeat }, { "cyclone", Emoji.Known.Cyclone }, { "dagger", Emoji.Known.Dagger }, { "dango", Emoji.Known.Dango }, { "dark_skin_tone", Emoji.Known.DarkSkinTone }, { "dashing_away", Emoji.Known.DashingAway }, { "deaf_person", Emoji.Known.DeafPerson }, { "deciduous_tree", Emoji.Known.DeciduousTree }, { "deer", Emoji.Known.Deer }, { "delivery_truck", Emoji.Known.DeliveryTruck }, { "department_store", Emoji.Known.DepartmentStore }, { "derelict_house", Emoji.Known.DerelictHouse }, { "desert", Emoji.Known.Desert }, { "desert_island", Emoji.Known.DesertIsland }, { "desktop_computer", Emoji.Known.DesktopComputer }, { "detective", Emoji.Known.Detective }, { "diamond_suit", Emoji.Known.DiamondSuit }, { "diamond_with_a_dot", Emoji.Known.DiamondWithADot }, { "dim_button", Emoji.Known.DimButton }, { "disappointed_face", Emoji.Known.DisappointedFace }, { "disguised_face", Emoji.Known.DisguisedFace }, { "distorted_face", Emoji.Known.DistortedFace }, { "divide", Emoji.Known.Divide }, { "diving_mask", Emoji.Known.DivingMask }, { "diya_lamp", Emoji.Known.DiyaLamp }, { "dizzy", Emoji.Known.Dizzy }, { "dna", Emoji.Known.Dna }, { "dodo", Emoji.Known.Dodo }, { "dog", Emoji.Known.Dog }, { "dog_face", Emoji.Known.DogFace }, { "dollar_banknote", Emoji.Known.DollarBanknote }, { "dolphin", Emoji.Known.Dolphin }, { "donkey", Emoji.Known.Donkey }, { "door", Emoji.Known.Door }, { "dotted_line_face", Emoji.Known.DottedLineFace }, { "dotted_six_pointed_star", Emoji.Known.DottedSixPointedStar }, { "double_curly_loop", Emoji.Known.DoubleCurlyLoop }, { "double_exclamation_mark", Emoji.Known.DoubleExclamationMark }, { "doughnut", Emoji.Known.Doughnut }, { "dove", Emoji.Known.Dove }, { "down_arrow", Emoji.Known.DownArrow }, { "downcast_face_with_sweat", Emoji.Known.DowncastFaceWithSweat }, { "down_left_arrow", Emoji.Known.DownLeftArrow }, { "down_right_arrow", Emoji.Known.DownRightArrow }, { "downwards_button", Emoji.Known.DownwardsButton }, { "dragon", Emoji.Known.Dragon }, { "dragon_face", Emoji.Known.DragonFace }, { "dress", Emoji.Known.Dress }, { "drooling_face", Emoji.Known.DroolingFace }, { "droplet", Emoji.Known.Droplet }, { "drop_of_blood", Emoji.Known.DropOfBlood }, { "drum", Emoji.Known.Drum }, { "duck", Emoji.Known.Duck }, { "dumpling", Emoji.Known.Dumpling }, { "dvd", Emoji.Known.Dvd }, { "eagle", Emoji.Known.Eagle }, { "ear", Emoji.Known.Ear }, { "ear_of_corn", Emoji.Known.EarOfCorn }, { "ear_with_hearing_aid", Emoji.Known.EarWithHearingAid }, { "egg", Emoji.Known.Egg }, { "eggplant", Emoji.Known.Eggplant }, { "eight_o_clock", Emoji.Known.EightOClock }, { "eight_pointed_star", Emoji.Known.EightPointedStar }, { "eight_spoked_asterisk", Emoji.Known.EightSpokedAsterisk }, { "eight_thirty", Emoji.Known.EightThirty }, { "eject_button", Emoji.Known.EjectButton }, { "electric_plug", Emoji.Known.ElectricPlug }, { "elephant", Emoji.Known.Elephant }, { "elevator", Emoji.Known.Elevator }, { "eleven_o_clock", Emoji.Known.ElevenOClock }, { "eleven_thirty", Emoji.Known.ElevenThirty }, { "elf", Emoji.Known.Elf }, { "e_mail", Emoji.Known.EMail }, { "empty_nest", Emoji.Known.EmptyNest }, { "end_arrow", Emoji.Known.EndArrow }, { "enraged_face", Emoji.Known.EnragedFace }, { "envelope", Emoji.Known.Envelope }, { "envelope_with_arrow", Emoji.Known.EnvelopeWithArrow }, { "euro_banknote", Emoji.Known.EuroBanknote }, { "evergreen_tree", Emoji.Known.EvergreenTree }, { "ewe", Emoji.Known.Ewe }, { "exclamation_question_mark", Emoji.Known.ExclamationQuestionMark }, { "exploding_head", Emoji.Known.ExplodingHead }, { "expressionless_face", Emoji.Known.ExpressionlessFace }, { "eye", Emoji.Known.Eye }, { "eyes", Emoji.Known.Eyes }, { "face_blowing_a_kiss", Emoji.Known.FaceBlowingAKiss }, { "face_holding_back_tears", Emoji.Known.FaceHoldingBackTears }, { "face_savoring_food", Emoji.Known.FaceSavoringFood }, { "face_screaming_in_fear", Emoji.Known.FaceScreamingInFear }, { "face_vomiting", Emoji.Known.FaceVomiting }, { "face_with_bags_under_eyes", Emoji.Known.FaceWithBagsUnderEyes }, { "face_with_crossed_out_eyes", Emoji.Known.FaceWithCrossedOutEyes }, { "face_with_diagonal_mouth", Emoji.Known.FaceWithDiagonalMouth }, { "face_with_hand_over_mouth", Emoji.Known.FaceWithHandOverMouth }, { "face_with_head_bandage", Emoji.Known.FaceWithHeadBandage }, { "face_with_medical_mask", Emoji.Known.FaceWithMedicalMask }, { "face_with_monocle", Emoji.Known.FaceWithMonocle }, { "face_with_open_eyes_and_hand_over_mouth", Emoji.Known.FaceWithOpenEyesAndHandOverMouth }, { "face_with_open_mouth", Emoji.Known.FaceWithOpenMouth }, { "face_without_mouth", Emoji.Known.FaceWithoutMouth }, { "face_with_peeking_eye", Emoji.Known.FaceWithPeekingEye }, { "face_with_raised_eyebrow", Emoji.Known.FaceWithRaisedEyebrow }, { "face_with_rolling_eyes", Emoji.Known.FaceWithRollingEyes }, { "face_with_steam_from_nose", Emoji.Known.FaceWithSteamFromNose }, { "face_with_symbols_on_mouth", Emoji.Known.FaceWithSymbolsOnMouth }, { "face_with_tears_of_joy", Emoji.Known.FaceWithTearsOfJoy }, { "face_with_thermometer", Emoji.Known.FaceWithThermometer }, { "face_with_tongue", Emoji.Known.FaceWithTongue }, { "factory", Emoji.Known.Factory }, { "fairy", Emoji.Known.Fairy }, { "falafel", Emoji.Known.Falafel }, { "fallen_leaf", Emoji.Known.FallenLeaf }, { "family", Emoji.Known.Family }, { "fast_down_button", Emoji.Known.FastDownButton }, { "fast_forward_button", Emoji.Known.FastForwardButton }, { "fast_reverse_button", Emoji.Known.FastReverseButton }, { "fast_up_button", Emoji.Known.FastUpButton }, { "fax_machine", Emoji.Known.FaxMachine }, { "fearful_face", Emoji.Known.FearfulFace }, { "feather", Emoji.Known.Feather }, { "female_sign", Emoji.Known.FemaleSign }, { "ferris_wheel", Emoji.Known.FerrisWheel }, { "ferry", Emoji.Known.Ferry }, { "field_hockey", Emoji.Known.FieldHockey }, { "fight_cloud", Emoji.Known.FightCloud }, { "file_cabinet", Emoji.Known.FileCabinet }, { "file_folder", Emoji.Known.FileFolder }, { "film_frames", Emoji.Known.FilmFrames }, { "film_projector", Emoji.Known.FilmProjector }, { "fingerprint", Emoji.Known.Fingerprint }, { "fire", Emoji.Known.Fire }, { "firecracker", Emoji.Known.Firecracker }, { "fire_engine", Emoji.Known.FireEngine }, { "fire_extinguisher", Emoji.Known.FireExtinguisher }, { "fireworks", Emoji.Known.Fireworks }, { "1st_place_medal", Emoji.Known.FirstPlaceMedal }, { "first_quarter_moon", Emoji.Known.FirstQuarterMoon }, { "first_quarter_moon_face", Emoji.Known.FirstQuarterMoonFace }, { "fish", Emoji.Known.Fish }, { "fish_cake_with_swirl", Emoji.Known.FishCakeWithSwirl }, { "fishing_pole", Emoji.Known.FishingPole }, { "five_o_clock", Emoji.Known.FiveOClock }, { "five_thirty", Emoji.Known.FiveThirty }, { "flag_in_hole", Emoji.Known.FlagInHole }, { "flamingo", Emoji.Known.Flamingo }, { "flashlight", Emoji.Known.Flashlight }, { "flatbread", Emoji.Known.Flatbread }, { "flat_shoe", Emoji.Known.FlatShoe }, { "fleur_de_lis", Emoji.Known.FleurDeLis }, { "flexed_biceps", Emoji.Known.FlexedBiceps }, { "floppy_disk", Emoji.Known.FloppyDisk }, { "flower_playing_cards", Emoji.Known.FlowerPlayingCards }, { "flushed_face", Emoji.Known.FlushedFace }, { "flute", Emoji.Known.Flute }, { "fly", Emoji.Known.Fly }, { "flying_disc", Emoji.Known.FlyingDisc }, { "flying_saucer", Emoji.Known.FlyingSaucer }, { "fog", Emoji.Known.Fog }, { "foggy", Emoji.Known.Foggy }, { "folded_hands", Emoji.Known.FoldedHands }, { "folding_hand_fan", Emoji.Known.FoldingHandFan }, { "fondue", Emoji.Known.Fondue }, { "foot", Emoji.Known.Foot }, { "footprints", Emoji.Known.Footprints }, { "fork_and_knife", Emoji.Known.ForkAndKnife }, { "fork_and_knife_with_plate", Emoji.Known.ForkAndKnifeWithPlate }, { "fortune_cookie", Emoji.Known.FortuneCookie }, { "fountain", Emoji.Known.Fountain }, { "fountain_pen", Emoji.Known.FountainPen }, { "four_leaf_clover", Emoji.Known.FourLeafClover }, { "four_o_clock", Emoji.Known.FourOClock }, { "four_thirty", Emoji.Known.FourThirty }, { "fox", Emoji.Known.Fox }, { "framed_picture", Emoji.Known.FramedPicture }, { "free_button", Emoji.Known.FreeButton }, { "french_fries", Emoji.Known.FrenchFries }, { "fried_shrimp", Emoji.Known.FriedShrimp }, { "frog", Emoji.Known.Frog }, { "front_facing_baby_chick", Emoji.Known.FrontFacingBabyChick }, { "frowning_face", Emoji.Known.FrowningFace }, { "frowning_face_with_open_mouth", Emoji.Known.FrowningFaceWithOpenMouth }, { "fuel_pump", Emoji.Known.FuelPump }, { "full_moon", Emoji.Known.FullMoon }, { "full_moon_face", Emoji.Known.FullMoonFace }, { "funeral_urn", Emoji.Known.FuneralUrn }, { "game_die", Emoji.Known.GameDie }, { "garlic", Emoji.Known.Garlic }, { "gear", Emoji.Known.Gear }, { "gemini", Emoji.Known.Gemini }, { "gem_stone", Emoji.Known.GemStone }, { "genie", Emoji.Known.Genie }, { "ghost", Emoji.Known.Ghost }, { "ginger_root", Emoji.Known.GingerRoot }, { "giraffe", Emoji.Known.Giraffe }, { "girl", Emoji.Known.Girl }, { "glasses", Emoji.Known.Glasses }, { "glass_of_milk", Emoji.Known.GlassOfMilk }, { "globe_showing_americas", Emoji.Known.GlobeShowingAmericas }, { "globe_showing_asia_australia", Emoji.Known.GlobeShowingAsiaAustralia }, { "globe_showing_europe_africa", Emoji.Known.GlobeShowingEuropeAfrica }, { "globe_with_meridians", Emoji.Known.GlobeWithMeridians }, { "gloves", Emoji.Known.Gloves }, { "glowing_star", Emoji.Known.GlowingStar }, { "goal_net", Emoji.Known.GoalNet }, { "goat", Emoji.Known.Goat }, { "goblin", Emoji.Known.Goblin }, { "goggles", Emoji.Known.Goggles }, { "goose", Emoji.Known.Goose }, { "gorilla", Emoji.Known.Gorilla }, { "graduation_cap", Emoji.Known.GraduationCap }, { "grapes", Emoji.Known.Grapes }, { "green_apple", Emoji.Known.GreenApple }, { "green_book", Emoji.Known.GreenBook }, { "green_circle", Emoji.Known.GreenCircle }, { "green_heart", Emoji.Known.GreenHeart }, { "green_salad", Emoji.Known.GreenSalad }, { "green_square", Emoji.Known.GreenSquare }, { "grey_heart", Emoji.Known.GreyHeart }, { "grimacing_face", Emoji.Known.GrimacingFace }, { "grinning_cat", Emoji.Known.GrinningCat }, { "grinning_cat_with_smiling_eyes", Emoji.Known.GrinningCatWithSmilingEyes }, { "grinning_face", Emoji.Known.GrinningFace }, { "grinning_face_with_big_eyes", Emoji.Known.GrinningFaceWithBigEyes }, { "grinning_face_with_smiling_eyes", Emoji.Known.GrinningFaceWithSmilingEyes }, { "grinning_face_with_sweat", Emoji.Known.GrinningFaceWithSweat }, { "grinning_squinting_face", Emoji.Known.GrinningSquintingFace }, { "growing_heart", Emoji.Known.GrowingHeart }, { "guard", Emoji.Known.Guard }, { "guide_dog", Emoji.Known.GuideDog }, { "guitar", Emoji.Known.Guitar }, { "hair_pick", Emoji.Known.HairPick }, { "hairy_creature", Emoji.Known.HairyCreature }, { "hamburger", Emoji.Known.Hamburger }, { "hammer", Emoji.Known.Hammer }, { "hammer_and_pick", Emoji.Known.HammerAndPick }, { "hammer_and_wrench", Emoji.Known.HammerAndWrench }, { "hamsa", Emoji.Known.Hamsa }, { "hamster", Emoji.Known.Hamster }, { "handbag", Emoji.Known.Handbag }, { "handshake", Emoji.Known.Handshake }, { "hand_with_fingers_splayed", Emoji.Known.HandWithFingersSplayed }, { "hand_with_index_finger_and_thumb_crossed", Emoji.Known.HandWithIndexFingerAndThumbCrossed }, { "harp", Emoji.Known.Harp }, { "hatching_chick", Emoji.Known.HatchingChick }, { "headphone", Emoji.Known.Headphone }, { "headstone", Emoji.Known.Headstone }, { "hear_no_evil_monkey", Emoji.Known.HearNoEvilMonkey }, { "heart_decoration", Emoji.Known.HeartDecoration }, { "heart_exclamation", Emoji.Known.HeartExclamation }, { "heart_hands", Emoji.Known.HeartHands }, { "heart_suit", Emoji.Known.HeartSuit }, { "heart_with_arrow", Emoji.Known.HeartWithArrow }, { "heart_with_ribbon", Emoji.Known.HeartWithRibbon }, { "heavy_dollar_sign", Emoji.Known.HeavyDollarSign }, { "heavy_equals_sign", Emoji.Known.HeavyEqualsSign }, { "hedgehog", Emoji.Known.Hedgehog }, { "helicopter", Emoji.Known.Helicopter }, { "herb", Emoji.Known.Herb }, { "hibiscus", Emoji.Known.Hibiscus }, { "high_heeled_shoe", Emoji.Known.HighHeeledShoe }, { "high_speed_train", Emoji.Known.HighSpeedTrain }, { "high_voltage", Emoji.Known.HighVoltage }, { "hiking_boot", Emoji.Known.HikingBoot }, { "hindu_temple", Emoji.Known.HinduTemple }, { "hippopotamus", Emoji.Known.Hippopotamus }, { "hole", Emoji.Known.Hole }, { "hollow_red_circle", Emoji.Known.HollowRedCircle }, { "honeybee", Emoji.Known.Honeybee }, { "honey_pot", Emoji.Known.HoneyPot }, { "hook", Emoji.Known.Hook }, { "horizontal_traffic_light", Emoji.Known.HorizontalTrafficLight }, { "horse", Emoji.Known.Horse }, { "horse_face", Emoji.Known.HorseFace }, { "horse_racing", Emoji.Known.HorseRacing }, { "hospital", Emoji.Known.Hospital }, { "hot_beverage", Emoji.Known.HotBeverage }, { "hot_dog", Emoji.Known.HotDog }, { "hotel", Emoji.Known.Hotel }, { "hot_face", Emoji.Known.HotFace }, { "hot_pepper", Emoji.Known.HotPepper }, { "hot_springs", Emoji.Known.HotSprings }, { "hourglass_done", Emoji.Known.HourglassDone }, { "hourglass_not_done", Emoji.Known.HourglassNotDone }, { "house", Emoji.Known.House }, { "houses", Emoji.Known.Houses }, { "house_with_garden", Emoji.Known.HouseWithGarden }, { "hundred_points", Emoji.Known.HundredPoints }, { "hushed_face", Emoji.Known.HushedFace }, { "hut", Emoji.Known.Hut }, { "hyacinth", Emoji.Known.Hyacinth }, { "ice", Emoji.Known.Ice }, { "ice_cream", Emoji.Known.IceCream }, { "ice_hockey", Emoji.Known.IceHockey }, { "ice_skate", Emoji.Known.IceSkate }, { "id_button", Emoji.Known.IdButton }, { "identification_card", Emoji.Known.IdentificationCard }, { "inbox_tray", Emoji.Known.InboxTray }, { "incoming_envelope", Emoji.Known.IncomingEnvelope }, { "index_pointing_at_the_viewer", Emoji.Known.IndexPointingAtTheViewer }, { "index_pointing_up", Emoji.Known.IndexPointingUp }, { "infinity", Emoji.Known.Infinity }, { "information", Emoji.Known.Information }, { "input_latin_letters", Emoji.Known.InputLatinLetters }, { "input_latin_lowercase", Emoji.Known.InputLatinLowercase }, { "input_latin_uppercase", Emoji.Known.InputLatinUppercase }, { "input_numbers", Emoji.Known.InputNumbers }, { "input_symbols", Emoji.Known.InputSymbols }, { "jack_o_lantern", Emoji.Known.JackOLantern }, { "japanese_acceptable_button", Emoji.Known.JapaneseAcceptableButton }, { "japanese_application_button", Emoji.Known.JapaneseApplicationButton }, { "japanese_bargain_button", Emoji.Known.JapaneseBargainButton }, { "japanese_castle", Emoji.Known.JapaneseCastle }, { "japanese_congratulations_button", Emoji.Known.JapaneseCongratulationsButton }, { "japanese_discount_button", Emoji.Known.JapaneseDiscountButton }, { "japanese_dolls", Emoji.Known.JapaneseDolls }, { "japanese_free_of_charge_button", Emoji.Known.JapaneseFreeOfChargeButton }, { "japanese_here_button", Emoji.Known.JapaneseHereButton }, { "japanese_monthly_amount_button", Emoji.Known.JapaneseMonthlyAmountButton }, { "japanese_not_free_of_charge_button", Emoji.Known.JapaneseNotFreeOfChargeButton }, { "japanese_no_vacancy_button", Emoji.Known.JapaneseNoVacancyButton }, { "japanese_open_for_business_button", Emoji.Known.JapaneseOpenForBusinessButton }, { "japanese_passing_grade_button", Emoji.Known.JapanesePassingGradeButton }, { "japanese_post_office", Emoji.Known.JapanesePostOffice }, { "japanese_prohibited_button", Emoji.Known.JapaneseProhibitedButton }, { "japanese_reserved_button", Emoji.Known.JapaneseReservedButton }, { "japanese_secret_button", Emoji.Known.JapaneseSecretButton }, { "japanese_service_charge_button", Emoji.Known.JapaneseServiceChargeButton }, { "japanese_symbol_for_beginner", Emoji.Known.JapaneseSymbolForBeginner }, { "japanese_vacancy_button", Emoji.Known.JapaneseVacancyButton }, { "jar", Emoji.Known.Jar }, { "jeans", Emoji.Known.Jeans }, { "jellyfish", Emoji.Known.Jellyfish }, { "joker", Emoji.Known.Joker }, { "joystick", Emoji.Known.Joystick }, { "kaaba", Emoji.Known.Kaaba }, { "kangaroo", Emoji.Known.Kangaroo }, { "key", Emoji.Known.Key }, { "keyboard", Emoji.Known.Keyboard }, { "keycap_10", Emoji.Known.Keycap10 }, { "khanda", Emoji.Known.Khanda }, { "kick_scooter", Emoji.Known.KickScooter }, { "kimono", Emoji.Known.Kimono }, { "kiss", Emoji.Known.Kiss }, { "kissing_cat", Emoji.Known.KissingCat }, { "kissing_face", Emoji.Known.KissingFace }, { "kissing_face_with_closed_eyes", Emoji.Known.KissingFaceWithClosedEyes }, { "kissing_face_with_smiling_eyes", Emoji.Known.KissingFaceWithSmilingEyes }, { "kiss_mark", Emoji.Known.KissMark }, { "kitchen_knife", Emoji.Known.KitchenKnife }, { "kite", Emoji.Known.Kite }, { "kiwi_fruit", Emoji.Known.KiwiFruit }, { "knot", Emoji.Known.Knot }, { "koala", Emoji.Known.Koala }, { "lab_coat", Emoji.Known.LabCoat }, { "label", Emoji.Known.Label }, { "lacrosse", Emoji.Known.Lacrosse }, { "ladder", Emoji.Known.Ladder }, { "lady_beetle", Emoji.Known.LadyBeetle }, { "landslide", Emoji.Known.Landslide }, { "laptop", Emoji.Known.Laptop }, { "large_blue_diamond", Emoji.Known.LargeBlueDiamond }, { "large_orange_diamond", Emoji.Known.LargeOrangeDiamond }, { "last_quarter_moon", Emoji.Known.LastQuarterMoon }, { "last_quarter_moon_face", Emoji.Known.LastQuarterMoonFace }, { "last_track_button", Emoji.Known.LastTrackButton }, { "latin_cross", Emoji.Known.LatinCross }, { "leaf_fluttering_in_wind", Emoji.Known.LeafFlutteringInWind }, { "leafless_tree", Emoji.Known.LeaflessTree }, { "leafy_green", Emoji.Known.LeafyGreen }, { "ledger", Emoji.Known.Ledger }, { "left_arrow", Emoji.Known.LeftArrow }, { "left_arrow_curving_right", Emoji.Known.LeftArrowCurvingRight }, { "left_facing_fist", Emoji.Known.LeftFacingFist }, { "left_luggage", Emoji.Known.LeftLuggage }, { "left_right_arrow", Emoji.Known.LeftRightArrow }, { "left_speech_bubble", Emoji.Known.LeftSpeechBubble }, { "leftwards_hand", Emoji.Known.LeftwardsHand }, { "leftwards_pushing_hand", Emoji.Known.LeftwardsPushingHand }, { "leg", Emoji.Known.Leg }, { "lemon", Emoji.Known.Lemon }, { "leo", Emoji.Known.Leo }, { "leopard", Emoji.Known.Leopard }, { "level_slider", Emoji.Known.LevelSlider }, { "libra", Emoji.Known.Libra }, { "light_blue_heart", Emoji.Known.LightBlueHeart }, { "light_bulb", Emoji.Known.LightBulb }, { "light_rail", Emoji.Known.LightRail }, { "light_skin_tone", Emoji.Known.LightSkinTone }, { "link", Emoji.Known.Link }, { "linked_paperclips", Emoji.Known.LinkedPaperclips }, { "lion", Emoji.Known.Lion }, { "lipstick", Emoji.Known.Lipstick }, { "litter_in_bin_sign", Emoji.Known.LitterInBinSign }, { "lizard", Emoji.Known.Lizard }, { "llama", Emoji.Known.Llama }, { "lobster", Emoji.Known.Lobster }, { "locked", Emoji.Known.Locked }, { "locked_with_key", Emoji.Known.LockedWithKey }, { "locked_with_pen", Emoji.Known.LockedWithPen }, { "locomotive", Emoji.Known.Locomotive }, { "lollipop", Emoji.Known.Lollipop }, { "long_drum", Emoji.Known.LongDrum }, { "lotion_bottle", Emoji.Known.LotionBottle }, { "lotus", Emoji.Known.Lotus }, { "loudly_crying_face", Emoji.Known.LoudlyCryingFace }, { "loudspeaker", Emoji.Known.Loudspeaker }, { "love_hotel", Emoji.Known.LoveHotel }, { "love_letter", Emoji.Known.LoveLetter }, { "love_you_gesture", Emoji.Known.LoveYouGesture }, { "low_battery", Emoji.Known.LowBattery }, { "luggage", Emoji.Known.Luggage }, { "lungs", Emoji.Known.Lungs }, { "lying_face", Emoji.Known.LyingFace }, { "mage", Emoji.Known.Mage }, { "magic_wand", Emoji.Known.MagicWand }, { "magnet", Emoji.Known.Magnet }, { "magnifying_glass_tilted_left", Emoji.Known.MagnifyingGlassTiltedLeft }, { "magnifying_glass_tilted_right", Emoji.Known.MagnifyingGlassTiltedRight }, { "mahjong_red_dragon", Emoji.Known.MahjongRedDragon }, { "male_sign", Emoji.Known.MaleSign }, { "mammoth", Emoji.Known.Mammoth }, { "man", Emoji.Known.Man }, { "man_dancing", Emoji.Known.ManDancing }, { "mango", Emoji.Known.Mango }, { "mans_shoe", Emoji.Known.MansShoe }, { "mantelpiece_clock", Emoji.Known.MantelpieceClock }, { "manual_wheelchair", Emoji.Known.ManualWheelchair }, { "maple_leaf", Emoji.Known.MapleLeaf }, { "map_of_japan", Emoji.Known.MapOfJapan }, { "maracas", Emoji.Known.Maracas }, { "martial_arts_uniform", Emoji.Known.MartialArtsUniform }, { "mate", Emoji.Known.Mate }, { "meat_on_bone", Emoji.Known.MeatOnBone }, { "mechanical_arm", Emoji.Known.MechanicalArm }, { "mechanical_leg", Emoji.Known.MechanicalLeg }, { "medical_symbol", Emoji.Known.MedicalSymbol }, { "medium_dark_skin_tone", Emoji.Known.MediumDarkSkinTone }, { "medium_light_skin_tone", Emoji.Known.MediumLightSkinTone }, { "medium_skin_tone", Emoji.Known.MediumSkinTone }, { "megaphone", Emoji.Known.Megaphone }, { "melon", Emoji.Known.Melon }, { "melting_face", Emoji.Known.MeltingFace }, { "memo", Emoji.Known.Memo }, { "men_holding_hands", Emoji.Known.MenHoldingHands }, { "menorah", Emoji.Known.Menorah }, { "mens_room", Emoji.Known.MensRoom }, { "merperson", Emoji.Known.Merperson }, { "metro", Emoji.Known.Metro }, { "microbe", Emoji.Known.Microbe }, { "microphone", Emoji.Known.Microphone }, { "microscope", Emoji.Known.Microscope }, { "middle_finger", Emoji.Known.MiddleFinger }, { "military_helmet", Emoji.Known.MilitaryHelmet }, { "military_medal", Emoji.Known.MilitaryMedal }, { "milky_way", Emoji.Known.MilkyWay }, { "minibus", Emoji.Known.Minibus }, { "minus", Emoji.Known.Minus }, { "mirror", Emoji.Known.Mirror }, { "mirror_ball", Emoji.Known.MirrorBall }, { "moai", Emoji.Known.Moai }, { "mobile_phone", Emoji.Known.MobilePhone }, { "mobile_phone_off", Emoji.Known.MobilePhoneOff }, { "mobile_phone_with_arrow", Emoji.Known.MobilePhoneWithArrow }, { "money_bag", Emoji.Known.MoneyBag }, { "money_mouth_face", Emoji.Known.MoneyMouthFace }, { "money_with_wings", Emoji.Known.MoneyWithWings }, { "monkey", Emoji.Known.Monkey }, { "monkey_face", Emoji.Known.MonkeyFace }, { "monorail", Emoji.Known.Monorail }, { "moon_cake", Emoji.Known.MoonCake }, { "moon_viewing_ceremony", Emoji.Known.MoonViewingCeremony }, { "moose", Emoji.Known.Moose }, { "mosque", Emoji.Known.Mosque }, { "mosquito", Emoji.Known.Mosquito }, { "motor_boat", Emoji.Known.MotorBoat }, { "motorcycle", Emoji.Known.Motorcycle }, { "motorized_wheelchair", Emoji.Known.MotorizedWheelchair }, { "motor_scooter", Emoji.Known.MotorScooter }, { "motorway", Emoji.Known.Motorway }, { "mountain", Emoji.Known.Mountain }, { "mountain_cableway", Emoji.Known.MountainCableway }, { "mountain_railway", Emoji.Known.MountainRailway }, { "mount_fuji", Emoji.Known.MountFuji }, { "mouse", Emoji.Known.Mouse }, { "mouse_face", Emoji.Known.MouseFace }, { "mouse_trap", Emoji.Known.MouseTrap }, { "mouth", Emoji.Known.Mouth }, { "movie_camera", Emoji.Known.MovieCamera }, { "mrs_claus", Emoji.Known.MrsClaus }, { "multiply", Emoji.Known.Multiply }, { "mushroom", Emoji.Known.Mushroom }, { "musical_keyboard", Emoji.Known.MusicalKeyboard }, { "musical_note", Emoji.Known.MusicalNote }, { "musical_notes", Emoji.Known.MusicalNotes }, { "musical_score", Emoji.Known.MusicalScore }, { "muted_speaker", Emoji.Known.MutedSpeaker }, { "nail_polish", Emoji.Known.NailPolish }, { "name_badge", Emoji.Known.NameBadge }, { "national_park", Emoji.Known.NationalPark }, { "nauseated_face", Emoji.Known.NauseatedFace }, { "nazar_amulet", Emoji.Known.NazarAmulet }, { "necktie", Emoji.Known.Necktie }, { "nerd_face", Emoji.Known.NerdFace }, { "nesting_dolls", Emoji.Known.NestingDolls }, { "nest_with_eggs", Emoji.Known.NestWithEggs }, { "neutral_face", Emoji.Known.NeutralFace }, { "new_button", Emoji.Known.NewButton }, { "new_moon", Emoji.Known.NewMoon }, { "new_moon_face", Emoji.Known.NewMoonFace }, { "newspaper", Emoji.Known.Newspaper }, { "next_track_button", Emoji.Known.NextTrackButton }, { "ng_button", Emoji.Known.NgButton }, { "night_with_stars", Emoji.Known.NightWithStars }, { "nine_o_clock", Emoji.Known.NineOClock }, { "nine_thirty", Emoji.Known.NineThirty }, { "ninja", Emoji.Known.Ninja }, { "no_bicycles", Emoji.Known.NoBicycles }, { "no_entry", Emoji.Known.NoEntry }, { "no_littering", Emoji.Known.NoLittering }, { "no_mobile_phones", Emoji.Known.NoMobilePhones }, { "non_potable_water", Emoji.Known.NonPotableWater }, { "no_one_under_eighteen", Emoji.Known.NoOneUnderEighteen }, { "no_pedestrians", Emoji.Known.NoPedestrians }, { "nose", Emoji.Known.Nose }, { "no_smoking", Emoji.Known.NoSmoking }, { "notebook", Emoji.Known.Notebook }, { "notebook_with_decorative_cover", Emoji.Known.NotebookWithDecorativeCover }, { "nut_and_bolt", Emoji.Known.NutAndBolt }, { "o_button_blood_type", Emoji.Known.OButtonBloodType }, { "octopus", Emoji.Known.Octopus }, { "oden", Emoji.Known.Oden }, { "office_building", Emoji.Known.OfficeBuilding }, { "ogre", Emoji.Known.Ogre }, { "oil_drum", Emoji.Known.OilDrum }, { "ok_button", Emoji.Known.OkButton }, { "ok_hand", Emoji.Known.OkHand }, { "older_person", Emoji.Known.OlderPerson }, { "old_key", Emoji.Known.OldKey }, { "old_man", Emoji.Known.OldMan }, { "old_woman", Emoji.Known.OldWoman }, { "olive", Emoji.Known.Olive }, { "om", Emoji.Known.Om }, { "on_arrow", Emoji.Known.OnArrow }, { "oncoming_automobile", Emoji.Known.OncomingAutomobile }, { "oncoming_bus", Emoji.Known.OncomingBus }, { "oncoming_fist", Emoji.Known.OncomingFist }, { "oncoming_police_car", Emoji.Known.OncomingPoliceCar }, { "oncoming_taxi", Emoji.Known.OncomingTaxi }, { "one_o_clock", Emoji.Known.OneOClock }, { "one_piece_swimsuit", Emoji.Known.OnePieceSwimsuit }, { "one_thirty", Emoji.Known.OneThirty }, { "onion", Emoji.Known.Onion }, { "open_book", Emoji.Known.OpenBook }, { "open_file_folder", Emoji.Known.OpenFileFolder }, { "open_hands", Emoji.Known.OpenHands }, { "open_mailbox_with_lowered_flag", Emoji.Known.OpenMailboxWithLoweredFlag }, { "open_mailbox_with_raised_flag", Emoji.Known.OpenMailboxWithRaisedFlag }, { "ophiuchus", Emoji.Known.Ophiuchus }, { "optical_disk", Emoji.Known.OpticalDisk }, { "orange_book", Emoji.Known.OrangeBook }, { "orange_circle", Emoji.Known.OrangeCircle }, { "orange_heart", Emoji.Known.OrangeHeart }, { "orange_square", Emoji.Known.OrangeSquare }, { "orangutan", Emoji.Known.Orangutan }, { "orca", Emoji.Known.Orca }, { "orthodox_cross", Emoji.Known.OrthodoxCross }, { "otter", Emoji.Known.Otter }, { "outbox_tray", Emoji.Known.OutboxTray }, { "owl", Emoji.Known.Owl }, { "ox", Emoji.Known.Ox }, { "oyster", Emoji.Known.Oyster }, { "package", Emoji.Known.Package }, { "page_facing_up", Emoji.Known.PageFacingUp }, { "pager", Emoji.Known.Pager }, { "page_with_curl", Emoji.Known.PageWithCurl }, { "paintbrush", Emoji.Known.Paintbrush }, { "palm_down_hand", Emoji.Known.PalmDownHand }, { "palms_up_together", Emoji.Known.PalmsUpTogether }, { "palm_tree", Emoji.Known.PalmTree }, { "palm_up_hand", Emoji.Known.PalmUpHand }, { "pancakes", Emoji.Known.Pancakes }, { "panda", Emoji.Known.Panda }, { "paperclip", Emoji.Known.Paperclip }, { "parachute", Emoji.Known.Parachute }, { "parrot", Emoji.Known.Parrot }, { "part_alternation_mark", Emoji.Known.PartAlternationMark }, { "partying_face", Emoji.Known.PartyingFace }, { "party_popper", Emoji.Known.PartyPopper }, { "passenger_ship", Emoji.Known.PassengerShip }, { "passport_control", Emoji.Known.PassportControl }, { "pause_button", Emoji.Known.PauseButton }, { "paw_prints", Emoji.Known.PawPrints }, { "p_button", Emoji.Known.PButton }, { "peace_symbol", Emoji.Known.PeaceSymbol }, { "peach", Emoji.Known.Peach }, { "peacock", Emoji.Known.Peacock }, { "peanuts", Emoji.Known.Peanuts }, { "pea_pod", Emoji.Known.PeaPod }, { "pear", Emoji.Known.Pear }, { "pen", Emoji.Known.Pen }, { "pencil", Emoji.Known.Pencil }, { "penguin", Emoji.Known.Penguin }, { "pensive_face", Emoji.Known.PensiveFace }, { "people_hugging", Emoji.Known.PeopleHugging }, { "people_with_bunny_ears", Emoji.Known.PeopleWithBunnyEars }, { "people_wrestling", Emoji.Known.PeopleWrestling }, { "performing_arts", Emoji.Known.PerformingArts }, { "persevering_face", Emoji.Known.PerseveringFace }, { "person", Emoji.Known.Person }, { "person_beard", Emoji.Known.PersonBeard }, { "person_biking", Emoji.Known.PersonBiking }, { "person_blond_hair", Emoji.Known.PersonBlondHair }, { "person_bouncing_ball", Emoji.Known.PersonBouncingBall }, { "person_bowing", Emoji.Known.PersonBowing }, { "person_cartwheeling", Emoji.Known.PersonCartwheeling }, { "person_climbing", Emoji.Known.PersonClimbing }, { "person_facepalming", Emoji.Known.PersonFacepalming }, { "person_fencing", Emoji.Known.PersonFencing }, { "person_frowning", Emoji.Known.PersonFrowning }, { "person_gesturing_no", Emoji.Known.PersonGesturingNo }, { "person_gesturing_ok", Emoji.Known.PersonGesturingOk }, { "person_getting_haircut", Emoji.Known.PersonGettingHaircut }, { "person_getting_massage", Emoji.Known.PersonGettingMassage }, { "person_golfing", Emoji.Known.PersonGolfing }, { "person_in_bed", Emoji.Known.PersonInBed }, { "person_in_lotus_position", Emoji.Known.PersonInLotusPosition }, { "person_in_steamy_room", Emoji.Known.PersonInSteamyRoom }, { "person_in_suit_levitating", Emoji.Known.PersonInSuitLevitating }, { "person_in_tuxedo", Emoji.Known.PersonInTuxedo }, { "person_juggling", Emoji.Known.PersonJuggling }, { "person_kneeling", Emoji.Known.PersonKneeling }, { "person_lifting_weights", Emoji.Known.PersonLiftingWeights }, { "person_mountain_biking", Emoji.Known.PersonMountainBiking }, { "person_playing_handball", Emoji.Known.PersonPlayingHandball }, { "person_playing_water_polo", Emoji.Known.PersonPlayingWaterPolo }, { "person_pouting", Emoji.Known.PersonPouting }, { "person_raising_hand", Emoji.Known.PersonRaisingHand }, { "person_rowing_boat", Emoji.Known.PersonRowingBoat }, { "person_running", Emoji.Known.PersonRunning }, { "person_shrugging", Emoji.Known.PersonShrugging }, { "person_standing", Emoji.Known.PersonStanding }, { "person_surfing", Emoji.Known.PersonSurfing }, { "person_swimming", Emoji.Known.PersonSwimming }, { "person_taking_bath", Emoji.Known.PersonTakingBath }, { "person_tipping_hand", Emoji.Known.PersonTippingHand }, { "person_walking", Emoji.Known.PersonWalking }, { "person_wearing_turban", Emoji.Known.PersonWearingTurban }, { "person_with_crown", Emoji.Known.PersonWithCrown }, { "person_with_skullcap", Emoji.Known.PersonWithSkullcap }, { "person_with_veil", Emoji.Known.PersonWithVeil }, { "petri_dish", Emoji.Known.PetriDish }, { "pick", Emoji.Known.Pick }, { "pickup_truck", Emoji.Known.PickupTruck }, { "pie", Emoji.Known.Pie }, { "pig", Emoji.Known.Pig }, { "pig_face", Emoji.Known.PigFace }, { "pig_nose", Emoji.Known.PigNose }, { "pile_of_poo", Emoji.Known.PileOfPoo }, { "pill", Emoji.Known.Pill }, { "piñata", Emoji.Known.Piñata }, { "pinched_fingers", Emoji.Known.PinchedFingers }, { "pinching_hand", Emoji.Known.PinchingHand }, { "pineapple", Emoji.Known.Pineapple }, { "pine_decoration", Emoji.Known.PineDecoration }, { "ping_pong", Emoji.Known.PingPong }, { "pink_heart", Emoji.Known.PinkHeart }, { "pisces", Emoji.Known.Pisces }, { "pizza", Emoji.Known.Pizza }, { "placard", Emoji.Known.Placard }, { "place_of_worship", Emoji.Known.PlaceOfWorship }, { "play_button", Emoji.Known.PlayButton }, { "playground_slide", Emoji.Known.PlaygroundSlide }, { "play_or_pause_button", Emoji.Known.PlayOrPauseButton }, { "pleading_face", Emoji.Known.PleadingFace }, { "plunger", Emoji.Known.Plunger }, { "plus", Emoji.Known.Plus }, { "police_car", Emoji.Known.PoliceCar }, { "police_car_light", Emoji.Known.PoliceCarLight }, { "police_officer", Emoji.Known.PoliceOfficer }, { "poodle", Emoji.Known.Poodle }, { "pool_8_ball", Emoji.Known.Pool8Ball }, { "popcorn", Emoji.Known.Popcorn }, { "postal_horn", Emoji.Known.PostalHorn }, { "postbox", Emoji.Known.Postbox }, { "post_office", Emoji.Known.PostOffice }, { "potable_water", Emoji.Known.PotableWater }, { "potato", Emoji.Known.Potato }, { "pot_of_food", Emoji.Known.PotOfFood }, { "potted_plant", Emoji.Known.PottedPlant }, { "poultry_leg", Emoji.Known.PoultryLeg }, { "pound_banknote", Emoji.Known.PoundBanknote }, { "pouring_liquid", Emoji.Known.PouringLiquid }, { "pouting_cat", Emoji.Known.PoutingCat }, { "prayer_beads", Emoji.Known.PrayerBeads }, { "pregnant_man", Emoji.Known.PregnantMan }, { "pregnant_person", Emoji.Known.PregnantPerson }, { "pregnant_woman", Emoji.Known.PregnantWoman }, { "pretzel", Emoji.Known.Pretzel }, { "prince", Emoji.Known.Prince }, { "princess", Emoji.Known.Princess }, { "printer", Emoji.Known.Printer }, { "prohibited", Emoji.Known.Prohibited }, { "purple_circle", Emoji.Known.PurpleCircle }, { "purple_heart", Emoji.Known.PurpleHeart }, { "purple_square", Emoji.Known.PurpleSquare }, { "purse", Emoji.Known.Purse }, { "pushpin", Emoji.Known.Pushpin }, { "puzzle_piece", Emoji.Known.PuzzlePiece }, { "rabbit", Emoji.Known.Rabbit }, { "rabbit_face", Emoji.Known.RabbitFace }, { "raccoon", Emoji.Known.Raccoon }, { "racing_car", Emoji.Known.RacingCar }, { "radio", Emoji.Known.Radio }, { "radioactive", Emoji.Known.Radioactive }, { "radio_button", Emoji.Known.RadioButton }, { "railway_car", Emoji.Known.RailwayCar }, { "railway_track", Emoji.Known.RailwayTrack }, { "rainbow", Emoji.Known.Rainbow }, { "raised_back_of_hand", Emoji.Known.RaisedBackOfHand }, { "raised_fist", Emoji.Known.RaisedFist }, { "raised_hand", Emoji.Known.RaisedHand }, { "raising_hands", Emoji.Known.RaisingHands }, { "ram", Emoji.Known.Ram }, { "rat", Emoji.Known.Rat }, { "razor", Emoji.Known.Razor }, { "receipt", Emoji.Known.Receipt }, { "record_button", Emoji.Known.RecordButton }, { "recycling_symbol", Emoji.Known.RecyclingSymbol }, { "red_apple", Emoji.Known.RedApple }, { "red_circle", Emoji.Known.RedCircle }, { "red_envelope", Emoji.Known.RedEnvelope }, { "red_exclamation_mark", Emoji.Known.RedExclamationMark }, { "red_hair", Emoji.Known.RedHair }, { "red_heart", Emoji.Known.RedHeart }, { "red_paper_lantern", Emoji.Known.RedPaperLantern }, { "red_question_mark", Emoji.Known.RedQuestionMark }, { "red_square", Emoji.Known.RedSquare }, { "red_triangle_pointed_down", Emoji.Known.RedTrianglePointedDown }, { "red_triangle_pointed_up", Emoji.Known.RedTrianglePointedUp }, { "regional_indicator_a", Emoji.Known.RegionalIndicatorA }, { "regional_indicator_b", Emoji.Known.RegionalIndicatorB }, { "regional_indicator_c", Emoji.Known.RegionalIndicatorC }, { "regional_indicator_d", Emoji.Known.RegionalIndicatorD }, { "regional_indicator_e", Emoji.Known.RegionalIndicatorE }, { "regional_indicator_f", Emoji.Known.RegionalIndicatorF }, { "regional_indicator_g", Emoji.Known.RegionalIndicatorG }, { "regional_indicator_h", Emoji.Known.RegionalIndicatorH }, { "regional_indicator_i", Emoji.Known.RegionalIndicatorI }, { "regional_indicator_j", Emoji.Known.RegionalIndicatorJ }, { "regional_indicator_k", Emoji.Known.RegionalIndicatorK }, { "regional_indicator_l", Emoji.Known.RegionalIndicatorL }, { "regional_indicator_m", Emoji.Known.RegionalIndicatorM }, { "regional_indicator_n", Emoji.Known.RegionalIndicatorN }, { "regional_indicator_o", Emoji.Known.RegionalIndicatorO }, { "regional_indicator_p", Emoji.Known.RegionalIndicatorP }, { "regional_indicator_q", Emoji.Known.RegionalIndicatorQ }, { "regional_indicator_r", Emoji.Known.RegionalIndicatorR }, { "regional_indicator_s", Emoji.Known.RegionalIndicatorS }, { "regional_indicator_t", Emoji.Known.RegionalIndicatorT }, { "regional_indicator_u", Emoji.Known.RegionalIndicatorU }, { "regional_indicator_v", Emoji.Known.RegionalIndicatorV }, { "regional_indicator_w", Emoji.Known.RegionalIndicatorW }, { "regional_indicator_x", Emoji.Known.RegionalIndicatorX }, { "regional_indicator_y", Emoji.Known.RegionalIndicatorY }, { "regional_indicator_z", Emoji.Known.RegionalIndicatorZ }, { "registered", Emoji.Known.Registered }, { "relieved_face", Emoji.Known.RelievedFace }, { "reminder_ribbon", Emoji.Known.ReminderRibbon }, { "repeat_button", Emoji.Known.RepeatButton }, { "repeat_single_button", Emoji.Known.RepeatSingleButton }, { "rescue_workers_helmet", Emoji.Known.RescueWorkersHelmet }, { "restroom", Emoji.Known.Restroom }, { "reverse_button", Emoji.Known.ReverseButton }, { "revolving_hearts", Emoji.Known.RevolvingHearts }, { "rhinoceros", Emoji.Known.Rhinoceros }, { "ribbon", Emoji.Known.Ribbon }, { "rice_ball", Emoji.Known.RiceBall }, { "rice_cracker", Emoji.Known.RiceCracker }, { "right_anger_bubble", Emoji.Known.RightAngerBubble }, { "right_arrow", Emoji.Known.RightArrow }, { "right_arrow_curving_down", Emoji.Known.RightArrowCurvingDown }, { "right_arrow_curving_left", Emoji.Known.RightArrowCurvingLeft }, { "right_arrow_curving_up", Emoji.Known.RightArrowCurvingUp }, { "right_facing_fist", Emoji.Known.RightFacingFist }, { "rightwards_hand", Emoji.Known.RightwardsHand }, { "rightwards_pushing_hand", Emoji.Known.RightwardsPushingHand }, { "ring", Emoji.Known.Ring }, { "ring_buoy", Emoji.Known.RingBuoy }, { "ringed_planet", Emoji.Known.RingedPlanet }, { "roasted_sweet_potato", Emoji.Known.RoastedSweetPotato }, { "robot", Emoji.Known.Robot }, { "rock", Emoji.Known.Rock }, { "rocket", Emoji.Known.Rocket }, { "rolled_up_newspaper", Emoji.Known.RolledUpNewspaper }, { "roller_coaster", Emoji.Known.RollerCoaster }, { "roller_skate", Emoji.Known.RollerSkate }, { "rolling_on_the_floor_laughing", Emoji.Known.RollingOnTheFloorLaughing }, { "roll_of_paper", Emoji.Known.RollOfPaper }, { "rooster", Emoji.Known.Rooster }, { "root_vegetable", Emoji.Known.RootVegetable }, { "rose", Emoji.Known.Rose }, { "rosette", Emoji.Known.Rosette }, { "round_pushpin", Emoji.Known.RoundPushpin }, { "rugby_football", Emoji.Known.RugbyFootball }, { "running_shirt", Emoji.Known.RunningShirt }, { "running_shoe", Emoji.Known.RunningShoe }, { "sad_but_relieved_face", Emoji.Known.SadButRelievedFace }, { "safety_pin", Emoji.Known.SafetyPin }, { "safety_vest", Emoji.Known.SafetyVest }, { "sagittarius", Emoji.Known.Sagittarius }, { "sailboat", Emoji.Known.Sailboat }, { "sake", Emoji.Known.Sake }, { "salt", Emoji.Known.Salt }, { "saluting_face", Emoji.Known.SalutingFace }, { "sandwich", Emoji.Known.Sandwich }, { "santa_claus", Emoji.Known.SantaClaus }, { "sari", Emoji.Known.Sari }, { "satellite", Emoji.Known.Satellite }, { "satellite_antenna", Emoji.Known.SatelliteAntenna }, { "sauropod", Emoji.Known.Sauropod }, { "saxophone", Emoji.Known.Saxophone }, { "scarf", Emoji.Known.Scarf }, { "school", Emoji.Known.School }, { "scissors", Emoji.Known.Scissors }, { "scorpio", Emoji.Known.Scorpio }, { "scorpion", Emoji.Known.Scorpion }, { "screwdriver", Emoji.Known.Screwdriver }, { "scroll", Emoji.Known.Scroll }, { "seal", Emoji.Known.Seal }, { "seat", Emoji.Known.Seat }, { "2nd_place_medal", Emoji.Known.SecondPlaceMedal }, { "seedling", Emoji.Known.Seedling }, { "see_no_evil_monkey", Emoji.Known.SeeNoEvilMonkey }, { "selfie", Emoji.Known.Selfie }, { "seven_o_clock", Emoji.Known.SevenOClock }, { "seven_thirty", Emoji.Known.SevenThirty }, { "sewing_needle", Emoji.Known.SewingNeedle }, { "shaking_face", Emoji.Known.ShakingFace }, { "shallow_pan_of_food", Emoji.Known.ShallowPanOfFood }, { "shamrock", Emoji.Known.Shamrock }, { "shark", Emoji.Known.Shark }, { "shaved_ice", Emoji.Known.ShavedIce }, { "sheaf_of_rice", Emoji.Known.SheafOfRice }, { "shield", Emoji.Known.Shield }, { "shinto_shrine", Emoji.Known.ShintoShrine }, { "ship", Emoji.Known.Ship }, { "shooting_star", Emoji.Known.ShootingStar }, { "shopping_bags", Emoji.Known.ShoppingBags }, { "shopping_cart", Emoji.Known.ShoppingCart }, { "shortcake", Emoji.Known.Shortcake }, { "shorts", Emoji.Known.Shorts }, { "shovel", Emoji.Known.Shovel }, { "shower", Emoji.Known.Shower }, { "shrimp", Emoji.Known.Shrimp }, { "shuffle_tracks_button", Emoji.Known.ShuffleTracksButton }, { "shushing_face", Emoji.Known.ShushingFace }, { "sign_of_the_horns", Emoji.Known.SignOfTheHorns }, { "six_o_clock", Emoji.Known.SixOClock }, { "six_thirty", Emoji.Known.SixThirty }, { "skateboard", Emoji.Known.Skateboard }, { "skier", Emoji.Known.Skier }, { "skis", Emoji.Known.Skis }, { "skull", Emoji.Known.Skull }, { "skull_and_crossbones", Emoji.Known.SkullAndCrossbones }, { "skunk", Emoji.Known.Skunk }, { "sled", Emoji.Known.Sled }, { "sleeping_face", Emoji.Known.SleepingFace }, { "sleepy_face", Emoji.Known.SleepyFace }, { "slightly_frowning_face", Emoji.Known.SlightlyFrowningFace }, { "slightly_smiling_face", Emoji.Known.SlightlySmilingFace }, { "sloth", Emoji.Known.Sloth }, { "slot_machine", Emoji.Known.SlotMachine }, { "small_airplane", Emoji.Known.SmallAirplane }, { "small_blue_diamond", Emoji.Known.SmallBlueDiamond }, { "small_orange_diamond", Emoji.Known.SmallOrangeDiamond }, { "smiling_cat_with_heart_eyes", Emoji.Known.SmilingCatWithHeartEyes }, { "smiling_face", Emoji.Known.SmilingFace }, { "smiling_face_with_halo", Emoji.Known.SmilingFaceWithHalo }, { "smiling_face_with_heart_eyes", Emoji.Known.SmilingFaceWithHeartEyes }, { "smiling_face_with_hearts", Emoji.Known.SmilingFaceWithHearts }, { "smiling_face_with_horns", Emoji.Known.SmilingFaceWithHorns }, { "smiling_face_with_open_hands", Emoji.Known.SmilingFaceWithOpenHands }, { "smiling_face_with_smiling_eyes", Emoji.Known.SmilingFaceWithSmilingEyes }, { "smiling_face_with_sunglasses", Emoji.Known.SmilingFaceWithSunglasses }, { "smiling_face_with_tear", Emoji.Known.SmilingFaceWithTear }, { "smirking_face", Emoji.Known.SmirkingFace }, { "snail", Emoji.Known.Snail }, { "snake", Emoji.Known.Snake }, { "sneezing_face", Emoji.Known.SneezingFace }, { "snowboarder", Emoji.Known.Snowboarder }, { "snow_capped_mountain", Emoji.Known.SnowCappedMountain }, { "snowflake", Emoji.Known.Snowflake }, { "snowman", Emoji.Known.Snowman }, { "snowman_without_snow", Emoji.Known.SnowmanWithoutSnow }, { "soap", Emoji.Known.Soap }, { "soccer_ball", Emoji.Known.SoccerBall }, { "socks", Emoji.Known.Socks }, { "softball", Emoji.Known.Softball }, { "soft_ice_cream", Emoji.Known.SoftIceCream }, { "soon_arrow", Emoji.Known.SoonArrow }, { "sos_button", Emoji.Known.SosButton }, { "spade_suit", Emoji.Known.SpadeSuit }, { "spaghetti", Emoji.Known.Spaghetti }, { "sparkle", Emoji.Known.Sparkle }, { "sparkler", Emoji.Known.Sparkler }, { "sparkles", Emoji.Known.Sparkles }, { "sparkling_heart", Emoji.Known.SparklingHeart }, { "speaker_high_volume", Emoji.Known.SpeakerHighVolume }, { "speaker_low_volume", Emoji.Known.SpeakerLowVolume }, { "speaker_medium_volume", Emoji.Known.SpeakerMediumVolume }, { "speaking_head", Emoji.Known.SpeakingHead }, { "speak_no_evil_monkey", Emoji.Known.SpeakNoEvilMonkey }, { "speech_balloon", Emoji.Known.SpeechBalloon }, { "speedboat", Emoji.Known.Speedboat }, { "spider", Emoji.Known.Spider }, { "spider_web", Emoji.Known.SpiderWeb }, { "spiral_calendar", Emoji.Known.SpiralCalendar }, { "spiral_notepad", Emoji.Known.SpiralNotepad }, { "spiral_shell", Emoji.Known.SpiralShell }, { "splatter", Emoji.Known.Splatter }, { "sponge", Emoji.Known.Sponge }, { "spoon", Emoji.Known.Spoon }, { "sports_medal", Emoji.Known.SportsMedal }, { "sport_utility_vehicle", Emoji.Known.SportUtilityVehicle }, { "spouting_whale", Emoji.Known.SpoutingWhale }, { "squid", Emoji.Known.Squid }, { "squinting_face_with_tongue", Emoji.Known.SquintingFaceWithTongue }, { "stadium", Emoji.Known.Stadium }, { "star", Emoji.Known.Star }, { "star_and_crescent", Emoji.Known.StarAndCrescent }, { "star_of_david", Emoji.Known.StarOfDavid }, { "star_struck", Emoji.Known.StarStruck }, { "station", Emoji.Known.Station }, { "statue_of_liberty", Emoji.Known.StatueOfLiberty }, { "steaming_bowl", Emoji.Known.SteamingBowl }, { "stethoscope", Emoji.Known.Stethoscope }, { "stop_button", Emoji.Known.StopButton }, { "stop_sign", Emoji.Known.StopSign }, { "stopwatch", Emoji.Known.Stopwatch }, { "straight_ruler", Emoji.Known.StraightRuler }, { "strawberry", Emoji.Known.Strawberry }, { "studio_microphone", Emoji.Known.StudioMicrophone }, { "stuffed_flatbread", Emoji.Known.StuffedFlatbread }, { "sun", Emoji.Known.Sun }, { "sun_behind_cloud", Emoji.Known.SunBehindCloud }, { "sun_behind_large_cloud", Emoji.Known.SunBehindLargeCloud }, { "sun_behind_rain_cloud", Emoji.Known.SunBehindRainCloud }, { "sun_behind_small_cloud", Emoji.Known.SunBehindSmallCloud }, { "sunflower", Emoji.Known.Sunflower }, { "sunglasses", Emoji.Known.Sunglasses }, { "sunrise", Emoji.Known.Sunrise }, { "sunrise_over_mountains", Emoji.Known.SunriseOverMountains }, { "sunset", Emoji.Known.Sunset }, { "sun_with_face", Emoji.Known.SunWithFace }, { "superhero", Emoji.Known.Superhero }, { "supervillain", Emoji.Known.Supervillain }, { "sushi", Emoji.Known.Sushi }, { "suspension_railway", Emoji.Known.SuspensionRailway }, { "swan", Emoji.Known.Swan }, { "sweat_droplets", Emoji.Known.SweatDroplets }, { "synagogue", Emoji.Known.Synagogue }, { "syringe", Emoji.Known.Syringe }, { "taco", Emoji.Known.Taco }, { "takeout_box", Emoji.Known.TakeoutBox }, { "tamale", Emoji.Known.Tamale }, { "tanabata_tree", Emoji.Known.TanabataTree }, { "tangerine", Emoji.Known.Tangerine }, { "taurus", Emoji.Known.Taurus }, { "taxi", Emoji.Known.Taxi }, { "teacup_without_handle", Emoji.Known.TeacupWithoutHandle }, { "teapot", Emoji.Known.Teapot }, { "tear_off_calendar", Emoji.Known.TearOffCalendar }, { "teddy_bear", Emoji.Known.TeddyBear }, { "telephone", Emoji.Known.Telephone }, { "telephone_receiver", Emoji.Known.TelephoneReceiver }, { "telescope", Emoji.Known.Telescope }, { "television", Emoji.Known.Television }, { "tennis", Emoji.Known.Tennis }, { "ten_o_clock", Emoji.Known.TenOClock }, { "tent", Emoji.Known.Tent }, { "ten_thirty", Emoji.Known.TenThirty }, { "test_tube", Emoji.Known.TestTube }, { "thermometer", Emoji.Known.Thermometer }, { "thinking_face", Emoji.Known.ThinkingFace }, { "3rd_place_medal", Emoji.Known.ThirdPlaceMedal }, { "thong_sandal", Emoji.Known.ThongSandal }, { "thought_balloon", Emoji.Known.ThoughtBalloon }, { "thread", Emoji.Known.Thread }, { "three_o_clock", Emoji.Known.ThreeOClock }, { "three_thirty", Emoji.Known.ThreeThirty }, { "thumbs_down", Emoji.Known.ThumbsDown }, { "thumbs_up", Emoji.Known.ThumbsUp }, { "ticket", Emoji.Known.Ticket }, { "tiger", Emoji.Known.Tiger }, { "tiger_face", Emoji.Known.TigerFace }, { "timer_clock", Emoji.Known.TimerClock }, { "tired_face", Emoji.Known.TiredFace }, { "toilet", Emoji.Known.Toilet }, { "tokyo_tower", Emoji.Known.TokyoTower }, { "tomato", Emoji.Known.Tomato }, { "tongue", Emoji.Known.Tongue }, { "toolbox", Emoji.Known.Toolbox }, { "tooth", Emoji.Known.Tooth }, { "toothbrush", Emoji.Known.Toothbrush }, { "top_arrow", Emoji.Known.TopArrow }, { "top_hat", Emoji.Known.TopHat }, { "tornado", Emoji.Known.Tornado }, { "trackball", Emoji.Known.Trackball }, { "tractor", Emoji.Known.Tractor }, { "trade_mark", Emoji.Known.TradeMark }, { "train", Emoji.Known.Train }, { "tram", Emoji.Known.Tram }, { "tram_car", Emoji.Known.TramCar }, { "transgender_symbol", Emoji.Known.TransgenderSymbol }, { "treasure_chest", Emoji.Known.TreasureChest }, { "t_rex", Emoji.Known.TRex }, { "triangular_flag", Emoji.Known.TriangularFlag }, { "triangular_ruler", Emoji.Known.TriangularRuler }, { "trident_emblem", Emoji.Known.TridentEmblem }, { "troll", Emoji.Known.Troll }, { "trolleybus", Emoji.Known.Trolleybus }, { "trombone", Emoji.Known.Trombone }, { "trophy", Emoji.Known.Trophy }, { "tropical_drink", Emoji.Known.TropicalDrink }, { "tropical_fish", Emoji.Known.TropicalFish }, { "trumpet", Emoji.Known.Trumpet }, { "t_shirt", Emoji.Known.TShirt }, { "tulip", Emoji.Known.Tulip }, { "tumbler_glass", Emoji.Known.TumblerGlass }, { "turkey", Emoji.Known.Turkey }, { "turtle", Emoji.Known.Turtle }, { "twelve_o_clock", Emoji.Known.TwelveOClock }, { "twelve_thirty", Emoji.Known.TwelveThirty }, { "two_hearts", Emoji.Known.TwoHearts }, { "two_hump_camel", Emoji.Known.TwoHumpCamel }, { "two_o_clock", Emoji.Known.TwoOClock }, { "two_thirty", Emoji.Known.TwoThirty }, { "umbrella", Emoji.Known.Umbrella }, { "umbrella_on_ground", Emoji.Known.UmbrellaOnGround }, { "umbrella_with_rain_drops", Emoji.Known.UmbrellaWithRainDrops }, { "unamused_face", Emoji.Known.UnamusedFace }, { "unicorn", Emoji.Known.Unicorn }, { "unlocked", Emoji.Known.Unlocked }, { "up_arrow", Emoji.Known.UpArrow }, { "up_button", Emoji.Known.UpButton }, { "up_down_arrow", Emoji.Known.UpDownArrow }, { "up_left_arrow", Emoji.Known.UpLeftArrow }, { "up_right_arrow", Emoji.Known.UpRightArrow }, { "upside_down_face", Emoji.Known.UpsideDownFace }, { "upwards_button", Emoji.Known.UpwardsButton }, { "vampire", Emoji.Known.Vampire }, { "vertical_traffic_light", Emoji.Known.VerticalTrafficLight }, { "vibration_mode", Emoji.Known.VibrationMode }, { "victory_hand", Emoji.Known.VictoryHand }, { "video_camera", Emoji.Known.VideoCamera }, { "videocassette", Emoji.Known.Videocassette }, { "video_game", Emoji.Known.VideoGame }, { "violin", Emoji.Known.Violin }, { "virgo", Emoji.Known.Virgo }, { "volcano", Emoji.Known.Volcano }, { "volleyball", Emoji.Known.Volleyball }, { "vs_button", Emoji.Known.VsButton }, { "vulcan_salute", Emoji.Known.VulcanSalute }, { "waffle", Emoji.Known.Waffle }, { "waning_crescent_moon", Emoji.Known.WaningCrescentMoon }, { "waning_gibbous_moon", Emoji.Known.WaningGibbousMoon }, { "warning", Emoji.Known.Warning }, { "wastebasket", Emoji.Known.Wastebasket }, { "watch", Emoji.Known.Watch }, { "water_buffalo", Emoji.Known.WaterBuffalo }, { "water_closet", Emoji.Known.WaterCloset }, { "watermelon", Emoji.Known.Watermelon }, { "water_pistol", Emoji.Known.WaterPistol }, { "water_wave", Emoji.Known.WaterWave }, { "waving_hand", Emoji.Known.WavingHand }, { "wavy_dash", Emoji.Known.WavyDash }, { "waxing_crescent_moon", Emoji.Known.WaxingCrescentMoon }, { "waxing_gibbous_moon", Emoji.Known.WaxingGibbousMoon }, { "weary_cat", Emoji.Known.WearyCat }, { "weary_face", Emoji.Known.WearyFace }, { "wedding", Emoji.Known.Wedding }, { "whale", Emoji.Known.Whale }, { "wheel", Emoji.Known.Wheel }, { "wheelchair_symbol", Emoji.Known.WheelchairSymbol }, { "wheel_of_dharma", Emoji.Known.WheelOfDharma }, { "white_cane", Emoji.Known.WhiteCane }, { "white_circle", Emoji.Known.WhiteCircle }, { "white_exclamation_mark", Emoji.Known.WhiteExclamationMark }, { "white_flag", Emoji.Known.WhiteFlag }, { "white_flower", Emoji.Known.WhiteFlower }, { "white_hair", Emoji.Known.WhiteHair }, { "white_heart", Emoji.Known.WhiteHeart }, { "white_large_square", Emoji.Known.WhiteLargeSquare }, { "white_medium_small_square", Emoji.Known.WhiteMediumSmallSquare }, { "white_medium_square", Emoji.Known.WhiteMediumSquare }, { "white_question_mark", Emoji.Known.WhiteQuestionMark }, { "white_small_square", Emoji.Known.WhiteSmallSquare }, { "white_square_button", Emoji.Known.WhiteSquareButton }, { "wilted_flower", Emoji.Known.WiltedFlower }, { "wind_chime", Emoji.Known.WindChime }, { "wind_face", Emoji.Known.WindFace }, { "window", Emoji.Known.Window }, { "wine_glass", Emoji.Known.WineGlass }, { "wing", Emoji.Known.Wing }, { "winking_face", Emoji.Known.WinkingFace }, { "winking_face_with_tongue", Emoji.Known.WinkingFaceWithTongue }, { "wireless", Emoji.Known.Wireless }, { "wolf", Emoji.Known.Wolf }, { "woman", Emoji.Known.Woman }, { "woman_and_man_holding_hands", Emoji.Known.WomanAndManHoldingHands }, { "woman_dancing", Emoji.Known.WomanDancing }, { "womans_boot", Emoji.Known.WomansBoot }, { "womans_clothes", Emoji.Known.WomansClothes }, { "womans_hat", Emoji.Known.WomansHat }, { "womans_sandal", Emoji.Known.WomansSandal }, { "woman_with_headscarf", Emoji.Known.WomanWithHeadscarf }, { "women_holding_hands", Emoji.Known.WomenHoldingHands }, { "womens_room", Emoji.Known.WomensRoom }, { "wood", Emoji.Known.Wood }, { "woozy_face", Emoji.Known.WoozyFace }, { "world_map", Emoji.Known.WorldMap }, { "worm", Emoji.Known.Worm }, { "worried_face", Emoji.Known.WorriedFace }, { "wrapped_gift", Emoji.Known.WrappedGift }, { "wrench", Emoji.Known.Wrench }, { "writing_hand", Emoji.Known.WritingHand }, { "x_ray", Emoji.Known.XRay }, { "yarn", Emoji.Known.Yarn }, { "yawning_face", Emoji.Known.YawningFace }, { "yellow_circle", Emoji.Known.YellowCircle }, { "yellow_heart", Emoji.Known.YellowHeart }, { "yellow_square", Emoji.Known.YellowSquare }, { "yen_banknote", Emoji.Known.YenBanknote }, { "yin_yang", Emoji.Known.YinYang }, { "yo_yo", Emoji.Known.YoYo }, { "zany_face", Emoji.Known.ZanyFace }, { "zebra", Emoji.Known.Zebra }, { "zipper_mouth_face", Emoji.Known.ZipperMouthFace }, { "zombie", Emoji.Known.Zombie }, { "zzz", Emoji.Known.Zzz }, { "hugging_face", Emoji.Known.SmilingFaceWithOpenHands }, { "knocked_out_face", Emoji.Known.FaceWithCrossedOutEyes }, { "pouting_face", Emoji.Known.EnragedFace }, }; /// /// Contains well-known emojis. /// public static class Known { /// /// Gets the "Abacus" emoji. 🧮 /// /// /// Lookup: abacus /// public const string Abacus = "\U0001F9EE"; /// /// Gets the "AB button (blood type)" emoji. 🆎 /// /// /// Lookup: ab_button_blood_type /// public const string AbButtonBloodType = "\U0001F18E"; /// /// Gets the "A button (blood type)" emoji. 🅰 /// /// /// Lookup: a_button_blood_type /// public const string AButtonBloodType = "\U0001F170"; /// /// Gets the "Accordion" emoji. 🪗 /// /// /// Lookup: accordion /// public const string Accordion = "\U0001FA97"; /// /// Gets the "Adhesive bandage" emoji. 🩹 /// /// /// Lookup: adhesive_bandage /// public const string AdhesiveBandage = "\U0001FA79"; /// /// Gets the "Admission tickets" emoji. 🎟 /// /// /// Lookup: admission_tickets /// public const string AdmissionTickets = "\U0001F39F"; /// /// Gets the "Aerial tramway" emoji. 🚡 /// /// /// Lookup: aerial_tramway /// public const string AerialTramway = "\U0001F6A1"; /// /// Gets the "Airplane" emoji. ✈ /// /// /// Lookup: airplane /// public const string Airplane = "\U00002708"; /// /// Gets the "Airplane arrival" emoji. 🛬 /// /// /// Lookup: airplane_arrival /// public const string AirplaneArrival = "\U0001F6EC"; /// /// Gets the "Airplane departure" emoji. 🛫 /// /// /// Lookup: airplane_departure /// public const string AirplaneDeparture = "\U0001F6EB"; /// /// Gets the "Alarm clock" emoji. ⏰ /// /// /// Lookup: alarm_clock /// public const string AlarmClock = "\U000023F0"; /// /// Gets the "Alembic" emoji. ⚗ /// /// /// Lookup: alembic /// public const string Alembic = "\U00002697"; /// /// Gets the "Alien" emoji. 👽 /// /// /// Lookup: alien /// public const string Alien = "\U0001F47D"; /// /// Gets the "Alien monster" emoji. 👾 /// /// /// Lookup: alien_monster /// public const string AlienMonster = "\U0001F47E"; /// /// Gets the "Ambulance" emoji. 🚑 /// /// /// Lookup: ambulance /// public const string Ambulance = "\U0001F691"; /// /// Gets the "American football" emoji. 🏈 /// /// /// Lookup: american_football /// public const string AmericanFootball = "\U0001F3C8"; /// /// Gets the "Amphora" emoji. 🏺 /// /// /// Lookup: amphora /// public const string Amphora = "\U0001F3FA"; /// /// Gets the "Anatomical heart" emoji. 🫀 /// /// /// Lookup: anatomical_heart /// public const string AnatomicalHeart = "\U0001FAC0"; /// /// Gets the "Anchor" emoji. ⚓ /// /// /// Lookup: anchor /// public const string Anchor = "\U00002693"; /// /// Gets the "Anger symbol" emoji. 💢 /// /// /// Lookup: anger_symbol /// public const string AngerSymbol = "\U0001F4A2"; /// /// Gets the "Angry face" emoji. 😠 /// /// /// Lookup: angry_face /// public const string AngryFace = "\U0001F620"; /// /// Gets the "Angry face with horns" emoji. 👿 /// /// /// Lookup: angry_face_with_horns /// public const string AngryFaceWithHorns = "\U0001F47F"; /// /// Gets the "Anguished face" emoji. 😧 /// /// /// Lookup: anguished_face /// public const string AnguishedFace = "\U0001F627"; /// /// Gets the "Ant" emoji. 🐜 /// /// /// Lookup: ant /// public const string Ant = "\U0001F41C"; /// /// Gets the "Antenna bars" emoji. 📶 /// /// /// Lookup: antenna_bars /// public const string AntennaBars = "\U0001F4F6"; /// /// Gets the "Anxious face with sweat" emoji. 😰 /// /// /// Lookup: anxious_face_with_sweat /// public const string AnxiousFaceWithSweat = "\U0001F630"; /// /// Gets the "Aquarius" emoji. ♒ /// /// /// Lookup: aquarius /// public const string Aquarius = "\U00002652"; /// /// Gets the "Aries" emoji. ♈ /// /// /// Lookup: aries /// public const string Aries = "\U00002648"; /// /// Gets the "Articulated lorry" emoji. 🚛 /// /// /// Lookup: articulated_lorry /// public const string ArticulatedLorry = "\U0001F69B"; /// /// Gets the "Artist palette" emoji. 🎨 /// /// /// Lookup: artist_palette /// public const string ArtistPalette = "\U0001F3A8"; /// /// Gets the "Astonished face" emoji. 😲 /// /// /// Lookup: astonished_face /// public const string AstonishedFace = "\U0001F632"; /// /// Gets the "ATM sign" emoji. 🏧 /// /// /// Lookup: atm_sign /// public const string AtmSign = "\U0001F3E7"; /// /// Gets the "Atom symbol" emoji. ⚛ /// /// /// Lookup: atom_symbol /// public const string AtomSymbol = "\U0000269B"; /// /// Gets the "Automobile" emoji. 🚗 /// /// /// Lookup: automobile /// public const string Automobile = "\U0001F697"; /// /// Gets the "Auto rickshaw" emoji. 🛺 /// /// /// Lookup: auto_rickshaw /// public const string AutoRickshaw = "\U0001F6FA"; /// /// Gets the "Avocado" emoji. 🥑 /// /// /// Lookup: avocado /// public const string Avocado = "\U0001F951"; /// /// Gets the "Axe" emoji. 🪓 /// /// /// Lookup: axe /// public const string Axe = "\U0001FA93"; /// /// Gets the "Baby" emoji. 👶 /// /// /// Lookup: baby /// public const string Baby = "\U0001F476"; /// /// Gets the "Baby angel" emoji. 👼 /// /// /// Lookup: baby_angel /// public const string BabyAngel = "\U0001F47C"; /// /// Gets the "Baby bottle" emoji. 🍼 /// /// /// Lookup: baby_bottle /// public const string BabyBottle = "\U0001F37C"; /// /// Gets the "Baby chick" emoji. 🐤 /// /// /// Lookup: baby_chick /// public const string BabyChick = "\U0001F424"; /// /// Gets the "Baby symbol" emoji. 🚼 /// /// /// Lookup: baby_symbol /// public const string BabySymbol = "\U0001F6BC"; /// /// Gets the "BACK arrow" emoji. 🔙 /// /// /// Lookup: back_arrow /// public const string BackArrow = "\U0001F519"; /// /// Gets the "Backhand index pointing down" emoji. 👇 /// /// /// Lookup: backhand_index_pointing_down /// public const string BackhandIndexPointingDown = "\U0001F447"; /// /// Gets the "Backhand index pointing left" emoji. 👈 /// /// /// Lookup: backhand_index_pointing_left /// public const string BackhandIndexPointingLeft = "\U0001F448"; /// /// Gets the "Backhand index pointing right" emoji. 👉 /// /// /// Lookup: backhand_index_pointing_right /// public const string BackhandIndexPointingRight = "\U0001F449"; /// /// Gets the "Backhand index pointing up" emoji. 👆 /// /// /// Lookup: backhand_index_pointing_up /// public const string BackhandIndexPointingUp = "\U0001F446"; /// /// Gets the "Backpack" emoji. 🎒 /// /// /// Lookup: backpack /// public const string Backpack = "\U0001F392"; /// /// Gets the "Bacon" emoji. 🥓 /// /// /// Lookup: bacon /// public const string Bacon = "\U0001F953"; /// /// Gets the "Badger" emoji. 🦡 /// /// /// Lookup: badger /// public const string Badger = "\U0001F9A1"; /// /// Gets the "Badminton" emoji. 🏸 /// /// /// Lookup: badminton /// public const string Badminton = "\U0001F3F8"; /// /// Gets the "Bagel" emoji. 🥯 /// /// /// Lookup: bagel /// public const string Bagel = "\U0001F96F"; /// /// Gets the "Baggage claim" emoji. 🛄 /// /// /// Lookup: baggage_claim /// public const string BaggageClaim = "\U0001F6C4"; /// /// Gets the "Baguette bread" emoji. 🥖 /// /// /// Lookup: baguette_bread /// public const string BaguetteBread = "\U0001F956"; /// /// Gets the "Balance scale" emoji. ⚖ /// /// /// Lookup: balance_scale /// public const string BalanceScale = "\U00002696"; /// /// Gets the "Bald" emoji. 🦲 /// /// /// Lookup: bald /// public const string Bald = "\U0001F9B2"; /// /// Gets the "Ballet shoes" emoji. 🩰 /// /// /// Lookup: ballet_shoes /// public const string BalletShoes = "\U0001FA70"; /// /// Gets the "Balloon" emoji. 🎈 /// /// /// Lookup: balloon /// public const string Balloon = "\U0001F388"; /// /// Gets the "Ballot box with ballot" emoji. 🗳 /// /// /// Lookup: ballot_box_with_ballot /// public const string BallotBoxWithBallot = "\U0001F5F3"; /// /// Gets the "Banana" emoji. 🍌 /// /// /// Lookup: banana /// public const string Banana = "\U0001F34C"; /// /// Gets the "Banjo" emoji. 🪕 /// /// /// Lookup: banjo /// public const string Banjo = "\U0001FA95"; /// /// Gets the "Bank" emoji. 🏦 /// /// /// Lookup: bank /// public const string Bank = "\U0001F3E6"; /// /// Gets the "Barber pole" emoji. 💈 /// /// /// Lookup: barber_pole /// public const string BarberPole = "\U0001F488"; /// /// Gets the "Bar chart" emoji. 📊 /// /// /// Lookup: bar_chart /// public const string BarChart = "\U0001F4CA"; /// /// Gets the "Baseball" emoji. ⚾ /// /// /// Lookup: baseball /// public const string Baseball = "\U000026BE"; /// /// Gets the "Basket" emoji. 🧺 /// /// /// Lookup: basket /// public const string Basket = "\U0001F9FA"; /// /// Gets the "Basketball" emoji. 🏀 /// /// /// Lookup: basketball /// public const string Basketball = "\U0001F3C0"; /// /// Gets the "Bat" emoji. 🦇 /// /// /// Lookup: bat /// public const string Bat = "\U0001F987"; /// /// Gets the "Bathtub" emoji. 🛁 /// /// /// Lookup: bathtub /// public const string Bathtub = "\U0001F6C1"; /// /// Gets the "Battery" emoji. 🔋 /// /// /// Lookup: battery /// public const string Battery = "\U0001F50B"; /// /// Gets the "B button (blood type)" emoji. 🅱 /// /// /// Lookup: b_button_blood_type /// public const string BButtonBloodType = "\U0001F171"; /// /// Gets the "Beach with umbrella" emoji. 🏖 /// /// /// Lookup: beach_with_umbrella /// public const string BeachWithUmbrella = "\U0001F3D6"; /// /// Gets the "Beaming face with smiling eyes" emoji. 😁 /// /// /// Lookup: beaming_face_with_smiling_eyes /// public const string BeamingFaceWithSmilingEyes = "\U0001F601"; /// /// Gets the "Beans" emoji. 🫘 /// /// /// Lookup: beans /// public const string Beans = "\U0001FAD8"; /// /// Gets the "Bear" emoji. 🐻 /// /// /// Lookup: bear /// public const string Bear = "\U0001F43B"; /// /// Gets the "Beating heart" emoji. 💓 /// /// /// Lookup: beating_heart /// public const string BeatingHeart = "\U0001F493"; /// /// Gets the "Beaver" emoji. 🦫 /// /// /// Lookup: beaver /// public const string Beaver = "\U0001F9AB"; /// /// Gets the "Bed" emoji. 🛏 /// /// /// Lookup: bed /// public const string Bed = "\U0001F6CF"; /// /// Gets the "Beer mug" emoji. 🍺 /// /// /// Lookup: beer_mug /// public const string BeerMug = "\U0001F37A"; /// /// Gets the "Beetle" emoji. 🪲 /// /// /// Lookup: beetle /// public const string Beetle = "\U0001FAB2"; /// /// Gets the "Bell" emoji. 🔔 /// /// /// Lookup: bell /// public const string Bell = "\U0001F514"; /// /// Gets the "Bellhop bell" emoji. 🛎 /// /// /// Lookup: bellhop_bell /// public const string BellhopBell = "\U0001F6CE"; /// /// Gets the "Bell pepper" emoji. 🫑 /// /// /// Lookup: bell_pepper /// public const string BellPepper = "\U0001FAD1"; /// /// Gets the "Bell with slash" emoji. 🔕 /// /// /// Lookup: bell_with_slash /// public const string BellWithSlash = "\U0001F515"; /// /// Gets the "Bento box" emoji. 🍱 /// /// /// Lookup: bento_box /// public const string BentoBox = "\U0001F371"; /// /// Gets the "Beverage box" emoji. 🧃 /// /// /// Lookup: beverage_box /// public const string BeverageBox = "\U0001F9C3"; /// /// Gets the "Bicycle" emoji. 🚲 /// /// /// Lookup: bicycle /// public const string Bicycle = "\U0001F6B2"; /// /// Gets the "Bikini" emoji. 👙 /// /// /// Lookup: bikini /// public const string Bikini = "\U0001F459"; /// /// Gets the "Billed cap" emoji. 🧢 /// /// /// Lookup: billed_cap /// public const string BilledCap = "\U0001F9E2"; /// /// Gets the "Biohazard" emoji. ☣ /// /// /// Lookup: biohazard /// public const string Biohazard = "\U00002623"; /// /// Gets the "Bird" emoji. 🐦 /// /// /// Lookup: bird /// public const string Bird = "\U0001F426"; /// /// Gets the "Birthday cake" emoji. 🎂 /// /// /// Lookup: birthday_cake /// public const string BirthdayCake = "\U0001F382"; /// /// Gets the "Bison" emoji. 🦬 /// /// /// Lookup: bison /// public const string Bison = "\U0001F9AC"; /// /// Gets the "Biting lip" emoji. 🫦 /// /// /// Lookup: biting_lip /// public const string BitingLip = "\U0001FAE6"; /// /// Gets the "Black circle" emoji. ⚫ /// /// /// Lookup: black_circle /// public const string BlackCircle = "\U000026AB"; /// /// Gets the "Black flag" emoji. 🏴 /// /// /// Lookup: black_flag /// public const string BlackFlag = "\U0001F3F4"; /// /// Gets the "Black heart" emoji. 🖤 /// /// /// Lookup: black_heart /// public const string BlackHeart = "\U0001F5A4"; /// /// Gets the "Black large square" emoji. ⬛ /// /// /// Lookup: black_large_square /// public const string BlackLargeSquare = "\U00002B1B"; /// /// Gets the "Black medium-small square" emoji. ◾ /// /// /// Lookup: black_medium_small_square /// public const string BlackMediumSmallSquare = "\U000025FE"; /// /// Gets the "Black medium square" emoji. ◼ /// /// /// Lookup: black_medium_square /// public const string BlackMediumSquare = "\U000025FC"; /// /// Gets the "Black nib" emoji. ✒ /// /// /// Lookup: black_nib /// public const string BlackNib = "\U00002712"; /// /// Gets the "Black small square" emoji. ▪ /// /// /// Lookup: black_small_square /// public const string BlackSmallSquare = "\U000025AA"; /// /// Gets the "Black square button" emoji. 🔲 /// /// /// Lookup: black_square_button /// public const string BlackSquareButton = "\U0001F532"; /// /// Gets the "Blossom" emoji. 🌼 /// /// /// Lookup: blossom /// public const string Blossom = "\U0001F33C"; /// /// Gets the "Blowfish" emoji. 🐡 /// /// /// Lookup: blowfish /// public const string Blowfish = "\U0001F421"; /// /// Gets the "Blueberries" emoji. 🫐 /// /// /// Lookup: blueberries /// public const string Blueberries = "\U0001FAD0"; /// /// Gets the "Blue book" emoji. 📘 /// /// /// Lookup: blue_book /// public const string BlueBook = "\U0001F4D8"; /// /// Gets the "Blue circle" emoji. 🔵 /// /// /// Lookup: blue_circle /// public const string BlueCircle = "\U0001F535"; /// /// Gets the "Blue heart" emoji. 💙 /// /// /// Lookup: blue_heart /// public const string BlueHeart = "\U0001F499"; /// /// Gets the "Blue square" emoji. 🟦 /// /// /// Lookup: blue_square /// public const string BlueSquare = "\U0001F7E6"; /// /// Gets the "Boar" emoji. 🐗 /// /// /// Lookup: boar /// public const string Boar = "\U0001F417"; /// /// Gets the "Bomb" emoji. 💣 /// /// /// Lookup: bomb /// public const string Bomb = "\U0001F4A3"; /// /// Gets the "Bone" emoji. 🦴 /// /// /// Lookup: bone /// public const string Bone = "\U0001F9B4"; /// /// Gets the "Bookmark" emoji. 🔖 /// /// /// Lookup: bookmark /// public const string Bookmark = "\U0001F516"; /// /// Gets the "Bookmark tabs" emoji. 📑 /// /// /// Lookup: bookmark_tabs /// public const string BookmarkTabs = "\U0001F4D1"; /// /// Gets the "Books" emoji. 📚 /// /// /// Lookup: books /// public const string Books = "\U0001F4DA"; /// /// Gets the "Boomerang" emoji. 🪃 /// /// /// Lookup: boomerang /// public const string Boomerang = "\U0001FA83"; /// /// Gets the "Bottle with popping cork" emoji. 🍾 /// /// /// Lookup: bottle_with_popping_cork /// public const string BottleWithPoppingCork = "\U0001F37E"; /// /// Gets the "Bouquet" emoji. 💐 /// /// /// Lookup: bouquet /// public const string Bouquet = "\U0001F490"; /// /// Gets the "Bow and arrow" emoji. 🏹 /// /// /// Lookup: bow_and_arrow /// public const string BowAndArrow = "\U0001F3F9"; /// /// Gets the "Bowling" emoji. 🎳 /// /// /// Lookup: bowling /// public const string Bowling = "\U0001F3B3"; /// /// Gets the "Bowl with spoon" emoji. 🥣 /// /// /// Lookup: bowl_with_spoon /// public const string BowlWithSpoon = "\U0001F963"; /// /// Gets the "Boxing glove" emoji. 🥊 /// /// /// Lookup: boxing_glove /// public const string BoxingGlove = "\U0001F94A"; /// /// Gets the "Boy" emoji. 👦 /// /// /// Lookup: boy /// public const string Boy = "\U0001F466"; /// /// Gets the "Brain" emoji. 🧠 /// /// /// Lookup: brain /// public const string Brain = "\U0001F9E0"; /// /// Gets the "Bread" emoji. 🍞 /// /// /// Lookup: bread /// public const string Bread = "\U0001F35E"; /// /// Gets the "Breast-feeding" emoji. 🤱 /// /// /// Lookup: breast_feeding /// public const string BreastFeeding = "\U0001F931"; /// /// Gets the "Brick" emoji. 🧱 /// /// /// Lookup: brick /// public const string Brick = "\U0001F9F1"; /// /// Gets the "Bridge at night" emoji. 🌉 /// /// /// Lookup: bridge_at_night /// public const string BridgeAtNight = "\U0001F309"; /// /// Gets the "Briefcase" emoji. 💼 /// /// /// Lookup: briefcase /// public const string Briefcase = "\U0001F4BC"; /// /// Gets the "Briefs" emoji. 🩲 /// /// /// Lookup: briefs /// public const string Briefs = "\U0001FA72"; /// /// Gets the "Bright button" emoji. 🔆 /// /// /// Lookup: bright_button /// public const string BrightButton = "\U0001F506"; /// /// Gets the "Broccoli" emoji. 🥦 /// /// /// Lookup: broccoli /// public const string Broccoli = "\U0001F966"; /// /// Gets the "Broken heart" emoji. 💔 /// /// /// Lookup: broken_heart /// public const string BrokenHeart = "\U0001F494"; /// /// Gets the "Broom" emoji. 🧹 /// /// /// Lookup: broom /// public const string Broom = "\U0001F9F9"; /// /// Gets the "Brown circle" emoji. 🟤 /// /// /// Lookup: brown_circle /// public const string BrownCircle = "\U0001F7E4"; /// /// Gets the "Brown heart" emoji. 🤎 /// /// /// Lookup: brown_heart /// public const string BrownHeart = "\U0001F90E"; /// /// Gets the "Brown square" emoji. 🟫 /// /// /// Lookup: brown_square /// public const string BrownSquare = "\U0001F7EB"; /// /// Gets the "Bubbles" emoji. 🫧 /// /// /// Lookup: bubbles /// public const string Bubbles = "\U0001FAE7"; /// /// Gets the "Bubble tea" emoji. 🧋 /// /// /// Lookup: bubble_tea /// public const string BubbleTea = "\U0001F9CB"; /// /// Gets the "Bucket" emoji. 🪣 /// /// /// Lookup: bucket /// public const string Bucket = "\U0001FAA3"; /// /// Gets the "Bug" emoji. 🐛 /// /// /// Lookup: bug /// public const string Bug = "\U0001F41B"; /// /// Gets the "Building construction" emoji. 🏗 /// /// /// Lookup: building_construction /// public const string BuildingConstruction = "\U0001F3D7"; /// /// Gets the "Bullet train" emoji. 🚅 /// /// /// Lookup: bullet_train /// public const string BulletTrain = "\U0001F685"; /// /// Gets the "Bullseye" emoji. 🎯 /// /// /// Lookup: bullseye /// public const string Bullseye = "\U0001F3AF"; /// /// Gets the "Burrito" emoji. 🌯 /// /// /// Lookup: burrito /// public const string Burrito = "\U0001F32F"; /// /// Gets the "Bus" emoji. 🚌 /// /// /// Lookup: bus /// public const string Bus = "\U0001F68C"; /// /// Gets the "Bus stop" emoji. 🚏 /// /// /// Lookup: bus_stop /// public const string BusStop = "\U0001F68F"; /// /// Gets the "Bust in silhouette" emoji. 👤 /// /// /// Lookup: bust_in_silhouette /// public const string BustInSilhouette = "\U0001F464"; /// /// Gets the "Busts in silhouette" emoji. 👥 /// /// /// Lookup: busts_in_silhouette /// public const string BustsInSilhouette = "\U0001F465"; /// /// Gets the "Butter" emoji. 🧈 /// /// /// Lookup: butter /// public const string Butter = "\U0001F9C8"; /// /// Gets the "Butterfly" emoji. 🦋 /// /// /// Lookup: butterfly /// public const string Butterfly = "\U0001F98B"; /// /// Gets the "Cactus" emoji. 🌵 /// /// /// Lookup: cactus /// public const string Cactus = "\U0001F335"; /// /// Gets the "Calendar" emoji. 📅 /// /// /// Lookup: calendar /// public const string Calendar = "\U0001F4C5"; /// /// Gets the "Call me hand" emoji. 🤙 /// /// /// Lookup: call_me_hand /// public const string CallMeHand = "\U0001F919"; /// /// Gets the "Camel" emoji. 🐪 /// /// /// Lookup: camel /// public const string Camel = "\U0001F42A"; /// /// Gets the "Camera" emoji. 📷 /// /// /// Lookup: camera /// public const string Camera = "\U0001F4F7"; /// /// Gets the "Camera with flash" emoji. 📸 /// /// /// Lookup: camera_with_flash /// public const string CameraWithFlash = "\U0001F4F8"; /// /// Gets the "Camping" emoji. 🏕 /// /// /// Lookup: camping /// public const string Camping = "\U0001F3D5"; /// /// Gets the "Cancer" emoji. ♋ /// /// /// Lookup: cancer /// public const string Cancer = "\U0000264B"; /// /// Gets the "Candle" emoji. 🕯 /// /// /// Lookup: candle /// public const string Candle = "\U0001F56F"; /// /// Gets the "Candy" emoji. 🍬 /// /// /// Lookup: candy /// public const string Candy = "\U0001F36C"; /// /// Gets the "Canned food" emoji. 🥫 /// /// /// Lookup: canned_food /// public const string CannedFood = "\U0001F96B"; /// /// Gets the "Canoe" emoji. 🛶 /// /// /// Lookup: canoe /// public const string Canoe = "\U0001F6F6"; /// /// Gets the "Capricorn" emoji. ♑ /// /// /// Lookup: capricorn /// public const string Capricorn = "\U00002651"; /// /// Gets the "Card file box" emoji. 🗃 /// /// /// Lookup: card_file_box /// public const string CardFileBox = "\U0001F5C3"; /// /// Gets the "Card index" emoji. 📇 /// /// /// Lookup: card_index /// public const string CardIndex = "\U0001F4C7"; /// /// Gets the "Card index dividers" emoji. 🗂 /// /// /// Lookup: card_index_dividers /// public const string CardIndexDividers = "\U0001F5C2"; /// /// Gets the "Carousel horse" emoji. 🎠 /// /// /// Lookup: carousel_horse /// public const string CarouselHorse = "\U0001F3A0"; /// /// Gets the "Carpentry saw" emoji. 🪚 /// /// /// Lookup: carpentry_saw /// public const string CarpentrySaw = "\U0001FA9A"; /// /// Gets the "Carp streamer" emoji. 🎏 /// /// /// Lookup: carp_streamer /// public const string CarpStreamer = "\U0001F38F"; /// /// Gets the "Carrot" emoji. 🥕 /// /// /// Lookup: carrot /// public const string Carrot = "\U0001F955"; /// /// Gets the "Castle" emoji. 🏰 /// /// /// Lookup: castle /// public const string Castle = "\U0001F3F0"; /// /// Gets the "Cat" emoji. 🐈 /// /// /// Lookup: cat /// public const string Cat = "\U0001F408"; /// /// Gets the "Cat face" emoji. 🐱 /// /// /// Lookup: cat_face /// public const string CatFace = "\U0001F431"; /// /// Gets the "Cat with tears of joy" emoji. 😹 /// /// /// Lookup: cat_with_tears_of_joy /// public const string CatWithTearsOfJoy = "\U0001F639"; /// /// Gets the "Cat with wry smile" emoji. 😼 /// /// /// Lookup: cat_with_wry_smile /// public const string CatWithWrySmile = "\U0001F63C"; /// /// Gets the "Chains" emoji. ⛓ /// /// /// Lookup: chains /// public const string Chains = "\U000026D3"; /// /// Gets the "Chair" emoji. 🪑 /// /// /// Lookup: chair /// public const string Chair = "\U0001FA91"; /// /// Gets the "Chart decreasing" emoji. 📉 /// /// /// Lookup: chart_decreasing /// public const string ChartDecreasing = "\U0001F4C9"; /// /// Gets the "Chart increasing" emoji. 📈 /// /// /// Lookup: chart_increasing /// public const string ChartIncreasing = "\U0001F4C8"; /// /// Gets the "Chart increasing with yen" emoji. 💹 /// /// /// Lookup: chart_increasing_with_yen /// public const string ChartIncreasingWithYen = "\U0001F4B9"; /// /// Gets the "Check box with check" emoji. ☑ /// /// /// Lookup: check_box_with_check /// public const string CheckBoxWithCheck = "\U00002611"; /// /// Gets the "Check mark" emoji. ✔ /// /// /// Lookup: check_mark /// public const string CheckMark = "\U00002714"; /// /// Gets the "Check mark button" emoji. ✅ /// /// /// Lookup: check_mark_button /// public const string CheckMarkButton = "\U00002705"; /// /// Gets the "Cheese wedge" emoji. 🧀 /// /// /// Lookup: cheese_wedge /// public const string CheeseWedge = "\U0001F9C0"; /// /// Gets the "Chequered flag" emoji. 🏁 /// /// /// Lookup: chequered_flag /// public const string ChequeredFlag = "\U0001F3C1"; /// /// Gets the "Cherries" emoji. 🍒 /// /// /// Lookup: cherries /// public const string Cherries = "\U0001F352"; /// /// Gets the "Cherry blossom" emoji. 🌸 /// /// /// Lookup: cherry_blossom /// public const string CherryBlossom = "\U0001F338"; /// /// Gets the "Chess pawn" emoji. ♟ /// /// /// Lookup: chess_pawn /// public const string ChessPawn = "\U0000265F"; /// /// Gets the "Chestnut" emoji. 🌰 /// /// /// Lookup: chestnut /// public const string Chestnut = "\U0001F330"; /// /// Gets the "Chicken" emoji. 🐔 /// /// /// Lookup: chicken /// public const string Chicken = "\U0001F414"; /// /// Gets the "Child" emoji. 🧒 /// /// /// Lookup: child /// public const string Child = "\U0001F9D2"; /// /// Gets the "Children crossing" emoji. 🚸 /// /// /// Lookup: children_crossing /// public const string ChildrenCrossing = "\U0001F6B8"; /// /// Gets the "Chipmunk" emoji. 🐿 /// /// /// Lookup: chipmunk /// public const string Chipmunk = "\U0001F43F"; /// /// Gets the "Chocolate bar" emoji. 🍫 /// /// /// Lookup: chocolate_bar /// public const string ChocolateBar = "\U0001F36B"; /// /// Gets the "Chopsticks" emoji. 🥢 /// /// /// Lookup: chopsticks /// public const string Chopsticks = "\U0001F962"; /// /// Gets the "Christmas tree" emoji. 🎄 /// /// /// Lookup: christmas_tree /// public const string ChristmasTree = "\U0001F384"; /// /// Gets the "Church" emoji. ⛪ /// /// /// Lookup: church /// public const string Church = "\U000026EA"; /// /// Gets the "Cigarette" emoji. 🚬 /// /// /// Lookup: cigarette /// public const string Cigarette = "\U0001F6AC"; /// /// Gets the "Cinema" emoji. 🎦 /// /// /// Lookup: cinema /// public const string Cinema = "\U0001F3A6"; /// /// Gets the "Circled M" emoji. Ⓜ /// /// /// Lookup: circled_m /// public const string CircledM = "\U000024C2"; /// /// Gets the "Circus tent" emoji. 🎪 /// /// /// Lookup: circus_tent /// public const string CircusTent = "\U0001F3AA"; /// /// Gets the "Cityscape" emoji. 🏙 /// /// /// Lookup: cityscape /// public const string Cityscape = "\U0001F3D9"; /// /// Gets the "Cityscape at dusk" emoji. 🌆 /// /// /// Lookup: cityscape_at_dusk /// public const string CityscapeAtDusk = "\U0001F306"; /// /// Gets the "Clamp" emoji. 🗜 /// /// /// Lookup: clamp /// public const string Clamp = "\U0001F5DC"; /// /// Gets the "Clapper board" emoji. 🎬 /// /// /// Lookup: clapper_board /// public const string ClapperBoard = "\U0001F3AC"; /// /// Gets the "Clapping hands" emoji. 👏 /// /// /// Lookup: clapping_hands /// public const string ClappingHands = "\U0001F44F"; /// /// Gets the "Classical building" emoji. 🏛 /// /// /// Lookup: classical_building /// public const string ClassicalBuilding = "\U0001F3DB"; /// /// Gets the "CL button" emoji. 🆑 /// /// /// Lookup: cl_button /// public const string ClButton = "\U0001F191"; /// /// Gets the "Clinking beer mugs" emoji. 🍻 /// /// /// Lookup: clinking_beer_mugs /// public const string ClinkingBeerMugs = "\U0001F37B"; /// /// Gets the "Clinking glasses" emoji. 🥂 /// /// /// Lookup: clinking_glasses /// public const string ClinkingGlasses = "\U0001F942"; /// /// Gets the "Clipboard" emoji. 📋 /// /// /// Lookup: clipboard /// public const string Clipboard = "\U0001F4CB"; /// /// Gets the "Clockwise vertical arrows" emoji. 🔃 /// /// /// Lookup: clockwise_vertical_arrows /// public const string ClockwiseVerticalArrows = "\U0001F503"; /// /// Gets the "Closed book" emoji. 📕 /// /// /// Lookup: closed_book /// public const string ClosedBook = "\U0001F4D5"; /// /// Gets the "Closed mailbox with lowered flag" emoji. 📪 /// /// /// Lookup: closed_mailbox_with_lowered_flag /// public const string ClosedMailboxWithLoweredFlag = "\U0001F4EA"; /// /// Gets the "Closed mailbox with raised flag" emoji. 📫 /// /// /// Lookup: closed_mailbox_with_raised_flag /// public const string ClosedMailboxWithRaisedFlag = "\U0001F4EB"; /// /// Gets the "Closed umbrella" emoji. 🌂 /// /// /// Lookup: closed_umbrella /// public const string ClosedUmbrella = "\U0001F302"; /// /// Gets the "Cloud" emoji. ☁ /// /// /// Lookup: cloud /// public const string Cloud = "\U00002601"; /// /// Gets the "Cloud with lightning" emoji. 🌩 /// /// /// Lookup: cloud_with_lightning /// public const string CloudWithLightning = "\U0001F329"; /// /// Gets the "Cloud with lightning and rain" emoji. ⛈ /// /// /// Lookup: cloud_with_lightning_and_rain /// public const string CloudWithLightningAndRain = "\U000026C8"; /// /// Gets the "Cloud with rain" emoji. 🌧 /// /// /// Lookup: cloud_with_rain /// public const string CloudWithRain = "\U0001F327"; /// /// Gets the "Cloud with snow" emoji. 🌨 /// /// /// Lookup: cloud_with_snow /// public const string CloudWithSnow = "\U0001F328"; /// /// Gets the "Clown face" emoji. 🤡 /// /// /// Lookup: clown_face /// public const string ClownFace = "\U0001F921"; /// /// Gets the "Club suit" emoji. ♣ /// /// /// Lookup: club_suit /// public const string ClubSuit = "\U00002663"; /// /// Gets the "Clutch bag" emoji. 👝 /// /// /// Lookup: clutch_bag /// public const string ClutchBag = "\U0001F45D"; /// /// Gets the "Coat" emoji. 🧥 /// /// /// Lookup: coat /// public const string Coat = "\U0001F9E5"; /// /// Gets the "Cockroach" emoji. 🪳 /// /// /// Lookup: cockroach /// public const string Cockroach = "\U0001FAB3"; /// /// Gets the "Cocktail glass" emoji. 🍸 /// /// /// Lookup: cocktail_glass /// public const string CocktailGlass = "\U0001F378"; /// /// Gets the "Coconut" emoji. 🥥 /// /// /// Lookup: coconut /// public const string Coconut = "\U0001F965"; /// /// Gets the "Coffin" emoji. ⚰ /// /// /// Lookup: coffin /// public const string Coffin = "\U000026B0"; /// /// Gets the "Coin" emoji. 🪙 /// /// /// Lookup: coin /// public const string Coin = "\U0001FA99"; /// /// Gets the "Cold face" emoji. 🥶 /// /// /// Lookup: cold_face /// public const string ColdFace = "\U0001F976"; /// /// Gets the "Collision" emoji. 💥 /// /// /// Lookup: collision /// public const string Collision = "\U0001F4A5"; /// /// Gets the "Comet" emoji. ☄ /// /// /// Lookup: comet /// public const string Comet = "\U00002604"; /// /// Gets the "Compass" emoji. 🧭 /// /// /// Lookup: compass /// public const string Compass = "\U0001F9ED"; /// /// Gets the "Computer disk" emoji. 💽 /// /// /// Lookup: computer_disk /// public const string ComputerDisk = "\U0001F4BD"; /// /// Gets the "Computer mouse" emoji. 🖱 /// /// /// Lookup: computer_mouse /// public const string ComputerMouse = "\U0001F5B1"; /// /// Gets the "Confetti ball" emoji. 🎊 /// /// /// Lookup: confetti_ball /// public const string ConfettiBall = "\U0001F38A"; /// /// Gets the "Confounded face" emoji. 😖 /// /// /// Lookup: confounded_face /// public const string ConfoundedFace = "\U0001F616"; /// /// Gets the "Confused face" emoji. 😕 /// /// /// Lookup: confused_face /// public const string ConfusedFace = "\U0001F615"; /// /// Gets the "Construction" emoji. 🚧 /// /// /// Lookup: construction /// public const string Construction = "\U0001F6A7"; /// /// Gets the "Construction worker" emoji. 👷 /// /// /// Lookup: construction_worker /// public const string ConstructionWorker = "\U0001F477"; /// /// Gets the "Control knobs" emoji. 🎛 /// /// /// Lookup: control_knobs /// public const string ControlKnobs = "\U0001F39B"; /// /// Gets the "Convenience store" emoji. 🏪 /// /// /// Lookup: convenience_store /// public const string ConvenienceStore = "\U0001F3EA"; /// /// Gets the "Cooked rice" emoji. 🍚 /// /// /// Lookup: cooked_rice /// public const string CookedRice = "\U0001F35A"; /// /// Gets the "Cookie" emoji. 🍪 /// /// /// Lookup: cookie /// public const string Cookie = "\U0001F36A"; /// /// Gets the "Cooking" emoji. 🍳 /// /// /// Lookup: cooking /// public const string Cooking = "\U0001F373"; /// /// Gets the "COOL button" emoji. 🆒 /// /// /// Lookup: cool_button /// public const string CoolButton = "\U0001F192"; /// /// Gets the "Copyright" emoji. © /// /// /// Lookup: copyright /// public const string Copyright = "\U000000A9"; /// /// Gets the "Coral" emoji. 🪸 /// /// /// Lookup: coral /// public const string Coral = "\U0001FAB8"; /// /// Gets the "Couch and lamp" emoji. 🛋 /// /// /// Lookup: couch_and_lamp /// public const string CouchAndLamp = "\U0001F6CB"; /// /// Gets the "Counterclockwise arrows button" emoji. 🔄 /// /// /// Lookup: counterclockwise_arrows_button /// public const string CounterclockwiseArrowsButton = "\U0001F504"; /// /// Gets the "Couple with heart" emoji. 💑 /// /// /// Lookup: couple_with_heart /// public const string CoupleWithHeart = "\U0001F491"; /// /// Gets the "Cow" emoji. 🐄 /// /// /// Lookup: cow /// public const string Cow = "\U0001F404"; /// /// Gets the "Cowboy hat face" emoji. 🤠 /// /// /// Lookup: cowboy_hat_face /// public const string CowboyHatFace = "\U0001F920"; /// /// Gets the "Cow face" emoji. 🐮 /// /// /// Lookup: cow_face /// public const string CowFace = "\U0001F42E"; /// /// Gets the "Crab" emoji. 🦀 /// /// /// Lookup: crab /// public const string Crab = "\U0001F980"; /// /// Gets the "Crayon" emoji. 🖍 /// /// /// Lookup: crayon /// public const string Crayon = "\U0001F58D"; /// /// Gets the "Credit card" emoji. 💳 /// /// /// Lookup: credit_card /// public const string CreditCard = "\U0001F4B3"; /// /// Gets the "Crescent moon" emoji. 🌙 /// /// /// Lookup: crescent_moon /// public const string CrescentMoon = "\U0001F319"; /// /// Gets the "Cricket" emoji. 🦗 /// /// /// Lookup: cricket /// public const string Cricket = "\U0001F997"; /// /// Gets the "Cricket game" emoji. 🏏 /// /// /// Lookup: cricket_game /// public const string CricketGame = "\U0001F3CF"; /// /// Gets the "Crocodile" emoji. 🐊 /// /// /// Lookup: crocodile /// public const string Crocodile = "\U0001F40A"; /// /// Gets the "Croissant" emoji. 🥐 /// /// /// Lookup: croissant /// public const string Croissant = "\U0001F950"; /// /// Gets the "Crossed fingers" emoji. 🤞 /// /// /// Lookup: crossed_fingers /// public const string CrossedFingers = "\U0001F91E"; /// /// Gets the "Crossed flags" emoji. 🎌 /// /// /// Lookup: crossed_flags /// public const string CrossedFlags = "\U0001F38C"; /// /// Gets the "Crossed swords" emoji. ⚔ /// /// /// Lookup: crossed_swords /// public const string CrossedSwords = "\U00002694"; /// /// Gets the "Cross mark" emoji. ❌ /// /// /// Lookup: cross_mark /// public const string CrossMark = "\U0000274C"; /// /// Gets the "Cross mark button" emoji. ❎ /// /// /// Lookup: cross_mark_button /// public const string CrossMarkButton = "\U0000274E"; /// /// Gets the "Crown" emoji. 👑 /// /// /// Lookup: crown /// public const string Crown = "\U0001F451"; /// /// Gets the "Crutch" emoji. 🩼 /// /// /// Lookup: crutch /// public const string Crutch = "\U0001FA7C"; /// /// Gets the "Crying cat" emoji. 😿 /// /// /// Lookup: crying_cat /// public const string CryingCat = "\U0001F63F"; /// /// Gets the "Crying face" emoji. 😢 /// /// /// Lookup: crying_face /// public const string CryingFace = "\U0001F622"; /// /// Gets the "Crystal ball" emoji. 🔮 /// /// /// Lookup: crystal_ball /// public const string CrystalBall = "\U0001F52E"; /// /// Gets the "Cucumber" emoji. 🥒 /// /// /// Lookup: cucumber /// public const string Cucumber = "\U0001F952"; /// /// Gets the "Cupcake" emoji. 🧁 /// /// /// Lookup: cupcake /// public const string Cupcake = "\U0001F9C1"; /// /// Gets the "Cup with straw" emoji. 🥤 /// /// /// Lookup: cup_with_straw /// public const string CupWithStraw = "\U0001F964"; /// /// Gets the "Curling stone" emoji. 🥌 /// /// /// Lookup: curling_stone /// public const string CurlingStone = "\U0001F94C"; /// /// Gets the "Curly hair" emoji. 🦱 /// /// /// Lookup: curly_hair /// public const string CurlyHair = "\U0001F9B1"; /// /// Gets the "Curly loop" emoji. ➰ /// /// /// Lookup: curly_loop /// public const string CurlyLoop = "\U000027B0"; /// /// Gets the "Currency exchange" emoji. 💱 /// /// /// Lookup: currency_exchange /// public const string CurrencyExchange = "\U0001F4B1"; /// /// Gets the "Curry rice" emoji. 🍛 /// /// /// Lookup: curry_rice /// public const string CurryRice = "\U0001F35B"; /// /// Gets the "Custard" emoji. 🍮 /// /// /// Lookup: custard /// public const string Custard = "\U0001F36E"; /// /// Gets the "Customs" emoji. 🛃 /// /// /// Lookup: customs /// public const string Customs = "\U0001F6C3"; /// /// Gets the "Cut of meat" emoji. 🥩 /// /// /// Lookup: cut_of_meat /// public const string CutOfMeat = "\U0001F969"; /// /// Gets the "Cyclone" emoji. 🌀 /// /// /// Lookup: cyclone /// public const string Cyclone = "\U0001F300"; /// /// Gets the "Dagger" emoji. 🗡 /// /// /// Lookup: dagger /// public const string Dagger = "\U0001F5E1"; /// /// Gets the "Dango" emoji. 🍡 /// /// /// Lookup: dango /// public const string Dango = "\U0001F361"; /// /// Gets the "Dark skin tone" emoji. 🏿 /// /// /// Lookup: dark_skin_tone /// public const string DarkSkinTone = "\U0001F3FF"; /// /// Gets the "Dashing away" emoji. 💨 /// /// /// Lookup: dashing_away /// public const string DashingAway = "\U0001F4A8"; /// /// Gets the "Deaf person" emoji. 🧏 /// /// /// Lookup: deaf_person /// public const string DeafPerson = "\U0001F9CF"; /// /// Gets the "Deciduous tree" emoji. 🌳 /// /// /// Lookup: deciduous_tree /// public const string DeciduousTree = "\U0001F333"; /// /// Gets the "Deer" emoji. 🦌 /// /// /// Lookup: deer /// public const string Deer = "\U0001F98C"; /// /// Gets the "Delivery truck" emoji. 🚚 /// /// /// Lookup: delivery_truck /// public const string DeliveryTruck = "\U0001F69A"; /// /// Gets the "Department store" emoji. 🏬 /// /// /// Lookup: department_store /// public const string DepartmentStore = "\U0001F3EC"; /// /// Gets the "Derelict house" emoji. 🏚 /// /// /// Lookup: derelict_house /// public const string DerelictHouse = "\U0001F3DA"; /// /// Gets the "Desert" emoji. 🏜 /// /// /// Lookup: desert /// public const string Desert = "\U0001F3DC"; /// /// Gets the "Desert island" emoji. 🏝 /// /// /// Lookup: desert_island /// public const string DesertIsland = "\U0001F3DD"; /// /// Gets the "Desktop computer" emoji. 🖥 /// /// /// Lookup: desktop_computer /// public const string DesktopComputer = "\U0001F5A5"; /// /// Gets the "Detective" emoji. 🕵 /// /// /// Lookup: detective /// public const string Detective = "\U0001F575"; /// /// Gets the "Diamond suit" emoji. ♦ /// /// /// Lookup: diamond_suit /// public const string DiamondSuit = "\U00002666"; /// /// Gets the "Diamond with a dot" emoji. 💠 /// /// /// Lookup: diamond_with_a_dot /// public const string DiamondWithADot = "\U0001F4A0"; /// /// Gets the "Dim button" emoji. 🔅 /// /// /// Lookup: dim_button /// public const string DimButton = "\U0001F505"; /// /// Gets the "Disappointed face" emoji. 😞 /// /// /// Lookup: disappointed_face /// public const string DisappointedFace = "\U0001F61E"; /// /// Gets the "Disguised face" emoji. 🥸 /// /// /// Lookup: disguised_face /// public const string DisguisedFace = "\U0001F978"; /// /// Gets the "Distorted face" emoji. 🫪 /// /// /// Lookup: distorted_face /// public const string DistortedFace = "\U0001FAEA"; /// /// Gets the "Divide" emoji. ➗ /// /// /// Lookup: divide /// public const string Divide = "\U00002797"; /// /// Gets the "Diving mask" emoji. 🤿 /// /// /// Lookup: diving_mask /// public const string DivingMask = "\U0001F93F"; /// /// Gets the "Diya lamp" emoji. 🪔 /// /// /// Lookup: diya_lamp /// public const string DiyaLamp = "\U0001FA94"; /// /// Gets the "Dizzy" emoji. 💫 /// /// /// Lookup: dizzy /// public const string Dizzy = "\U0001F4AB"; /// /// Gets the "Dna" emoji. 🧬 /// /// /// Lookup: dna /// public const string Dna = "\U0001F9EC"; /// /// Gets the "Dodo" emoji. 🦤 /// /// /// Lookup: dodo /// public const string Dodo = "\U0001F9A4"; /// /// Gets the "Dog" emoji. 🐕 /// /// /// Lookup: dog /// public const string Dog = "\U0001F415"; /// /// Gets the "Dog face" emoji. 🐶 /// /// /// Lookup: dog_face /// public const string DogFace = "\U0001F436"; /// /// Gets the "Dollar banknote" emoji. 💵 /// /// /// Lookup: dollar_banknote /// public const string DollarBanknote = "\U0001F4B5"; /// /// Gets the "Dolphin" emoji. 🐬 /// /// /// Lookup: dolphin /// public const string Dolphin = "\U0001F42C"; /// /// Gets the "Donkey" emoji. 🫏 /// /// /// Lookup: donkey /// public const string Donkey = "\U0001FACF"; /// /// Gets the "Door" emoji. 🚪 /// /// /// Lookup: door /// public const string Door = "\U0001F6AA"; /// /// Gets the "Dotted line face" emoji. 🫥 /// /// /// Lookup: dotted_line_face /// public const string DottedLineFace = "\U0001FAE5"; /// /// Gets the "Dotted six-pointed star" emoji. 🔯 /// /// /// Lookup: dotted_six_pointed_star /// public const string DottedSixPointedStar = "\U0001F52F"; /// /// Gets the "Double curly loop" emoji. ➿ /// /// /// Lookup: double_curly_loop /// public const string DoubleCurlyLoop = "\U000027BF"; /// /// Gets the "Double exclamation mark" emoji. ‼ /// /// /// Lookup: double_exclamation_mark /// public const string DoubleExclamationMark = "\U0000203C"; /// /// Gets the "Doughnut" emoji. 🍩 /// /// /// Lookup: doughnut /// public const string Doughnut = "\U0001F369"; /// /// Gets the "Dove" emoji. 🕊 /// /// /// Lookup: dove /// public const string Dove = "\U0001F54A"; /// /// Gets the "Down arrow" emoji. ⬇ /// /// /// Lookup: down_arrow /// public const string DownArrow = "\U00002B07"; /// /// Gets the "Downcast face with sweat" emoji. 😓 /// /// /// Lookup: downcast_face_with_sweat /// public const string DowncastFaceWithSweat = "\U0001F613"; /// /// Gets the "Down-left arrow" emoji. ↙ /// /// /// Lookup: down_left_arrow /// public const string DownLeftArrow = "\U00002199"; /// /// Gets the "Down-right arrow" emoji. ↘ /// /// /// Lookup: down_right_arrow /// public const string DownRightArrow = "\U00002198"; /// /// Gets the "Downwards button" emoji. 🔽 /// /// /// Lookup: downwards_button /// public const string DownwardsButton = "\U0001F53D"; /// /// Gets the "Dragon" emoji. 🐉 /// /// /// Lookup: dragon /// public const string Dragon = "\U0001F409"; /// /// Gets the "Dragon face" emoji. 🐲 /// /// /// Lookup: dragon_face /// public const string DragonFace = "\U0001F432"; /// /// Gets the "Dress" emoji. 👗 /// /// /// Lookup: dress /// public const string Dress = "\U0001F457"; /// /// Gets the "Drooling face" emoji. 🤤 /// /// /// Lookup: drooling_face /// public const string DroolingFace = "\U0001F924"; /// /// Gets the "Droplet" emoji. 💧 /// /// /// Lookup: droplet /// public const string Droplet = "\U0001F4A7"; /// /// Gets the "Drop of blood" emoji. 🩸 /// /// /// Lookup: drop_of_blood /// public const string DropOfBlood = "\U0001FA78"; /// /// Gets the "Drum" emoji. 🥁 /// /// /// Lookup: drum /// public const string Drum = "\U0001F941"; /// /// Gets the "Duck" emoji. 🦆 /// /// /// Lookup: duck /// public const string Duck = "\U0001F986"; /// /// Gets the "Dumpling" emoji. 🥟 /// /// /// Lookup: dumpling /// public const string Dumpling = "\U0001F95F"; /// /// Gets the "Dvd" emoji. 📀 /// /// /// Lookup: dvd /// public const string Dvd = "\U0001F4C0"; /// /// Gets the "Eagle" emoji. 🦅 /// /// /// Lookup: eagle /// public const string Eagle = "\U0001F985"; /// /// Gets the "Ear" emoji. 👂 /// /// /// Lookup: ear /// public const string Ear = "\U0001F442"; /// /// Gets the "Ear of corn" emoji. 🌽 /// /// /// Lookup: ear_of_corn /// public const string EarOfCorn = "\U0001F33D"; /// /// Gets the "Ear with hearing aid" emoji. 🦻 /// /// /// Lookup: ear_with_hearing_aid /// public const string EarWithHearingAid = "\U0001F9BB"; /// /// Gets the "Egg" emoji. 🥚 /// /// /// Lookup: egg /// public const string Egg = "\U0001F95A"; /// /// Gets the "Eggplant" emoji. 🍆 /// /// /// Lookup: eggplant /// public const string Eggplant = "\U0001F346"; /// /// Gets the "Eight o’clock" emoji. 🕗 /// /// /// Lookup: eight_o_clock /// public const string EightOClock = "\U0001F557"; /// /// Gets the "Eight-pointed star" emoji. ✴ /// /// /// Lookup: eight_pointed_star /// public const string EightPointedStar = "\U00002734"; /// /// Gets the "Eight-spoked asterisk" emoji. ✳ /// /// /// Lookup: eight_spoked_asterisk /// public const string EightSpokedAsterisk = "\U00002733"; /// /// Gets the "Eight-thirty" emoji. 🕣 /// /// /// Lookup: eight_thirty /// public const string EightThirty = "\U0001F563"; /// /// Gets the "Eject button" emoji. ⏏ /// /// /// Lookup: eject_button /// public const string EjectButton = "\U000023CF"; /// /// Gets the "Electric plug" emoji. 🔌 /// /// /// Lookup: electric_plug /// public const string ElectricPlug = "\U0001F50C"; /// /// Gets the "Elephant" emoji. 🐘 /// /// /// Lookup: elephant /// public const string Elephant = "\U0001F418"; /// /// Gets the "Elevator" emoji. 🛗 /// /// /// Lookup: elevator /// public const string Elevator = "\U0001F6D7"; /// /// Gets the "Eleven o’clock" emoji. 🕚 /// /// /// Lookup: eleven_o_clock /// public const string ElevenOClock = "\U0001F55A"; /// /// Gets the "Eleven-thirty" emoji. 🕦 /// /// /// Lookup: eleven_thirty /// public const string ElevenThirty = "\U0001F566"; /// /// Gets the "Elf" emoji. 🧝 /// /// /// Lookup: elf /// public const string Elf = "\U0001F9DD"; /// /// Gets the "E-mail" emoji. 📧 /// /// /// Lookup: e_mail /// public const string EMail = "\U0001F4E7"; /// /// Gets the "Empty nest" emoji. 🪹 /// /// /// Lookup: empty_nest /// public const string EmptyNest = "\U0001FAB9"; /// /// Gets the "END arrow" emoji. 🔚 /// /// /// Lookup: end_arrow /// public const string EndArrow = "\U0001F51A"; /// /// Gets the "Enraged face" emoji. 😡 /// /// /// Lookup: enraged_face /// public const string EnragedFace = "\U0001F621"; /// /// Gets the "Envelope" emoji. ✉ /// /// /// Lookup: envelope /// public const string Envelope = "\U00002709"; /// /// Gets the "Envelope with arrow" emoji. 📩 /// /// /// Lookup: envelope_with_arrow /// public const string EnvelopeWithArrow = "\U0001F4E9"; /// /// Gets the "Euro banknote" emoji. 💶 /// /// /// Lookup: euro_banknote /// public const string EuroBanknote = "\U0001F4B6"; /// /// Gets the "Evergreen tree" emoji. 🌲 /// /// /// Lookup: evergreen_tree /// public const string EvergreenTree = "\U0001F332"; /// /// Gets the "Ewe" emoji. 🐑 /// /// /// Lookup: ewe /// public const string Ewe = "\U0001F411"; /// /// Gets the "Exclamation question mark" emoji. ⁉ /// /// /// Lookup: exclamation_question_mark /// public const string ExclamationQuestionMark = "\U00002049"; /// /// Gets the "Exploding head" emoji. 🤯 /// /// /// Lookup: exploding_head /// public const string ExplodingHead = "\U0001F92F"; /// /// Gets the "Expressionless face" emoji. 😑 /// /// /// Lookup: expressionless_face /// public const string ExpressionlessFace = "\U0001F611"; /// /// Gets the "Eye" emoji. 👁 /// /// /// Lookup: eye /// public const string Eye = "\U0001F441"; /// /// Gets the "Eyes" emoji. 👀 /// /// /// Lookup: eyes /// public const string Eyes = "\U0001F440"; /// /// Gets the "Face blowing a kiss" emoji. 😘 /// /// /// Lookup: face_blowing_a_kiss /// public const string FaceBlowingAKiss = "\U0001F618"; /// /// Gets the "Face holding back tears" emoji. 🥹 /// /// /// Lookup: face_holding_back_tears /// public const string FaceHoldingBackTears = "\U0001F979"; /// /// Gets the "Face savoring food" emoji. 😋 /// /// /// Lookup: face_savoring_food /// public const string FaceSavoringFood = "\U0001F60B"; /// /// Gets the "Face screaming in fear" emoji. 😱 /// /// /// Lookup: face_screaming_in_fear /// public const string FaceScreamingInFear = "\U0001F631"; /// /// Gets the "Face vomiting" emoji. 🤮 /// /// /// Lookup: face_vomiting /// public const string FaceVomiting = "\U0001F92E"; /// /// Gets the "Face with bags under eyes" emoji. 🫩 /// /// /// Lookup: face_with_bags_under_eyes /// public const string FaceWithBagsUnderEyes = "\U0001FAE9"; /// /// Gets the "Face with crossed-out eyes" emoji. 😵 /// /// /// Lookup: face_with_crossed_out_eyes /// public const string FaceWithCrossedOutEyes = "\U0001F635"; /// /// Gets the "Face with diagonal mouth" emoji. 🫤 /// /// /// Lookup: face_with_diagonal_mouth /// public const string FaceWithDiagonalMouth = "\U0001FAE4"; /// /// Gets the "Face with hand over mouth" emoji. 🤭 /// /// /// Lookup: face_with_hand_over_mouth /// public const string FaceWithHandOverMouth = "\U0001F92D"; /// /// Gets the "Face with head-bandage" emoji. 🤕 /// /// /// Lookup: face_with_head_bandage /// public const string FaceWithHeadBandage = "\U0001F915"; /// /// Gets the "Face with medical mask" emoji. 😷 /// /// /// Lookup: face_with_medical_mask /// public const string FaceWithMedicalMask = "\U0001F637"; /// /// Gets the "Face with monocle" emoji. 🧐 /// /// /// Lookup: face_with_monocle /// public const string FaceWithMonocle = "\U0001F9D0"; /// /// Gets the "Face with open eyes and hand over mouth" emoji. 🫢 /// /// /// Lookup: face_with_open_eyes_and_hand_over_mouth /// public const string FaceWithOpenEyesAndHandOverMouth = "\U0001FAE2"; /// /// Gets the "Face with open mouth" emoji. 😮 /// /// /// Lookup: face_with_open_mouth /// public const string FaceWithOpenMouth = "\U0001F62E"; /// /// Gets the "Face without mouth" emoji. 😶 /// /// /// Lookup: face_without_mouth /// public const string FaceWithoutMouth = "\U0001F636"; /// /// Gets the "Face with peeking eye" emoji. 🫣 /// /// /// Lookup: face_with_peeking_eye /// public const string FaceWithPeekingEye = "\U0001FAE3"; /// /// Gets the "Face with raised eyebrow" emoji. 🤨 /// /// /// Lookup: face_with_raised_eyebrow /// public const string FaceWithRaisedEyebrow = "\U0001F928"; /// /// Gets the "Face with rolling eyes" emoji. 🙄 /// /// /// Lookup: face_with_rolling_eyes /// public const string FaceWithRollingEyes = "\U0001F644"; /// /// Gets the "Face with steam from nose" emoji. 😤 /// /// /// Lookup: face_with_steam_from_nose /// public const string FaceWithSteamFromNose = "\U0001F624"; /// /// Gets the "Face with symbols on mouth" emoji. 🤬 /// /// /// Lookup: face_with_symbols_on_mouth /// public const string FaceWithSymbolsOnMouth = "\U0001F92C"; /// /// Gets the "Face with tears of joy" emoji. 😂 /// /// /// Lookup: face_with_tears_of_joy /// public const string FaceWithTearsOfJoy = "\U0001F602"; /// /// Gets the "Face with thermometer" emoji. 🤒 /// /// /// Lookup: face_with_thermometer /// public const string FaceWithThermometer = "\U0001F912"; /// /// Gets the "Face with tongue" emoji. 😛 /// /// /// Lookup: face_with_tongue /// public const string FaceWithTongue = "\U0001F61B"; /// /// Gets the "Factory" emoji. 🏭 /// /// /// Lookup: factory /// public const string Factory = "\U0001F3ED"; /// /// Gets the "Fairy" emoji. 🧚 /// /// /// Lookup: fairy /// public const string Fairy = "\U0001F9DA"; /// /// Gets the "Falafel" emoji. 🧆 /// /// /// Lookup: falafel /// public const string Falafel = "\U0001F9C6"; /// /// Gets the "Fallen leaf" emoji. 🍂 /// /// /// Lookup: fallen_leaf /// public const string FallenLeaf = "\U0001F342"; /// /// Gets the "Family" emoji. 👪 /// /// /// Lookup: family /// public const string Family = "\U0001F46A"; /// /// Gets the "Fast down button" emoji. ⏬ /// /// /// Lookup: fast_down_button /// public const string FastDownButton = "\U000023EC"; /// /// Gets the "Fast-forward button" emoji. ⏩ /// /// /// Lookup: fast_forward_button /// public const string FastForwardButton = "\U000023E9"; /// /// Gets the "Fast reverse button" emoji. ⏪ /// /// /// Lookup: fast_reverse_button /// public const string FastReverseButton = "\U000023EA"; /// /// Gets the "Fast up button" emoji. ⏫ /// /// /// Lookup: fast_up_button /// public const string FastUpButton = "\U000023EB"; /// /// Gets the "Fax machine" emoji. 📠 /// /// /// Lookup: fax_machine /// public const string FaxMachine = "\U0001F4E0"; /// /// Gets the "Fearful face" emoji. 😨 /// /// /// Lookup: fearful_face /// public const string FearfulFace = "\U0001F628"; /// /// Gets the "Feather" emoji. 🪶 /// /// /// Lookup: feather /// public const string Feather = "\U0001FAB6"; /// /// Gets the "Female sign" emoji. ♀ /// /// /// Lookup: female_sign /// public const string FemaleSign = "\U00002640"; /// /// Gets the "Ferris wheel" emoji. 🎡 /// /// /// Lookup: ferris_wheel /// public const string FerrisWheel = "\U0001F3A1"; /// /// Gets the "Ferry" emoji. ⛴ /// /// /// Lookup: ferry /// public const string Ferry = "\U000026F4"; /// /// Gets the "Field hockey" emoji. 🏑 /// /// /// Lookup: field_hockey /// public const string FieldHockey = "\U0001F3D1"; /// /// Gets the "Fight cloud" emoji. 🫯 /// /// /// Lookup: fight_cloud /// public const string FightCloud = "\U0001FAEF"; /// /// Gets the "File cabinet" emoji. 🗄 /// /// /// Lookup: file_cabinet /// public const string FileCabinet = "\U0001F5C4"; /// /// Gets the "File folder" emoji. 📁 /// /// /// Lookup: file_folder /// public const string FileFolder = "\U0001F4C1"; /// /// Gets the "Film frames" emoji. 🎞 /// /// /// Lookup: film_frames /// public const string FilmFrames = "\U0001F39E"; /// /// Gets the "Film projector" emoji. 📽 /// /// /// Lookup: film_projector /// public const string FilmProjector = "\U0001F4FD"; /// /// Gets the "Fingerprint" emoji. 🫆 /// /// /// Lookup: fingerprint /// public const string Fingerprint = "\U0001FAC6"; /// /// Gets the "Fire" emoji. 🔥 /// /// /// Lookup: fire /// public const string Fire = "\U0001F525"; /// /// Gets the "Firecracker" emoji. 🧨 /// /// /// Lookup: firecracker /// public const string Firecracker = "\U0001F9E8"; /// /// Gets the "Fire engine" emoji. 🚒 /// /// /// Lookup: fire_engine /// public const string FireEngine = "\U0001F692"; /// /// Gets the "Fire extinguisher" emoji. 🧯 /// /// /// Lookup: fire_extinguisher /// public const string FireExtinguisher = "\U0001F9EF"; /// /// Gets the "Fireworks" emoji. 🎆 /// /// /// Lookup: fireworks /// public const string Fireworks = "\U0001F386"; /// /// Gets the "1st place medal" emoji. 🥇 /// /// /// Lookup: 1st_place_medal /// public const string FirstPlaceMedal = "\U0001F947"; /// /// Gets the "First quarter moon" emoji. 🌓 /// /// /// Lookup: first_quarter_moon /// public const string FirstQuarterMoon = "\U0001F313"; /// /// Gets the "First quarter moon face" emoji. 🌛 /// /// /// Lookup: first_quarter_moon_face /// public const string FirstQuarterMoonFace = "\U0001F31B"; /// /// Gets the "Fish" emoji. 🐟 /// /// /// Lookup: fish /// public const string Fish = "\U0001F41F"; /// /// Gets the "Fish cake with swirl" emoji. 🍥 /// /// /// Lookup: fish_cake_with_swirl /// public const string FishCakeWithSwirl = "\U0001F365"; /// /// Gets the "Fishing pole" emoji. 🎣 /// /// /// Lookup: fishing_pole /// public const string FishingPole = "\U0001F3A3"; /// /// Gets the "Five o’clock" emoji. 🕔 /// /// /// Lookup: five_o_clock /// public const string FiveOClock = "\U0001F554"; /// /// Gets the "Five-thirty" emoji. 🕠 /// /// /// Lookup: five_thirty /// public const string FiveThirty = "\U0001F560"; /// /// Gets the "Flag in hole" emoji. ⛳ /// /// /// Lookup: flag_in_hole /// public const string FlagInHole = "\U000026F3"; /// /// Gets the "Flamingo" emoji. 🦩 /// /// /// Lookup: flamingo /// public const string Flamingo = "\U0001F9A9"; /// /// Gets the "Flashlight" emoji. 🔦 /// /// /// Lookup: flashlight /// public const string Flashlight = "\U0001F526"; /// /// Gets the "Flatbread" emoji. 🫓 /// /// /// Lookup: flatbread /// public const string Flatbread = "\U0001FAD3"; /// /// Gets the "Flat shoe" emoji. 🥿 /// /// /// Lookup: flat_shoe /// public const string FlatShoe = "\U0001F97F"; /// /// Gets the "Fleur-de-lis" emoji. ⚜ /// /// /// Lookup: fleur_de_lis /// public const string FleurDeLis = "\U0000269C"; /// /// Gets the "Flexed biceps" emoji. 💪 /// /// /// Lookup: flexed_biceps /// public const string FlexedBiceps = "\U0001F4AA"; /// /// Gets the "Floppy disk" emoji. 💾 /// /// /// Lookup: floppy_disk /// public const string FloppyDisk = "\U0001F4BE"; /// /// Gets the "Flower playing cards" emoji. 🎴 /// /// /// Lookup: flower_playing_cards /// public const string FlowerPlayingCards = "\U0001F3B4"; /// /// Gets the "Flushed face" emoji. 😳 /// /// /// Lookup: flushed_face /// public const string FlushedFace = "\U0001F633"; /// /// Gets the "Flute" emoji. 🪈 /// /// /// Lookup: flute /// public const string Flute = "\U0001FA88"; /// /// Gets the "Fly" emoji. 🪰 /// /// /// Lookup: fly /// public const string Fly = "\U0001FAB0"; /// /// Gets the "Flying disc" emoji. 🥏 /// /// /// Lookup: flying_disc /// public const string FlyingDisc = "\U0001F94F"; /// /// Gets the "Flying saucer" emoji. 🛸 /// /// /// Lookup: flying_saucer /// public const string FlyingSaucer = "\U0001F6F8"; /// /// Gets the "Fog" emoji. 🌫 /// /// /// Lookup: fog /// public const string Fog = "\U0001F32B"; /// /// Gets the "Foggy" emoji. 🌁 /// /// /// Lookup: foggy /// public const string Foggy = "\U0001F301"; /// /// Gets the "Folded hands" emoji. 🙏 /// /// /// Lookup: folded_hands /// public const string FoldedHands = "\U0001F64F"; /// /// Gets the "Folding hand fan" emoji. 🪭 /// /// /// Lookup: folding_hand_fan /// public const string FoldingHandFan = "\U0001FAAD"; /// /// Gets the "Fondue" emoji. 🫕 /// /// /// Lookup: fondue /// public const string Fondue = "\U0001FAD5"; /// /// Gets the "Foot" emoji. 🦶 /// /// /// Lookup: foot /// public const string Foot = "\U0001F9B6"; /// /// Gets the "Footprints" emoji. 👣 /// /// /// Lookup: footprints /// public const string Footprints = "\U0001F463"; /// /// Gets the "Fork and knife" emoji. 🍴 /// /// /// Lookup: fork_and_knife /// public const string ForkAndKnife = "\U0001F374"; /// /// Gets the "Fork and knife with plate" emoji. 🍽 /// /// /// Lookup: fork_and_knife_with_plate /// public const string ForkAndKnifeWithPlate = "\U0001F37D"; /// /// Gets the "Fortune cookie" emoji. 🥠 /// /// /// Lookup: fortune_cookie /// public const string FortuneCookie = "\U0001F960"; /// /// Gets the "Fountain" emoji. ⛲ /// /// /// Lookup: fountain /// public const string Fountain = "\U000026F2"; /// /// Gets the "Fountain pen" emoji. 🖋 /// /// /// Lookup: fountain_pen /// public const string FountainPen = "\U0001F58B"; /// /// Gets the "Four leaf clover" emoji. 🍀 /// /// /// Lookup: four_leaf_clover /// public const string FourLeafClover = "\U0001F340"; /// /// Gets the "Four o’clock" emoji. 🕓 /// /// /// Lookup: four_o_clock /// public const string FourOClock = "\U0001F553"; /// /// Gets the "Four-thirty" emoji. 🕟 /// /// /// Lookup: four_thirty /// public const string FourThirty = "\U0001F55F"; /// /// Gets the "Fox" emoji. 🦊 /// /// /// Lookup: fox /// public const string Fox = "\U0001F98A"; /// /// Gets the "Framed picture" emoji. 🖼 /// /// /// Lookup: framed_picture /// public const string FramedPicture = "\U0001F5BC"; /// /// Gets the "FREE button" emoji. 🆓 /// /// /// Lookup: free_button /// public const string FreeButton = "\U0001F193"; /// /// Gets the "French fries" emoji. 🍟 /// /// /// Lookup: french_fries /// public const string FrenchFries = "\U0001F35F"; /// /// Gets the "Fried shrimp" emoji. 🍤 /// /// /// Lookup: fried_shrimp /// public const string FriedShrimp = "\U0001F364"; /// /// Gets the "Frog" emoji. 🐸 /// /// /// Lookup: frog /// public const string Frog = "\U0001F438"; /// /// Gets the "Front-facing baby chick" emoji. 🐥 /// /// /// Lookup: front_facing_baby_chick /// public const string FrontFacingBabyChick = "\U0001F425"; /// /// Gets the "Frowning face" emoji. ☹ /// /// /// Lookup: frowning_face /// public const string FrowningFace = "\U00002639"; /// /// Gets the "Frowning face with open mouth" emoji. 😦 /// /// /// Lookup: frowning_face_with_open_mouth /// public const string FrowningFaceWithOpenMouth = "\U0001F626"; /// /// Gets the "Fuel pump" emoji. ⛽ /// /// /// Lookup: fuel_pump /// public const string FuelPump = "\U000026FD"; /// /// Gets the "Full moon" emoji. 🌕 /// /// /// Lookup: full_moon /// public const string FullMoon = "\U0001F315"; /// /// Gets the "Full moon face" emoji. 🌝 /// /// /// Lookup: full_moon_face /// public const string FullMoonFace = "\U0001F31D"; /// /// Gets the "Funeral urn" emoji. ⚱ /// /// /// Lookup: funeral_urn /// public const string FuneralUrn = "\U000026B1"; /// /// Gets the "Game die" emoji. 🎲 /// /// /// Lookup: game_die /// public const string GameDie = "\U0001F3B2"; /// /// Gets the "Garlic" emoji. 🧄 /// /// /// Lookup: garlic /// public const string Garlic = "\U0001F9C4"; /// /// Gets the "Gear" emoji. ⚙ /// /// /// Lookup: gear /// public const string Gear = "\U00002699"; /// /// Gets the "Gemini" emoji. ♊ /// /// /// Lookup: gemini /// public const string Gemini = "\U0000264A"; /// /// Gets the "Gem stone" emoji. 💎 /// /// /// Lookup: gem_stone /// public const string GemStone = "\U0001F48E"; /// /// Gets the "Genie" emoji. 🧞 /// /// /// Lookup: genie /// public const string Genie = "\U0001F9DE"; /// /// Gets the "Ghost" emoji. 👻 /// /// /// Lookup: ghost /// public const string Ghost = "\U0001F47B"; /// /// Gets the "Ginger root" emoji. 🫚 /// /// /// Lookup: ginger_root /// public const string GingerRoot = "\U0001FADA"; /// /// Gets the "Giraffe" emoji. 🦒 /// /// /// Lookup: giraffe /// public const string Giraffe = "\U0001F992"; /// /// Gets the "Girl" emoji. 👧 /// /// /// Lookup: girl /// public const string Girl = "\U0001F467"; /// /// Gets the "Glasses" emoji. 👓 /// /// /// Lookup: glasses /// public const string Glasses = "\U0001F453"; /// /// Gets the "Glass of milk" emoji. 🥛 /// /// /// Lookup: glass_of_milk /// public const string GlassOfMilk = "\U0001F95B"; /// /// Gets the "Globe showing Americas" emoji. 🌎 /// /// /// Lookup: globe_showing_americas /// public const string GlobeShowingAmericas = "\U0001F30E"; /// /// Gets the "Globe showing Asia-Australia" emoji. 🌏 /// /// /// Lookup: globe_showing_asia_australia /// public const string GlobeShowingAsiaAustralia = "\U0001F30F"; /// /// Gets the "Globe showing Europe-Africa" emoji. 🌍 /// /// /// Lookup: globe_showing_europe_africa /// public const string GlobeShowingEuropeAfrica = "\U0001F30D"; /// /// Gets the "Globe with meridians" emoji. 🌐 /// /// /// Lookup: globe_with_meridians /// public const string GlobeWithMeridians = "\U0001F310"; /// /// Gets the "Gloves" emoji. 🧤 /// /// /// Lookup: gloves /// public const string Gloves = "\U0001F9E4"; /// /// Gets the "Glowing star" emoji. 🌟 /// /// /// Lookup: glowing_star /// public const string GlowingStar = "\U0001F31F"; /// /// Gets the "Goal net" emoji. 🥅 /// /// /// Lookup: goal_net /// public const string GoalNet = "\U0001F945"; /// /// Gets the "Goat" emoji. 🐐 /// /// /// Lookup: goat /// public const string Goat = "\U0001F410"; /// /// Gets the "Goblin" emoji. 👺 /// /// /// Lookup: goblin /// public const string Goblin = "\U0001F47A"; /// /// Gets the "Goggles" emoji. 🥽 /// /// /// Lookup: goggles /// public const string Goggles = "\U0001F97D"; /// /// Gets the "Goose" emoji. 🪿 /// /// /// Lookup: goose /// public const string Goose = "\U0001FABF"; /// /// Gets the "Gorilla" emoji. 🦍 /// /// /// Lookup: gorilla /// public const string Gorilla = "\U0001F98D"; /// /// Gets the "Graduation cap" emoji. 🎓 /// /// /// Lookup: graduation_cap /// public const string GraduationCap = "\U0001F393"; /// /// Gets the "Grapes" emoji. 🍇 /// /// /// Lookup: grapes /// public const string Grapes = "\U0001F347"; /// /// Gets the "Green apple" emoji. 🍏 /// /// /// Lookup: green_apple /// public const string GreenApple = "\U0001F34F"; /// /// Gets the "Green book" emoji. 📗 /// /// /// Lookup: green_book /// public const string GreenBook = "\U0001F4D7"; /// /// Gets the "Green circle" emoji. 🟢 /// /// /// Lookup: green_circle /// public const string GreenCircle = "\U0001F7E2"; /// /// Gets the "Green heart" emoji. 💚 /// /// /// Lookup: green_heart /// public const string GreenHeart = "\U0001F49A"; /// /// Gets the "Green salad" emoji. 🥗 /// /// /// Lookup: green_salad /// public const string GreenSalad = "\U0001F957"; /// /// Gets the "Green square" emoji. 🟩 /// /// /// Lookup: green_square /// public const string GreenSquare = "\U0001F7E9"; /// /// Gets the "Grey heart" emoji. 🩶 /// /// /// Lookup: grey_heart /// public const string GreyHeart = "\U0001FA76"; /// /// Gets the "Grimacing face" emoji. 😬 /// /// /// Lookup: grimacing_face /// public const string GrimacingFace = "\U0001F62C"; /// /// Gets the "Grinning cat" emoji. 😺 /// /// /// Lookup: grinning_cat /// public const string GrinningCat = "\U0001F63A"; /// /// Gets the "Grinning cat with smiling eyes" emoji. 😸 /// /// /// Lookup: grinning_cat_with_smiling_eyes /// public const string GrinningCatWithSmilingEyes = "\U0001F638"; /// /// Gets the "Grinning face" emoji. 😀 /// /// /// Lookup: grinning_face /// public const string GrinningFace = "\U0001F600"; /// /// Gets the "Grinning face with big eyes" emoji. 😃 /// /// /// Lookup: grinning_face_with_big_eyes /// public const string GrinningFaceWithBigEyes = "\U0001F603"; /// /// Gets the "Grinning face with smiling eyes" emoji. 😄 /// /// /// Lookup: grinning_face_with_smiling_eyes /// public const string GrinningFaceWithSmilingEyes = "\U0001F604"; /// /// Gets the "Grinning face with sweat" emoji. 😅 /// /// /// Lookup: grinning_face_with_sweat /// public const string GrinningFaceWithSweat = "\U0001F605"; /// /// Gets the "Grinning squinting face" emoji. 😆 /// /// /// Lookup: grinning_squinting_face /// public const string GrinningSquintingFace = "\U0001F606"; /// /// Gets the "Growing heart" emoji. 💗 /// /// /// Lookup: growing_heart /// public const string GrowingHeart = "\U0001F497"; /// /// Gets the "Guard" emoji. 💂 /// /// /// Lookup: guard /// public const string Guard = "\U0001F482"; /// /// Gets the "Guide dog" emoji. 🦮 /// /// /// Lookup: guide_dog /// public const string GuideDog = "\U0001F9AE"; /// /// Gets the "Guitar" emoji. 🎸 /// /// /// Lookup: guitar /// public const string Guitar = "\U0001F3B8"; /// /// Gets the "Hair pick" emoji. 🪮 /// /// /// Lookup: hair_pick /// public const string HairPick = "\U0001FAAE"; /// /// Gets the "Hairy creature" emoji. 🫈 /// /// /// Lookup: hairy_creature /// public const string HairyCreature = "\U0001FAC8"; /// /// Gets the "Hamburger" emoji. 🍔 /// /// /// Lookup: hamburger /// public const string Hamburger = "\U0001F354"; /// /// Gets the "Hammer" emoji. 🔨 /// /// /// Lookup: hammer /// public const string Hammer = "\U0001F528"; /// /// Gets the "Hammer and pick" emoji. ⚒ /// /// /// Lookup: hammer_and_pick /// public const string HammerAndPick = "\U00002692"; /// /// Gets the "Hammer and wrench" emoji. 🛠 /// /// /// Lookup: hammer_and_wrench /// public const string HammerAndWrench = "\U0001F6E0"; /// /// Gets the "Hamsa" emoji. 🪬 /// /// /// Lookup: hamsa /// public const string Hamsa = "\U0001FAAC"; /// /// Gets the "Hamster" emoji. 🐹 /// /// /// Lookup: hamster /// public const string Hamster = "\U0001F439"; /// /// Gets the "Handbag" emoji. 👜 /// /// /// Lookup: handbag /// public const string Handbag = "\U0001F45C"; /// /// Gets the "Handshake" emoji. 🤝 /// /// /// Lookup: handshake /// public const string Handshake = "\U0001F91D"; /// /// Gets the "Hand with fingers splayed" emoji. 🖐 /// /// /// Lookup: hand_with_fingers_splayed /// public const string HandWithFingersSplayed = "\U0001F590"; /// /// Gets the "Hand with index finger and thumb crossed" emoji. 🫰 /// /// /// Lookup: hand_with_index_finger_and_thumb_crossed /// public const string HandWithIndexFingerAndThumbCrossed = "\U0001FAF0"; /// /// Gets the "Harp" emoji. 🪉 /// /// /// Lookup: harp /// public const string Harp = "\U0001FA89"; /// /// Gets the "Hatching chick" emoji. 🐣 /// /// /// Lookup: hatching_chick /// public const string HatchingChick = "\U0001F423"; /// /// Gets the "Headphone" emoji. 🎧 /// /// /// Lookup: headphone /// public const string Headphone = "\U0001F3A7"; /// /// Gets the "Headstone" emoji. 🪦 /// /// /// Lookup: headstone /// public const string Headstone = "\U0001FAA6"; /// /// Gets the "Hear-no-evil monkey" emoji. 🙉 /// /// /// Lookup: hear_no_evil_monkey /// public const string HearNoEvilMonkey = "\U0001F649"; /// /// Gets the "Heart decoration" emoji. 💟 /// /// /// Lookup: heart_decoration /// public const string HeartDecoration = "\U0001F49F"; /// /// Gets the "Heart exclamation" emoji. ❣ /// /// /// Lookup: heart_exclamation /// public const string HeartExclamation = "\U00002763"; /// /// Gets the "Heart hands" emoji. 🫶 /// /// /// Lookup: heart_hands /// public const string HeartHands = "\U0001FAF6"; /// /// Gets the "Heart suit" emoji. ♥ /// /// /// Lookup: heart_suit /// public const string HeartSuit = "\U00002665"; /// /// Gets the "Heart with arrow" emoji. 💘 /// /// /// Lookup: heart_with_arrow /// public const string HeartWithArrow = "\U0001F498"; /// /// Gets the "Heart with ribbon" emoji. 💝 /// /// /// Lookup: heart_with_ribbon /// public const string HeartWithRibbon = "\U0001F49D"; /// /// Gets the "Heavy dollar sign" emoji. 💲 /// /// /// Lookup: heavy_dollar_sign /// public const string HeavyDollarSign = "\U0001F4B2"; /// /// Gets the "Heavy equals sign" emoji. 🟰 /// /// /// Lookup: heavy_equals_sign /// public const string HeavyEqualsSign = "\U0001F7F0"; /// /// Gets the "Hedgehog" emoji. 🦔 /// /// /// Lookup: hedgehog /// public const string Hedgehog = "\U0001F994"; /// /// Gets the "Helicopter" emoji. 🚁 /// /// /// Lookup: helicopter /// public const string Helicopter = "\U0001F681"; /// /// Gets the "Herb" emoji. 🌿 /// /// /// Lookup: herb /// public const string Herb = "\U0001F33F"; /// /// Gets the "Hibiscus" emoji. 🌺 /// /// /// Lookup: hibiscus /// public const string Hibiscus = "\U0001F33A"; /// /// Gets the "High-heeled shoe" emoji. 👠 /// /// /// Lookup: high_heeled_shoe /// public const string HighHeeledShoe = "\U0001F460"; /// /// Gets the "High-speed train" emoji. 🚄 /// /// /// Lookup: high_speed_train /// public const string HighSpeedTrain = "\U0001F684"; /// /// Gets the "High voltage" emoji. ⚡ /// /// /// Lookup: high_voltage /// public const string HighVoltage = "\U000026A1"; /// /// Gets the "Hiking boot" emoji. 🥾 /// /// /// Lookup: hiking_boot /// public const string HikingBoot = "\U0001F97E"; /// /// Gets the "Hindu temple" emoji. 🛕 /// /// /// Lookup: hindu_temple /// public const string HinduTemple = "\U0001F6D5"; /// /// Gets the "Hippopotamus" emoji. 🦛 /// /// /// Lookup: hippopotamus /// public const string Hippopotamus = "\U0001F99B"; /// /// Gets the "Hole" emoji. 🕳 /// /// /// Lookup: hole /// public const string Hole = "\U0001F573"; /// /// Gets the "Hollow red circle" emoji. ⭕ /// /// /// Lookup: hollow_red_circle /// public const string HollowRedCircle = "\U00002B55"; /// /// Gets the "Honeybee" emoji. 🐝 /// /// /// Lookup: honeybee /// public const string Honeybee = "\U0001F41D"; /// /// Gets the "Honey pot" emoji. 🍯 /// /// /// Lookup: honey_pot /// public const string HoneyPot = "\U0001F36F"; /// /// Gets the "Hook" emoji. 🪝 /// /// /// Lookup: hook /// public const string Hook = "\U0001FA9D"; /// /// Gets the "Horizontal traffic light" emoji. 🚥 /// /// /// Lookup: horizontal_traffic_light /// public const string HorizontalTrafficLight = "\U0001F6A5"; /// /// Gets the "Horse" emoji. 🐎 /// /// /// Lookup: horse /// public const string Horse = "\U0001F40E"; /// /// Gets the "Horse face" emoji. 🐴 /// /// /// Lookup: horse_face /// public const string HorseFace = "\U0001F434"; /// /// Gets the "Horse racing" emoji. 🏇 /// /// /// Lookup: horse_racing /// public const string HorseRacing = "\U0001F3C7"; /// /// Gets the "Hospital" emoji. 🏥 /// /// /// Lookup: hospital /// public const string Hospital = "\U0001F3E5"; /// /// Gets the "Hot beverage" emoji. ☕ /// /// /// Lookup: hot_beverage /// public const string HotBeverage = "\U00002615"; /// /// Gets the "Hot dog" emoji. 🌭 /// /// /// Lookup: hot_dog /// public const string HotDog = "\U0001F32D"; /// /// Gets the "Hotel" emoji. 🏨 /// /// /// Lookup: hotel /// public const string Hotel = "\U0001F3E8"; /// /// Gets the "Hot face" emoji. 🥵 /// /// /// Lookup: hot_face /// public const string HotFace = "\U0001F975"; /// /// Gets the "Hot pepper" emoji. 🌶 /// /// /// Lookup: hot_pepper /// public const string HotPepper = "\U0001F336"; /// /// Gets the "Hot springs" emoji. ♨ /// /// /// Lookup: hot_springs /// public const string HotSprings = "\U00002668"; /// /// Gets the "Hourglass done" emoji. ⌛ /// /// /// Lookup: hourglass_done /// public const string HourglassDone = "\U0000231B"; /// /// Gets the "Hourglass not done" emoji. ⏳ /// /// /// Lookup: hourglass_not_done /// public const string HourglassNotDone = "\U000023F3"; /// /// Gets the "House" emoji. 🏠 /// /// /// Lookup: house /// public const string House = "\U0001F3E0"; /// /// Gets the "Houses" emoji. 🏘 /// /// /// Lookup: houses /// public const string Houses = "\U0001F3D8"; /// /// Gets the "House with garden" emoji. 🏡 /// /// /// Lookup: house_with_garden /// public const string HouseWithGarden = "\U0001F3E1"; /// /// Gets the "Hundred points" emoji. 💯 /// /// /// Lookup: hundred_points /// public const string HundredPoints = "\U0001F4AF"; /// /// Gets the "Hushed face" emoji. 😯 /// /// /// Lookup: hushed_face /// public const string HushedFace = "\U0001F62F"; /// /// Gets the "Hut" emoji. 🛖 /// /// /// Lookup: hut /// public const string Hut = "\U0001F6D6"; /// /// Gets the "Hyacinth" emoji. 🪻 /// /// /// Lookup: hyacinth /// public const string Hyacinth = "\U0001FABB"; /// /// Gets the "Ice" emoji. 🧊 /// /// /// Lookup: ice /// public const string Ice = "\U0001F9CA"; /// /// Gets the "Ice cream" emoji. 🍨 /// /// /// Lookup: ice_cream /// public const string IceCream = "\U0001F368"; /// /// Gets the "Ice hockey" emoji. 🏒 /// /// /// Lookup: ice_hockey /// public const string IceHockey = "\U0001F3D2"; /// /// Gets the "Ice skate" emoji. ⛸ /// /// /// Lookup: ice_skate /// public const string IceSkate = "\U000026F8"; /// /// Gets the "ID button" emoji. 🆔 /// /// /// Lookup: id_button /// public const string IdButton = "\U0001F194"; /// /// Gets the "Identification card" emoji. 🪪 /// /// /// Lookup: identification_card /// public const string IdentificationCard = "\U0001FAAA"; /// /// Gets the "Inbox tray" emoji. 📥 /// /// /// Lookup: inbox_tray /// public const string InboxTray = "\U0001F4E5"; /// /// Gets the "Incoming envelope" emoji. 📨 /// /// /// Lookup: incoming_envelope /// public const string IncomingEnvelope = "\U0001F4E8"; /// /// Gets the "Index pointing at the viewer" emoji. 🫵 /// /// /// Lookup: index_pointing_at_the_viewer /// public const string IndexPointingAtTheViewer = "\U0001FAF5"; /// /// Gets the "Index pointing up" emoji. ☝ /// /// /// Lookup: index_pointing_up /// public const string IndexPointingUp = "\U0000261D"; /// /// Gets the "Infinity" emoji. ♾ /// /// /// Lookup: infinity /// public const string Infinity = "\U0000267E"; /// /// Gets the "Information" emoji. ℹ /// /// /// Lookup: information /// public const string Information = "\U00002139"; /// /// Gets the "Input latin letters" emoji. 🔤 /// /// /// Lookup: input_latin_letters /// public const string InputLatinLetters = "\U0001F524"; /// /// Gets the "Input latin lowercase" emoji. 🔡 /// /// /// Lookup: input_latin_lowercase /// public const string InputLatinLowercase = "\U0001F521"; /// /// Gets the "Input latin uppercase" emoji. 🔠 /// /// /// Lookup: input_latin_uppercase /// public const string InputLatinUppercase = "\U0001F520"; /// /// Gets the "Input numbers" emoji. 🔢 /// /// /// Lookup: input_numbers /// public const string InputNumbers = "\U0001F522"; /// /// Gets the "Input symbols" emoji. 🔣 /// /// /// Lookup: input_symbols /// public const string InputSymbols = "\U0001F523"; /// /// Gets the "Jack-o-lantern" emoji. 🎃 /// /// /// Lookup: jack_o_lantern /// public const string JackOLantern = "\U0001F383"; /// /// Gets the "Japanese “acceptable” button" emoji. 🉑 /// /// /// Lookup: japanese_acceptable_button /// public const string JapaneseAcceptableButton = "\U0001F251"; /// /// Gets the "Japanese “application” button" emoji. 🈸 /// /// /// Lookup: japanese_application_button /// public const string JapaneseApplicationButton = "\U0001F238"; /// /// Gets the "Japanese “bargain” button" emoji. 🉐 /// /// /// Lookup: japanese_bargain_button /// public const string JapaneseBargainButton = "\U0001F250"; /// /// Gets the "Japanese castle" emoji. 🏯 /// /// /// Lookup: japanese_castle /// public const string JapaneseCastle = "\U0001F3EF"; /// /// Gets the "Japanese “congratulations” button" emoji. ㊗ /// /// /// Lookup: japanese_congratulations_button /// public const string JapaneseCongratulationsButton = "\U00003297"; /// /// Gets the "Japanese “discount” button" emoji. 🈹 /// /// /// Lookup: japanese_discount_button /// public const string JapaneseDiscountButton = "\U0001F239"; /// /// Gets the "Japanese dolls" emoji. 🎎 /// /// /// Lookup: japanese_dolls /// public const string JapaneseDolls = "\U0001F38E"; /// /// Gets the "Japanese “free of charge” button" emoji. 🈚 /// /// /// Lookup: japanese_free_of_charge_button /// public const string JapaneseFreeOfChargeButton = "\U0001F21A"; /// /// Gets the "Japanese “here” button" emoji. 🈁 /// /// /// Lookup: japanese_here_button /// public const string JapaneseHereButton = "\U0001F201"; /// /// Gets the "Japanese “monthly amount” button" emoji. 🈷 /// /// /// Lookup: japanese_monthly_amount_button /// public const string JapaneseMonthlyAmountButton = "\U0001F237"; /// /// Gets the "Japanese “not free of charge” button" emoji. 🈶 /// /// /// Lookup: japanese_not_free_of_charge_button /// public const string JapaneseNotFreeOfChargeButton = "\U0001F236"; /// /// Gets the "Japanese “no vacancy” button" emoji. 🈵 /// /// /// Lookup: japanese_no_vacancy_button /// public const string JapaneseNoVacancyButton = "\U0001F235"; /// /// Gets the "Japanese “open for business” button" emoji. 🈺 /// /// /// Lookup: japanese_open_for_business_button /// public const string JapaneseOpenForBusinessButton = "\U0001F23A"; /// /// Gets the "Japanese “passing grade” button" emoji. 🈴 /// /// /// Lookup: japanese_passing_grade_button /// public const string JapanesePassingGradeButton = "\U0001F234"; /// /// Gets the "Japanese post office" emoji. 🏣 /// /// /// Lookup: japanese_post_office /// public const string JapanesePostOffice = "\U0001F3E3"; /// /// Gets the "Japanese “prohibited” button" emoji. 🈲 /// /// /// Lookup: japanese_prohibited_button /// public const string JapaneseProhibitedButton = "\U0001F232"; /// /// Gets the "Japanese “reserved” button" emoji. 🈯 /// /// /// Lookup: japanese_reserved_button /// public const string JapaneseReservedButton = "\U0001F22F"; /// /// Gets the "Japanese “secret” button" emoji. ㊙ /// /// /// Lookup: japanese_secret_button /// public const string JapaneseSecretButton = "\U00003299"; /// /// Gets the "Japanese “service charge” button" emoji. 🈂 /// /// /// Lookup: japanese_service_charge_button /// public const string JapaneseServiceChargeButton = "\U0001F202"; /// /// Gets the "Japanese symbol for beginner" emoji. 🔰 /// /// /// Lookup: japanese_symbol_for_beginner /// public const string JapaneseSymbolForBeginner = "\U0001F530"; /// /// Gets the "Japanese “vacancy” button" emoji. 🈳 /// /// /// Lookup: japanese_vacancy_button /// public const string JapaneseVacancyButton = "\U0001F233"; /// /// Gets the "Jar" emoji. 🫙 /// /// /// Lookup: jar /// public const string Jar = "\U0001FAD9"; /// /// Gets the "Jeans" emoji. 👖 /// /// /// Lookup: jeans /// public const string Jeans = "\U0001F456"; /// /// Gets the "Jellyfish" emoji. 🪼 /// /// /// Lookup: jellyfish /// public const string Jellyfish = "\U0001FABC"; /// /// Gets the "Joker" emoji. 🃏 /// /// /// Lookup: joker /// public const string Joker = "\U0001F0CF"; /// /// Gets the "Joystick" emoji. 🕹 /// /// /// Lookup: joystick /// public const string Joystick = "\U0001F579"; /// /// Gets the "Kaaba" emoji. 🕋 /// /// /// Lookup: kaaba /// public const string Kaaba = "\U0001F54B"; /// /// Gets the "Kangaroo" emoji. 🦘 /// /// /// Lookup: kangaroo /// public const string Kangaroo = "\U0001F998"; /// /// Gets the "Key" emoji. 🔑 /// /// /// Lookup: key /// public const string Key = "\U0001F511"; /// /// Gets the "Keyboard" emoji. ⌨ /// /// /// Lookup: keyboard /// public const string Keyboard = "\U00002328"; /// /// Gets the "Keycap: 10" emoji. 🔟 /// /// /// Lookup: keycap_10 /// public const string Keycap10 = "\U0001F51F"; /// /// Gets the "Khanda" emoji. 🪯 /// /// /// Lookup: khanda /// public const string Khanda = "\U0001FAAF"; /// /// Gets the "Kick scooter" emoji. 🛴 /// /// /// Lookup: kick_scooter /// public const string KickScooter = "\U0001F6F4"; /// /// Gets the "Kimono" emoji. 👘 /// /// /// Lookup: kimono /// public const string Kimono = "\U0001F458"; /// /// Gets the "Kiss" emoji. 💏 /// /// /// Lookup: kiss /// public const string Kiss = "\U0001F48F"; /// /// Gets the "Kissing cat" emoji. 😽 /// /// /// Lookup: kissing_cat /// public const string KissingCat = "\U0001F63D"; /// /// Gets the "Kissing face" emoji. 😗 /// /// /// Lookup: kissing_face /// public const string KissingFace = "\U0001F617"; /// /// Gets the "Kissing face with closed eyes" emoji. 😚 /// /// /// Lookup: kissing_face_with_closed_eyes /// public const string KissingFaceWithClosedEyes = "\U0001F61A"; /// /// Gets the "Kissing face with smiling eyes" emoji. 😙 /// /// /// Lookup: kissing_face_with_smiling_eyes /// public const string KissingFaceWithSmilingEyes = "\U0001F619"; /// /// Gets the "Kiss mark" emoji. 💋 /// /// /// Lookup: kiss_mark /// public const string KissMark = "\U0001F48B"; /// /// Gets the "Kitchen knife" emoji. 🔪 /// /// /// Lookup: kitchen_knife /// public const string KitchenKnife = "\U0001F52A"; /// /// Gets the "Kite" emoji. 🪁 /// /// /// Lookup: kite /// public const string Kite = "\U0001FA81"; /// /// Gets the "Kiwi fruit" emoji. 🥝 /// /// /// Lookup: kiwi_fruit /// public const string KiwiFruit = "\U0001F95D"; /// /// Gets the "Knot" emoji. 🪢 /// /// /// Lookup: knot /// public const string Knot = "\U0001FAA2"; /// /// Gets the "Koala" emoji. 🐨 /// /// /// Lookup: koala /// public const string Koala = "\U0001F428"; /// /// Gets the "Lab coat" emoji. 🥼 /// /// /// Lookup: lab_coat /// public const string LabCoat = "\U0001F97C"; /// /// Gets the "Label" emoji. 🏷 /// /// /// Lookup: label /// public const string Label = "\U0001F3F7"; /// /// Gets the "Lacrosse" emoji. 🥍 /// /// /// Lookup: lacrosse /// public const string Lacrosse = "\U0001F94D"; /// /// Gets the "Ladder" emoji. 🪜 /// /// /// Lookup: ladder /// public const string Ladder = "\U0001FA9C"; /// /// Gets the "Lady beetle" emoji. 🐞 /// /// /// Lookup: lady_beetle /// public const string LadyBeetle = "\U0001F41E"; /// /// Gets the "Landslide" emoji. 🛘 /// /// /// Lookup: landslide /// public const string Landslide = "\U0001F6D8"; /// /// Gets the "Laptop" emoji. 💻 /// /// /// Lookup: laptop /// public const string Laptop = "\U0001F4BB"; /// /// Gets the "Large blue diamond" emoji. 🔷 /// /// /// Lookup: large_blue_diamond /// public const string LargeBlueDiamond = "\U0001F537"; /// /// Gets the "Large orange diamond" emoji. 🔶 /// /// /// Lookup: large_orange_diamond /// public const string LargeOrangeDiamond = "\U0001F536"; /// /// Gets the "Last quarter moon" emoji. 🌗 /// /// /// Lookup: last_quarter_moon /// public const string LastQuarterMoon = "\U0001F317"; /// /// Gets the "Last quarter moon face" emoji. 🌜 /// /// /// Lookup: last_quarter_moon_face /// public const string LastQuarterMoonFace = "\U0001F31C"; /// /// Gets the "Last track button" emoji. ⏮ /// /// /// Lookup: last_track_button /// public const string LastTrackButton = "\U000023EE"; /// /// Gets the "Latin cross" emoji. ✝ /// /// /// Lookup: latin_cross /// public const string LatinCross = "\U0000271D"; /// /// Gets the "Leaf fluttering in wind" emoji. 🍃 /// /// /// Lookup: leaf_fluttering_in_wind /// public const string LeafFlutteringInWind = "\U0001F343"; /// /// Gets the "Leafless tree" emoji. 🪾 /// /// /// Lookup: leafless_tree /// public const string LeaflessTree = "\U0001FABE"; /// /// Gets the "Leafy green" emoji. 🥬 /// /// /// Lookup: leafy_green /// public const string LeafyGreen = "\U0001F96C"; /// /// Gets the "Ledger" emoji. 📒 /// /// /// Lookup: ledger /// public const string Ledger = "\U0001F4D2"; /// /// Gets the "Left arrow" emoji. ⬅ /// /// /// Lookup: left_arrow /// public const string LeftArrow = "\U00002B05"; /// /// Gets the "Left arrow curving right" emoji. ↪ /// /// /// Lookup: left_arrow_curving_right /// public const string LeftArrowCurvingRight = "\U000021AA"; /// /// Gets the "Left-facing fist" emoji. 🤛 /// /// /// Lookup: left_facing_fist /// public const string LeftFacingFist = "\U0001F91B"; /// /// Gets the "Left luggage" emoji. 🛅 /// /// /// Lookup: left_luggage /// public const string LeftLuggage = "\U0001F6C5"; /// /// Gets the "Left-right arrow" emoji. ↔ /// /// /// Lookup: left_right_arrow /// public const string LeftRightArrow = "\U00002194"; /// /// Gets the "Left speech bubble" emoji. 🗨 /// /// /// Lookup: left_speech_bubble /// public const string LeftSpeechBubble = "\U0001F5E8"; /// /// Gets the "Leftwards hand" emoji. 🫲 /// /// /// Lookup: leftwards_hand /// public const string LeftwardsHand = "\U0001FAF2"; /// /// Gets the "Leftwards pushing hand" emoji. 🫷 /// /// /// Lookup: leftwards_pushing_hand /// public const string LeftwardsPushingHand = "\U0001FAF7"; /// /// Gets the "Leg" emoji. 🦵 /// /// /// Lookup: leg /// public const string Leg = "\U0001F9B5"; /// /// Gets the "Lemon" emoji. 🍋 /// /// /// Lookup: lemon /// public const string Lemon = "\U0001F34B"; /// /// Gets the "Leo" emoji. ♌ /// /// /// Lookup: leo /// public const string Leo = "\U0000264C"; /// /// Gets the "Leopard" emoji. 🐆 /// /// /// Lookup: leopard /// public const string Leopard = "\U0001F406"; /// /// Gets the "Level slider" emoji. 🎚 /// /// /// Lookup: level_slider /// public const string LevelSlider = "\U0001F39A"; /// /// Gets the "Libra" emoji. ♎ /// /// /// Lookup: libra /// public const string Libra = "\U0000264E"; /// /// Gets the "Light blue heart" emoji. 🩵 /// /// /// Lookup: light_blue_heart /// public const string LightBlueHeart = "\U0001FA75"; /// /// Gets the "Light bulb" emoji. 💡 /// /// /// Lookup: light_bulb /// public const string LightBulb = "\U0001F4A1"; /// /// Gets the "Light rail" emoji. 🚈 /// /// /// Lookup: light_rail /// public const string LightRail = "\U0001F688"; /// /// Gets the "Light skin tone" emoji. 🏻 /// /// /// Lookup: light_skin_tone /// public const string LightSkinTone = "\U0001F3FB"; /// /// Gets the "Link" emoji. 🔗 /// /// /// Lookup: link /// public const string Link = "\U0001F517"; /// /// Gets the "Linked paperclips" emoji. 🖇 /// /// /// Lookup: linked_paperclips /// public const string LinkedPaperclips = "\U0001F587"; /// /// Gets the "Lion" emoji. 🦁 /// /// /// Lookup: lion /// public const string Lion = "\U0001F981"; /// /// Gets the "Lipstick" emoji. 💄 /// /// /// Lookup: lipstick /// public const string Lipstick = "\U0001F484"; /// /// Gets the "Litter in bin sign" emoji. 🚮 /// /// /// Lookup: litter_in_bin_sign /// public const string LitterInBinSign = "\U0001F6AE"; /// /// Gets the "Lizard" emoji. 🦎 /// /// /// Lookup: lizard /// public const string Lizard = "\U0001F98E"; /// /// Gets the "Llama" emoji. 🦙 /// /// /// Lookup: llama /// public const string Llama = "\U0001F999"; /// /// Gets the "Lobster" emoji. 🦞 /// /// /// Lookup: lobster /// public const string Lobster = "\U0001F99E"; /// /// Gets the "Locked" emoji. 🔒 /// /// /// Lookup: locked /// public const string Locked = "\U0001F512"; /// /// Gets the "Locked with key" emoji. 🔐 /// /// /// Lookup: locked_with_key /// public const string LockedWithKey = "\U0001F510"; /// /// Gets the "Locked with pen" emoji. 🔏 /// /// /// Lookup: locked_with_pen /// public const string LockedWithPen = "\U0001F50F"; /// /// Gets the "Locomotive" emoji. 🚂 /// /// /// Lookup: locomotive /// public const string Locomotive = "\U0001F682"; /// /// Gets the "Lollipop" emoji. 🍭 /// /// /// Lookup: lollipop /// public const string Lollipop = "\U0001F36D"; /// /// Gets the "Long drum" emoji. 🪘 /// /// /// Lookup: long_drum /// public const string LongDrum = "\U0001FA98"; /// /// Gets the "Lotion bottle" emoji. 🧴 /// /// /// Lookup: lotion_bottle /// public const string LotionBottle = "\U0001F9F4"; /// /// Gets the "Lotus" emoji. 🪷 /// /// /// Lookup: lotus /// public const string Lotus = "\U0001FAB7"; /// /// Gets the "Loudly crying face" emoji. 😭 /// /// /// Lookup: loudly_crying_face /// public const string LoudlyCryingFace = "\U0001F62D"; /// /// Gets the "Loudspeaker" emoji. 📢 /// /// /// Lookup: loudspeaker /// public const string Loudspeaker = "\U0001F4E2"; /// /// Gets the "Love hotel" emoji. 🏩 /// /// /// Lookup: love_hotel /// public const string LoveHotel = "\U0001F3E9"; /// /// Gets the "Love letter" emoji. 💌 /// /// /// Lookup: love_letter /// public const string LoveLetter = "\U0001F48C"; /// /// Gets the "Love-you gesture" emoji. 🤟 /// /// /// Lookup: love_you_gesture /// public const string LoveYouGesture = "\U0001F91F"; /// /// Gets the "Low battery" emoji. 🪫 /// /// /// Lookup: low_battery /// public const string LowBattery = "\U0001FAAB"; /// /// Gets the "Luggage" emoji. 🧳 /// /// /// Lookup: luggage /// public const string Luggage = "\U0001F9F3"; /// /// Gets the "Lungs" emoji. 🫁 /// /// /// Lookup: lungs /// public const string Lungs = "\U0001FAC1"; /// /// Gets the "Lying face" emoji. 🤥 /// /// /// Lookup: lying_face /// public const string LyingFace = "\U0001F925"; /// /// Gets the "Mage" emoji. 🧙 /// /// /// Lookup: mage /// public const string Mage = "\U0001F9D9"; /// /// Gets the "Magic wand" emoji. 🪄 /// /// /// Lookup: magic_wand /// public const string MagicWand = "\U0001FA84"; /// /// Gets the "Magnet" emoji. 🧲 /// /// /// Lookup: magnet /// public const string Magnet = "\U0001F9F2"; /// /// Gets the "Magnifying glass tilted left" emoji. 🔍 /// /// /// Lookup: magnifying_glass_tilted_left /// public const string MagnifyingGlassTiltedLeft = "\U0001F50D"; /// /// Gets the "Magnifying glass tilted right" emoji. 🔎 /// /// /// Lookup: magnifying_glass_tilted_right /// public const string MagnifyingGlassTiltedRight = "\U0001F50E"; /// /// Gets the "Mahjong red dragon" emoji. 🀄 /// /// /// Lookup: mahjong_red_dragon /// public const string MahjongRedDragon = "\U0001F004"; /// /// Gets the "Male sign" emoji. ♂ /// /// /// Lookup: male_sign /// public const string MaleSign = "\U00002642"; /// /// Gets the "Mammoth" emoji. 🦣 /// /// /// Lookup: mammoth /// public const string Mammoth = "\U0001F9A3"; /// /// Gets the "Man" emoji. 👨 /// /// /// Lookup: man /// public const string Man = "\U0001F468"; /// /// Gets the "Man dancing" emoji. 🕺 /// /// /// Lookup: man_dancing /// public const string ManDancing = "\U0001F57A"; /// /// Gets the "Mango" emoji. 🥭 /// /// /// Lookup: mango /// public const string Mango = "\U0001F96D"; /// /// Gets the "Man’s shoe" emoji. 👞 /// /// /// Lookup: mans_shoe /// public const string MansShoe = "\U0001F45E"; /// /// Gets the "Mantelpiece clock" emoji. 🕰 /// /// /// Lookup: mantelpiece_clock /// public const string MantelpieceClock = "\U0001F570"; /// /// Gets the "Manual wheelchair" emoji. 🦽 /// /// /// Lookup: manual_wheelchair /// public const string ManualWheelchair = "\U0001F9BD"; /// /// Gets the "Maple leaf" emoji. 🍁 /// /// /// Lookup: maple_leaf /// public const string MapleLeaf = "\U0001F341"; /// /// Gets the "Map of Japan" emoji. 🗾 /// /// /// Lookup: map_of_japan /// public const string MapOfJapan = "\U0001F5FE"; /// /// Gets the "Maracas" emoji. 🪇 /// /// /// Lookup: maracas /// public const string Maracas = "\U0001FA87"; /// /// Gets the "Martial arts uniform" emoji. 🥋 /// /// /// Lookup: martial_arts_uniform /// public const string MartialArtsUniform = "\U0001F94B"; /// /// Gets the "Mate" emoji. 🧉 /// /// /// Lookup: mate /// public const string Mate = "\U0001F9C9"; /// /// Gets the "Meat on bone" emoji. 🍖 /// /// /// Lookup: meat_on_bone /// public const string MeatOnBone = "\U0001F356"; /// /// Gets the "Mechanical arm" emoji. 🦾 /// /// /// Lookup: mechanical_arm /// public const string MechanicalArm = "\U0001F9BE"; /// /// Gets the "Mechanical leg" emoji. 🦿 /// /// /// Lookup: mechanical_leg /// public const string MechanicalLeg = "\U0001F9BF"; /// /// Gets the "Medical symbol" emoji. ⚕ /// /// /// Lookup: medical_symbol /// public const string MedicalSymbol = "\U00002695"; /// /// Gets the "Medium-dark skin tone" emoji. 🏾 /// /// /// Lookup: medium_dark_skin_tone /// public const string MediumDarkSkinTone = "\U0001F3FE"; /// /// Gets the "Medium-light skin tone" emoji. 🏼 /// /// /// Lookup: medium_light_skin_tone /// public const string MediumLightSkinTone = "\U0001F3FC"; /// /// Gets the "Medium skin tone" emoji. 🏽 /// /// /// Lookup: medium_skin_tone /// public const string MediumSkinTone = "\U0001F3FD"; /// /// Gets the "Megaphone" emoji. 📣 /// /// /// Lookup: megaphone /// public const string Megaphone = "\U0001F4E3"; /// /// Gets the "Melon" emoji. 🍈 /// /// /// Lookup: melon /// public const string Melon = "\U0001F348"; /// /// Gets the "Melting face" emoji. 🫠 /// /// /// Lookup: melting_face /// public const string MeltingFace = "\U0001FAE0"; /// /// Gets the "Memo" emoji. 📝 /// /// /// Lookup: memo /// public const string Memo = "\U0001F4DD"; /// /// Gets the "Men holding hands" emoji. 👬 /// /// /// Lookup: men_holding_hands /// public const string MenHoldingHands = "\U0001F46C"; /// /// Gets the "Menorah" emoji. 🕎 /// /// /// Lookup: menorah /// public const string Menorah = "\U0001F54E"; /// /// Gets the "Men’s room" emoji. 🚹 /// /// /// Lookup: mens_room /// public const string MensRoom = "\U0001F6B9"; /// /// Gets the "Merperson" emoji. 🧜 /// /// /// Lookup: merperson /// public const string Merperson = "\U0001F9DC"; /// /// Gets the "Metro" emoji. 🚇 /// /// /// Lookup: metro /// public const string Metro = "\U0001F687"; /// /// Gets the "Microbe" emoji. 🦠 /// /// /// Lookup: microbe /// public const string Microbe = "\U0001F9A0"; /// /// Gets the "Microphone" emoji. 🎤 /// /// /// Lookup: microphone /// public const string Microphone = "\U0001F3A4"; /// /// Gets the "Microscope" emoji. 🔬 /// /// /// Lookup: microscope /// public const string Microscope = "\U0001F52C"; /// /// Gets the "Middle finger" emoji. 🖕 /// /// /// Lookup: middle_finger /// public const string MiddleFinger = "\U0001F595"; /// /// Gets the "Military helmet" emoji. 🪖 /// /// /// Lookup: military_helmet /// public const string MilitaryHelmet = "\U0001FA96"; /// /// Gets the "Military medal" emoji. 🎖 /// /// /// Lookup: military_medal /// public const string MilitaryMedal = "\U0001F396"; /// /// Gets the "Milky way" emoji. 🌌 /// /// /// Lookup: milky_way /// public const string MilkyWay = "\U0001F30C"; /// /// Gets the "Minibus" emoji. 🚐 /// /// /// Lookup: minibus /// public const string Minibus = "\U0001F690"; /// /// Gets the "Minus" emoji. ➖ /// /// /// Lookup: minus /// public const string Minus = "\U00002796"; /// /// Gets the "Mirror" emoji. 🪞 /// /// /// Lookup: mirror /// public const string Mirror = "\U0001FA9E"; /// /// Gets the "Mirror ball" emoji. 🪩 /// /// /// Lookup: mirror_ball /// public const string MirrorBall = "\U0001FAA9"; /// /// Gets the "Moai" emoji. 🗿 /// /// /// Lookup: moai /// public const string Moai = "\U0001F5FF"; /// /// Gets the "Mobile phone" emoji. 📱 /// /// /// Lookup: mobile_phone /// public const string MobilePhone = "\U0001F4F1"; /// /// Gets the "Mobile phone off" emoji. 📴 /// /// /// Lookup: mobile_phone_off /// public const string MobilePhoneOff = "\U0001F4F4"; /// /// Gets the "Mobile phone with arrow" emoji. 📲 /// /// /// Lookup: mobile_phone_with_arrow /// public const string MobilePhoneWithArrow = "\U0001F4F2"; /// /// Gets the "Money bag" emoji. 💰 /// /// /// Lookup: money_bag /// public const string MoneyBag = "\U0001F4B0"; /// /// Gets the "Money-mouth face" emoji. 🤑 /// /// /// Lookup: money_mouth_face /// public const string MoneyMouthFace = "\U0001F911"; /// /// Gets the "Money with wings" emoji. 💸 /// /// /// Lookup: money_with_wings /// public const string MoneyWithWings = "\U0001F4B8"; /// /// Gets the "Monkey" emoji. 🐒 /// /// /// Lookup: monkey /// public const string Monkey = "\U0001F412"; /// /// Gets the "Monkey face" emoji. 🐵 /// /// /// Lookup: monkey_face /// public const string MonkeyFace = "\U0001F435"; /// /// Gets the "Monorail" emoji. 🚝 /// /// /// Lookup: monorail /// public const string Monorail = "\U0001F69D"; /// /// Gets the "Moon cake" emoji. 🥮 /// /// /// Lookup: moon_cake /// public const string MoonCake = "\U0001F96E"; /// /// Gets the "Moon viewing ceremony" emoji. 🎑 /// /// /// Lookup: moon_viewing_ceremony /// public const string MoonViewingCeremony = "\U0001F391"; /// /// Gets the "Moose" emoji. 🫎 /// /// /// Lookup: moose /// public const string Moose = "\U0001FACE"; /// /// Gets the "Mosque" emoji. 🕌 /// /// /// Lookup: mosque /// public const string Mosque = "\U0001F54C"; /// /// Gets the "Mosquito" emoji. 🦟 /// /// /// Lookup: mosquito /// public const string Mosquito = "\U0001F99F"; /// /// Gets the "Motor boat" emoji. 🛥 /// /// /// Lookup: motor_boat /// public const string MotorBoat = "\U0001F6E5"; /// /// Gets the "Motorcycle" emoji. 🏍 /// /// /// Lookup: motorcycle /// public const string Motorcycle = "\U0001F3CD"; /// /// Gets the "Motorized wheelchair" emoji. 🦼 /// /// /// Lookup: motorized_wheelchair /// public const string MotorizedWheelchair = "\U0001F9BC"; /// /// Gets the "Motor scooter" emoji. 🛵 /// /// /// Lookup: motor_scooter /// public const string MotorScooter = "\U0001F6F5"; /// /// Gets the "Motorway" emoji. 🛣 /// /// /// Lookup: motorway /// public const string Motorway = "\U0001F6E3"; /// /// Gets the "Mountain" emoji. ⛰ /// /// /// Lookup: mountain /// public const string Mountain = "\U000026F0"; /// /// Gets the "Mountain cableway" emoji. 🚠 /// /// /// Lookup: mountain_cableway /// public const string MountainCableway = "\U0001F6A0"; /// /// Gets the "Mountain railway" emoji. 🚞 /// /// /// Lookup: mountain_railway /// public const string MountainRailway = "\U0001F69E"; /// /// Gets the "Mount fuji" emoji. 🗻 /// /// /// Lookup: mount_fuji /// public const string MountFuji = "\U0001F5FB"; /// /// Gets the "Mouse" emoji. 🐁 /// /// /// Lookup: mouse /// public const string Mouse = "\U0001F401"; /// /// Gets the "Mouse face" emoji. 🐭 /// /// /// Lookup: mouse_face /// public const string MouseFace = "\U0001F42D"; /// /// Gets the "Mouse trap" emoji. 🪤 /// /// /// Lookup: mouse_trap /// public const string MouseTrap = "\U0001FAA4"; /// /// Gets the "Mouth" emoji. 👄 /// /// /// Lookup: mouth /// public const string Mouth = "\U0001F444"; /// /// Gets the "Movie camera" emoji. 🎥 /// /// /// Lookup: movie_camera /// public const string MovieCamera = "\U0001F3A5"; /// /// Gets the "Mrs. Claus" emoji. 🤶 /// /// /// Lookup: mrs_claus /// public const string MrsClaus = "\U0001F936"; /// /// Gets the "Multiply" emoji. ✖ /// /// /// Lookup: multiply /// public const string Multiply = "\U00002716"; /// /// Gets the "Mushroom" emoji. 🍄 /// /// /// Lookup: mushroom /// public const string Mushroom = "\U0001F344"; /// /// Gets the "Musical keyboard" emoji. 🎹 /// /// /// Lookup: musical_keyboard /// public const string MusicalKeyboard = "\U0001F3B9"; /// /// Gets the "Musical note" emoji. 🎵 /// /// /// Lookup: musical_note /// public const string MusicalNote = "\U0001F3B5"; /// /// Gets the "Musical notes" emoji. 🎶 /// /// /// Lookup: musical_notes /// public const string MusicalNotes = "\U0001F3B6"; /// /// Gets the "Musical score" emoji. 🎼 /// /// /// Lookup: musical_score /// public const string MusicalScore = "\U0001F3BC"; /// /// Gets the "Muted speaker" emoji. 🔇 /// /// /// Lookup: muted_speaker /// public const string MutedSpeaker = "\U0001F507"; /// /// Gets the "Nail polish" emoji. 💅 /// /// /// Lookup: nail_polish /// public const string NailPolish = "\U0001F485"; /// /// Gets the "Name badge" emoji. 📛 /// /// /// Lookup: name_badge /// public const string NameBadge = "\U0001F4DB"; /// /// Gets the "National park" emoji. 🏞 /// /// /// Lookup: national_park /// public const string NationalPark = "\U0001F3DE"; /// /// Gets the "Nauseated face" emoji. 🤢 /// /// /// Lookup: nauseated_face /// public const string NauseatedFace = "\U0001F922"; /// /// Gets the "Nazar amulet" emoji. 🧿 /// /// /// Lookup: nazar_amulet /// public const string NazarAmulet = "\U0001F9FF"; /// /// Gets the "Necktie" emoji. 👔 /// /// /// Lookup: necktie /// public const string Necktie = "\U0001F454"; /// /// Gets the "Nerd face" emoji. 🤓 /// /// /// Lookup: nerd_face /// public const string NerdFace = "\U0001F913"; /// /// Gets the "Nesting dolls" emoji. 🪆 /// /// /// Lookup: nesting_dolls /// public const string NestingDolls = "\U0001FA86"; /// /// Gets the "Nest with eggs" emoji. 🪺 /// /// /// Lookup: nest_with_eggs /// public const string NestWithEggs = "\U0001FABA"; /// /// Gets the "Neutral face" emoji. 😐 /// /// /// Lookup: neutral_face /// public const string NeutralFace = "\U0001F610"; /// /// Gets the "NEW button" emoji. 🆕 /// /// /// Lookup: new_button /// public const string NewButton = "\U0001F195"; /// /// Gets the "New moon" emoji. 🌑 /// /// /// Lookup: new_moon /// public const string NewMoon = "\U0001F311"; /// /// Gets the "New moon face" emoji. 🌚 /// /// /// Lookup: new_moon_face /// public const string NewMoonFace = "\U0001F31A"; /// /// Gets the "Newspaper" emoji. 📰 /// /// /// Lookup: newspaper /// public const string Newspaper = "\U0001F4F0"; /// /// Gets the "Next track button" emoji. ⏭ /// /// /// Lookup: next_track_button /// public const string NextTrackButton = "\U000023ED"; /// /// Gets the "NG button" emoji. 🆖 /// /// /// Lookup: ng_button /// public const string NgButton = "\U0001F196"; /// /// Gets the "Night with stars" emoji. 🌃 /// /// /// Lookup: night_with_stars /// public const string NightWithStars = "\U0001F303"; /// /// Gets the "Nine o’clock" emoji. 🕘 /// /// /// Lookup: nine_o_clock /// public const string NineOClock = "\U0001F558"; /// /// Gets the "Nine-thirty" emoji. 🕤 /// /// /// Lookup: nine_thirty /// public const string NineThirty = "\U0001F564"; /// /// Gets the "Ninja" emoji. 🥷 /// /// /// Lookup: ninja /// public const string Ninja = "\U0001F977"; /// /// Gets the "No bicycles" emoji. 🚳 /// /// /// Lookup: no_bicycles /// public const string NoBicycles = "\U0001F6B3"; /// /// Gets the "No entry" emoji. ⛔ /// /// /// Lookup: no_entry /// public const string NoEntry = "\U000026D4"; /// /// Gets the "No littering" emoji. 🚯 /// /// /// Lookup: no_littering /// public const string NoLittering = "\U0001F6AF"; /// /// Gets the "No mobile phones" emoji. 📵 /// /// /// Lookup: no_mobile_phones /// public const string NoMobilePhones = "\U0001F4F5"; /// /// Gets the "Non-potable water" emoji. 🚱 /// /// /// Lookup: non_potable_water /// public const string NonPotableWater = "\U0001F6B1"; /// /// Gets the "No one under eighteen" emoji. 🔞 /// /// /// Lookup: no_one_under_eighteen /// public const string NoOneUnderEighteen = "\U0001F51E"; /// /// Gets the "No pedestrians" emoji. 🚷 /// /// /// Lookup: no_pedestrians /// public const string NoPedestrians = "\U0001F6B7"; /// /// Gets the "Nose" emoji. 👃 /// /// /// Lookup: nose /// public const string Nose = "\U0001F443"; /// /// Gets the "No smoking" emoji. 🚭 /// /// /// Lookup: no_smoking /// public const string NoSmoking = "\U0001F6AD"; /// /// Gets the "Notebook" emoji. 📓 /// /// /// Lookup: notebook /// public const string Notebook = "\U0001F4D3"; /// /// Gets the "Notebook with decorative cover" emoji. 📔 /// /// /// Lookup: notebook_with_decorative_cover /// public const string NotebookWithDecorativeCover = "\U0001F4D4"; /// /// Gets the "Nut and bolt" emoji. 🔩 /// /// /// Lookup: nut_and_bolt /// public const string NutAndBolt = "\U0001F529"; /// /// Gets the "O button (blood type)" emoji. 🅾 /// /// /// Lookup: o_button_blood_type /// public const string OButtonBloodType = "\U0001F17E"; /// /// Gets the "Octopus" emoji. 🐙 /// /// /// Lookup: octopus /// public const string Octopus = "\U0001F419"; /// /// Gets the "Oden" emoji. 🍢 /// /// /// Lookup: oden /// public const string Oden = "\U0001F362"; /// /// Gets the "Office building" emoji. 🏢 /// /// /// Lookup: office_building /// public const string OfficeBuilding = "\U0001F3E2"; /// /// Gets the "Ogre" emoji. 👹 /// /// /// Lookup: ogre /// public const string Ogre = "\U0001F479"; /// /// Gets the "Oil drum" emoji. 🛢 /// /// /// Lookup: oil_drum /// public const string OilDrum = "\U0001F6E2"; /// /// Gets the "OK button" emoji. 🆗 /// /// /// Lookup: ok_button /// public const string OkButton = "\U0001F197"; /// /// Gets the "OK hand" emoji. 👌 /// /// /// Lookup: ok_hand /// public const string OkHand = "\U0001F44C"; /// /// Gets the "Older person" emoji. 🧓 /// /// /// Lookup: older_person /// public const string OlderPerson = "\U0001F9D3"; /// /// Gets the "Old key" emoji. 🗝 /// /// /// Lookup: old_key /// public const string OldKey = "\U0001F5DD"; /// /// Gets the "Old man" emoji. 👴 /// /// /// Lookup: old_man /// public const string OldMan = "\U0001F474"; /// /// Gets the "Old woman" emoji. 👵 /// /// /// Lookup: old_woman /// public const string OldWoman = "\U0001F475"; /// /// Gets the "Olive" emoji. 🫒 /// /// /// Lookup: olive /// public const string Olive = "\U0001FAD2"; /// /// Gets the "Om" emoji. 🕉 /// /// /// Lookup: om /// public const string Om = "\U0001F549"; /// /// Gets the "ON! arrow" emoji. 🔛 /// /// /// Lookup: on_arrow /// public const string OnArrow = "\U0001F51B"; /// /// Gets the "Oncoming automobile" emoji. 🚘 /// /// /// Lookup: oncoming_automobile /// public const string OncomingAutomobile = "\U0001F698"; /// /// Gets the "Oncoming bus" emoji. 🚍 /// /// /// Lookup: oncoming_bus /// public const string OncomingBus = "\U0001F68D"; /// /// Gets the "Oncoming fist" emoji. 👊 /// /// /// Lookup: oncoming_fist /// public const string OncomingFist = "\U0001F44A"; /// /// Gets the "Oncoming police car" emoji. 🚔 /// /// /// Lookup: oncoming_police_car /// public const string OncomingPoliceCar = "\U0001F694"; /// /// Gets the "Oncoming taxi" emoji. 🚖 /// /// /// Lookup: oncoming_taxi /// public const string OncomingTaxi = "\U0001F696"; /// /// Gets the "One o’clock" emoji. 🕐 /// /// /// Lookup: one_o_clock /// public const string OneOClock = "\U0001F550"; /// /// Gets the "One-piece swimsuit" emoji. 🩱 /// /// /// Lookup: one_piece_swimsuit /// public const string OnePieceSwimsuit = "\U0001FA71"; /// /// Gets the "One-thirty" emoji. 🕜 /// /// /// Lookup: one_thirty /// public const string OneThirty = "\U0001F55C"; /// /// Gets the "Onion" emoji. 🧅 /// /// /// Lookup: onion /// public const string Onion = "\U0001F9C5"; /// /// Gets the "Open book" emoji. 📖 /// /// /// Lookup: open_book /// public const string OpenBook = "\U0001F4D6"; /// /// Gets the "Open file folder" emoji. 📂 /// /// /// Lookup: open_file_folder /// public const string OpenFileFolder = "\U0001F4C2"; /// /// Gets the "Open hands" emoji. 👐 /// /// /// Lookup: open_hands /// public const string OpenHands = "\U0001F450"; /// /// Gets the "Open mailbox with lowered flag" emoji. 📭 /// /// /// Lookup: open_mailbox_with_lowered_flag /// public const string OpenMailboxWithLoweredFlag = "\U0001F4ED"; /// /// Gets the "Open mailbox with raised flag" emoji. 📬 /// /// /// Lookup: open_mailbox_with_raised_flag /// public const string OpenMailboxWithRaisedFlag = "\U0001F4EC"; /// /// Gets the "Ophiuchus" emoji. ⛎ /// /// /// Lookup: ophiuchus /// public const string Ophiuchus = "\U000026CE"; /// /// Gets the "Optical disk" emoji. 💿 /// /// /// Lookup: optical_disk /// public const string OpticalDisk = "\U0001F4BF"; /// /// Gets the "Orange book" emoji. 📙 /// /// /// Lookup: orange_book /// public const string OrangeBook = "\U0001F4D9"; /// /// Gets the "Orange circle" emoji. 🟠 /// /// /// Lookup: orange_circle /// public const string OrangeCircle = "\U0001F7E0"; /// /// Gets the "Orange heart" emoji. 🧡 /// /// /// Lookup: orange_heart /// public const string OrangeHeart = "\U0001F9E1"; /// /// Gets the "Orange square" emoji. 🟧 /// /// /// Lookup: orange_square /// public const string OrangeSquare = "\U0001F7E7"; /// /// Gets the "Orangutan" emoji. 🦧 /// /// /// Lookup: orangutan /// public const string Orangutan = "\U0001F9A7"; /// /// Gets the "Orca" emoji. 🫍 /// /// /// Lookup: orca /// public const string Orca = "\U0001FACD"; /// /// Gets the "Orthodox cross" emoji. ☦ /// /// /// Lookup: orthodox_cross /// public const string OrthodoxCross = "\U00002626"; /// /// Gets the "Otter" emoji. 🦦 /// /// /// Lookup: otter /// public const string Otter = "\U0001F9A6"; /// /// Gets the "Outbox tray" emoji. 📤 /// /// /// Lookup: outbox_tray /// public const string OutboxTray = "\U0001F4E4"; /// /// Gets the "Owl" emoji. 🦉 /// /// /// Lookup: owl /// public const string Owl = "\U0001F989"; /// /// Gets the "Ox" emoji. 🐂 /// /// /// Lookup: ox /// public const string Ox = "\U0001F402"; /// /// Gets the "Oyster" emoji. 🦪 /// /// /// Lookup: oyster /// public const string Oyster = "\U0001F9AA"; /// /// Gets the "Package" emoji. 📦 /// /// /// Lookup: package /// public const string Package = "\U0001F4E6"; /// /// Gets the "Page facing up" emoji. 📄 /// /// /// Lookup: page_facing_up /// public const string PageFacingUp = "\U0001F4C4"; /// /// Gets the "Pager" emoji. 📟 /// /// /// Lookup: pager /// public const string Pager = "\U0001F4DF"; /// /// Gets the "Page with curl" emoji. 📃 /// /// /// Lookup: page_with_curl /// public const string PageWithCurl = "\U0001F4C3"; /// /// Gets the "Paintbrush" emoji. 🖌 /// /// /// Lookup: paintbrush /// public const string Paintbrush = "\U0001F58C"; /// /// Gets the "Palm down hand" emoji. 🫳 /// /// /// Lookup: palm_down_hand /// public const string PalmDownHand = "\U0001FAF3"; /// /// Gets the "Palms up together" emoji. 🤲 /// /// /// Lookup: palms_up_together /// public const string PalmsUpTogether = "\U0001F932"; /// /// Gets the "Palm tree" emoji. 🌴 /// /// /// Lookup: palm_tree /// public const string PalmTree = "\U0001F334"; /// /// Gets the "Palm up hand" emoji. 🫴 /// /// /// Lookup: palm_up_hand /// public const string PalmUpHand = "\U0001FAF4"; /// /// Gets the "Pancakes" emoji. 🥞 /// /// /// Lookup: pancakes /// public const string Pancakes = "\U0001F95E"; /// /// Gets the "Panda" emoji. 🐼 /// /// /// Lookup: panda /// public const string Panda = "\U0001F43C"; /// /// Gets the "Paperclip" emoji. 📎 /// /// /// Lookup: paperclip /// public const string Paperclip = "\U0001F4CE"; /// /// Gets the "Parachute" emoji. 🪂 /// /// /// Lookup: parachute /// public const string Parachute = "\U0001FA82"; /// /// Gets the "Parrot" emoji. 🦜 /// /// /// Lookup: parrot /// public const string Parrot = "\U0001F99C"; /// /// Gets the "Part alternation mark" emoji. 〽 /// /// /// Lookup: part_alternation_mark /// public const string PartAlternationMark = "\U0000303D"; /// /// Gets the "Partying face" emoji. 🥳 /// /// /// Lookup: partying_face /// public const string PartyingFace = "\U0001F973"; /// /// Gets the "Party popper" emoji. 🎉 /// /// /// Lookup: party_popper /// public const string PartyPopper = "\U0001F389"; /// /// Gets the "Passenger ship" emoji. 🛳 /// /// /// Lookup: passenger_ship /// public const string PassengerShip = "\U0001F6F3"; /// /// Gets the "Passport control" emoji. 🛂 /// /// /// Lookup: passport_control /// public const string PassportControl = "\U0001F6C2"; /// /// Gets the "Pause button" emoji. ⏸ /// /// /// Lookup: pause_button /// public const string PauseButton = "\U000023F8"; /// /// Gets the "Paw prints" emoji. 🐾 /// /// /// Lookup: paw_prints /// public const string PawPrints = "\U0001F43E"; /// /// Gets the "P button" emoji. 🅿 /// /// /// Lookup: p_button /// public const string PButton = "\U0001F17F"; /// /// Gets the "Peace symbol" emoji. ☮ /// /// /// Lookup: peace_symbol /// public const string PeaceSymbol = "\U0000262E"; /// /// Gets the "Peach" emoji. 🍑 /// /// /// Lookup: peach /// public const string Peach = "\U0001F351"; /// /// Gets the "Peacock" emoji. 🦚 /// /// /// Lookup: peacock /// public const string Peacock = "\U0001F99A"; /// /// Gets the "Peanuts" emoji. 🥜 /// /// /// Lookup: peanuts /// public const string Peanuts = "\U0001F95C"; /// /// Gets the "Pea pod" emoji. 🫛 /// /// /// Lookup: pea_pod /// public const string PeaPod = "\U0001FADB"; /// /// Gets the "Pear" emoji. 🍐 /// /// /// Lookup: pear /// public const string Pear = "\U0001F350"; /// /// Gets the "Pen" emoji. 🖊 /// /// /// Lookup: pen /// public const string Pen = "\U0001F58A"; /// /// Gets the "Pencil" emoji. ✏ /// /// /// Lookup: pencil /// public const string Pencil = "\U0000270F"; /// /// Gets the "Penguin" emoji. 🐧 /// /// /// Lookup: penguin /// public const string Penguin = "\U0001F427"; /// /// Gets the "Pensive face" emoji. 😔 /// /// /// Lookup: pensive_face /// public const string PensiveFace = "\U0001F614"; /// /// Gets the "People hugging" emoji. 🫂 /// /// /// Lookup: people_hugging /// public const string PeopleHugging = "\U0001FAC2"; /// /// Gets the "People with bunny ears" emoji. 👯 /// /// /// Lookup: people_with_bunny_ears /// public const string PeopleWithBunnyEars = "\U0001F46F"; /// /// Gets the "People wrestling" emoji. 🤼 /// /// /// Lookup: people_wrestling /// public const string PeopleWrestling = "\U0001F93C"; /// /// Gets the "Performing arts" emoji. 🎭 /// /// /// Lookup: performing_arts /// public const string PerformingArts = "\U0001F3AD"; /// /// Gets the "Persevering face" emoji. 😣 /// /// /// Lookup: persevering_face /// public const string PerseveringFace = "\U0001F623"; /// /// Gets the "Person" emoji. 🧑 /// /// /// Lookup: person /// public const string Person = "\U0001F9D1"; /// /// Gets the "Person: beard" emoji. 🧔 /// /// /// Lookup: person_beard /// public const string PersonBeard = "\U0001F9D4"; /// /// Gets the "Person biking" emoji. 🚴 /// /// /// Lookup: person_biking /// public const string PersonBiking = "\U0001F6B4"; /// /// Gets the "Person: blond hair" emoji. 👱 /// /// /// Lookup: person_blond_hair /// public const string PersonBlondHair = "\U0001F471"; /// /// Gets the "Person bouncing ball" emoji. ⛹ /// /// /// Lookup: person_bouncing_ball /// public const string PersonBouncingBall = "\U000026F9"; /// /// Gets the "Person bowing" emoji. 🙇 /// /// /// Lookup: person_bowing /// public const string PersonBowing = "\U0001F647"; /// /// Gets the "Person cartwheeling" emoji. 🤸 /// /// /// Lookup: person_cartwheeling /// public const string PersonCartwheeling = "\U0001F938"; /// /// Gets the "Person climbing" emoji. 🧗 /// /// /// Lookup: person_climbing /// public const string PersonClimbing = "\U0001F9D7"; /// /// Gets the "Person facepalming" emoji. 🤦 /// /// /// Lookup: person_facepalming /// public const string PersonFacepalming = "\U0001F926"; /// /// Gets the "Person fencing" emoji. 🤺 /// /// /// Lookup: person_fencing /// public const string PersonFencing = "\U0001F93A"; /// /// Gets the "Person frowning" emoji. 🙍 /// /// /// Lookup: person_frowning /// public const string PersonFrowning = "\U0001F64D"; /// /// Gets the "Person gesturing NO" emoji. 🙅 /// /// /// Lookup: person_gesturing_no /// public const string PersonGesturingNo = "\U0001F645"; /// /// Gets the "Person gesturing OK" emoji. 🙆 /// /// /// Lookup: person_gesturing_ok /// public const string PersonGesturingOk = "\U0001F646"; /// /// Gets the "Person getting haircut" emoji. 💇 /// /// /// Lookup: person_getting_haircut /// public const string PersonGettingHaircut = "\U0001F487"; /// /// Gets the "Person getting massage" emoji. 💆 /// /// /// Lookup: person_getting_massage /// public const string PersonGettingMassage = "\U0001F486"; /// /// Gets the "Person golfing" emoji. 🏌 /// /// /// Lookup: person_golfing /// public const string PersonGolfing = "\U0001F3CC"; /// /// Gets the "Person in bed" emoji. 🛌 /// /// /// Lookup: person_in_bed /// public const string PersonInBed = "\U0001F6CC"; /// /// Gets the "Person in lotus position" emoji. 🧘 /// /// /// Lookup: person_in_lotus_position /// public const string PersonInLotusPosition = "\U0001F9D8"; /// /// Gets the "Person in steamy room" emoji. 🧖 /// /// /// Lookup: person_in_steamy_room /// public const string PersonInSteamyRoom = "\U0001F9D6"; /// /// Gets the "Person in suit levitating" emoji. 🕴 /// /// /// Lookup: person_in_suit_levitating /// public const string PersonInSuitLevitating = "\U0001F574"; /// /// Gets the "Person in tuxedo" emoji. 🤵 /// /// /// Lookup: person_in_tuxedo /// public const string PersonInTuxedo = "\U0001F935"; /// /// Gets the "Person juggling" emoji. 🤹 /// /// /// Lookup: person_juggling /// public const string PersonJuggling = "\U0001F939"; /// /// Gets the "Person kneeling" emoji. 🧎 /// /// /// Lookup: person_kneeling /// public const string PersonKneeling = "\U0001F9CE"; /// /// Gets the "Person lifting weights" emoji. 🏋 /// /// /// Lookup: person_lifting_weights /// public const string PersonLiftingWeights = "\U0001F3CB"; /// /// Gets the "Person mountain biking" emoji. 🚵 /// /// /// Lookup: person_mountain_biking /// public const string PersonMountainBiking = "\U0001F6B5"; /// /// Gets the "Person playing handball" emoji. 🤾 /// /// /// Lookup: person_playing_handball /// public const string PersonPlayingHandball = "\U0001F93E"; /// /// Gets the "Person playing water polo" emoji. 🤽 /// /// /// Lookup: person_playing_water_polo /// public const string PersonPlayingWaterPolo = "\U0001F93D"; /// /// Gets the "Person pouting" emoji. 🙎 /// /// /// Lookup: person_pouting /// public const string PersonPouting = "\U0001F64E"; /// /// Gets the "Person raising hand" emoji. 🙋 /// /// /// Lookup: person_raising_hand /// public const string PersonRaisingHand = "\U0001F64B"; /// /// Gets the "Person rowing boat" emoji. 🚣 /// /// /// Lookup: person_rowing_boat /// public const string PersonRowingBoat = "\U0001F6A3"; /// /// Gets the "Person running" emoji. 🏃 /// /// /// Lookup: person_running /// public const string PersonRunning = "\U0001F3C3"; /// /// Gets the "Person shrugging" emoji. 🤷 /// /// /// Lookup: person_shrugging /// public const string PersonShrugging = "\U0001F937"; /// /// Gets the "Person standing" emoji. 🧍 /// /// /// Lookup: person_standing /// public const string PersonStanding = "\U0001F9CD"; /// /// Gets the "Person surfing" emoji. 🏄 /// /// /// Lookup: person_surfing /// public const string PersonSurfing = "\U0001F3C4"; /// /// Gets the "Person swimming" emoji. 🏊 /// /// /// Lookup: person_swimming /// public const string PersonSwimming = "\U0001F3CA"; /// /// Gets the "Person taking bath" emoji. 🛀 /// /// /// Lookup: person_taking_bath /// public const string PersonTakingBath = "\U0001F6C0"; /// /// Gets the "Person tipping hand" emoji. 💁 /// /// /// Lookup: person_tipping_hand /// public const string PersonTippingHand = "\U0001F481"; /// /// Gets the "Person walking" emoji. 🚶 /// /// /// Lookup: person_walking /// public const string PersonWalking = "\U0001F6B6"; /// /// Gets the "Person wearing turban" emoji. 👳 /// /// /// Lookup: person_wearing_turban /// public const string PersonWearingTurban = "\U0001F473"; /// /// Gets the "Person with crown" emoji. 🫅 /// /// /// Lookup: person_with_crown /// public const string PersonWithCrown = "\U0001FAC5"; /// /// Gets the "Person with skullcap" emoji. 👲 /// /// /// Lookup: person_with_skullcap /// public const string PersonWithSkullcap = "\U0001F472"; /// /// Gets the "Person with veil" emoji. 👰 /// /// /// Lookup: person_with_veil /// public const string PersonWithVeil = "\U0001F470"; /// /// Gets the "Petri dish" emoji. 🧫 /// /// /// Lookup: petri_dish /// public const string PetriDish = "\U0001F9EB"; /// /// Gets the "Pick" emoji. ⛏ /// /// /// Lookup: pick /// public const string Pick = "\U000026CF"; /// /// Gets the "Pickup truck" emoji. 🛻 /// /// /// Lookup: pickup_truck /// public const string PickupTruck = "\U0001F6FB"; /// /// Gets the "Pie" emoji. 🥧 /// /// /// Lookup: pie /// public const string Pie = "\U0001F967"; /// /// Gets the "Pig" emoji. 🐖 /// /// /// Lookup: pig /// public const string Pig = "\U0001F416"; /// /// Gets the "Pig face" emoji. 🐷 /// /// /// Lookup: pig_face /// public const string PigFace = "\U0001F437"; /// /// Gets the "Pig nose" emoji. 🐽 /// /// /// Lookup: pig_nose /// public const string PigNose = "\U0001F43D"; /// /// Gets the "Pile of poo" emoji. 💩 /// /// /// Lookup: pile_of_poo /// public const string PileOfPoo = "\U0001F4A9"; /// /// Gets the "Pill" emoji. 💊 /// /// /// Lookup: pill /// public const string Pill = "\U0001F48A"; /// /// Gets the "Piñata" emoji. 🪅 /// /// /// Lookup: piñata /// public const string Piñata = "\U0001FA85"; /// /// Gets the "Pinched fingers" emoji. 🤌 /// /// /// Lookup: pinched_fingers /// public const string PinchedFingers = "\U0001F90C"; /// /// Gets the "Pinching hand" emoji. 🤏 /// /// /// Lookup: pinching_hand /// public const string PinchingHand = "\U0001F90F"; /// /// Gets the "Pineapple" emoji. 🍍 /// /// /// Lookup: pineapple /// public const string Pineapple = "\U0001F34D"; /// /// Gets the "Pine decoration" emoji. 🎍 /// /// /// Lookup: pine_decoration /// public const string PineDecoration = "\U0001F38D"; /// /// Gets the "Ping pong" emoji. 🏓 /// /// /// Lookup: ping_pong /// public const string PingPong = "\U0001F3D3"; /// /// Gets the "Pink heart" emoji. 🩷 /// /// /// Lookup: pink_heart /// public const string PinkHeart = "\U0001FA77"; /// /// Gets the "Pisces" emoji. ♓ /// /// /// Lookup: pisces /// public const string Pisces = "\U00002653"; /// /// Gets the "Pizza" emoji. 🍕 /// /// /// Lookup: pizza /// public const string Pizza = "\U0001F355"; /// /// Gets the "Placard" emoji. 🪧 /// /// /// Lookup: placard /// public const string Placard = "\U0001FAA7"; /// /// Gets the "Place of worship" emoji. 🛐 /// /// /// Lookup: place_of_worship /// public const string PlaceOfWorship = "\U0001F6D0"; /// /// Gets the "Play button" emoji. ▶ /// /// /// Lookup: play_button /// public const string PlayButton = "\U000025B6"; /// /// Gets the "Playground slide" emoji. 🛝 /// /// /// Lookup: playground_slide /// public const string PlaygroundSlide = "\U0001F6DD"; /// /// Gets the "Play or pause button" emoji. ⏯ /// /// /// Lookup: play_or_pause_button /// public const string PlayOrPauseButton = "\U000023EF"; /// /// Gets the "Pleading face" emoji. 🥺 /// /// /// Lookup: pleading_face /// public const string PleadingFace = "\U0001F97A"; /// /// Gets the "Plunger" emoji. 🪠 /// /// /// Lookup: plunger /// public const string Plunger = "\U0001FAA0"; /// /// Gets the "Plus" emoji. ➕ /// /// /// Lookup: plus /// public const string Plus = "\U00002795"; /// /// Gets the "Police car" emoji. 🚓 /// /// /// Lookup: police_car /// public const string PoliceCar = "\U0001F693"; /// /// Gets the "Police car light" emoji. 🚨 /// /// /// Lookup: police_car_light /// public const string PoliceCarLight = "\U0001F6A8"; /// /// Gets the "Police officer" emoji. 👮 /// /// /// Lookup: police_officer /// public const string PoliceOfficer = "\U0001F46E"; /// /// Gets the "Poodle" emoji. 🐩 /// /// /// Lookup: poodle /// public const string Poodle = "\U0001F429"; /// /// Gets the "Pool 8 ball" emoji. 🎱 /// /// /// Lookup: pool_8_ball /// public const string Pool8Ball = "\U0001F3B1"; /// /// Gets the "Popcorn" emoji. 🍿 /// /// /// Lookup: popcorn /// public const string Popcorn = "\U0001F37F"; /// /// Gets the "Postal horn" emoji. 📯 /// /// /// Lookup: postal_horn /// public const string PostalHorn = "\U0001F4EF"; /// /// Gets the "Postbox" emoji. 📮 /// /// /// Lookup: postbox /// public const string Postbox = "\U0001F4EE"; /// /// Gets the "Post office" emoji. 🏤 /// /// /// Lookup: post_office /// public const string PostOffice = "\U0001F3E4"; /// /// Gets the "Potable water" emoji. 🚰 /// /// /// Lookup: potable_water /// public const string PotableWater = "\U0001F6B0"; /// /// Gets the "Potato" emoji. 🥔 /// /// /// Lookup: potato /// public const string Potato = "\U0001F954"; /// /// Gets the "Pot of food" emoji. 🍲 /// /// /// Lookup: pot_of_food /// public const string PotOfFood = "\U0001F372"; /// /// Gets the "Potted plant" emoji. 🪴 /// /// /// Lookup: potted_plant /// public const string PottedPlant = "\U0001FAB4"; /// /// Gets the "Poultry leg" emoji. 🍗 /// /// /// Lookup: poultry_leg /// public const string PoultryLeg = "\U0001F357"; /// /// Gets the "Pound banknote" emoji. 💷 /// /// /// Lookup: pound_banknote /// public const string PoundBanknote = "\U0001F4B7"; /// /// Gets the "Pouring liquid" emoji. 🫗 /// /// /// Lookup: pouring_liquid /// public const string PouringLiquid = "\U0001FAD7"; /// /// Gets the "Pouting cat" emoji. 😾 /// /// /// Lookup: pouting_cat /// public const string PoutingCat = "\U0001F63E"; /// /// Gets the "Prayer beads" emoji. 📿 /// /// /// Lookup: prayer_beads /// public const string PrayerBeads = "\U0001F4FF"; /// /// Gets the "Pregnant man" emoji. 🫃 /// /// /// Lookup: pregnant_man /// public const string PregnantMan = "\U0001FAC3"; /// /// Gets the "Pregnant person" emoji. 🫄 /// /// /// Lookup: pregnant_person /// public const string PregnantPerson = "\U0001FAC4"; /// /// Gets the "Pregnant woman" emoji. 🤰 /// /// /// Lookup: pregnant_woman /// public const string PregnantWoman = "\U0001F930"; /// /// Gets the "Pretzel" emoji. 🥨 /// /// /// Lookup: pretzel /// public const string Pretzel = "\U0001F968"; /// /// Gets the "Prince" emoji. 🤴 /// /// /// Lookup: prince /// public const string Prince = "\U0001F934"; /// /// Gets the "Princess" emoji. 👸 /// /// /// Lookup: princess /// public const string Princess = "\U0001F478"; /// /// Gets the "Printer" emoji. 🖨 /// /// /// Lookup: printer /// public const string Printer = "\U0001F5A8"; /// /// Gets the "Prohibited" emoji. 🚫 /// /// /// Lookup: prohibited /// public const string Prohibited = "\U0001F6AB"; /// /// Gets the "Purple circle" emoji. 🟣 /// /// /// Lookup: purple_circle /// public const string PurpleCircle = "\U0001F7E3"; /// /// Gets the "Purple heart" emoji. 💜 /// /// /// Lookup: purple_heart /// public const string PurpleHeart = "\U0001F49C"; /// /// Gets the "Purple square" emoji. 🟪 /// /// /// Lookup: purple_square /// public const string PurpleSquare = "\U0001F7EA"; /// /// Gets the "Purse" emoji. 👛 /// /// /// Lookup: purse /// public const string Purse = "\U0001F45B"; /// /// Gets the "Pushpin" emoji. 📌 /// /// /// Lookup: pushpin /// public const string Pushpin = "\U0001F4CC"; /// /// Gets the "Puzzle piece" emoji. 🧩 /// /// /// Lookup: puzzle_piece /// public const string PuzzlePiece = "\U0001F9E9"; /// /// Gets the "Rabbit" emoji. 🐇 /// /// /// Lookup: rabbit /// public const string Rabbit = "\U0001F407"; /// /// Gets the "Rabbit face" emoji. 🐰 /// /// /// Lookup: rabbit_face /// public const string RabbitFace = "\U0001F430"; /// /// Gets the "Raccoon" emoji. 🦝 /// /// /// Lookup: raccoon /// public const string Raccoon = "\U0001F99D"; /// /// Gets the "Racing car" emoji. 🏎 /// /// /// Lookup: racing_car /// public const string RacingCar = "\U0001F3CE"; /// /// Gets the "Radio" emoji. 📻 /// /// /// Lookup: radio /// public const string Radio = "\U0001F4FB"; /// /// Gets the "Radioactive" emoji. ☢ /// /// /// Lookup: radioactive /// public const string Radioactive = "\U00002622"; /// /// Gets the "Radio button" emoji. 🔘 /// /// /// Lookup: radio_button /// public const string RadioButton = "\U0001F518"; /// /// Gets the "Railway car" emoji. 🚃 /// /// /// Lookup: railway_car /// public const string RailwayCar = "\U0001F683"; /// /// Gets the "Railway track" emoji. 🛤 /// /// /// Lookup: railway_track /// public const string RailwayTrack = "\U0001F6E4"; /// /// Gets the "Rainbow" emoji. 🌈 /// /// /// Lookup: rainbow /// public const string Rainbow = "\U0001F308"; /// /// Gets the "Raised back of hand" emoji. 🤚 /// /// /// Lookup: raised_back_of_hand /// public const string RaisedBackOfHand = "\U0001F91A"; /// /// Gets the "Raised fist" emoji. ✊ /// /// /// Lookup: raised_fist /// public const string RaisedFist = "\U0000270A"; /// /// Gets the "Raised hand" emoji. ✋ /// /// /// Lookup: raised_hand /// public const string RaisedHand = "\U0000270B"; /// /// Gets the "Raising hands" emoji. 🙌 /// /// /// Lookup: raising_hands /// public const string RaisingHands = "\U0001F64C"; /// /// Gets the "Ram" emoji. 🐏 /// /// /// Lookup: ram /// public const string Ram = "\U0001F40F"; /// /// Gets the "Rat" emoji. 🐀 /// /// /// Lookup: rat /// public const string Rat = "\U0001F400"; /// /// Gets the "Razor" emoji. 🪒 /// /// /// Lookup: razor /// public const string Razor = "\U0001FA92"; /// /// Gets the "Receipt" emoji. 🧾 /// /// /// Lookup: receipt /// public const string Receipt = "\U0001F9FE"; /// /// Gets the "Record button" emoji. ⏺ /// /// /// Lookup: record_button /// public const string RecordButton = "\U000023FA"; /// /// Gets the "Recycling symbol" emoji. ♻ /// /// /// Lookup: recycling_symbol /// public const string RecyclingSymbol = "\U0000267B"; /// /// Gets the "Red apple" emoji. 🍎 /// /// /// Lookup: red_apple /// public const string RedApple = "\U0001F34E"; /// /// Gets the "Red circle" emoji. 🔴 /// /// /// Lookup: red_circle /// public const string RedCircle = "\U0001F534"; /// /// Gets the "Red envelope" emoji. 🧧 /// /// /// Lookup: red_envelope /// public const string RedEnvelope = "\U0001F9E7"; /// /// Gets the "Red exclamation mark" emoji. ❗ /// /// /// Lookup: red_exclamation_mark /// public const string RedExclamationMark = "\U00002757"; /// /// Gets the "Red hair" emoji. 🦰 /// /// /// Lookup: red_hair /// public const string RedHair = "\U0001F9B0"; /// /// Gets the "Red heart" emoji. ❤ /// /// /// Lookup: red_heart /// public const string RedHeart = "\U00002764"; /// /// Gets the "Red paper lantern" emoji. 🏮 /// /// /// Lookup: red_paper_lantern /// public const string RedPaperLantern = "\U0001F3EE"; /// /// Gets the "Red question mark" emoji. ❓ /// /// /// Lookup: red_question_mark /// public const string RedQuestionMark = "\U00002753"; /// /// Gets the "Red square" emoji. 🟥 /// /// /// Lookup: red_square /// public const string RedSquare = "\U0001F7E5"; /// /// Gets the "Red triangle pointed down" emoji. 🔻 /// /// /// Lookup: red_triangle_pointed_down /// public const string RedTrianglePointedDown = "\U0001F53B"; /// /// Gets the "Red triangle pointed up" emoji. 🔺 /// /// /// Lookup: red_triangle_pointed_up /// public const string RedTrianglePointedUp = "\U0001F53A"; /// /// Gets the "Regional indicator A" emoji. 🇦 /// /// /// Lookup: regional_indicator_a /// public const string RegionalIndicatorA = "\U0001F1E6"; /// /// Gets the "Regional indicator B" emoji. 🇧 /// /// /// Lookup: regional_indicator_b /// public const string RegionalIndicatorB = "\U0001F1E7"; /// /// Gets the "Regional indicator C" emoji. 🇨 /// /// /// Lookup: regional_indicator_c /// public const string RegionalIndicatorC = "\U0001F1E8"; /// /// Gets the "Regional indicator D" emoji. 🇩 /// /// /// Lookup: regional_indicator_d /// public const string RegionalIndicatorD = "\U0001F1E9"; /// /// Gets the "Regional indicator E" emoji. 🇪 /// /// /// Lookup: regional_indicator_e /// public const string RegionalIndicatorE = "\U0001F1EA"; /// /// Gets the "Regional indicator F" emoji. 🇫 /// /// /// Lookup: regional_indicator_f /// public const string RegionalIndicatorF = "\U0001F1EB"; /// /// Gets the "Regional indicator G" emoji. 🇬 /// /// /// Lookup: regional_indicator_g /// public const string RegionalIndicatorG = "\U0001F1EC"; /// /// Gets the "Regional indicator H" emoji. 🇭 /// /// /// Lookup: regional_indicator_h /// public const string RegionalIndicatorH = "\U0001F1ED"; /// /// Gets the "Regional indicator I" emoji. 🇮 /// /// /// Lookup: regional_indicator_i /// public const string RegionalIndicatorI = "\U0001F1EE"; /// /// Gets the "Regional indicator J" emoji. 🇯 /// /// /// Lookup: regional_indicator_j /// public const string RegionalIndicatorJ = "\U0001F1EF"; /// /// Gets the "Regional indicator K" emoji. 🇰 /// /// /// Lookup: regional_indicator_k /// public const string RegionalIndicatorK = "\U0001F1F0"; /// /// Gets the "Regional indicator L" emoji. 🇱 /// /// /// Lookup: regional_indicator_l /// public const string RegionalIndicatorL = "\U0001F1F1"; /// /// Gets the "Regional indicator M" emoji. 🇲 /// /// /// Lookup: regional_indicator_m /// public const string RegionalIndicatorM = "\U0001F1F2"; /// /// Gets the "Regional indicator N" emoji. 🇳 /// /// /// Lookup: regional_indicator_n /// public const string RegionalIndicatorN = "\U0001F1F3"; /// /// Gets the "Regional indicator O" emoji. 🇴 /// /// /// Lookup: regional_indicator_o /// public const string RegionalIndicatorO = "\U0001F1F4"; /// /// Gets the "Regional indicator P" emoji. 🇵 /// /// /// Lookup: regional_indicator_p /// public const string RegionalIndicatorP = "\U0001F1F5"; /// /// Gets the "Regional indicator Q" emoji. 🇶 /// /// /// Lookup: regional_indicator_q /// public const string RegionalIndicatorQ = "\U0001F1F6"; /// /// Gets the "Regional indicator R" emoji. 🇷 /// /// /// Lookup: regional_indicator_r /// public const string RegionalIndicatorR = "\U0001F1F7"; /// /// Gets the "Regional indicator S" emoji. 🇸 /// /// /// Lookup: regional_indicator_s /// public const string RegionalIndicatorS = "\U0001F1F8"; /// /// Gets the "Regional indicator T" emoji. 🇹 /// /// /// Lookup: regional_indicator_t /// public const string RegionalIndicatorT = "\U0001F1F9"; /// /// Gets the "Regional indicator U" emoji. 🇺 /// /// /// Lookup: regional_indicator_u /// public const string RegionalIndicatorU = "\U0001F1FA"; /// /// Gets the "Regional indicator V" emoji. 🇻 /// /// /// Lookup: regional_indicator_v /// public const string RegionalIndicatorV = "\U0001F1FB"; /// /// Gets the "Regional indicator W" emoji. 🇼 /// /// /// Lookup: regional_indicator_w /// public const string RegionalIndicatorW = "\U0001F1FC"; /// /// Gets the "Regional indicator X" emoji. 🇽 /// /// /// Lookup: regional_indicator_x /// public const string RegionalIndicatorX = "\U0001F1FD"; /// /// Gets the "Regional indicator Y" emoji. 🇾 /// /// /// Lookup: regional_indicator_y /// public const string RegionalIndicatorY = "\U0001F1FE"; /// /// Gets the "Regional indicator Z" emoji. 🇿 /// /// /// Lookup: regional_indicator_z /// public const string RegionalIndicatorZ = "\U0001F1FF"; /// /// Gets the "Registered" emoji. ® /// /// /// Lookup: registered /// public const string Registered = "\U000000AE"; /// /// Gets the "Relieved face" emoji. 😌 /// /// /// Lookup: relieved_face /// public const string RelievedFace = "\U0001F60C"; /// /// Gets the "Reminder ribbon" emoji. 🎗 /// /// /// Lookup: reminder_ribbon /// public const string ReminderRibbon = "\U0001F397"; /// /// Gets the "Repeat button" emoji. 🔁 /// /// /// Lookup: repeat_button /// public const string RepeatButton = "\U0001F501"; /// /// Gets the "Repeat single button" emoji. 🔂 /// /// /// Lookup: repeat_single_button /// public const string RepeatSingleButton = "\U0001F502"; /// /// Gets the "Rescue worker’s helmet" emoji. ⛑ /// /// /// Lookup: rescue_workers_helmet /// public const string RescueWorkersHelmet = "\U000026D1"; /// /// Gets the "Restroom" emoji. 🚻 /// /// /// Lookup: restroom /// public const string Restroom = "\U0001F6BB"; /// /// Gets the "Reverse button" emoji. ◀ /// /// /// Lookup: reverse_button /// public const string ReverseButton = "\U000025C0"; /// /// Gets the "Revolving hearts" emoji. 💞 /// /// /// Lookup: revolving_hearts /// public const string RevolvingHearts = "\U0001F49E"; /// /// Gets the "Rhinoceros" emoji. 🦏 /// /// /// Lookup: rhinoceros /// public const string Rhinoceros = "\U0001F98F"; /// /// Gets the "Ribbon" emoji. 🎀 /// /// /// Lookup: ribbon /// public const string Ribbon = "\U0001F380"; /// /// Gets the "Rice ball" emoji. 🍙 /// /// /// Lookup: rice_ball /// public const string RiceBall = "\U0001F359"; /// /// Gets the "Rice cracker" emoji. 🍘 /// /// /// Lookup: rice_cracker /// public const string RiceCracker = "\U0001F358"; /// /// Gets the "Right anger bubble" emoji. 🗯 /// /// /// Lookup: right_anger_bubble /// public const string RightAngerBubble = "\U0001F5EF"; /// /// Gets the "Right arrow" emoji. ➡ /// /// /// Lookup: right_arrow /// public const string RightArrow = "\U000027A1"; /// /// Gets the "Right arrow curving down" emoji. ⤵ /// /// /// Lookup: right_arrow_curving_down /// public const string RightArrowCurvingDown = "\U00002935"; /// /// Gets the "Right arrow curving left" emoji. ↩ /// /// /// Lookup: right_arrow_curving_left /// public const string RightArrowCurvingLeft = "\U000021A9"; /// /// Gets the "Right arrow curving up" emoji. ⤴ /// /// /// Lookup: right_arrow_curving_up /// public const string RightArrowCurvingUp = "\U00002934"; /// /// Gets the "Right-facing fist" emoji. 🤜 /// /// /// Lookup: right_facing_fist /// public const string RightFacingFist = "\U0001F91C"; /// /// Gets the "Rightwards hand" emoji. 🫱 /// /// /// Lookup: rightwards_hand /// public const string RightwardsHand = "\U0001FAF1"; /// /// Gets the "Rightwards pushing hand" emoji. 🫸 /// /// /// Lookup: rightwards_pushing_hand /// public const string RightwardsPushingHand = "\U0001FAF8"; /// /// Gets the "Ring" emoji. 💍 /// /// /// Lookup: ring /// public const string Ring = "\U0001F48D"; /// /// Gets the "Ring buoy" emoji. 🛟 /// /// /// Lookup: ring_buoy /// public const string RingBuoy = "\U0001F6DF"; /// /// Gets the "Ringed planet" emoji. 🪐 /// /// /// Lookup: ringed_planet /// public const string RingedPlanet = "\U0001FA90"; /// /// Gets the "Roasted sweet potato" emoji. 🍠 /// /// /// Lookup: roasted_sweet_potato /// public const string RoastedSweetPotato = "\U0001F360"; /// /// Gets the "Robot" emoji. 🤖 /// /// /// Lookup: robot /// public const string Robot = "\U0001F916"; /// /// Gets the "Rock" emoji. 🪨 /// /// /// Lookup: rock /// public const string Rock = "\U0001FAA8"; /// /// Gets the "Rocket" emoji. 🚀 /// /// /// Lookup: rocket /// public const string Rocket = "\U0001F680"; /// /// Gets the "Rolled-up newspaper" emoji. 🗞 /// /// /// Lookup: rolled_up_newspaper /// public const string RolledUpNewspaper = "\U0001F5DE"; /// /// Gets the "Roller coaster" emoji. 🎢 /// /// /// Lookup: roller_coaster /// public const string RollerCoaster = "\U0001F3A2"; /// /// Gets the "Roller skate" emoji. 🛼 /// /// /// Lookup: roller_skate /// public const string RollerSkate = "\U0001F6FC"; /// /// Gets the "Rolling on the floor laughing" emoji. 🤣 /// /// /// Lookup: rolling_on_the_floor_laughing /// public const string RollingOnTheFloorLaughing = "\U0001F923"; /// /// Gets the "Roll of paper" emoji. 🧻 /// /// /// Lookup: roll_of_paper /// public const string RollOfPaper = "\U0001F9FB"; /// /// Gets the "Rooster" emoji. 🐓 /// /// /// Lookup: rooster /// public const string Rooster = "\U0001F413"; /// /// Gets the "Root vegetable" emoji. 🫜 /// /// /// Lookup: root_vegetable /// public const string RootVegetable = "\U0001FADC"; /// /// Gets the "Rose" emoji. 🌹 /// /// /// Lookup: rose /// public const string Rose = "\U0001F339"; /// /// Gets the "Rosette" emoji. 🏵 /// /// /// Lookup: rosette /// public const string Rosette = "\U0001F3F5"; /// /// Gets the "Round pushpin" emoji. 📍 /// /// /// Lookup: round_pushpin /// public const string RoundPushpin = "\U0001F4CD"; /// /// Gets the "Rugby football" emoji. 🏉 /// /// /// Lookup: rugby_football /// public const string RugbyFootball = "\U0001F3C9"; /// /// Gets the "Running shirt" emoji. 🎽 /// /// /// Lookup: running_shirt /// public const string RunningShirt = "\U0001F3BD"; /// /// Gets the "Running shoe" emoji. 👟 /// /// /// Lookup: running_shoe /// public const string RunningShoe = "\U0001F45F"; /// /// Gets the "Sad but relieved face" emoji. 😥 /// /// /// Lookup: sad_but_relieved_face /// public const string SadButRelievedFace = "\U0001F625"; /// /// Gets the "Safety pin" emoji. 🧷 /// /// /// Lookup: safety_pin /// public const string SafetyPin = "\U0001F9F7"; /// /// Gets the "Safety vest" emoji. 🦺 /// /// /// Lookup: safety_vest /// public const string SafetyVest = "\U0001F9BA"; /// /// Gets the "Sagittarius" emoji. ♐ /// /// /// Lookup: sagittarius /// public const string Sagittarius = "\U00002650"; /// /// Gets the "Sailboat" emoji. ⛵ /// /// /// Lookup: sailboat /// public const string Sailboat = "\U000026F5"; /// /// Gets the "Sake" emoji. 🍶 /// /// /// Lookup: sake /// public const string Sake = "\U0001F376"; /// /// Gets the "Salt" emoji. 🧂 /// /// /// Lookup: salt /// public const string Salt = "\U0001F9C2"; /// /// Gets the "Saluting face" emoji. 🫡 /// /// /// Lookup: saluting_face /// public const string SalutingFace = "\U0001FAE1"; /// /// Gets the "Sandwich" emoji. 🥪 /// /// /// Lookup: sandwich /// public const string Sandwich = "\U0001F96A"; /// /// Gets the "Santa Claus" emoji. 🎅 /// /// /// Lookup: santa_claus /// public const string SantaClaus = "\U0001F385"; /// /// Gets the "Sari" emoji. 🥻 /// /// /// Lookup: sari /// public const string Sari = "\U0001F97B"; /// /// Gets the "Satellite" emoji. 🛰 /// /// /// Lookup: satellite /// public const string Satellite = "\U0001F6F0"; /// /// Gets the "Satellite antenna" emoji. 📡 /// /// /// Lookup: satellite_antenna /// public const string SatelliteAntenna = "\U0001F4E1"; /// /// Gets the "Sauropod" emoji. 🦕 /// /// /// Lookup: sauropod /// public const string Sauropod = "\U0001F995"; /// /// Gets the "Saxophone" emoji. 🎷 /// /// /// Lookup: saxophone /// public const string Saxophone = "\U0001F3B7"; /// /// Gets the "Scarf" emoji. 🧣 /// /// /// Lookup: scarf /// public const string Scarf = "\U0001F9E3"; /// /// Gets the "School" emoji. 🏫 /// /// /// Lookup: school /// public const string School = "\U0001F3EB"; /// /// Gets the "Scissors" emoji. ✂ /// /// /// Lookup: scissors /// public const string Scissors = "\U00002702"; /// /// Gets the "Scorpio" emoji. ♏ /// /// /// Lookup: scorpio /// public const string Scorpio = "\U0000264F"; /// /// Gets the "Scorpion" emoji. 🦂 /// /// /// Lookup: scorpion /// public const string Scorpion = "\U0001F982"; /// /// Gets the "Screwdriver" emoji. 🪛 /// /// /// Lookup: screwdriver /// public const string Screwdriver = "\U0001FA9B"; /// /// Gets the "Scroll" emoji. 📜 /// /// /// Lookup: scroll /// public const string Scroll = "\U0001F4DC"; /// /// Gets the "Seal" emoji. 🦭 /// /// /// Lookup: seal /// public const string Seal = "\U0001F9AD"; /// /// Gets the "Seat" emoji. 💺 /// /// /// Lookup: seat /// public const string Seat = "\U0001F4BA"; /// /// Gets the "2nd place medal" emoji. 🥈 /// /// /// Lookup: 2nd_place_medal /// public const string SecondPlaceMedal = "\U0001F948"; /// /// Gets the "Seedling" emoji. 🌱 /// /// /// Lookup: seedling /// public const string Seedling = "\U0001F331"; /// /// Gets the "See-no-evil monkey" emoji. 🙈 /// /// /// Lookup: see_no_evil_monkey /// public const string SeeNoEvilMonkey = "\U0001F648"; /// /// Gets the "Selfie" emoji. 🤳 /// /// /// Lookup: selfie /// public const string Selfie = "\U0001F933"; /// /// Gets the "Seven o’clock" emoji. 🕖 /// /// /// Lookup: seven_o_clock /// public const string SevenOClock = "\U0001F556"; /// /// Gets the "Seven-thirty" emoji. 🕢 /// /// /// Lookup: seven_thirty /// public const string SevenThirty = "\U0001F562"; /// /// Gets the "Sewing needle" emoji. 🪡 /// /// /// Lookup: sewing_needle /// public const string SewingNeedle = "\U0001FAA1"; /// /// Gets the "Shaking face" emoji. 🫨 /// /// /// Lookup: shaking_face /// public const string ShakingFace = "\U0001FAE8"; /// /// Gets the "Shallow pan of food" emoji. 🥘 /// /// /// Lookup: shallow_pan_of_food /// public const string ShallowPanOfFood = "\U0001F958"; /// /// Gets the "Shamrock" emoji. ☘ /// /// /// Lookup: shamrock /// public const string Shamrock = "\U00002618"; /// /// Gets the "Shark" emoji. 🦈 /// /// /// Lookup: shark /// public const string Shark = "\U0001F988"; /// /// Gets the "Shaved ice" emoji. 🍧 /// /// /// Lookup: shaved_ice /// public const string ShavedIce = "\U0001F367"; /// /// Gets the "Sheaf of rice" emoji. 🌾 /// /// /// Lookup: sheaf_of_rice /// public const string SheafOfRice = "\U0001F33E"; /// /// Gets the "Shield" emoji. 🛡 /// /// /// Lookup: shield /// public const string Shield = "\U0001F6E1"; /// /// Gets the "Shinto shrine" emoji. ⛩ /// /// /// Lookup: shinto_shrine /// public const string ShintoShrine = "\U000026E9"; /// /// Gets the "Ship" emoji. 🚢 /// /// /// Lookup: ship /// public const string Ship = "\U0001F6A2"; /// /// Gets the "Shooting star" emoji. 🌠 /// /// /// Lookup: shooting_star /// public const string ShootingStar = "\U0001F320"; /// /// Gets the "Shopping bags" emoji. 🛍 /// /// /// Lookup: shopping_bags /// public const string ShoppingBags = "\U0001F6CD"; /// /// Gets the "Shopping cart" emoji. 🛒 /// /// /// Lookup: shopping_cart /// public const string ShoppingCart = "\U0001F6D2"; /// /// Gets the "Shortcake" emoji. 🍰 /// /// /// Lookup: shortcake /// public const string Shortcake = "\U0001F370"; /// /// Gets the "Shorts" emoji. 🩳 /// /// /// Lookup: shorts /// public const string Shorts = "\U0001FA73"; /// /// Gets the "Shovel" emoji. 🪏 /// /// /// Lookup: shovel /// public const string Shovel = "\U0001FA8F"; /// /// Gets the "Shower" emoji. 🚿 /// /// /// Lookup: shower /// public const string Shower = "\U0001F6BF"; /// /// Gets the "Shrimp" emoji. 🦐 /// /// /// Lookup: shrimp /// public const string Shrimp = "\U0001F990"; /// /// Gets the "Shuffle tracks button" emoji. 🔀 /// /// /// Lookup: shuffle_tracks_button /// public const string ShuffleTracksButton = "\U0001F500"; /// /// Gets the "Shushing face" emoji. 🤫 /// /// /// Lookup: shushing_face /// public const string ShushingFace = "\U0001F92B"; /// /// Gets the "Sign of the horns" emoji. 🤘 /// /// /// Lookup: sign_of_the_horns /// public const string SignOfTheHorns = "\U0001F918"; /// /// Gets the "Six o’clock" emoji. 🕕 /// /// /// Lookup: six_o_clock /// public const string SixOClock = "\U0001F555"; /// /// Gets the "Six-thirty" emoji. 🕡 /// /// /// Lookup: six_thirty /// public const string SixThirty = "\U0001F561"; /// /// Gets the "Skateboard" emoji. 🛹 /// /// /// Lookup: skateboard /// public const string Skateboard = "\U0001F6F9"; /// /// Gets the "Skier" emoji. ⛷ /// /// /// Lookup: skier /// public const string Skier = "\U000026F7"; /// /// Gets the "Skis" emoji. 🎿 /// /// /// Lookup: skis /// public const string Skis = "\U0001F3BF"; /// /// Gets the "Skull" emoji. 💀 /// /// /// Lookup: skull /// public const string Skull = "\U0001F480"; /// /// Gets the "Skull and crossbones" emoji. ☠ /// /// /// Lookup: skull_and_crossbones /// public const string SkullAndCrossbones = "\U00002620"; /// /// Gets the "Skunk" emoji. 🦨 /// /// /// Lookup: skunk /// public const string Skunk = "\U0001F9A8"; /// /// Gets the "Sled" emoji. 🛷 /// /// /// Lookup: sled /// public const string Sled = "\U0001F6F7"; /// /// Gets the "Sleeping face" emoji. 😴 /// /// /// Lookup: sleeping_face /// public const string SleepingFace = "\U0001F634"; /// /// Gets the "Sleepy face" emoji. 😪 /// /// /// Lookup: sleepy_face /// public const string SleepyFace = "\U0001F62A"; /// /// Gets the "Slightly frowning face" emoji. 🙁 /// /// /// Lookup: slightly_frowning_face /// public const string SlightlyFrowningFace = "\U0001F641"; /// /// Gets the "Slightly smiling face" emoji. 🙂 /// /// /// Lookup: slightly_smiling_face /// public const string SlightlySmilingFace = "\U0001F642"; /// /// Gets the "Sloth" emoji. 🦥 /// /// /// Lookup: sloth /// public const string Sloth = "\U0001F9A5"; /// /// Gets the "Slot machine" emoji. 🎰 /// /// /// Lookup: slot_machine /// public const string SlotMachine = "\U0001F3B0"; /// /// Gets the "Small airplane" emoji. 🛩 /// /// /// Lookup: small_airplane /// public const string SmallAirplane = "\U0001F6E9"; /// /// Gets the "Small blue diamond" emoji. 🔹 /// /// /// Lookup: small_blue_diamond /// public const string SmallBlueDiamond = "\U0001F539"; /// /// Gets the "Small orange diamond" emoji. 🔸 /// /// /// Lookup: small_orange_diamond /// public const string SmallOrangeDiamond = "\U0001F538"; /// /// Gets the "Smiling cat with heart-eyes" emoji. 😻 /// /// /// Lookup: smiling_cat_with_heart_eyes /// public const string SmilingCatWithHeartEyes = "\U0001F63B"; /// /// Gets the "Smiling face" emoji. ☺ /// /// /// Lookup: smiling_face /// public const string SmilingFace = "\U0000263A"; /// /// Gets the "Smiling face with halo" emoji. 😇 /// /// /// Lookup: smiling_face_with_halo /// public const string SmilingFaceWithHalo = "\U0001F607"; /// /// Gets the "Smiling face with heart-eyes" emoji. 😍 /// /// /// Lookup: smiling_face_with_heart_eyes /// public const string SmilingFaceWithHeartEyes = "\U0001F60D"; /// /// Gets the "Smiling face with hearts" emoji. 🥰 /// /// /// Lookup: smiling_face_with_hearts /// public const string SmilingFaceWithHearts = "\U0001F970"; /// /// Gets the "Smiling face with horns" emoji. 😈 /// /// /// Lookup: smiling_face_with_horns /// public const string SmilingFaceWithHorns = "\U0001F608"; /// /// Gets the "Smiling face with open hands" emoji. 🤗 /// /// /// Lookup: smiling_face_with_open_hands /// public const string SmilingFaceWithOpenHands = "\U0001F917"; /// /// Gets the "Smiling face with smiling eyes" emoji. 😊 /// /// /// Lookup: smiling_face_with_smiling_eyes /// public const string SmilingFaceWithSmilingEyes = "\U0001F60A"; /// /// Gets the "Smiling face with sunglasses" emoji. 😎 /// /// /// Lookup: smiling_face_with_sunglasses /// public const string SmilingFaceWithSunglasses = "\U0001F60E"; /// /// Gets the "Smiling face with tear" emoji. 🥲 /// /// /// Lookup: smiling_face_with_tear /// public const string SmilingFaceWithTear = "\U0001F972"; /// /// Gets the "Smirking face" emoji. 😏 /// /// /// Lookup: smirking_face /// public const string SmirkingFace = "\U0001F60F"; /// /// Gets the "Snail" emoji. 🐌 /// /// /// Lookup: snail /// public const string Snail = "\U0001F40C"; /// /// Gets the "Snake" emoji. 🐍 /// /// /// Lookup: snake /// public const string Snake = "\U0001F40D"; /// /// Gets the "Sneezing face" emoji. 🤧 /// /// /// Lookup: sneezing_face /// public const string SneezingFace = "\U0001F927"; /// /// Gets the "Snowboarder" emoji. 🏂 /// /// /// Lookup: snowboarder /// public const string Snowboarder = "\U0001F3C2"; /// /// Gets the "Snow-capped mountain" emoji. 🏔 /// /// /// Lookup: snow_capped_mountain /// public const string SnowCappedMountain = "\U0001F3D4"; /// /// Gets the "Snowflake" emoji. ❄ /// /// /// Lookup: snowflake /// public const string Snowflake = "\U00002744"; /// /// Gets the "Snowman" emoji. ☃ /// /// /// Lookup: snowman /// public const string Snowman = "\U00002603"; /// /// Gets the "Snowman without snow" emoji. ⛄ /// /// /// Lookup: snowman_without_snow /// public const string SnowmanWithoutSnow = "\U000026C4"; /// /// Gets the "Soap" emoji. 🧼 /// /// /// Lookup: soap /// public const string Soap = "\U0001F9FC"; /// /// Gets the "Soccer ball" emoji. ⚽ /// /// /// Lookup: soccer_ball /// public const string SoccerBall = "\U000026BD"; /// /// Gets the "Socks" emoji. 🧦 /// /// /// Lookup: socks /// public const string Socks = "\U0001F9E6"; /// /// Gets the "Softball" emoji. 🥎 /// /// /// Lookup: softball /// public const string Softball = "\U0001F94E"; /// /// Gets the "Soft ice cream" emoji. 🍦 /// /// /// Lookup: soft_ice_cream /// public const string SoftIceCream = "\U0001F366"; /// /// Gets the "SOON arrow" emoji. 🔜 /// /// /// Lookup: soon_arrow /// public const string SoonArrow = "\U0001F51C"; /// /// Gets the "SOS button" emoji. 🆘 /// /// /// Lookup: sos_button /// public const string SosButton = "\U0001F198"; /// /// Gets the "Spade suit" emoji. ♠ /// /// /// Lookup: spade_suit /// public const string SpadeSuit = "\U00002660"; /// /// Gets the "Spaghetti" emoji. 🍝 /// /// /// Lookup: spaghetti /// public const string Spaghetti = "\U0001F35D"; /// /// Gets the "Sparkle" emoji. ❇ /// /// /// Lookup: sparkle /// public const string Sparkle = "\U00002747"; /// /// Gets the "Sparkler" emoji. 🎇 /// /// /// Lookup: sparkler /// public const string Sparkler = "\U0001F387"; /// /// Gets the "Sparkles" emoji. ✨ /// /// /// Lookup: sparkles /// public const string Sparkles = "\U00002728"; /// /// Gets the "Sparkling heart" emoji. 💖 /// /// /// Lookup: sparkling_heart /// public const string SparklingHeart = "\U0001F496"; /// /// Gets the "Speaker high volume" emoji. 🔊 /// /// /// Lookup: speaker_high_volume /// public const string SpeakerHighVolume = "\U0001F50A"; /// /// Gets the "Speaker low volume" emoji. 🔈 /// /// /// Lookup: speaker_low_volume /// public const string SpeakerLowVolume = "\U0001F508"; /// /// Gets the "Speaker medium volume" emoji. 🔉 /// /// /// Lookup: speaker_medium_volume /// public const string SpeakerMediumVolume = "\U0001F509"; /// /// Gets the "Speaking head" emoji. 🗣 /// /// /// Lookup: speaking_head /// public const string SpeakingHead = "\U0001F5E3"; /// /// Gets the "Speak-no-evil monkey" emoji. 🙊 /// /// /// Lookup: speak_no_evil_monkey /// public const string SpeakNoEvilMonkey = "\U0001F64A"; /// /// Gets the "Speech balloon" emoji. 💬 /// /// /// Lookup: speech_balloon /// public const string SpeechBalloon = "\U0001F4AC"; /// /// Gets the "Speedboat" emoji. 🚤 /// /// /// Lookup: speedboat /// public const string Speedboat = "\U0001F6A4"; /// /// Gets the "Spider" emoji. 🕷 /// /// /// Lookup: spider /// public const string Spider = "\U0001F577"; /// /// Gets the "Spider web" emoji. 🕸 /// /// /// Lookup: spider_web /// public const string SpiderWeb = "\U0001F578"; /// /// Gets the "Spiral calendar" emoji. 🗓 /// /// /// Lookup: spiral_calendar /// public const string SpiralCalendar = "\U0001F5D3"; /// /// Gets the "Spiral notepad" emoji. 🗒 /// /// /// Lookup: spiral_notepad /// public const string SpiralNotepad = "\U0001F5D2"; /// /// Gets the "Spiral shell" emoji. 🐚 /// /// /// Lookup: spiral_shell /// public const string SpiralShell = "\U0001F41A"; /// /// Gets the "Splatter" emoji. 🫟 /// /// /// Lookup: splatter /// public const string Splatter = "\U0001FADF"; /// /// Gets the "Sponge" emoji. 🧽 /// /// /// Lookup: sponge /// public const string Sponge = "\U0001F9FD"; /// /// Gets the "Spoon" emoji. 🥄 /// /// /// Lookup: spoon /// public const string Spoon = "\U0001F944"; /// /// Gets the "Sports medal" emoji. 🏅 /// /// /// Lookup: sports_medal /// public const string SportsMedal = "\U0001F3C5"; /// /// Gets the "Sport utility vehicle" emoji. 🚙 /// /// /// Lookup: sport_utility_vehicle /// public const string SportUtilityVehicle = "\U0001F699"; /// /// Gets the "Spouting whale" emoji. 🐳 /// /// /// Lookup: spouting_whale /// public const string SpoutingWhale = "\U0001F433"; /// /// Gets the "Squid" emoji. 🦑 /// /// /// Lookup: squid /// public const string Squid = "\U0001F991"; /// /// Gets the "Squinting face with tongue" emoji. 😝 /// /// /// Lookup: squinting_face_with_tongue /// public const string SquintingFaceWithTongue = "\U0001F61D"; /// /// Gets the "Stadium" emoji. 🏟 /// /// /// Lookup: stadium /// public const string Stadium = "\U0001F3DF"; /// /// Gets the "Star" emoji. ⭐ /// /// /// Lookup: star /// public const string Star = "\U00002B50"; /// /// Gets the "Star and crescent" emoji. ☪ /// /// /// Lookup: star_and_crescent /// public const string StarAndCrescent = "\U0000262A"; /// /// Gets the "Star of David" emoji. ✡ /// /// /// Lookup: star_of_david /// public const string StarOfDavid = "\U00002721"; /// /// Gets the "Star-struck" emoji. 🤩 /// /// /// Lookup: star_struck /// public const string StarStruck = "\U0001F929"; /// /// Gets the "Station" emoji. 🚉 /// /// /// Lookup: station /// public const string Station = "\U0001F689"; /// /// Gets the "Statue of Liberty" emoji. 🗽 /// /// /// Lookup: statue_of_liberty /// public const string StatueOfLiberty = "\U0001F5FD"; /// /// Gets the "Steaming bowl" emoji. 🍜 /// /// /// Lookup: steaming_bowl /// public const string SteamingBowl = "\U0001F35C"; /// /// Gets the "Stethoscope" emoji. 🩺 /// /// /// Lookup: stethoscope /// public const string Stethoscope = "\U0001FA7A"; /// /// Gets the "Stop button" emoji. ⏹ /// /// /// Lookup: stop_button /// public const string StopButton = "\U000023F9"; /// /// Gets the "Stop sign" emoji. 🛑 /// /// /// Lookup: stop_sign /// public const string StopSign = "\U0001F6D1"; /// /// Gets the "Stopwatch" emoji. ⏱ /// /// /// Lookup: stopwatch /// public const string Stopwatch = "\U000023F1"; /// /// Gets the "Straight ruler" emoji. 📏 /// /// /// Lookup: straight_ruler /// public const string StraightRuler = "\U0001F4CF"; /// /// Gets the "Strawberry" emoji. 🍓 /// /// /// Lookup: strawberry /// public const string Strawberry = "\U0001F353"; /// /// Gets the "Studio microphone" emoji. 🎙 /// /// /// Lookup: studio_microphone /// public const string StudioMicrophone = "\U0001F399"; /// /// Gets the "Stuffed flatbread" emoji. 🥙 /// /// /// Lookup: stuffed_flatbread /// public const string StuffedFlatbread = "\U0001F959"; /// /// Gets the "Sun" emoji. ☀ /// /// /// Lookup: sun /// public const string Sun = "\U00002600"; /// /// Gets the "Sun behind cloud" emoji. ⛅ /// /// /// Lookup: sun_behind_cloud /// public const string SunBehindCloud = "\U000026C5"; /// /// Gets the "Sun behind large cloud" emoji. 🌥 /// /// /// Lookup: sun_behind_large_cloud /// public const string SunBehindLargeCloud = "\U0001F325"; /// /// Gets the "Sun behind rain cloud" emoji. 🌦 /// /// /// Lookup: sun_behind_rain_cloud /// public const string SunBehindRainCloud = "\U0001F326"; /// /// Gets the "Sun behind small cloud" emoji. 🌤 /// /// /// Lookup: sun_behind_small_cloud /// public const string SunBehindSmallCloud = "\U0001F324"; /// /// Gets the "Sunflower" emoji. 🌻 /// /// /// Lookup: sunflower /// public const string Sunflower = "\U0001F33B"; /// /// Gets the "Sunglasses" emoji. 🕶 /// /// /// Lookup: sunglasses /// public const string Sunglasses = "\U0001F576"; /// /// Gets the "Sunrise" emoji. 🌅 /// /// /// Lookup: sunrise /// public const string Sunrise = "\U0001F305"; /// /// Gets the "Sunrise over mountains" emoji. 🌄 /// /// /// Lookup: sunrise_over_mountains /// public const string SunriseOverMountains = "\U0001F304"; /// /// Gets the "Sunset" emoji. 🌇 /// /// /// Lookup: sunset /// public const string Sunset = "\U0001F307"; /// /// Gets the "Sun with face" emoji. 🌞 /// /// /// Lookup: sun_with_face /// public const string SunWithFace = "\U0001F31E"; /// /// Gets the "Superhero" emoji. 🦸 /// /// /// Lookup: superhero /// public const string Superhero = "\U0001F9B8"; /// /// Gets the "Supervillain" emoji. 🦹 /// /// /// Lookup: supervillain /// public const string Supervillain = "\U0001F9B9"; /// /// Gets the "Sushi" emoji. 🍣 /// /// /// Lookup: sushi /// public const string Sushi = "\U0001F363"; /// /// Gets the "Suspension railway" emoji. 🚟 /// /// /// Lookup: suspension_railway /// public const string SuspensionRailway = "\U0001F69F"; /// /// Gets the "Swan" emoji. 🦢 /// /// /// Lookup: swan /// public const string Swan = "\U0001F9A2"; /// /// Gets the "Sweat droplets" emoji. 💦 /// /// /// Lookup: sweat_droplets /// public const string SweatDroplets = "\U0001F4A6"; /// /// Gets the "Synagogue" emoji. 🕍 /// /// /// Lookup: synagogue /// public const string Synagogue = "\U0001F54D"; /// /// Gets the "Syringe" emoji. 💉 /// /// /// Lookup: syringe /// public const string Syringe = "\U0001F489"; /// /// Gets the "Taco" emoji. 🌮 /// /// /// Lookup: taco /// public const string Taco = "\U0001F32E"; /// /// Gets the "Takeout box" emoji. 🥡 /// /// /// Lookup: takeout_box /// public const string TakeoutBox = "\U0001F961"; /// /// Gets the "Tamale" emoji. 🫔 /// /// /// Lookup: tamale /// public const string Tamale = "\U0001FAD4"; /// /// Gets the "Tanabata tree" emoji. 🎋 /// /// /// Lookup: tanabata_tree /// public const string TanabataTree = "\U0001F38B"; /// /// Gets the "Tangerine" emoji. 🍊 /// /// /// Lookup: tangerine /// public const string Tangerine = "\U0001F34A"; /// /// Gets the "Taurus" emoji. ♉ /// /// /// Lookup: taurus /// public const string Taurus = "\U00002649"; /// /// Gets the "Taxi" emoji. 🚕 /// /// /// Lookup: taxi /// public const string Taxi = "\U0001F695"; /// /// Gets the "Teacup without handle" emoji. 🍵 /// /// /// Lookup: teacup_without_handle /// public const string TeacupWithoutHandle = "\U0001F375"; /// /// Gets the "Teapot" emoji. 🫖 /// /// /// Lookup: teapot /// public const string Teapot = "\U0001FAD6"; /// /// Gets the "Tear-off calendar" emoji. 📆 /// /// /// Lookup: tear_off_calendar /// public const string TearOffCalendar = "\U0001F4C6"; /// /// Gets the "Teddy bear" emoji. 🧸 /// /// /// Lookup: teddy_bear /// public const string TeddyBear = "\U0001F9F8"; /// /// Gets the "Telephone" emoji. ☎ /// /// /// Lookup: telephone /// public const string Telephone = "\U0000260E"; /// /// Gets the "Telephone receiver" emoji. 📞 /// /// /// Lookup: telephone_receiver /// public const string TelephoneReceiver = "\U0001F4DE"; /// /// Gets the "Telescope" emoji. 🔭 /// /// /// Lookup: telescope /// public const string Telescope = "\U0001F52D"; /// /// Gets the "Television" emoji. 📺 /// /// /// Lookup: television /// public const string Television = "\U0001F4FA"; /// /// Gets the "Tennis" emoji. 🎾 /// /// /// Lookup: tennis /// public const string Tennis = "\U0001F3BE"; /// /// Gets the "Ten o’clock" emoji. 🕙 /// /// /// Lookup: ten_o_clock /// public const string TenOClock = "\U0001F559"; /// /// Gets the "Tent" emoji. ⛺ /// /// /// Lookup: tent /// public const string Tent = "\U000026FA"; /// /// Gets the "Ten-thirty" emoji. 🕥 /// /// /// Lookup: ten_thirty /// public const string TenThirty = "\U0001F565"; /// /// Gets the "Test tube" emoji. 🧪 /// /// /// Lookup: test_tube /// public const string TestTube = "\U0001F9EA"; /// /// Gets the "Thermometer" emoji. 🌡 /// /// /// Lookup: thermometer /// public const string Thermometer = "\U0001F321"; /// /// Gets the "Thinking face" emoji. 🤔 /// /// /// Lookup: thinking_face /// public const string ThinkingFace = "\U0001F914"; /// /// Gets the "3rd place medal" emoji. 🥉 /// /// /// Lookup: 3rd_place_medal /// public const string ThirdPlaceMedal = "\U0001F949"; /// /// Gets the "Thong sandal" emoji. 🩴 /// /// /// Lookup: thong_sandal /// public const string ThongSandal = "\U0001FA74"; /// /// Gets the "Thought balloon" emoji. 💭 /// /// /// Lookup: thought_balloon /// public const string ThoughtBalloon = "\U0001F4AD"; /// /// Gets the "Thread" emoji. 🧵 /// /// /// Lookup: thread /// public const string Thread = "\U0001F9F5"; /// /// Gets the "Three o’clock" emoji. 🕒 /// /// /// Lookup: three_o_clock /// public const string ThreeOClock = "\U0001F552"; /// /// Gets the "Three-thirty" emoji. 🕞 /// /// /// Lookup: three_thirty /// public const string ThreeThirty = "\U0001F55E"; /// /// Gets the "Thumbs down" emoji. 👎 /// /// /// Lookup: thumbs_down /// public const string ThumbsDown = "\U0001F44E"; /// /// Gets the "Thumbs up" emoji. 👍 /// /// /// Lookup: thumbs_up /// public const string ThumbsUp = "\U0001F44D"; /// /// Gets the "Ticket" emoji. 🎫 /// /// /// Lookup: ticket /// public const string Ticket = "\U0001F3AB"; /// /// Gets the "Tiger" emoji. 🐅 /// /// /// Lookup: tiger /// public const string Tiger = "\U0001F405"; /// /// Gets the "Tiger face" emoji. 🐯 /// /// /// Lookup: tiger_face /// public const string TigerFace = "\U0001F42F"; /// /// Gets the "Timer clock" emoji. ⏲ /// /// /// Lookup: timer_clock /// public const string TimerClock = "\U000023F2"; /// /// Gets the "Tired face" emoji. 😫 /// /// /// Lookup: tired_face /// public const string TiredFace = "\U0001F62B"; /// /// Gets the "Toilet" emoji. 🚽 /// /// /// Lookup: toilet /// public const string Toilet = "\U0001F6BD"; /// /// Gets the "Tokyo tower" emoji. 🗼 /// /// /// Lookup: tokyo_tower /// public const string TokyoTower = "\U0001F5FC"; /// /// Gets the "Tomato" emoji. 🍅 /// /// /// Lookup: tomato /// public const string Tomato = "\U0001F345"; /// /// Gets the "Tongue" emoji. 👅 /// /// /// Lookup: tongue /// public const string Tongue = "\U0001F445"; /// /// Gets the "Toolbox" emoji. 🧰 /// /// /// Lookup: toolbox /// public const string Toolbox = "\U0001F9F0"; /// /// Gets the "Tooth" emoji. 🦷 /// /// /// Lookup: tooth /// public const string Tooth = "\U0001F9B7"; /// /// Gets the "Toothbrush" emoji. 🪥 /// /// /// Lookup: toothbrush /// public const string Toothbrush = "\U0001FAA5"; /// /// Gets the "TOP arrow" emoji. 🔝 /// /// /// Lookup: top_arrow /// public const string TopArrow = "\U0001F51D"; /// /// Gets the "Top hat" emoji. 🎩 /// /// /// Lookup: top_hat /// public const string TopHat = "\U0001F3A9"; /// /// Gets the "Tornado" emoji. 🌪 /// /// /// Lookup: tornado /// public const string Tornado = "\U0001F32A"; /// /// Gets the "Trackball" emoji. 🖲 /// /// /// Lookup: trackball /// public const string Trackball = "\U0001F5B2"; /// /// Gets the "Tractor" emoji. 🚜 /// /// /// Lookup: tractor /// public const string Tractor = "\U0001F69C"; /// /// Gets the "Trade mark" emoji. ™ /// /// /// Lookup: trade_mark /// public const string TradeMark = "\U00002122"; /// /// Gets the "Train" emoji. 🚆 /// /// /// Lookup: train /// public const string Train = "\U0001F686"; /// /// Gets the "Tram" emoji. 🚊 /// /// /// Lookup: tram /// public const string Tram = "\U0001F68A"; /// /// Gets the "Tram car" emoji. 🚋 /// /// /// Lookup: tram_car /// public const string TramCar = "\U0001F68B"; /// /// Gets the "Transgender symbol" emoji. ⚧ /// /// /// Lookup: transgender_symbol /// public const string TransgenderSymbol = "\U000026A7"; /// /// Gets the "Treasure chest" emoji. 🪎 /// /// /// Lookup: treasure_chest /// public const string TreasureChest = "\U0001FA8E"; /// /// Gets the "T-Rex" emoji. 🦖 /// /// /// Lookup: t_rex /// public const string TRex = "\U0001F996"; /// /// Gets the "Triangular flag" emoji. 🚩 /// /// /// Lookup: triangular_flag /// public const string TriangularFlag = "\U0001F6A9"; /// /// Gets the "Triangular ruler" emoji. 📐 /// /// /// Lookup: triangular_ruler /// public const string TriangularRuler = "\U0001F4D0"; /// /// Gets the "Trident emblem" emoji. 🔱 /// /// /// Lookup: trident_emblem /// public const string TridentEmblem = "\U0001F531"; /// /// Gets the "Troll" emoji. 🧌 /// /// /// Lookup: troll /// public const string Troll = "\U0001F9CC"; /// /// Gets the "Trolleybus" emoji. 🚎 /// /// /// Lookup: trolleybus /// public const string Trolleybus = "\U0001F68E"; /// /// Gets the "Trombone" emoji. 🪊 /// /// /// Lookup: trombone /// public const string Trombone = "\U0001FA8A"; /// /// Gets the "Trophy" emoji. 🏆 /// /// /// Lookup: trophy /// public const string Trophy = "\U0001F3C6"; /// /// Gets the "Tropical drink" emoji. 🍹 /// /// /// Lookup: tropical_drink /// public const string TropicalDrink = "\U0001F379"; /// /// Gets the "Tropical fish" emoji. 🐠 /// /// /// Lookup: tropical_fish /// public const string TropicalFish = "\U0001F420"; /// /// Gets the "Trumpet" emoji. 🎺 /// /// /// Lookup: trumpet /// public const string Trumpet = "\U0001F3BA"; /// /// Gets the "T-shirt" emoji. 👕 /// /// /// Lookup: t_shirt /// public const string TShirt = "\U0001F455"; /// /// Gets the "Tulip" emoji. 🌷 /// /// /// Lookup: tulip /// public const string Tulip = "\U0001F337"; /// /// Gets the "Tumbler glass" emoji. 🥃 /// /// /// Lookup: tumbler_glass /// public const string TumblerGlass = "\U0001F943"; /// /// Gets the "Turkey" emoji. 🦃 /// /// /// Lookup: turkey /// public const string Turkey = "\U0001F983"; /// /// Gets the "Turtle" emoji. 🐢 /// /// /// Lookup: turtle /// public const string Turtle = "\U0001F422"; /// /// Gets the "Twelve o’clock" emoji. 🕛 /// /// /// Lookup: twelve_o_clock /// public const string TwelveOClock = "\U0001F55B"; /// /// Gets the "Twelve-thirty" emoji. 🕧 /// /// /// Lookup: twelve_thirty /// public const string TwelveThirty = "\U0001F567"; /// /// Gets the "Two hearts" emoji. 💕 /// /// /// Lookup: two_hearts /// public const string TwoHearts = "\U0001F495"; /// /// Gets the "Two-hump camel" emoji. 🐫 /// /// /// Lookup: two_hump_camel /// public const string TwoHumpCamel = "\U0001F42B"; /// /// Gets the "Two o’clock" emoji. 🕑 /// /// /// Lookup: two_o_clock /// public const string TwoOClock = "\U0001F551"; /// /// Gets the "Two-thirty" emoji. 🕝 /// /// /// Lookup: two_thirty /// public const string TwoThirty = "\U0001F55D"; /// /// Gets the "Umbrella" emoji. ☂ /// /// /// Lookup: umbrella /// public const string Umbrella = "\U00002602"; /// /// Gets the "Umbrella on ground" emoji. ⛱ /// /// /// Lookup: umbrella_on_ground /// public const string UmbrellaOnGround = "\U000026F1"; /// /// Gets the "Umbrella with rain drops" emoji. ☔ /// /// /// Lookup: umbrella_with_rain_drops /// public const string UmbrellaWithRainDrops = "\U00002614"; /// /// Gets the "Unamused face" emoji. 😒 /// /// /// Lookup: unamused_face /// public const string UnamusedFace = "\U0001F612"; /// /// Gets the "Unicorn" emoji. 🦄 /// /// /// Lookup: unicorn /// public const string Unicorn = "\U0001F984"; /// /// Gets the "Unlocked" emoji. 🔓 /// /// /// Lookup: unlocked /// public const string Unlocked = "\U0001F513"; /// /// Gets the "Up arrow" emoji. ⬆ /// /// /// Lookup: up_arrow /// public const string UpArrow = "\U00002B06"; /// /// Gets the "UP! button" emoji. 🆙 /// /// /// Lookup: up_button /// public const string UpButton = "\U0001F199"; /// /// Gets the "Up-down arrow" emoji. ↕ /// /// /// Lookup: up_down_arrow /// public const string UpDownArrow = "\U00002195"; /// /// Gets the "Up-left arrow" emoji. ↖ /// /// /// Lookup: up_left_arrow /// public const string UpLeftArrow = "\U00002196"; /// /// Gets the "Up-right arrow" emoji. ↗ /// /// /// Lookup: up_right_arrow /// public const string UpRightArrow = "\U00002197"; /// /// Gets the "Upside-down face" emoji. 🙃 /// /// /// Lookup: upside_down_face /// public const string UpsideDownFace = "\U0001F643"; /// /// Gets the "Upwards button" emoji. 🔼 /// /// /// Lookup: upwards_button /// public const string UpwardsButton = "\U0001F53C"; /// /// Gets the "Vampire" emoji. 🧛 /// /// /// Lookup: vampire /// public const string Vampire = "\U0001F9DB"; /// /// Gets the "Vertical traffic light" emoji. 🚦 /// /// /// Lookup: vertical_traffic_light /// public const string VerticalTrafficLight = "\U0001F6A6"; /// /// Gets the "Vibration mode" emoji. 📳 /// /// /// Lookup: vibration_mode /// public const string VibrationMode = "\U0001F4F3"; /// /// Gets the "Victory hand" emoji. ✌ /// /// /// Lookup: victory_hand /// public const string VictoryHand = "\U0000270C"; /// /// Gets the "Video camera" emoji. 📹 /// /// /// Lookup: video_camera /// public const string VideoCamera = "\U0001F4F9"; /// /// Gets the "Videocassette" emoji. 📼 /// /// /// Lookup: videocassette /// public const string Videocassette = "\U0001F4FC"; /// /// Gets the "Video game" emoji. 🎮 /// /// /// Lookup: video_game /// public const string VideoGame = "\U0001F3AE"; /// /// Gets the "Violin" emoji. 🎻 /// /// /// Lookup: violin /// public const string Violin = "\U0001F3BB"; /// /// Gets the "Virgo" emoji. ♍ /// /// /// Lookup: virgo /// public const string Virgo = "\U0000264D"; /// /// Gets the "Volcano" emoji. 🌋 /// /// /// Lookup: volcano /// public const string Volcano = "\U0001F30B"; /// /// Gets the "Volleyball" emoji. 🏐 /// /// /// Lookup: volleyball /// public const string Volleyball = "\U0001F3D0"; /// /// Gets the "VS button" emoji. 🆚 /// /// /// Lookup: vs_button /// public const string VsButton = "\U0001F19A"; /// /// Gets the "Vulcan salute" emoji. 🖖 /// /// /// Lookup: vulcan_salute /// public const string VulcanSalute = "\U0001F596"; /// /// Gets the "Waffle" emoji. 🧇 /// /// /// Lookup: waffle /// public const string Waffle = "\U0001F9C7"; /// /// Gets the "Waning crescent moon" emoji. 🌘 /// /// /// Lookup: waning_crescent_moon /// public const string WaningCrescentMoon = "\U0001F318"; /// /// Gets the "Waning gibbous moon" emoji. 🌖 /// /// /// Lookup: waning_gibbous_moon /// public const string WaningGibbousMoon = "\U0001F316"; /// /// Gets the "Warning" emoji. ⚠ /// /// /// Lookup: warning /// public const string Warning = "\U000026A0"; /// /// Gets the "Wastebasket" emoji. 🗑 /// /// /// Lookup: wastebasket /// public const string Wastebasket = "\U0001F5D1"; /// /// Gets the "Watch" emoji. ⌚ /// /// /// Lookup: watch /// public const string Watch = "\U0000231A"; /// /// Gets the "Water buffalo" emoji. 🐃 /// /// /// Lookup: water_buffalo /// public const string WaterBuffalo = "\U0001F403"; /// /// Gets the "Water closet" emoji. 🚾 /// /// /// Lookup: water_closet /// public const string WaterCloset = "\U0001F6BE"; /// /// Gets the "Watermelon" emoji. 🍉 /// /// /// Lookup: watermelon /// public const string Watermelon = "\U0001F349"; /// /// Gets the "Water pistol" emoji. 🔫 /// /// /// Lookup: water_pistol /// public const string WaterPistol = "\U0001F52B"; /// /// Gets the "Water wave" emoji. 🌊 /// /// /// Lookup: water_wave /// public const string WaterWave = "\U0001F30A"; /// /// Gets the "Waving hand" emoji. 👋 /// /// /// Lookup: waving_hand /// public const string WavingHand = "\U0001F44B"; /// /// Gets the "Wavy dash" emoji. 〰 /// /// /// Lookup: wavy_dash /// public const string WavyDash = "\U00003030"; /// /// Gets the "Waxing crescent moon" emoji. 🌒 /// /// /// Lookup: waxing_crescent_moon /// public const string WaxingCrescentMoon = "\U0001F312"; /// /// Gets the "Waxing gibbous moon" emoji. 🌔 /// /// /// Lookup: waxing_gibbous_moon /// public const string WaxingGibbousMoon = "\U0001F314"; /// /// Gets the "Weary cat" emoji. 🙀 /// /// /// Lookup: weary_cat /// public const string WearyCat = "\U0001F640"; /// /// Gets the "Weary face" emoji. 😩 /// /// /// Lookup: weary_face /// public const string WearyFace = "\U0001F629"; /// /// Gets the "Wedding" emoji. 💒 /// /// /// Lookup: wedding /// public const string Wedding = "\U0001F492"; /// /// Gets the "Whale" emoji. 🐋 /// /// /// Lookup: whale /// public const string Whale = "\U0001F40B"; /// /// Gets the "Wheel" emoji. 🛞 /// /// /// Lookup: wheel /// public const string Wheel = "\U0001F6DE"; /// /// Gets the "Wheelchair symbol" emoji. ♿ /// /// /// Lookup: wheelchair_symbol /// public const string WheelchairSymbol = "\U0000267F"; /// /// Gets the "Wheel of dharma" emoji. ☸ /// /// /// Lookup: wheel_of_dharma /// public const string WheelOfDharma = "\U00002638"; /// /// Gets the "White cane" emoji. 🦯 /// /// /// Lookup: white_cane /// public const string WhiteCane = "\U0001F9AF"; /// /// Gets the "White circle" emoji. ⚪ /// /// /// Lookup: white_circle /// public const string WhiteCircle = "\U000026AA"; /// /// Gets the "White exclamation mark" emoji. ❕ /// /// /// Lookup: white_exclamation_mark /// public const string WhiteExclamationMark = "\U00002755"; /// /// Gets the "White flag" emoji. 🏳 /// /// /// Lookup: white_flag /// public const string WhiteFlag = "\U0001F3F3"; /// /// Gets the "White flower" emoji. 💮 /// /// /// Lookup: white_flower /// public const string WhiteFlower = "\U0001F4AE"; /// /// Gets the "White hair" emoji. 🦳 /// /// /// Lookup: white_hair /// public const string WhiteHair = "\U0001F9B3"; /// /// Gets the "White heart" emoji. 🤍 /// /// /// Lookup: white_heart /// public const string WhiteHeart = "\U0001F90D"; /// /// Gets the "White large square" emoji. ⬜ /// /// /// Lookup: white_large_square /// public const string WhiteLargeSquare = "\U00002B1C"; /// /// Gets the "White medium-small square" emoji. ◽ /// /// /// Lookup: white_medium_small_square /// public const string WhiteMediumSmallSquare = "\U000025FD"; /// /// Gets the "White medium square" emoji. ◻ /// /// /// Lookup: white_medium_square /// public const string WhiteMediumSquare = "\U000025FB"; /// /// Gets the "White question mark" emoji. ❔ /// /// /// Lookup: white_question_mark /// public const string WhiteQuestionMark = "\U00002754"; /// /// Gets the "White small square" emoji. ▫ /// /// /// Lookup: white_small_square /// public const string WhiteSmallSquare = "\U000025AB"; /// /// Gets the "White square button" emoji. 🔳 /// /// /// Lookup: white_square_button /// public const string WhiteSquareButton = "\U0001F533"; /// /// Gets the "Wilted flower" emoji. 🥀 /// /// /// Lookup: wilted_flower /// public const string WiltedFlower = "\U0001F940"; /// /// Gets the "Wind chime" emoji. 🎐 /// /// /// Lookup: wind_chime /// public const string WindChime = "\U0001F390"; /// /// Gets the "Wind face" emoji. 🌬 /// /// /// Lookup: wind_face /// public const string WindFace = "\U0001F32C"; /// /// Gets the "Window" emoji. 🪟 /// /// /// Lookup: window /// public const string Window = "\U0001FA9F"; /// /// Gets the "Wine glass" emoji. 🍷 /// /// /// Lookup: wine_glass /// public const string WineGlass = "\U0001F377"; /// /// Gets the "Wing" emoji. 🪽 /// /// /// Lookup: wing /// public const string Wing = "\U0001FABD"; /// /// Gets the "Winking face" emoji. 😉 /// /// /// Lookup: winking_face /// public const string WinkingFace = "\U0001F609"; /// /// Gets the "Winking face with tongue" emoji. 😜 /// /// /// Lookup: winking_face_with_tongue /// public const string WinkingFaceWithTongue = "\U0001F61C"; /// /// Gets the "Wireless" emoji. 🛜 /// /// /// Lookup: wireless /// public const string Wireless = "\U0001F6DC"; /// /// Gets the "Wolf" emoji. 🐺 /// /// /// Lookup: wolf /// public const string Wolf = "\U0001F43A"; /// /// Gets the "Woman" emoji. 👩 /// /// /// Lookup: woman /// public const string Woman = "\U0001F469"; /// /// Gets the "Woman and man holding hands" emoji. 👫 /// /// /// Lookup: woman_and_man_holding_hands /// public const string WomanAndManHoldingHands = "\U0001F46B"; /// /// Gets the "Woman dancing" emoji. 💃 /// /// /// Lookup: woman_dancing /// public const string WomanDancing = "\U0001F483"; /// /// Gets the "Woman’s boot" emoji. 👢 /// /// /// Lookup: womans_boot /// public const string WomansBoot = "\U0001F462"; /// /// Gets the "Woman’s clothes" emoji. 👚 /// /// /// Lookup: womans_clothes /// public const string WomansClothes = "\U0001F45A"; /// /// Gets the "Woman’s hat" emoji. 👒 /// /// /// Lookup: womans_hat /// public const string WomansHat = "\U0001F452"; /// /// Gets the "Woman’s sandal" emoji. 👡 /// /// /// Lookup: womans_sandal /// public const string WomansSandal = "\U0001F461"; /// /// Gets the "Woman with headscarf" emoji. 🧕 /// /// /// Lookup: woman_with_headscarf /// public const string WomanWithHeadscarf = "\U0001F9D5"; /// /// Gets the "Women holding hands" emoji. 👭 /// /// /// Lookup: women_holding_hands /// public const string WomenHoldingHands = "\U0001F46D"; /// /// Gets the "Women’s room" emoji. 🚺 /// /// /// Lookup: womens_room /// public const string WomensRoom = "\U0001F6BA"; /// /// Gets the "Wood" emoji. 🪵 /// /// /// Lookup: wood /// public const string Wood = "\U0001FAB5"; /// /// Gets the "Woozy face" emoji. 🥴 /// /// /// Lookup: woozy_face /// public const string WoozyFace = "\U0001F974"; /// /// Gets the "World map" emoji. 🗺 /// /// /// Lookup: world_map /// public const string WorldMap = "\U0001F5FA"; /// /// Gets the "Worm" emoji. 🪱 /// /// /// Lookup: worm /// public const string Worm = "\U0001FAB1"; /// /// Gets the "Worried face" emoji. 😟 /// /// /// Lookup: worried_face /// public const string WorriedFace = "\U0001F61F"; /// /// Gets the "Wrapped gift" emoji. 🎁 /// /// /// Lookup: wrapped_gift /// public const string WrappedGift = "\U0001F381"; /// /// Gets the "Wrench" emoji. 🔧 /// /// /// Lookup: wrench /// public const string Wrench = "\U0001F527"; /// /// Gets the "Writing hand" emoji. ✍ /// /// /// Lookup: writing_hand /// public const string WritingHand = "\U0000270D"; /// /// Gets the "X-ray" emoji. 🩻 /// /// /// Lookup: x_ray /// public const string XRay = "\U0001FA7B"; /// /// Gets the "Yarn" emoji. 🧶 /// /// /// Lookup: yarn /// public const string Yarn = "\U0001F9F6"; /// /// Gets the "Yawning face" emoji. 🥱 /// /// /// Lookup: yawning_face /// public const string YawningFace = "\U0001F971"; /// /// Gets the "Yellow circle" emoji. 🟡 /// /// /// Lookup: yellow_circle /// public const string YellowCircle = "\U0001F7E1"; /// /// Gets the "Yellow heart" emoji. 💛 /// /// /// Lookup: yellow_heart /// public const string YellowHeart = "\U0001F49B"; /// /// Gets the "Yellow square" emoji. 🟨 /// /// /// Lookup: yellow_square /// public const string YellowSquare = "\U0001F7E8"; /// /// Gets the "Yen banknote" emoji. 💴 /// /// /// Lookup: yen_banknote /// public const string YenBanknote = "\U0001F4B4"; /// /// Gets the "Yin yang" emoji. ☯ /// /// /// Lookup: yin_yang /// public const string YinYang = "\U0000262F"; /// /// Gets the "Yo-yo" emoji. 🪀 /// /// /// Lookup: yo_yo /// public const string YoYo = "\U0001FA80"; /// /// Gets the "Zany face" emoji. 🤪 /// /// /// Lookup: zany_face /// public const string ZanyFace = "\U0001F92A"; /// /// Gets the "Zebra" emoji. 🦓 /// /// /// Lookup: zebra /// public const string Zebra = "\U0001F993"; /// /// Gets the "Zipper-mouth face" emoji. 🤐 /// /// /// Lookup: zipper_mouth_face /// public const string ZipperMouthFace = "\U0001F910"; /// /// Gets the "Zombie" emoji. 🧟 /// /// /// Lookup: zombie /// public const string Zombie = "\U0001F9DF"; /// /// Gets the "ZZZ" emoji. 💤 /// /// /// Lookup: zzz /// public const string Zzz = "\U0001F4A4"; /// /// Gets the "Hugging face" emoji. /// /// /// Lookup: hugging_face
/// This is a legacy alias for . ///
public const string HuggingFace = SmilingFaceWithOpenHands; /// /// Gets the "Knocked-out face" emoji. /// /// /// Lookup: knocked_out_face
/// This is a legacy alias for . ///
public const string KnockedOutFace = FaceWithCrossedOutEyes; /// /// Gets the "Pouting face" emoji. /// /// /// Lookup: pouting_face
/// This is a legacy alias for . ///
public const string PoutingFace = EnragedFace; } } } ================================================ FILE: src/Spectre.Console/Generated/Spectre.Console.SourceGenerator/Spectre.Console.SourceGenerator.Spinners.SpinnerGenerator/Spinner.Generated.g.cs ================================================ //------------------------------------------------------------------------------ // // This code was generated by a tool. // // Partly generated from // https://github.com/sindresorhus/cli-spinners/blob/master/spinners.json // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. // //------------------------------------------------------------------------------ using System; using System.Collections.Generic; namespace Spectre.Console { public abstract partial class Spinner { private sealed class DefaultSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⣷", "⣯", "⣟", "⡿", "⢿", "⣻", "⣽", "⣾", }; } private sealed class AsciiSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "-", "\\", "|", "/", "-", "\\", "|", "/", }; } private sealed class DotsSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏", }; } private sealed class Dots2Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⣾", "⣽", "⣻", "⢿", "⡿", "⣟", "⣯", "⣷", }; } private sealed class Dots3Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠋", "⠙", "⠚", "⠞", "⠖", "⠦", "⠴", "⠲", "⠳", "⠓", }; } private sealed class Dots4Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠄", "⠆", "⠇", "⠋", "⠙", "⠸", "⠰", "⠠", "⠰", "⠸", "⠙", "⠋", "⠇", "⠆", }; } private sealed class Dots5Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠋", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋", }; } private sealed class Dots6Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠁", "⠉", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠤", "⠄", "⠄", "⠤", "⠴", "⠲", "⠒", "⠂", "⠂", "⠒", "⠚", "⠙", "⠉", "⠁", }; } private sealed class Dots7Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠈", "⠉", "⠋", "⠓", "⠒", "⠐", "⠐", "⠒", "⠖", "⠦", "⠤", "⠠", "⠠", "⠤", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋", "⠉", "⠈", }; } private sealed class Dots8Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠁", "⠁", "⠉", "⠙", "⠚", "⠒", "⠂", "⠂", "⠒", "⠲", "⠴", "⠤", "⠄", "⠄", "⠤", "⠠", "⠠", "⠤", "⠦", "⠖", "⠒", "⠐", "⠐", "⠒", "⠓", "⠋", "⠉", "⠈", "⠈", }; } private sealed class Dots9Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⢹", "⢺", "⢼", "⣸", "⣇", "⡧", "⡗", "⡏", }; } private sealed class Dots10Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⢄", "⢂", "⢁", "⡁", "⡈", "⡐", "⡠", }; } private sealed class Dots11Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠁", "⠂", "⠄", "⡀", "⢀", "⠠", "⠐", "⠈", }; } private sealed class Dots12Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⢀⠀", "⡀⠀", "⠄⠀", "⢂⠀", "⡂⠀", "⠅⠀", "⢃⠀", "⡃⠀", "⠍⠀", "⢋⠀", "⡋⠀", "⠍⠁", "⢋⠁", "⡋⠁", "⠍⠉", "⠋⠉", "⠋⠉", "⠉⠙", "⠉⠙", "⠉⠩", "⠈⢙", "⠈⡙", "⢈⠩", "⡀⢙", "⠄⡙", "⢂⠩", "⡂⢘", "⠅⡘", "⢃⠨", "⡃⢐", "⠍⡐", "⢋⠠", "⡋⢀", "⠍⡁", "⢋⠁", "⡋⠁", "⠍⠉", "⠋⠉", "⠋⠉", "⠉⠙", "⠉⠙", "⠉⠩", "⠈⢙", "⠈⡙", "⠈⠩", "⠀⢙", "⠀⡙", "⠀⠩", "⠀⢘", "⠀⡘", "⠀⠨", "⠀⢐", "⠀⡐", "⠀⠠", "⠀⢀", "⠀⡀", }; } private sealed class Dots13Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⣼", "⣹", "⢻", "⠿", "⡟", "⣏", "⣧", "⣶", }; } private sealed class Dots14Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠉⠉", "⠈⠙", "⠀⠹", "⠀⢸", "⠀⣰", "⢀⣠", "⣀⣀", "⣄⡀", "⣆⠀", "⡇⠀", "⠏⠀", "⠋⠁", }; } private sealed class Dots8BitSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠀", "⠁", "⠂", "⠃", "⠄", "⠅", "⠆", "⠇", "⡀", "⡁", "⡂", "⡃", "⡄", "⡅", "⡆", "⡇", "⠈", "⠉", "⠊", "⠋", "⠌", "⠍", "⠎", "⠏", "⡈", "⡉", "⡊", "⡋", "⡌", "⡍", "⡎", "⡏", "⠐", "⠑", "⠒", "⠓", "⠔", "⠕", "⠖", "⠗", "⡐", "⡑", "⡒", "⡓", "⡔", "⡕", "⡖", "⡗", "⠘", "⠙", "⠚", "⠛", "⠜", "⠝", "⠞", "⠟", "⡘", "⡙", "⡚", "⡛", "⡜", "⡝", "⡞", "⡟", "⠠", "⠡", "⠢", "⠣", "⠤", "⠥", "⠦", "⠧", "⡠", "⡡", "⡢", "⡣", "⡤", "⡥", "⡦", "⡧", "⠨", "⠩", "⠪", "⠫", "⠬", "⠭", "⠮", "⠯", "⡨", "⡩", "⡪", "⡫", "⡬", "⡭", "⡮", "⡯", "⠰", "⠱", "⠲", "⠳", "⠴", "⠵", "⠶", "⠷", "⡰", "⡱", "⡲", "⡳", "⡴", "⡵", "⡶", "⡷", "⠸", "⠹", "⠺", "⠻", "⠼", "⠽", "⠾", "⠿", "⡸", "⡹", "⡺", "⡻", "⡼", "⡽", "⡾", "⡿", "⢀", "⢁", "⢂", "⢃", "⢄", "⢅", "⢆", "⢇", "⣀", "⣁", "⣂", "⣃", "⣄", "⣅", "⣆", "⣇", "⢈", "⢉", "⢊", "⢋", "⢌", "⢍", "⢎", "⢏", "⣈", "⣉", "⣊", "⣋", "⣌", "⣍", "⣎", "⣏", "⢐", "⢑", "⢒", "⢓", "⢔", "⢕", "⢖", "⢗", "⣐", "⣑", "⣒", "⣓", "⣔", "⣕", "⣖", "⣗", "⢘", "⢙", "⢚", "⢛", "⢜", "⢝", "⢞", "⢟", "⣘", "⣙", "⣚", "⣛", "⣜", "⣝", "⣞", "⣟", "⢠", "⢡", "⢢", "⢣", "⢤", "⢥", "⢦", "⢧", "⣠", "⣡", "⣢", "⣣", "⣤", "⣥", "⣦", "⣧", "⢨", "⢩", "⢪", "⢫", "⢬", "⢭", "⢮", "⢯", "⣨", "⣩", "⣪", "⣫", "⣬", "⣭", "⣮", "⣯", "⢰", "⢱", "⢲", "⢳", "⢴", "⢵", "⢶", "⢷", "⣰", "⣱", "⣲", "⣳", "⣴", "⣵", "⣶", "⣷", "⢸", "⢹", "⢺", "⢻", "⢼", "⢽", "⢾", "⢿", "⣸", "⣹", "⣺", "⣻", "⣼", "⣽", "⣾", "⣿", }; } private sealed class DotsCircleSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⢎ ", "⠎⠁", "⠊⠑", "⠈⠱", " ⡱", "⢀⡰", "⢄⡠", "⢆⡀", }; } private sealed class SandSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠁", "⠂", "⠄", "⡀", "⡈", "⡐", "⡠", "⣀", "⣁", "⣂", "⣄", "⣌", "⣔", "⣤", "⣥", "⣦", "⣮", "⣶", "⣷", "⣿", "⡿", "⠿", "⢟", "⠟", "⡛", "⠛", "⠫", "⢋", "⠋", "⠍", "⡉", "⠉", "⠑", "⠡", "⢁", }; } private sealed class LineSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(130); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { "-", "\\", "|", "/", }; } private sealed class Line2Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { "⠂", "-", "–", "—", "–", "-", }; } private sealed class PipeSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { "┤", "┘", "┴", "└", "├", "┌", "┬", "┐", }; } private sealed class SimpleDotsSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(400); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { ". ", ".. ", "...", " ", }; } private sealed class SimpleDotsScrollingSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(200); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { ". ", ".. ", "...", " ..", " .", " ", }; } private sealed class StarSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(70); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "✶", "✸", "✹", "✺", "✹", "✷", }; } private sealed class Star2Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { "+", "x", "*", }; } private sealed class FlipSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(70); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { "_", "_", "_", "-", "`", "`", "'", "´", "-", "_", "_", "_", }; } private sealed class HamburgerSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "☱", "☲", "☴", }; } private sealed class GrowVerticalSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▁", "▃", "▄", "▅", "▆", "▇", "▆", "▅", "▄", "▃", }; } private sealed class GrowHorizontalSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▏", "▎", "▍", "▌", "▋", "▊", "▉", "▊", "▋", "▌", "▍", "▎", }; } private sealed class BalloonSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(140); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { " ", ".", "o", "O", "@", "*", " ", }; } private sealed class Balloon2Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { ".", "o", "O", "°", "O", "o", ".", }; } private sealed class NoiseSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▓", "▒", "░", }; } private sealed class BounceSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⠁", "⠂", "⠄", "⠂", }; } private sealed class BoxBounceSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▖", "▘", "▝", "▗", }; } private sealed class BoxBounce2Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▌", "▀", "▐", "▄", }; } private sealed class TriangleSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(50); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "◢", "◣", "◤", "◥", }; } private sealed class BinarySpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { "010010", "001100", "100101", "111010", "111101", "010111", "101011", "111000", "110011", "110101", }; } private sealed class ArcSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "◜", "◠", "◝", "◞", "◡", "◟", }; } private sealed class CircleSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "◡", "⊙", "◠", }; } private sealed class SquareCornersSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(180); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "◰", "◳", "◲", "◱", }; } private sealed class CircleQuartersSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "◴", "◷", "◶", "◵", }; } private sealed class CircleHalvesSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(50); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "◐", "◓", "◑", "◒", }; } private sealed class SquishSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "╫", "╪", }; } private sealed class ToggleSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(250); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⊶", "⊷", }; } private sealed class Toggle2Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▫", "▪", }; } private sealed class Toggle3Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "□", "■", }; } private sealed class Toggle4Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "■", "□", "▪", "▫", }; } private sealed class Toggle5Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▮", "▯", }; } private sealed class Toggle6Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(300); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "ဝ", "၀", }; } private sealed class Toggle7Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⦾", "⦿", }; } private sealed class Toggle8Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "◍", "◌", }; } private sealed class Toggle9Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "◉", "◎", }; } private sealed class Toggle10Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "㊂", "㊀", "㊁", }; } private sealed class Toggle11Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(50); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⧇", "⧆", }; } private sealed class Toggle12Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "☗", "☖", }; } private sealed class Toggle13Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { "=", "*", "-", }; } private sealed class ArrowSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "←", "↖", "↑", "↗", "→", "↘", "↓", "↙", }; } private sealed class Arrow2Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "⬆️ ", "↗️ ", "➡️ ", "↘️ ", "⬇️ ", "↙️ ", "⬅️ ", "↖️ ", }; } private sealed class Arrow3Spinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▹▹▹▹▹", "▸▹▹▹▹", "▹▸▹▹▹", "▹▹▸▹▹", "▹▹▹▸▹", "▹▹▹▹▸", }; } private sealed class BouncingBarSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "[ ]", "[= ]", "[== ]", "[=== ]", "[====]", "[ ===]", "[ ==]", "[ =]", "[ ]", "[ =]", "[ ==]", "[ ===]", "[====]", "[=== ]", "[== ]", "[= ]", }; } private sealed class BouncingBallSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "( ● )", "( ● )", "( ● )", "( ● )", "( ●)", "( ● )", "( ● )", "( ● )", "( ● )", "(● )", }; } private sealed class SmileySpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(200); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "😄 ", "😝 ", }; } private sealed class MonkeySpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(300); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🙈 ", "🙈 ", "🙉 ", "🙊 ", }; } private sealed class HeartsSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "💛 ", "💙 ", "💜 ", "💚 ", "❤️ ", }; } private sealed class ClockSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🕛 ", "🕐 ", "🕑 ", "🕒 ", "🕓 ", "🕔 ", "🕕 ", "🕖 ", "🕗 ", "🕘 ", "🕙 ", "🕚 ", }; } private sealed class EarthSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(180); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🌍 ", "🌎 ", "🌏 ", }; } private sealed class MaterialSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(17); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "██████▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "███████▁▁▁▁▁▁▁▁▁▁▁▁▁", "████████▁▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "██████████▁▁▁▁▁▁▁▁▁▁", "███████████▁▁▁▁▁▁▁▁▁", "█████████████▁▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁▁██████████████▁▁▁▁", "▁▁▁██████████████▁▁▁", "▁▁▁▁█████████████▁▁▁", "▁▁▁▁██████████████▁▁", "▁▁▁▁██████████████▁▁", "▁▁▁▁▁██████████████▁", "▁▁▁▁▁██████████████▁", "▁▁▁▁▁██████████████▁", "▁▁▁▁▁▁██████████████", "▁▁▁▁▁▁██████████████", "▁▁▁▁▁▁▁█████████████", "▁▁▁▁▁▁▁█████████████", "▁▁▁▁▁▁▁▁████████████", "▁▁▁▁▁▁▁▁████████████", "▁▁▁▁▁▁▁▁▁███████████", "▁▁▁▁▁▁▁▁▁███████████", "▁▁▁▁▁▁▁▁▁▁██████████", "▁▁▁▁▁▁▁▁▁▁██████████", "▁▁▁▁▁▁▁▁▁▁▁▁████████", "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁██████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", "█▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "██▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "███▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "████▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "█████▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "██████▁▁▁▁▁▁▁▁▁▁▁▁▁█", "████████▁▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "█████████▁▁▁▁▁▁▁▁▁▁▁", "███████████▁▁▁▁▁▁▁▁▁", "████████████▁▁▁▁▁▁▁▁", "████████████▁▁▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁", "██████████████▁▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁██████████████▁▁▁▁▁", "▁▁▁█████████████▁▁▁▁", "▁▁▁▁▁████████████▁▁▁", "▁▁▁▁▁████████████▁▁▁", "▁▁▁▁▁▁███████████▁▁▁", "▁▁▁▁▁▁▁▁█████████▁▁▁", "▁▁▁▁▁▁▁▁█████████▁▁▁", "▁▁▁▁▁▁▁▁▁█████████▁▁", "▁▁▁▁▁▁▁▁▁█████████▁▁", "▁▁▁▁▁▁▁▁▁▁█████████▁", "▁▁▁▁▁▁▁▁▁▁▁████████▁", "▁▁▁▁▁▁▁▁▁▁▁████████▁", "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", "▁▁▁▁▁▁▁▁▁▁▁▁███████▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", "▁▁▁▁▁▁▁▁▁▁▁▁▁███████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁████", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁███", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁██", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁█", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", "▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁", }; } private sealed class MoonSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🌑 ", "🌒 ", "🌓 ", "🌔 ", "🌕 ", "🌖 ", "🌗 ", "🌘 ", }; } private sealed class RunnerSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(140); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🚶 ", "🏃 ", }; } private sealed class PongSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▐⠂ ▌", "▐⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂▌", "▐ ⠠▌", "▐ ⡀▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐ ⠠ ▌", "▐ ⠂ ▌", "▐ ⠈ ▌", "▐ ⠂ ▌", "▐ ⠠ ▌", "▐ ⡀ ▌", "▐⠠ ▌", }; } private sealed class SharkSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(120); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▐|\\____________▌", "▐_|\\___________▌", "▐__|\\__________▌", "▐___|\\_________▌", "▐____|\\________▌", "▐_____|\\_______▌", "▐______|\\______▌", "▐_______|\\_____▌", "▐________|\\____▌", "▐_________|\\___▌", "▐__________|\\__▌", "▐___________|\\_▌", "▐____________|\\▌", "▐____________/|▌", "▐___________/|_▌", "▐__________/|__▌", "▐_________/|___▌", "▐________/|____▌", "▐_______/|_____▌", "▐______/|______▌", "▐_____/|_______▌", "▐____/|________▌", "▐___/|_________▌", "▐__/|__________▌", "▐_/|___________▌", "▐/|____________▌", }; } private sealed class DqpbSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => false; public override IReadOnlyList Frames => new List { "d", "q", "p", "b", }; } private sealed class WeatherSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "☀️ ", "☀️ ", "☀️ ", "🌤 ", "⛅️ ", "🌥 ", "☁️ ", "🌧 ", "🌨 ", "🌧 ", "🌨 ", "🌧 ", "🌨 ", "⛈ ", "🌨 ", "🌧 ", "🌨 ", "☁️ ", "🌥 ", "⛅️ ", "🌤 ", "☀️ ", "☀️ ", }; } private sealed class ChristmasSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(400); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🌲", "🎄", }; } private sealed class GrenadeSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "، ", "′ ", " ´ ", " ‾ ", " ⸌", " ⸊", " |", " ⁎", " ⁕", " ෴ ", " ⁓", " ", " ", " ", }; } private sealed class PointSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(125); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "∙∙∙", "●∙∙", "∙●∙", "∙∙●", "∙∙∙", }; } private sealed class LayerSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(150); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "-", "=", "≡", }; } private sealed class BetaWaveSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "ρββββββ", "βρβββββ", "ββρββββ", "βββρβββ", "ββββρββ", "βββββρβ", "ββββββρ", }; } private sealed class FingerDanceSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(160); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🤘 ", "🤟 ", "🖖 ", "✋ ", "🤚 ", "👆 ", }; } private sealed class FistBumpSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🤜    🤛 ", "🤜    🤛 ", "🤜    🤛 ", " 🤜  🤛  ", "  🤜🤛   ", " 🤜✨🤛   ", "🤜 ✨ 🤛  ", }; } private sealed class SoccerHeaderSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { " 🧑⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", "🧑 ⚽️ 🧑 ", }; } private sealed class MindblownSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(160); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "😐 ", "😐 ", "😮 ", "😮 ", "😦 ", "😦 ", "😧 ", "😧 ", "🤯 ", "💥 ", "✨ ", "  ", "  ", "  ", }; } private sealed class SpeakerSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(160); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🔈 ", "🔉 ", "🔊 ", "🔉 ", }; } private sealed class OrangePulseSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🔸 ", "🔶 ", "🟠 ", "🟠 ", "🔶 ", }; } private sealed class BluePulseSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🔹 ", "🔷 ", "🔵 ", "🔵 ", "🔷 ", }; } private sealed class OrangeBluePulseSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🔸 ", "🔶 ", "🟠 ", "🟠 ", "🔶 ", "🔹 ", "🔷 ", "🔵 ", "🔵 ", "🔷 ", }; } private sealed class TimeTravelSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(100); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "🕛 ", "🕚 ", "🕙 ", "🕘 ", "🕗 ", "🕖 ", "🕕 ", "🕔 ", "🕓 ", "🕒 ", "🕑 ", "🕐 ", }; } private sealed class AestheticSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { "▰▱▱▱▱▱▱", "▰▰▱▱▱▱▱", "▰▰▰▱▱▱▱", "▰▰▰▰▱▱▱", "▰▰▰▰▰▱▱", "▰▰▰▰▰▰▱", "▰▰▰▰▰▰▰", "▰▱▱▱▱▱▱", }; } private sealed class DwarfFortressSpinner : Spinner { public override TimeSpan Interval => TimeSpan.FromMilliseconds(80); public override bool IsUnicode => true; public override IReadOnlyList Frames => new List { " ██████£££ ", "☺██████£££ ", "☺██████£££ ", "☺▓█████£££ ", "☺▓█████£££ ", "☺▒█████£££ ", "☺▒█████£££ ", "☺░█████£££ ", "☺░█████£££ ", "☺ █████£££ ", " ☺█████£££ ", " ☺█████£££ ", " ☺▓████£££ ", " ☺▓████£££ ", " ☺▒████£££ ", " ☺▒████£££ ", " ☺░████£££ ", " ☺░████£££ ", " ☺ ████£££ ", " ☺████£££ ", " ☺████£££ ", " ☺▓███£££ ", " ☺▓███£££ ", " ☺▒███£££ ", " ☺▒███£££ ", " ☺░███£££ ", " ☺░███£££ ", " ☺ ███£££ ", " ☺███£££ ", " ☺███£££ ", " ☺▓██£££ ", " ☺▓██£££ ", " ☺▒██£££ ", " ☺▒██£££ ", " ☺░██£££ ", " ☺░██£££ ", " ☺ ██£££ ", " ☺██£££ ", " ☺██£££ ", " ☺▓█£££ ", " ☺▓█£££ ", " ☺▒█£££ ", " ☺▒█£££ ", " ☺░█£££ ", " ☺░█£££ ", " ☺ █£££ ", " ☺█£££ ", " ☺█£££ ", " ☺▓£££ ", " ☺▓£££ ", " ☺▒£££ ", " ☺▒£££ ", " ☺░£££ ", " ☺░£££ ", " ☺ £££ ", " ☺£££ ", " ☺£££ ", " ☺▓££ ", " ☺▓££ ", " ☺▒££ ", " ☺▒££ ", " ☺░££ ", " ☺░££ ", " ☺ ££ ", " ☺££ ", " ☺££ ", " ☺▓£ ", " ☺▓£ ", " ☺▒£ ", " ☺▒£ ", " ☺░£ ", " ☺░£ ", " ☺ £ ", " ☺£ ", " ☺£ ", " ☺▓ ", " ☺▓ ", " ☺▒ ", " ☺▒ ", " ☺░ ", " ☺░ ", " ☺ ", " ☺ &", " ☺ ☼&", " ☺ ☼ &", " ☺☼ &", " ☺☼ & ", " ‼ & ", " ☺ & ", " ‼ & ", " ☺ & ", " ‼ & ", " ☺ & ", "‼ & ", " & ", " & ", " & ░ ", " & ▒ ", " & ▓ ", " & £ ", " & ░£ ", " & ▒£ ", " & ▓£ ", " & ££ ", " & ░££ ", " & ▒££ ", "& ▓££ ", "& £££ ", " ░£££ ", " ▒£££ ", " ▓£££ ", " █£££ ", " ░█£££ ", " ▒█£££ ", " ▓█£££ ", " ██£££ ", " ░██£££ ", " ▒██£££ ", " ▓██£££ ", " ███£££ ", " ░███£££ ", " ▒███£££ ", " ▓███£££ ", " ████£££ ", " ░████£££ ", " ▒████£££ ", " ▓████£££ ", " █████£££ ", " ░█████£££ ", " ▒█████£££ ", " ▓█████£££ ", " ██████£££ ", " ██████£££ ", }; } /// /// Contains well-known spinners. /// public static class Known { /// /// Gets the "Default" spinner. /// public static Spinner Default { get; } = new DefaultSpinner(); /// /// Gets the "Ascii" spinner. /// public static Spinner Ascii { get; } = new AsciiSpinner(); /// /// Gets the "dots" spinner. /// public static Spinner Dots { get; } = new DotsSpinner(); /// /// Gets the "dots2" spinner. /// public static Spinner Dots2 { get; } = new Dots2Spinner(); /// /// Gets the "dots3" spinner. /// public static Spinner Dots3 { get; } = new Dots3Spinner(); /// /// Gets the "dots4" spinner. /// public static Spinner Dots4 { get; } = new Dots4Spinner(); /// /// Gets the "dots5" spinner. /// public static Spinner Dots5 { get; } = new Dots5Spinner(); /// /// Gets the "dots6" spinner. /// public static Spinner Dots6 { get; } = new Dots6Spinner(); /// /// Gets the "dots7" spinner. /// public static Spinner Dots7 { get; } = new Dots7Spinner(); /// /// Gets the "dots8" spinner. /// public static Spinner Dots8 { get; } = new Dots8Spinner(); /// /// Gets the "dots9" spinner. /// public static Spinner Dots9 { get; } = new Dots9Spinner(); /// /// Gets the "dots10" spinner. /// public static Spinner Dots10 { get; } = new Dots10Spinner(); /// /// Gets the "dots11" spinner. /// public static Spinner Dots11 { get; } = new Dots11Spinner(); /// /// Gets the "dots12" spinner. /// public static Spinner Dots12 { get; } = new Dots12Spinner(); /// /// Gets the "dots13" spinner. /// public static Spinner Dots13 { get; } = new Dots13Spinner(); /// /// Gets the "dots14" spinner. /// public static Spinner Dots14 { get; } = new Dots14Spinner(); /// /// Gets the "dots8Bit" spinner. /// public static Spinner Dots8Bit { get; } = new Dots8BitSpinner(); /// /// Gets the "dotsCircle" spinner. /// public static Spinner DotsCircle { get; } = new DotsCircleSpinner(); /// /// Gets the "sand" spinner. /// public static Spinner Sand { get; } = new SandSpinner(); /// /// Gets the "line" spinner. /// public static Spinner Line { get; } = new LineSpinner(); /// /// Gets the "line2" spinner. /// public static Spinner Line2 { get; } = new Line2Spinner(); /// /// Gets the "pipe" spinner. /// public static Spinner Pipe { get; } = new PipeSpinner(); /// /// Gets the "simpleDots" spinner. /// public static Spinner SimpleDots { get; } = new SimpleDotsSpinner(); /// /// Gets the "simpleDotsScrolling" spinner. /// public static Spinner SimpleDotsScrolling { get; } = new SimpleDotsScrollingSpinner(); /// /// Gets the "star" spinner. /// public static Spinner Star { get; } = new StarSpinner(); /// /// Gets the "star2" spinner. /// public static Spinner Star2 { get; } = new Star2Spinner(); /// /// Gets the "flip" spinner. /// public static Spinner Flip { get; } = new FlipSpinner(); /// /// Gets the "hamburger" spinner. /// public static Spinner Hamburger { get; } = new HamburgerSpinner(); /// /// Gets the "growVertical" spinner. /// public static Spinner GrowVertical { get; } = new GrowVerticalSpinner(); /// /// Gets the "growHorizontal" spinner. /// public static Spinner GrowHorizontal { get; } = new GrowHorizontalSpinner(); /// /// Gets the "balloon" spinner. /// public static Spinner Balloon { get; } = new BalloonSpinner(); /// /// Gets the "balloon2" spinner. /// public static Spinner Balloon2 { get; } = new Balloon2Spinner(); /// /// Gets the "noise" spinner. /// public static Spinner Noise { get; } = new NoiseSpinner(); /// /// Gets the "bounce" spinner. /// public static Spinner Bounce { get; } = new BounceSpinner(); /// /// Gets the "boxBounce" spinner. /// public static Spinner BoxBounce { get; } = new BoxBounceSpinner(); /// /// Gets the "boxBounce2" spinner. /// public static Spinner BoxBounce2 { get; } = new BoxBounce2Spinner(); /// /// Gets the "triangle" spinner. /// public static Spinner Triangle { get; } = new TriangleSpinner(); /// /// Gets the "binary" spinner. /// public static Spinner Binary { get; } = new BinarySpinner(); /// /// Gets the "arc" spinner. /// public static Spinner Arc { get; } = new ArcSpinner(); /// /// Gets the "circle" spinner. /// public static Spinner Circle { get; } = new CircleSpinner(); /// /// Gets the "squareCorners" spinner. /// public static Spinner SquareCorners { get; } = new SquareCornersSpinner(); /// /// Gets the "circleQuarters" spinner. /// public static Spinner CircleQuarters { get; } = new CircleQuartersSpinner(); /// /// Gets the "circleHalves" spinner. /// public static Spinner CircleHalves { get; } = new CircleHalvesSpinner(); /// /// Gets the "squish" spinner. /// public static Spinner Squish { get; } = new SquishSpinner(); /// /// Gets the "toggle" spinner. /// public static Spinner Toggle { get; } = new ToggleSpinner(); /// /// Gets the "toggle2" spinner. /// public static Spinner Toggle2 { get; } = new Toggle2Spinner(); /// /// Gets the "toggle3" spinner. /// public static Spinner Toggle3 { get; } = new Toggle3Spinner(); /// /// Gets the "toggle4" spinner. /// public static Spinner Toggle4 { get; } = new Toggle4Spinner(); /// /// Gets the "toggle5" spinner. /// public static Spinner Toggle5 { get; } = new Toggle5Spinner(); /// /// Gets the "toggle6" spinner. /// public static Spinner Toggle6 { get; } = new Toggle6Spinner(); /// /// Gets the "toggle7" spinner. /// public static Spinner Toggle7 { get; } = new Toggle7Spinner(); /// /// Gets the "toggle8" spinner. /// public static Spinner Toggle8 { get; } = new Toggle8Spinner(); /// /// Gets the "toggle9" spinner. /// public static Spinner Toggle9 { get; } = new Toggle9Spinner(); /// /// Gets the "toggle10" spinner. /// public static Spinner Toggle10 { get; } = new Toggle10Spinner(); /// /// Gets the "toggle11" spinner. /// public static Spinner Toggle11 { get; } = new Toggle11Spinner(); /// /// Gets the "toggle12" spinner. /// public static Spinner Toggle12 { get; } = new Toggle12Spinner(); /// /// Gets the "toggle13" spinner. /// public static Spinner Toggle13 { get; } = new Toggle13Spinner(); /// /// Gets the "arrow" spinner. /// public static Spinner Arrow { get; } = new ArrowSpinner(); /// /// Gets the "arrow2" spinner. /// public static Spinner Arrow2 { get; } = new Arrow2Spinner(); /// /// Gets the "arrow3" spinner. /// public static Spinner Arrow3 { get; } = new Arrow3Spinner(); /// /// Gets the "bouncingBar" spinner. /// public static Spinner BouncingBar { get; } = new BouncingBarSpinner(); /// /// Gets the "bouncingBall" spinner. /// public static Spinner BouncingBall { get; } = new BouncingBallSpinner(); /// /// Gets the "smiley" spinner. /// public static Spinner Smiley { get; } = new SmileySpinner(); /// /// Gets the "monkey" spinner. /// public static Spinner Monkey { get; } = new MonkeySpinner(); /// /// Gets the "hearts" spinner. /// public static Spinner Hearts { get; } = new HeartsSpinner(); /// /// Gets the "clock" spinner. /// public static Spinner Clock { get; } = new ClockSpinner(); /// /// Gets the "earth" spinner. /// public static Spinner Earth { get; } = new EarthSpinner(); /// /// Gets the "material" spinner. /// public static Spinner Material { get; } = new MaterialSpinner(); /// /// Gets the "moon" spinner. /// public static Spinner Moon { get; } = new MoonSpinner(); /// /// Gets the "runner" spinner. /// public static Spinner Runner { get; } = new RunnerSpinner(); /// /// Gets the "pong" spinner. /// public static Spinner Pong { get; } = new PongSpinner(); /// /// Gets the "shark" spinner. /// public static Spinner Shark { get; } = new SharkSpinner(); /// /// Gets the "dqpb" spinner. /// public static Spinner Dqpb { get; } = new DqpbSpinner(); /// /// Gets the "weather" spinner. /// public static Spinner Weather { get; } = new WeatherSpinner(); /// /// Gets the "christmas" spinner. /// public static Spinner Christmas { get; } = new ChristmasSpinner(); /// /// Gets the "grenade" spinner. /// public static Spinner Grenade { get; } = new GrenadeSpinner(); /// /// Gets the "point" spinner. /// public static Spinner Point { get; } = new PointSpinner(); /// /// Gets the "layer" spinner. /// public static Spinner Layer { get; } = new LayerSpinner(); /// /// Gets the "betaWave" spinner. /// public static Spinner BetaWave { get; } = new BetaWaveSpinner(); /// /// Gets the "fingerDance" spinner. /// public static Spinner FingerDance { get; } = new FingerDanceSpinner(); /// /// Gets the "fistBump" spinner. /// public static Spinner FistBump { get; } = new FistBumpSpinner(); /// /// Gets the "soccerHeader" spinner. /// public static Spinner SoccerHeader { get; } = new SoccerHeaderSpinner(); /// /// Gets the "mindblown" spinner. /// public static Spinner Mindblown { get; } = new MindblownSpinner(); /// /// Gets the "speaker" spinner. /// public static Spinner Speaker { get; } = new SpeakerSpinner(); /// /// Gets the "orangePulse" spinner. /// public static Spinner OrangePulse { get; } = new OrangePulseSpinner(); /// /// Gets the "bluePulse" spinner. /// public static Spinner BluePulse { get; } = new BluePulseSpinner(); /// /// Gets the "orangeBluePulse" spinner. /// public static Spinner OrangeBluePulse { get; } = new OrangeBluePulseSpinner(); /// /// Gets the "timeTravel" spinner. /// public static Spinner TimeTravel { get; } = new TimeTravelSpinner(); /// /// Gets the "aesthetic" spinner. /// public static Spinner Aesthetic { get; } = new AestheticSpinner(); /// /// Gets the "dwarfFortress" spinner. /// public static Spinner DwarfFortress { get; } = new DwarfFortressSpinner(); } } } ================================================ FILE: src/Spectre.Console/HorizontalAlignment.cs ================================================ namespace Spectre.Console; /// /// Represents horizontal alignment. /// public enum HorizontalAlignment { /// /// Left aligned. /// Left, /// /// Centered. /// Center, /// /// Right aligned. /// Right, } ================================================ FILE: src/Spectre.Console/IAlignable.cs ================================================ namespace Spectre.Console; /// /// Represents something that is alignable. /// public interface IAlignable { /// /// Gets or sets the alignment. /// Justify? Alignment { get; set; } } /// /// Contains extension methods for . /// public static class AlignableExtensions { /// /// Sets the alignment for an object. /// /// The alignable object type. /// The alignable object. /// The alignment. /// The same instance so that multiple calls can be chained. public static T Alignment(this T obj, Justify? alignment) where T : class, IAlignable { ArgumentNullException.ThrowIfNull(obj); obj.Alignment = alignment; return obj; } /// /// Sets the object to be left aligned. /// /// The alignable type. /// The alignable object. /// The same instance so that multiple calls can be chained. public static T LeftAligned(this T obj) where T : class, IAlignable { ArgumentNullException.ThrowIfNull(obj); obj.Alignment = Justify.Left; return obj; } /// /// Sets the object to be centered. /// /// The alignable type. /// The alignable object. /// The same instance so that multiple calls can be chained. public static T Centered(this T obj) where T : class, IAlignable { ArgumentNullException.ThrowIfNull(obj); obj.Alignment = Justify.Center; return obj; } /// /// Sets the object to be right aligned. /// /// The alignable type. /// The alignable object. /// The same instance so that multiple calls can be chained. public static T RightAligned(this T obj) where T : class, IAlignable { ArgumentNullException.ThrowIfNull(obj); obj.Alignment = Justify.Right; return obj; } } ================================================ FILE: src/Spectre.Console/IAnsiConsole.cs ================================================ namespace Spectre.Console; /// /// Represents a console. /// public interface IAnsiConsole { /// /// Gets the console profile. /// Profile Profile { get; } /// /// Gets the console cursor. /// IAnsiConsoleCursor Cursor { get; } /// /// Gets the console input. /// IAnsiConsoleInput Input { get; } /// /// Gets the exclusivity mode. /// IExclusivityMode ExclusivityMode { get; } /// /// Gets the render pipeline. /// RenderPipeline Pipeline { get; } /// /// Clears the console. /// /// If the cursor should be moved to the home position. void Clear(bool home); /// /// Writes a to the console. /// /// The to write. void Write(IRenderable renderable); /// /// Writes ANSI/VT escapes sequences to the console. /// /// The action. void WriteAnsi(Action action); } ================================================ FILE: src/Spectre.Console/IAnsiConsoleCursor.cs ================================================ namespace Spectre.Console; /// /// Represents the console's cursor. /// public interface IAnsiConsoleCursor { /// /// Shows or hides the cursor. /// /// true to show the cursor, false to hide it. void Show(bool show); /// /// Sets the cursor position. /// /// The column to move the cursor to. /// The line to move the cursor to. void SetPosition(int column, int line); /// /// Moves the cursor relative to the current position. /// /// The direction to move the cursor. /// The number of steps to move the cursor. void Move(CursorDirection direction, int steps); } /// /// Contains extension methods for . /// public static class CursorExtensions { /// /// Shows the cursor. /// /// The cursor. public static void Show(this IAnsiConsoleCursor cursor) { ArgumentNullException.ThrowIfNull(cursor); cursor.Show(true); } /// /// Hides the cursor. /// /// The cursor. public static void Hide(this IAnsiConsoleCursor cursor) { ArgumentNullException.ThrowIfNull(cursor); cursor.Show(false); } /// /// Moves the cursor up. /// /// The cursor. public static void MoveUp(this IAnsiConsoleCursor cursor) { ArgumentNullException.ThrowIfNull(cursor); cursor.Move(CursorDirection.Up, 1); } /// /// Moves the cursor up. /// /// The cursor. /// The number of steps to move the cursor. public static void MoveUp(this IAnsiConsoleCursor cursor, int steps) { ArgumentNullException.ThrowIfNull(cursor); cursor.Move(CursorDirection.Up, steps); } /// /// Moves the cursor down. /// /// The cursor. public static void MoveDown(this IAnsiConsoleCursor cursor) { ArgumentNullException.ThrowIfNull(cursor); cursor.Move(CursorDirection.Down, 1); } /// /// Moves the cursor down. /// /// The cursor. /// The number of steps to move the cursor. public static void MoveDown(this IAnsiConsoleCursor cursor, int steps) { ArgumentNullException.ThrowIfNull(cursor); cursor.Move(CursorDirection.Down, steps); } /// /// Moves the cursor to the left. /// /// The cursor. public static void MoveLeft(this IAnsiConsoleCursor cursor) { ArgumentNullException.ThrowIfNull(cursor); cursor.Move(CursorDirection.Left, 1); } /// /// Moves the cursor to the left. /// /// The cursor. /// The number of steps to move the cursor. public static void MoveLeft(this IAnsiConsoleCursor cursor, int steps) { ArgumentNullException.ThrowIfNull(cursor); cursor.Move(CursorDirection.Left, steps); } /// /// Moves the cursor to the right. /// /// The cursor. public static void MoveRight(this IAnsiConsoleCursor cursor) { ArgumentNullException.ThrowIfNull(cursor); cursor.Move(CursorDirection.Right, 1); } /// /// Moves the cursor to the right. /// /// The cursor. /// The number of steps to move the cursor. public static void MoveRight(this IAnsiConsoleCursor cursor, int steps) { ArgumentNullException.ThrowIfNull(cursor); cursor.Move(CursorDirection.Right, steps); } } ================================================ FILE: src/Spectre.Console/IAnsiConsoleInput.cs ================================================ namespace Spectre.Console; /// /// Represents the console's input mechanism. /// public interface IAnsiConsoleInput { /// /// Gets a value indicating whether or not /// there is a key available. /// /// true if there's a key available, otherwise false. bool IsKeyAvailable(); /// /// Reads a key from the console. /// /// Whether or not to intercept the key. /// The key that was read. ConsoleKeyInfo? ReadKey(bool intercept); /// /// Reads a key from the console. /// /// Whether or not to intercept the key. /// The token to monitor for cancellation requests. /// The key that was read. Task ReadKeyAsync(bool intercept, CancellationToken cancellationToken); } ================================================ FILE: src/Spectre.Console/IAnsiConsoleOutput.cs ================================================ namespace Spectre.Console; /// /// Represents console output. /// public interface IAnsiConsoleOutput { /// /// Gets the used to write to the output. /// TextWriter Writer { get; } /// /// Gets a value indicating whether or not the output is a terminal. /// bool IsTerminal { get; } /// /// Gets the output width. /// int Width { get; } /// /// Gets the output height. /// int Height { get; } /// /// Sets the output encoding. /// /// The encoding. void SetEncoding(Encoding encoding); } ================================================ FILE: src/Spectre.Console/IColumn.cs ================================================ namespace Spectre.Console; /// /// Represents a column. /// public interface IColumn : IAlignable, IPaddable { /// /// Gets or sets a value indicating whether /// or not wrapping should be prevented. /// bool NoWrap { get; set; } /// /// Gets or sets the width of the column. /// int? Width { get; set; } } /// /// Contains extension methods for . /// public static class ColumnExtensions { /// /// Prevents a column from wrapping. /// /// An object implementing . /// The column. /// The same instance so that multiple calls can be chained. public static T NoWrap(this T obj) where T : class, IColumn { ArgumentNullException.ThrowIfNull(obj); obj.NoWrap = true; return obj; } /// /// Sets the width of the column. /// /// An object implementing . /// The column. /// The column width. /// The same instance so that multiple calls can be chained. public static T Width(this T obj, int? width) where T : class, IColumn { ArgumentNullException.ThrowIfNull(obj); obj.Width = width; return obj; } } ================================================ FILE: src/Spectre.Console/IExclusivityMode.cs ================================================ namespace Spectre.Console; /// /// Represents an exclusivity mode. /// public interface IExclusivityMode { /// /// Runs the specified function in exclusive mode. /// /// The result type. /// The func to run in exclusive mode. /// The result of the function. T Run(Func func); /// /// Runs the specified function in exclusive mode asynchronously. /// /// The result type. /// The func to run in exclusive mode. /// The result of the function. Task RunAsync(Func> func); } ================================================ FILE: src/Spectre.Console/IExpandable.cs ================================================ namespace Spectre.Console; /// /// Represents something that is expandable. /// public interface IExpandable { /// /// Gets or sets a value indicating whether or not the object should /// expand to the available space. If false, the object's /// width will be auto calculated. /// bool Expand { get; set; } } /// /// Contains extension methods for . /// public static class ExpandableExtensions { /// /// Tells the specified object to not expand to the available area /// but take as little space as possible. /// /// The expandable object. /// The object to collapse. /// The same instance so that multiple calls can be chained. public static T Collapse(this T obj) where T : class, IExpandable { ArgumentNullException.ThrowIfNull(obj); obj.Expand = false; return obj; } /// /// Tells the specified object to expand to the available area. /// /// The expandable object. /// The object to expand. /// The same instance so that multiple calls can be chained. public static T Expand(this T obj) where T : class, IExpandable { ArgumentNullException.ThrowIfNull(obj); obj.Expand = true; return obj; } } ================================================ FILE: src/Spectre.Console/IHasBorder.cs ================================================ namespace Spectre.Console; /// /// Represents something that has a border. /// public interface IHasBorder { /// /// Gets or sets a value indicating whether or not to use /// a "safe" border on legacy consoles that might not be able /// to render non-ASCII characters. /// bool UseSafeBorder { get; set; } /// /// Gets or sets the box style. /// public Style? BorderStyle { get; set; } } /// /// Contains extension methods for . /// public static class HasBorderExtensions { /// /// Enables the safe border. /// /// An object type with a border. /// The object to enable the safe border for. /// The same instance so that multiple calls can be chained. public static T SafeBorder(this T obj) where T : class, IHasBorder { ArgumentNullException.ThrowIfNull(obj); obj.UseSafeBorder = true; return obj; } /// /// Disables the safe border. /// /// An object type with a border. /// The object to disable the safe border for. /// The same instance so that multiple calls can be chained. public static T NoSafeBorder(this T obj) where T : class, IHasBorder { ArgumentNullException.ThrowIfNull(obj); obj.UseSafeBorder = false; return obj; } /// /// Sets the border style. /// /// An object type with a border. /// The object to set the border style for. /// The border style to set. /// The same instance so that multiple calls can be chained. public static T BorderStyle(this T obj, Style style) where T : class, IHasBorder { ArgumentNullException.ThrowIfNull(obj); obj.BorderStyle = style; return obj; } /// /// Sets the border color. /// /// An object type with a border. /// The object to set the border color for. /// The border color to set. /// The same instance so that multiple calls can be chained. public static T BorderColor(this T obj, Color color) where T : class, IHasBorder { ArgumentNullException.ThrowIfNull(obj); obj.BorderStyle = (obj.BorderStyle ?? Style.Plain).Foreground(color); return obj; } } ================================================ FILE: src/Spectre.Console/IHasBoxBorder.cs ================================================ namespace Spectre.Console; /// /// Represents something that has a box border. /// public interface IHasBoxBorder { /// /// Gets or sets the box. /// public BoxBorder Border { get; set; } } /// /// Contains extension methods for . /// public static class HasBoxBorderExtensions { /// /// Sets the border. /// /// An object type with a border. /// The object to set the border for. /// The border to use. /// The same instance so that multiple calls can be chained. public static T Border(this T obj, BoxBorder border) where T : class, IHasBoxBorder { ArgumentNullException.ThrowIfNull(obj); obj.Border = border; return obj; } /// /// Do not display a border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T NoBorder(this T obj) where T : class, IHasBoxBorder { return Border(obj, BoxBorder.None); } /// /// Display a square border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T SquareBorder(this T obj) where T : class, IHasBoxBorder { return Border(obj, BoxBorder.Square); } /// /// Display an ASCII border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T AsciiBorder(this T obj) where T : class, IHasBoxBorder { return Border(obj, BoxBorder.Ascii); } /// /// Display a rounded border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T RoundedBorder(this T obj) where T : class, IHasBoxBorder { return Border(obj, BoxBorder.Rounded); } /// /// Display a heavy border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T HeavyBorder(this T obj) where T : class, IHasBoxBorder { return Border(obj, BoxBorder.Heavy); } /// /// Display a double border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T DoubleBorder(this T obj) where T : class, IHasBoxBorder { return Border(obj, BoxBorder.Double); } } ================================================ FILE: src/Spectre.Console/IHasCulture.cs ================================================ namespace Spectre.Console; /// /// Represents something that has a culture. /// public interface IHasCulture { /// /// Gets or sets the culture. /// CultureInfo? Culture { get; set; } } /// /// Contains extension methods for . /// public static class HasCultureExtensions { /// /// Sets the culture. /// /// An object type with a culture. /// The object to set the culture for. /// The culture to set. /// The same instance so that multiple calls can be chained. public static T Culture(this T obj, CultureInfo culture) where T : class, IHasCulture { ArgumentNullException.ThrowIfNull(obj); ArgumentNullException.ThrowIfNull(culture); obj.Culture = culture; return obj; } /// /// Sets the culture. /// /// An object type with a culture. /// The object to set the culture for. /// The culture to set. /// The same instance so that multiple calls can be chained. public static T Culture(this T obj, string name) where T : class, IHasCulture { ArgumentNullException.ThrowIfNull(obj); ArgumentNullException.ThrowIfNull(name); return Culture(obj, CultureInfo.GetCultureInfo(name)); } /// /// Sets the culture. /// /// An object type with a culture. /// The object to set the culture for. /// The culture to set. /// The same instance so that multiple calls can be chained. public static T Culture(this T obj, int culture) where T : class, IHasCulture { ArgumentNullException.ThrowIfNull(obj); return Culture(obj, CultureInfo.GetCultureInfo(culture)); } } ================================================ FILE: src/Spectre.Console/IHasJustification.cs ================================================ namespace Spectre.Console; /// /// Represents something that has justification. /// public interface IHasJustification { /// /// Gets or sets the justification. /// Justify? Justification { get; set; } } /// /// Contains extension methods for . /// public static class HasJustificationExtensions { /// /// Sets the justification for an object. /// /// The type that can be justified. /// The alignable object. /// The alignment. /// The same instance so that multiple calls can be chained. public static T Justify(this T obj, Justify? alignment) where T : class, IHasJustification { ArgumentNullException.ThrowIfNull(obj); obj.Justification = alignment; return obj; } /// /// Sets the object to be left justified. /// /// The type that can be justified. /// The alignable object. /// The same instance so that multiple calls can be chained. public static T LeftJustified(this T obj) where T : class, IHasJustification { ArgumentNullException.ThrowIfNull(obj); obj.Justification = Console.Justify.Left; return obj; } /// /// Sets the object to be centered. /// /// The type that can be justified. /// The alignable object. /// The same instance so that multiple calls can be chained. public static T Centered(this T obj) where T : class, IHasJustification { ArgumentNullException.ThrowIfNull(obj); obj.Justification = Console.Justify.Center; return obj; } /// /// Sets the object to be right justified. /// /// The type that can be justified. /// The alignable object. /// The same instance so that multiple calls can be chained. public static T RightJustified(this T obj) where T : class, IHasJustification { ArgumentNullException.ThrowIfNull(obj); obj.Justification = Console.Justify.Right; return obj; } } ================================================ FILE: src/Spectre.Console/IHasTableBorder.cs ================================================ namespace Spectre.Console; /// /// Represents something that has a border. /// public interface IHasTableBorder : IHasBorder { /// /// Gets or sets the border. /// public TableBorder Border { get; set; } } /// /// Contains extension methods for . /// public static class HasTableBorderExtensions { /// /// Do not display a border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T NoBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.None); } /// /// Display a square border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T SquareBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Square); } /// /// Display an ASCII border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T AsciiBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Ascii); } /// /// Display another ASCII border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T Ascii2Border(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Ascii2); } /// /// Display an ASCII border with a double header border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T AsciiDoubleHeadBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.AsciiDoubleHead); } /// /// Display a rounded border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T RoundedBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Rounded); } /// /// Display a minimal border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T MinimalBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Minimal); } /// /// Display a minimal border with a heavy head. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T MinimalHeavyHeadBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.MinimalHeavyHead); } /// /// Display a minimal border with a double header border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T MinimalDoubleHeadBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.MinimalDoubleHead); } /// /// Display a simple border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T SimpleBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Simple); } /// /// Display a simple border with heavy lines. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T SimpleHeavyBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.SimpleHeavy); } /// /// Display a simple border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T HorizontalBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Horizontal); } /// /// Display a heavy border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T HeavyBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Heavy); } /// /// Display a border with a heavy edge. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T HeavyEdgeBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.HeavyEdge); } /// /// Display a border with a heavy header. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T HeavyHeadBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.HeavyHead); } /// /// Display a double border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T DoubleBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Double); } /// /// Display a border with a double edge. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T DoubleEdgeBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.DoubleEdge); } /// /// Display a minimalist border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T MinimalistBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Minimalist); } /// /// Display a markdown border. /// /// An object type with a border. /// The object to set the border for. /// The same instance so that multiple calls can be chained. public static T MarkdownBorder(this T obj) where T : class, IHasTableBorder { return Border(obj, TableBorder.Markdown); } /// /// Sets the border. /// /// An object type with a border. /// The object to set the border for. /// The border to use. /// The same instance so that multiple calls can be chained. public static T Border(this T obj, TableBorder border) where T : class, IHasTableBorder { ArgumentNullException.ThrowIfNull(obj); obj.Border = border; return obj; } } ================================================ FILE: src/Spectre.Console/IHasTreeNodes.cs ================================================ namespace Spectre.Console; /// /// Represents something that has tree nodes. /// public interface IHasTreeNodes { /// /// Gets the tree's child nodes. /// List Nodes { get; } } /// /// Contains extension methods for . /// public static class HasTreeNodeExtensions { /// /// Adds a tree node. /// /// An object with tree nodes. /// The object to add the tree node to. /// The node's markup text. /// The added tree node. public static TreeNode AddNode(this T obj, string markup) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(markup); return AddNode(obj, new Markup(markup)); } /// /// Adds a tree node. /// /// An object with tree nodes. /// The object to add the tree node to. /// The renderable to add. /// The added tree node. public static TreeNode AddNode(this T obj, IRenderable renderable) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(renderable); var node = new TreeNode(renderable); obj.Nodes.Add(node); return node; } /// /// Adds a tree node. /// /// An object with tree nodes. /// The object to add the tree node to. /// The tree node to add. /// The added tree node. public static TreeNode AddNode(this T obj, TreeNode node) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(node); obj.Nodes.Add(node); return node; } /// /// Add multiple tree nodes. /// /// An object with tree nodes. /// The object to add the tree nodes to. /// The tree nodes to add. public static void AddNodes(this T obj, params string[] nodes) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(nodes); obj.Nodes.AddRange(nodes.Select(node => new TreeNode(new Markup(node)))); } /// /// Add multiple tree nodes. /// /// An object with tree nodes. /// The object to add the tree nodes to. /// The tree nodes to add. public static void AddNodes(this T obj, IEnumerable nodes) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(nodes); obj.Nodes.AddRange(nodes.Select(node => new TreeNode(new Markup(node)))); } /// /// Add multiple tree nodes. /// /// An object with tree nodes. /// The object to add the tree nodes to. /// The tree nodes to add. public static void AddNodes(this T obj, params IRenderable[] nodes) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(nodes); obj.Nodes.AddRange(nodes.Select(node => new TreeNode(node))); } /// /// Add multiple tree nodes. /// /// An object with tree nodes. /// The object to add the tree nodes to. /// The tree nodes to add. public static void AddNodes(this T obj, IEnumerable nodes) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(nodes); obj.Nodes.AddRange(nodes.Select(node => new TreeNode(node))); } /// /// Add multiple tree nodes. /// /// An object with tree nodes. /// The object to add the tree nodes to. /// The tree nodes to add. public static void AddNodes(this T obj, params TreeNode[] nodes) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(nodes); obj.Nodes.AddRange(nodes); } /// /// Add multiple tree nodes. /// /// An object with tree nodes. /// The object to add the tree nodes to. /// The tree nodes to add. public static void AddNodes(this T obj, IEnumerable nodes) where T : IHasTreeNodes { if (obj is null) { throw new ArgumentNullException(nameof(obj)); } ArgumentNullException.ThrowIfNull(nodes); obj.Nodes.AddRange(nodes); } } ================================================ FILE: src/Spectre.Console/IHasVisibility.cs ================================================ namespace Spectre.Console; /// /// Represents something that can be hidden. /// public interface IHasVisibility { /// /// Gets or sets a value indicating whether or not the object should /// be visible or not. /// bool IsVisible { get; set; } } /// /// Contains extension methods for . /// public static class VisibilityExtensions { /// /// Marks the specified object as being invisible. /// /// An object implementing . /// The object to hide. /// The same instance so that multiple calls can be chained. public static T Invisible(this T obj) where T : class, IHasVisibility { ArgumentNullException.ThrowIfNull(obj); obj.IsVisible = false; return obj; } /// /// Marks the specified object as being visible. /// /// An object implementing . /// The object to show. /// The same instance so that multiple calls can be chained. public static T Visible(this T obj) where T : class, IHasVisibility { ArgumentNullException.ThrowIfNull(obj); obj.IsVisible = true; return obj; } } ================================================ FILE: src/Spectre.Console/IOverflowable.cs ================================================ namespace Spectre.Console; /// /// Represents something that can overflow. /// public interface IOverflowable { /// /// Gets or sets the text overflow strategy. /// Overflow? Overflow { get; set; } } /// /// Contains extension methods for . /// public static class OverflowableExtensions { /// /// Folds any overflowing text. /// /// An object implementing . /// The overflowable object instance. /// The same instance so that multiple calls can be chained. public static T Fold(this T obj) where T : class, IOverflowable { ArgumentNullException.ThrowIfNull(obj); return Overflow(obj, Console.Overflow.Fold); } /// /// Crops any overflowing text. /// /// An object implementing . /// The overflowable object instance. /// The same instance so that multiple calls can be chained. public static T Crop(this T obj) where T : class, IOverflowable { ArgumentNullException.ThrowIfNull(obj); return Overflow(obj, Console.Overflow.Crop); } /// /// Crops any overflowing text and adds an ellipsis to the end. /// /// An object implementing . /// The overflowable object instance. /// The same instance so that multiple calls can be chained. public static T Ellipsis(this T obj) where T : class, IOverflowable { ArgumentNullException.ThrowIfNull(obj); return Overflow(obj, Console.Overflow.Ellipsis); } /// /// Sets the overflow strategy. /// /// An object implementing . /// The overflowable object instance. /// The overflow strategy to use. /// The same instance so that multiple calls can be chained. public static T Overflow(this T obj, Overflow overflow) where T : class, IOverflowable { ArgumentNullException.ThrowIfNull(obj); obj.Overflow = overflow; return obj; } } ================================================ FILE: src/Spectre.Console/IPaddable.cs ================================================ namespace Spectre.Console; /// /// Represents something that is paddable. /// public interface IPaddable { /// /// Gets or sets the padding. /// public Padding? Padding { get; set; } } /// /// Contains extension methods for . /// public static class PaddableExtensions { /// /// Sets the left padding. /// /// An object implementing . /// The paddable object instance. /// The left padding. /// The same instance so that multiple calls can be chained. public static T PadLeft(this T obj, int left) where T : class, IPaddable { ArgumentNullException.ThrowIfNull(obj); return Padding(obj, new Padding(left, obj.Padding.GetTopSafe(), obj.Padding.GetRightSafe(), obj.Padding.GetBottomSafe())); } /// /// Sets the top padding. /// /// An object implementing . /// The paddable object instance. /// The top padding. /// The same instance so that multiple calls can be chained. public static T PadTop(this T obj, int top) where T : class, IPaddable { ArgumentNullException.ThrowIfNull(obj); return Padding(obj, new Padding(obj.Padding.GetLeftSafe(), top, obj.Padding.GetRightSafe(), obj.Padding.GetBottomSafe())); } /// /// Sets the right padding. /// /// An object implementing . /// The paddable object instance. /// The right padding. /// The same instance so that multiple calls can be chained. public static T PadRight(this T obj, int right) where T : class, IPaddable { ArgumentNullException.ThrowIfNull(obj); return Padding(obj, new Padding(obj.Padding.GetLeftSafe(), obj.Padding.GetTopSafe(), right, obj.Padding.GetBottomSafe())); } /// /// Sets the bottom padding. /// /// An object implementing . /// The paddable object instance. /// The bottom padding. /// The same instance so that multiple calls can be chained. public static T PadBottom(this T obj, int bottom) where T : class, IPaddable { ArgumentNullException.ThrowIfNull(obj); return Padding(obj, new Padding(obj.Padding.GetLeftSafe(), obj.Padding.GetTopSafe(), obj.Padding.GetRightSafe(), bottom)); } /// /// Sets the left, top, right and bottom padding. /// /// An object implementing . /// The paddable object instance. /// The left padding to apply. /// The top padding to apply. /// The right padding to apply. /// The bottom padding to apply. /// The same instance so that multiple calls can be chained. public static T Padding(this T obj, int left, int top, int right, int bottom) where T : class, IPaddable { return Padding(obj, new Padding(left, top, right, bottom)); } /// /// Sets the horizontal and vertical padding. /// /// An object implementing . /// The paddable object instance. /// The left and right padding. /// The top and bottom padding. /// The same instance so that multiple calls can be chained. public static T Padding(this T obj, int horizontal, int vertical) where T : class, IPaddable { return Padding(obj, new Padding(horizontal, vertical)); } /// /// Sets the padding. /// /// An object implementing . /// The paddable object instance. /// The padding to apply. /// The same instance so that multiple calls can be chained. public static T Padding(this T obj, Padding padding) where T : class, IPaddable { ArgumentNullException.ThrowIfNull(obj); obj.Padding = padding; return obj; } } ================================================ FILE: src/Spectre.Console/IProfileEnricher.cs ================================================ namespace Spectre.Console; /// /// Represents something that can enrich a profile. /// public interface IProfileEnricher { /// /// Gets the name of the enricher. /// public string Name { get; } /// /// Gets whether or not this enricher is enabled. /// /// The environment variables. /// Whether or not this enricher is enabled. bool Enabled(IDictionary environmentVariables); /// /// Enriches the profile. /// /// The profile to enrich. void Enrich(Profile profile); } ================================================ FILE: src/Spectre.Console/IReadOnlyCapabilities.cs ================================================ namespace Spectre.Console; /// /// Represents (read-only) terminal capabilities. /// public interface IReadOnlyCapabilities : IReadOnlyAnsiCapabilities { /// /// Gets a value indicating whether or not /// this is a legacy console (cmd.exe) on an OS /// prior to Windows 10. /// /// /// Only relevant when running on Microsoft Windows. /// [Obsolete("This property will be removed in a future version")] bool Legacy { get; } /// /// Gets a value indicating whether /// or not the console supports interaction. /// bool Interactive { get; } /// /// Gets a value indicating whether /// or not the console supports Unicode. /// bool Unicode { get; } } ================================================ FILE: src/Spectre.Console/InteractionDetector.cs ================================================ namespace Spectre.Console; internal static class InteractionDetector { public static bool IsInteractive(InteractionSupport interaction) { return IsInteractive( interaction, System.Console.IsInputRedirected, System.Console.IsOutputRedirected, System.Console.IsErrorRedirected); } internal static bool IsInteractive( InteractionSupport interaction, bool isInputRedirected, bool isOutputRedirected, bool isErrorRedirected) { var interactive = interaction == InteractionSupport.Yes; if (interaction == InteractionSupport.Detect) { // Consider the console interactive only when input, output and error are not redirected. interactive = !isInputRedirected && !isOutputRedirected && !isErrorRedirected; } return interactive; } } ================================================ FILE: src/Spectre.Console/InteractionSupport.cs ================================================ namespace Spectre.Console; /// /// Determines interactivity support. /// public enum InteractionSupport { /// /// Interaction support should be /// detected by the system. /// Detect = 0, /// /// Interactivity is supported. /// Yes = 1, /// /// Interactivity is not supported. /// No = 2, } ================================================ FILE: src/Spectre.Console/Internal/Aligner.cs ================================================ namespace Spectre.Console; internal static class Aligner { public static string Align(string text, Justify? alignment, int maxWidth) { if (alignment == null || alignment == Justify.Left) { return text; } var width = Cell.GetCellLength(text); if (width >= maxWidth) { return text; } switch (alignment) { case Justify.Right: { var diff = maxWidth - width; return new string(' ', diff) + text; } case Justify.Center: { var diff = (maxWidth - width) / 2; var left = new string(' ', diff); var right = new string(' ', diff); // Right side var remainder = (maxWidth - width) % 2; if (remainder != 0) { right += new string(' ', remainder); } return left + text + right; } default: throw new NotSupportedException("Unknown alignment"); } } public static void Align(T segments, Justify? alignment, int maxWidth) where T : List { if (alignment == null || alignment == Justify.Left) { return; } var width = Segment.CellCount(segments); if (width >= maxWidth) { return; } switch (alignment) { case Justify.Right: { var diff = maxWidth - width; segments.Insert(0, Segment.Padding(diff)); break; } case Justify.Center: { // Left side. var diff = (maxWidth - width) / 2; segments.Insert(0, Segment.Padding(diff)); // Right side segments.Add(Segment.Padding(diff)); var remainder = (maxWidth - width) % 2; if (remainder != 0) { segments.Add(Segment.Padding(remainder)); } break; } default: throw new NotSupportedException("Unknown alignment"); } } public static void AlignHorizontally(T segments, HorizontalAlignment alignment, int maxWidth) where T : List { var width = Segment.CellCount(segments); if (width >= maxWidth) { return; } switch (alignment) { case HorizontalAlignment.Left: { var diff = maxWidth - width; segments.Add(Segment.Padding(diff)); break; } case HorizontalAlignment.Right: { var diff = maxWidth - width; segments.Insert(0, Segment.Padding(diff)); break; } case HorizontalAlignment.Center: { // Left side. var diff = (maxWidth - width) / 2; segments.Insert(0, Segment.Padding(diff)); // Right side segments.Add(Segment.Padding(diff)); var remainder = (maxWidth - width) % 2; if (remainder != 0) { segments.Add(Segment.Padding(remainder)); } break; } default: throw new NotSupportedException("Unknown alignment"); } } } ================================================ FILE: src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleBackend.cs ================================================ namespace Spectre.Console; internal sealed class AnsiConsoleBackend : IAnsiConsoleBackend { private readonly IAnsiConsole _console; private readonly AnsiWriter _writer; public IAnsiConsoleCursor Cursor { get; } public Capabilities Capabilities => _console.Profile.Capabilities; public AnsiConsoleBackend(IAnsiConsole console) { _console = console ?? throw new ArgumentNullException(nameof(console)); _writer = new AnsiWriter(_console.Profile.Out.Writer, _console.Profile.Capabilities); Cursor = new AnsiConsoleCursor(this); } public void Clear(bool home) { Write(w => w.EraseInDisplay(2)); Write(w => w.ClearScrollback()); if (home) { Write(w => w.CursorPosition(1, 1)); } } public void Write(IRenderable renderable) { _writer.Write(_console, renderable); } public void Write(Action action) { action(_writer); } } ================================================ FILE: src/Spectre.Console/Internal/Backends/Ansi/AnsiConsoleCursor.cs ================================================ namespace Spectre.Console; internal sealed class AnsiConsoleCursor : IAnsiConsoleCursor { private readonly AnsiConsoleBackend _backend; public AnsiConsoleCursor(AnsiConsoleBackend backend) { _backend = backend ?? throw new ArgumentNullException(nameof(backend)); } public void Show(bool show) { if (show) { _backend.Write(w => w.ShowCursor()); } else { _backend.Write(w => w.HideCursor()); } } public void Move(CursorDirection direction, int steps) { if (steps == 0) { return; } switch (direction) { case CursorDirection.Up: _backend.Write(w => w.CursorUp(steps)); break; case CursorDirection.Down: _backend.Write(w => w.CursorDown(steps)); break; case CursorDirection.Right: _backend.Write(w => w.CursorRight(steps)); break; case CursorDirection.Left: _backend.Write(w => w.CursorLeft(steps)); break; } } public void SetPosition(int column, int line) { _backend.Write(w => w.CursorPosition(line, column)); } } ================================================ FILE: src/Spectre.Console/Internal/Backends/Ansi/AnsiStringWriter.cs ================================================ namespace Spectre.Console; internal sealed class AnsiStringWriter { private readonly SemaphoreSlim _lock; private readonly StringBuilder _builder; private readonly AnsiWriter _writer; public static AnsiStringWriter Shared { get; } = new(); private AnsiStringWriter() { _lock = new SemaphoreSlim(1, 1); _builder = new StringBuilder(); _writer = new AnsiWriter( new StringWriter(_builder), new Capabilities { ColorSystem = ColorSystem.NoColors, Ansi = true, Links = true, Interactive = false, Unicode = true, AlternateBuffer = true, }); } public string Write(IReadOnlyCapabilities capabilities, Action action) { _lock.Wait(); try { _builder.Clear(); _writer.Capabilities = capabilities; action(_writer); return _builder.ToString(); } finally { _lock.Release(); } } } ================================================ FILE: src/Spectre.Console/Internal/Backends/AnsiConsoleFacade.cs ================================================ namespace Spectre.Console; internal sealed class AnsiConsoleFacade : IAnsiConsole { private readonly Lock _renderLock; private readonly AnsiConsoleBackend _ansiBackend; private readonly LegacyConsoleBackend _legacyBackend; public Profile Profile { get; } public IAnsiConsoleCursor Cursor => GetBackend().Cursor; public IAnsiConsoleInput Input { get; } public IExclusivityMode ExclusivityMode { get; } public RenderPipeline Pipeline { get; } public AnsiConsoleFacade(Profile profile, IExclusivityMode exclusivityMode) { _renderLock = LockFactory.Create(); Profile = profile ?? throw new ArgumentNullException(nameof(profile)); Input = new DefaultInput(Profile); ExclusivityMode = exclusivityMode ?? throw new ArgumentNullException(nameof(exclusivityMode)); Pipeline = new RenderPipeline(); _ansiBackend = new AnsiConsoleBackend(this); _legacyBackend = new LegacyConsoleBackend(this); } public void Clear(bool home) { lock (_renderLock) { GetBackend().Clear(home); } } public void Write(IRenderable renderable) { lock (_renderLock) { GetBackend().Write(renderable); } } public void WriteAnsi(Action action) { lock (_renderLock) { GetBackend().Write(action); } } private IAnsiConsoleBackend GetBackend() { if (Profile.Capabilities.Ansi) { return _ansiBackend; } return _legacyBackend; } } ================================================ FILE: src/Spectre.Console/Internal/Backends/IAnsiConsoleBackend.cs ================================================ namespace Spectre.Console; /// /// Represents a console backend. /// internal interface IAnsiConsoleBackend { IAnsiConsoleCursor Cursor { get; } void Clear(bool home); void Write(IRenderable renderable); void Write(Action action); } ================================================ FILE: src/Spectre.Console/Internal/Backends/Legacy/LegacyConsoleBackend.cs ================================================ namespace Spectre.Console; internal sealed class LegacyConsoleBackend : IAnsiConsoleBackend { private readonly IAnsiConsole _console; private Style _lastStyle; public IAnsiConsoleCursor Cursor { get; } public LegacyConsoleBackend(IAnsiConsole console) { _console = console ?? throw new System.ArgumentNullException(nameof(console)); _lastStyle = Style.Plain; Cursor = new LegacyConsoleCursor(); } public void Clear(bool home) { var (x, y) = (System.Console.CursorLeft, System.Console.CursorTop); System.Console.Clear(); if (!home) { // Set the cursor position System.Console.SetCursorPosition(x, y); } } public void Write(IRenderable renderable) { foreach (var segment in renderable.GetSegments(_console)) { if (segment.IsControlCode) { continue; } if (!_lastStyle.Equals(segment.Style)) { SetStyle(segment.Style); } _console.Profile.Out.Writer.Write(segment.Text.NormalizeNewLines(native: true)); } } public void Write(Action action) { // Do nothing. The backend is not capable of emitting ANSI/VT escape sequences. } private void SetStyle(Style style) { _lastStyle = style; System.Console.ResetColor(); var background = Color.ToConsoleColor(style.Background); if (_console.Profile.Capabilities.ColorSystem != ColorSystem.NoColors && (int)background != -1) { System.Console.BackgroundColor = background; } var foreground = Color.ToConsoleColor(style.Foreground); if (_console.Profile.Capabilities.ColorSystem != ColorSystem.NoColors && (int)foreground != -1) { System.Console.ForegroundColor = foreground; } } } ================================================ FILE: src/Spectre.Console/Internal/Backends/Legacy/LegacyConsoleCursor.cs ================================================ namespace Spectre.Console; internal sealed class LegacyConsoleCursor : IAnsiConsoleCursor { public void Show(bool show) { System.Console.CursorVisible = show; } public void Move(CursorDirection direction, int steps) { if (steps == 0) { return; } switch (direction) { case CursorDirection.Up: System.Console.CursorTop -= steps; break; case CursorDirection.Down: System.Console.CursorTop += steps; break; case CursorDirection.Left: System.Console.CursorLeft -= steps; break; case CursorDirection.Right: System.Console.CursorLeft += steps; break; } } public void SetPosition(int x, int y) { System.Console.CursorLeft = x; System.Console.CursorTop = y; } } ================================================ FILE: src/Spectre.Console/Internal/Cell.cs ================================================ namespace Spectre.Console; internal static class Cell { private const sbyte Sentinel = -2; /// /// UnicodeCalculator.GetWidth documents the width as (-1, 0, 1, 2). We only need space for these values and a sentinel for uninitialized values. /// This is only five values in total so we are storing one byte per value. We could store 2 per byte but that would add more logic to the retrieval. /// We should add one to char.MaxValue because the total number of characters includes \0 too so there are 65536 valid chars. /// private static readonly sbyte[] _runeWidthCache = new sbyte[char.MaxValue + 1]; static Cell() { #if !NETSTANDARD2_0 Array.Fill(_runeWidthCache, Sentinel); #else for (var i = 0; i < _runeWidthCache.Length; i++) { _runeWidthCache[i] = Sentinel; } #endif } public static int GetCellLength(string text) => GetCellLength(text.AsSpan()); public static int GetCellLength(ReadOnlySpan text) { var sum = 0; foreach (var rune in text) { sum += GetCellLength(rune); } return sum; } public static int GetCellLength(char rune) { // TODO: We need to figure out why Segment.SplitLines fails // if we let wcwidth (which returns -1 instead of 1) // calculate the size for new line characters. // That is correct from a Unicode perspective, but the // algorithm was written before wcwidth was added and used // to work with string length and not cell length. if (rune == '\n') { return 1; } var width = _runeWidthCache[rune]; if (width == Sentinel) { width = (sbyte)UnicodeCalculator.GetWidth(rune); _runeWidthCache[rune] = width; } return width; } } ================================================ FILE: src/Spectre.Console/Internal/Collections/ListWithCallback.cs ================================================ namespace Spectre.Console; internal sealed class ListWithCallback : IList, IReadOnlyList { private readonly List _list; private readonly Action _callback; public T this[int index] { get => _list[index]; set => _list[index] = value; } public int Count => _list.Count; public bool IsReadOnly => false; public ListWithCallback(Action callback) { _list = []; _callback = callback ?? throw new ArgumentNullException(nameof(callback)); } public void Add(T item) { _list.Add(item); _callback(); } public void Clear() { _list.Clear(); _callback(); } public bool Contains(T item) { return _list.Contains(item); } public void CopyTo(T[] array, int arrayIndex) { _list.CopyTo(array, arrayIndex); _callback(); } public IEnumerator GetEnumerator() { return _list.GetEnumerator(); } public int IndexOf(T item) { return _list.IndexOf(item); } public void Insert(int index, T item) { _list.Insert(index, item); _callback(); } public bool Remove(T item) { var result = _list.Remove(item); if (result) { _callback(); } return result; } public void RemoveAt(int index) { _list.RemoveAt(index); _callback(); } IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } ================================================ FILE: src/Spectre.Console/Internal/ConsoleHelper.cs ================================================ namespace Spectre.Console; internal static class ConsoleHelper { public static int GetSafeWidth(int defaultValue = Constants.DefaultTerminalWidth) { try { var width = System.Console.BufferWidth; if (width == 0) { width = defaultValue; } return width; } catch (IOException) { return defaultValue; } } public static int GetSafeHeight(int defaultValue = Constants.DefaultTerminalHeight) { try { var height = System.Console.WindowHeight; if (height == 0) { height = defaultValue; } return height; } catch (IOException) { return defaultValue; } } } ================================================ FILE: src/Spectre.Console/Internal/Constants.cs ================================================ namespace Spectre.Console; internal static class Constants { public const int DefaultTerminalWidth = 80; public const int DefaultTerminalHeight = 24; public const string EmptyLink = "https://emptylink"; } ================================================ FILE: src/Spectre.Console/Internal/DecorationTable.cs ================================================ namespace Spectre.Console; internal static class DecorationTable { private static readonly Dictionary _lookup; private static readonly Dictionary _reverseLookup; static DecorationTable() { _lookup = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "none", Decoration.None }, { "bold", Decoration.Bold }, { "b", Decoration.Bold }, { "dim", Decoration.Dim }, { "italic", Decoration.Italic }, { "i", Decoration.Italic }, { "underline", Decoration.Underline }, { "u", Decoration.Underline }, { "invert", Decoration.Invert }, { "reverse", Decoration.Invert }, { "conceal", Decoration.Conceal }, { "blink", Decoration.SlowBlink }, { "slowblink", Decoration.SlowBlink }, { "rapidblink", Decoration.RapidBlink }, { "strike", Decoration.Strikethrough }, { "strikethrough", Decoration.Strikethrough }, { "s", Decoration.Strikethrough }, }; _reverseLookup = new Dictionary(); foreach (var (name, decoration) in _lookup) { // Cannot happen, but the compiler thinks so... if (decoration == null) { continue; } _reverseLookup.TryAdd(decoration.Value, name); } } public static Decoration? GetDecoration(string name) { _lookup.TryGetValue(name, out var result); return result; } public static List GetMarkupNames(Decoration decoration) { var result = new List(); EnumUtils.GetValues() .Where(flag => (decoration & flag) != 0) .ForEach(flag => { if (flag != Decoration.None && _reverseLookup.TryGetValue(flag, out var name)) { result.Add(name); } }); return result; } } ================================================ FILE: src/Spectre.Console/Internal/DefaultExclusivityMode.cs ================================================ namespace Spectre.Console; internal sealed class DefaultExclusivityMode : IExclusivityMode { private readonly SemaphoreSlim _semaphore; public DefaultExclusivityMode() { _semaphore = new SemaphoreSlim(1, 1); } public T Run(Func func) { // Try acquiring the exclusivity semaphore if (!_semaphore.Wait(0)) { throw CreateExclusivityException(); } try { return func(); } finally { _semaphore.Release(1); } } public async Task RunAsync(Func> func) { // Try acquiring the exclusivity semaphore if (!await _semaphore.WaitAsync(0).ConfigureAwait(false)) { throw CreateExclusivityException(); } try { return await func().ConfigureAwait(false); } finally { _semaphore.Release(1); } } private static Exception CreateExclusivityException() => new InvalidOperationException( "Trying to run one or more interactive functions concurrently. " + "Operations with dynamic displays (e.g. a prompt and a progress display) " + "cannot be running at the same time."); } ================================================ FILE: src/Spectre.Console/Internal/DefaultInput.cs ================================================ namespace Spectre.Console; internal sealed class DefaultInput : IAnsiConsoleInput { private readonly Profile _profile; public DefaultInput(Profile profile) { _profile = profile ?? throw new ArgumentNullException(nameof(profile)); } public bool IsKeyAvailable() { if (!_profile.Capabilities.Interactive) { throw new InvalidOperationException("Failed to read input in non-interactive mode."); } return System.Console.KeyAvailable; } public ConsoleKeyInfo? ReadKey(bool intercept) { if (!_profile.Capabilities.Interactive) { throw new InvalidOperationException("Failed to read input in non-interactive mode."); } return System.Console.ReadKey(intercept); } public async Task ReadKeyAsync(bool intercept, CancellationToken cancellationToken) { if (!_profile.Capabilities.Interactive) { throw new InvalidOperationException("Failed to read input in non-interactive mode."); } while (true) { if (cancellationToken.IsCancellationRequested) { return null; } if (System.Console.KeyAvailable) { break; } await Task.Delay(5, cancellationToken).ConfigureAwait(false); } return ReadKey(intercept); } } ================================================ FILE: src/Spectre.Console/Internal/FileSize.cs ================================================ namespace Spectre.Console; internal readonly struct FileSize { public double Bytes { get; } public double Bits => Bytes * 8; public FileSizePrefix Prefix { get; } = FileSizePrefix.None; private readonly FileSizeBase _prefixBase = FileSizeBase.Binary; /// /// If enabled, will display the output in bits, rather than bytes. /// private readonly bool _showBits = false; public string Suffix => GetSuffix(); public FileSize(double bytes) { Bytes = bytes; Prefix = DetectPrefix(bytes); } public FileSize(double bytes, FileSizeBase @base) { Bytes = bytes; _prefixBase = @base; Prefix = DetectPrefix(bytes); } public FileSize(double bytes, FileSizeBase @base, bool showBits) { Bytes = bytes; _showBits = showBits; _prefixBase = @base; Prefix = DetectPrefix(bytes); } public FileSize(double bytes, FileSizePrefix prefix) { Bytes = bytes; Prefix = prefix; } public FileSize(double bytes, FileSizePrefix prefix, FileSizeBase @base, bool showBits) { Bytes = bytes; _showBits = showBits; _prefixBase = @base; Prefix = prefix; } public string Format(CultureInfo? culture = null) { var unitBase = Math.Pow((int)_prefixBase, (int)Prefix); if (_showBits) { var bits = Bits / unitBase; return Prefix == FileSizePrefix.None ? ((int)bits).ToString(culture ?? CultureInfo.InvariantCulture) : bits.ToString("F1", culture ?? CultureInfo.InvariantCulture); } var bytes = Bytes / unitBase; return Prefix == FileSizePrefix.None ? ((int)bytes).ToString(culture ?? CultureInfo.InvariantCulture) : bytes.ToString("F1", culture ?? CultureInfo.InvariantCulture); } public override string ToString() { return ToString(suffix: true, CultureInfo.InvariantCulture); } public string ToString(bool suffix = true, CultureInfo? culture = null) { if (suffix) { return $"{Format(culture)} {Suffix}"; } return Format(culture); } private string GetSuffix() { return (Bytes, Unit: Prefix, PrefixBase: _prefixBase, ShowBits: _showBits) switch { (_, FileSizePrefix.Kilo, FileSizeBase.Binary, false) => "KiB", (_, FileSizePrefix.Mega, FileSizeBase.Binary, false) => "MiB", (_, FileSizePrefix.Giga, FileSizeBase.Binary, false) => "GiB", (_, FileSizePrefix.Tera, FileSizeBase.Binary, false) => "TiB", (_, FileSizePrefix.Peta, FileSizeBase.Binary, false) => "PiB", (_, FileSizePrefix.Exa, FileSizeBase.Binary, false) => "EiB", (_, FileSizePrefix.Zetta, FileSizeBase.Binary, false) => "ZiB", (_, FileSizePrefix.Yotta, FileSizeBase.Binary, false) => "YiB", (_, FileSizePrefix.Kilo, FileSizeBase.Binary, true) => "Kibit", (_, FileSizePrefix.Mega, FileSizeBase.Binary, true) => "Mibit", (_, FileSizePrefix.Giga, FileSizeBase.Binary, true) => "Gibit", (_, FileSizePrefix.Tera, FileSizeBase.Binary, true) => "Tibit", (_, FileSizePrefix.Peta, FileSizeBase.Binary, true) => "Pibit", (_, FileSizePrefix.Exa, FileSizeBase.Binary, true) => "Eibit", (_, FileSizePrefix.Zetta, FileSizeBase.Binary, true) => "Zibit", (_, FileSizePrefix.Yotta, FileSizeBase.Binary, true) => "Yibit", (_, FileSizePrefix.Kilo, FileSizeBase.Decimal, false) => "KB", (_, FileSizePrefix.Mega, FileSizeBase.Decimal, false) => "MB", (_, FileSizePrefix.Giga, FileSizeBase.Decimal, false) => "GB", (_, FileSizePrefix.Tera, FileSizeBase.Decimal, false) => "TB", (_, FileSizePrefix.Peta, FileSizeBase.Decimal, false) => "PB", (_, FileSizePrefix.Exa, FileSizeBase.Decimal, false) => "EB", (_, FileSizePrefix.Zetta, FileSizeBase.Decimal, false) => "ZB", (_, FileSizePrefix.Yotta, FileSizeBase.Decimal, false) => "YB", (_, FileSizePrefix.Kilo, FileSizeBase.Decimal, true) => "Kbit", (_, FileSizePrefix.Mega, FileSizeBase.Decimal, true) => "Mbit", (_, FileSizePrefix.Giga, FileSizeBase.Decimal, true) => "Gbit", (_, FileSizePrefix.Tera, FileSizeBase.Decimal, true) => "Tbit", (_, FileSizePrefix.Peta, FileSizeBase.Decimal, true) => "Pbit", (_, FileSizePrefix.Exa, FileSizeBase.Decimal, true) => "Ebit", (_, FileSizePrefix.Zetta, FileSizeBase.Decimal, true) => "Zbit", (_, FileSizePrefix.Yotta, FileSizeBase.Decimal, true) => "Ybit", (1, _, _, true) => "bit", (_, _, _, true) => "bits", (1, _, _, false) => "byte", (_, _, _, false) => "bytes", }; } private FileSizePrefix DetectPrefix(double bytes) { if (_showBits) { bytes *= 8; } foreach (var prefix in EnumUtils.GetValues()) { // Trying to find the largest unit, that the number of bytes can fit under. Ex. 40kb < 1mb if (bytes < Math.Pow((int)_prefixBase, (int)prefix + 1)) { return prefix; } } return FileSizePrefix.None; } } ================================================ FILE: src/Spectre.Console/Internal/FileSizeBase.cs ================================================ namespace Spectre.Console; /// /// Determines possible file size base prefixes. (base 2/base 10). /// public enum FileSizeBase { /// /// The SI prefix definition (base 10) of kilobyte, megabyte, etc. /// Decimal = 1000, /// /// The IEC binary prefix definition (base 2) of kibibyte, mebibyte, etc. /// Binary = 1024, } ================================================ FILE: src/Spectre.Console/Internal/FileSizePrefix.cs ================================================ namespace Spectre.Console; internal enum FileSizePrefix { None = 0, Kilo = 1, Mega = 2, Giga = 3, Tera = 4, Peta = 5, Exa = 6, Zetta = 7, Yotta = 8, } ================================================ FILE: src/Spectre.Console/Internal/IRatioResolvable.cs ================================================ namespace Spectre.Console; /// /// Represents something that can be used to resolve ratios. /// internal interface IRatioResolvable { /// /// Gets the ratio. /// int Ratio { get; } /// /// Gets the size. /// int? Size { get; } /// /// Gets the minimum size. /// int MinimumSize { get; } } ================================================ FILE: src/Spectre.Console/Internal/Polyfill/CancellationToken.cs ================================================ #if NETSTANDARD2_0 namespace Spectre.Console; internal static class CancellationTokenHelpers { public static Task CancelAsync(this CancellationTokenSource cts) { cts.Cancel(); return Task.CompletedTask; } } #endif ================================================ FILE: src/Spectre.Console/Internal/Polyfill/EnumHelpers.cs ================================================ namespace Spectre.Console; internal static class EnumUtils { public static T[] GetValues() where T : struct, Enum { return #if NET6_0_OR_GREATER Enum.GetValues(); #else (T[])Enum.GetValues(typeof(T)); #endif } } ================================================ FILE: src/Spectre.Console/Internal/Ratio.cs ================================================ // Ported from Rich by Will McGugan, licensed under MIT. // https://github.com/willmcgugan/rich/blob/527475837ebbfc427530b3ee0d4d0741d2d0fc6d/rich/_ratio.py namespace Spectre.Console; internal static class Ratio { public static List Resolve(int total, IEnumerable edges) { static (int Div, float Mod) DivMod(float x, float y) { var (div, mod) = ((int)(x / y), x % y); // If remainder is within .0001 of 1 then we round up if (!(mod > 0.9999)) { return (div, mod); } div++; mod = 0; return (div, mod); } static int? GetEdgeWidth(IRatioResolvable edge) { if (edge.Size != null && edge.Size < edge.MinimumSize) { return edge.MinimumSize; } return edge.Size; } var sizes = edges.Select(GetEdgeWidth).ToArray(); while (sizes.Any(s => s == null)) { // Get all edges and map them back to their index. // Ignore edges which have a explicit size. var flexibleEdges = sizes.Zip(edges, (a, b) => (Size: a, Edge: b)) .Enumerate() .Select(x => (x.Index, x.Item.Size, x.Item.Edge)) .Where(x => x.Size == null) .ToList(); // Get the remaining space var remaining = total - sizes.Select(size => size ?? 0).Sum(); if (remaining <= 0) { // No more room for flexible edges. return sizes .Zip(edges, (size, edge) => (Size: size, Edge: edge)) .Select(zip => zip.Size ?? zip.Edge.MinimumSize) .Select(size => size > 0 ? size : 1) .ToList(); } var portion = (float)remaining / flexibleEdges.Sum(x => Math.Max(1, x.Edge.Ratio)); var invalidate = false; foreach (var (index, size, edge) in flexibleEdges) { if (portion * edge.Ratio <= edge.MinimumSize) { sizes[index] = edge.MinimumSize; // New fixed size will invalidate calculations, // so we need to repeat the process invalidate = true; break; } } if (!invalidate) { var remainder = 0f; foreach (var flexibleEdge in flexibleEdges) { var (div, mod) = DivMod((portion * flexibleEdge.Edge.Ratio) + remainder, 1); remainder = mod; sizes[flexibleEdge.Index] = div; } } } return sizes.Select(x => x ?? 1).ToList(); } public static List Reduce(int total, List ratios, List maximums, List values) { ratios = ratios.Zip(maximums, (a, b) => (ratio: a, max: b)).Select(a => a.max > 0 ? a.ratio : 0).ToList(); var totalRatio = ratios.Sum(); if (totalRatio <= 0) { return values; } var totalRemaining = total; var result = new List(); foreach (var (ratio, maximum, value) in ratios.ZipThree(maximums, values)) { if (ratio != 0 && totalRatio > 0) { var distributed = (int)Math.Min(maximum, Math.Round((double)(ratio * totalRemaining / totalRatio))); result.Add(value - distributed); totalRemaining -= distributed; totalRatio -= ratio; } else { result.Add(value); } } return result; } public static List Distribute(int total, IList ratios, IList? minimums = null) { if (minimums != null) { ratios = ratios.Zip(minimums, (a, b) => (ratio: a, min: b)).Select(a => a.min > 0 ? a.ratio : 0).ToList(); } var totalRatio = ratios.Sum(); Debug.Assert(totalRatio > 0, "Sum or ratios must be > 0"); var totalRemaining = total; var distributedTotal = new List(); minimums ??= ratios.Select(_ => 0).ToList(); foreach (var (ratio, minimum) in ratios.Zip(minimums, (a, b) => (a, b))) { var distributed = (totalRatio > 0) ? Math.Max(minimum, (int)Math.Ceiling(ratio * totalRemaining / (double)totalRatio)) : totalRemaining; distributedTotal.Add(distributed); totalRatio -= ratio; totalRemaining -= distributed; } return distributedTotal; } } ================================================ FILE: src/Spectre.Console/Internal/ResourceReader.cs ================================================ namespace Spectre.Console; internal static class ResourceReader { public static string ReadManifestData(string resourceName) { ArgumentNullException.ThrowIfNull(resourceName); var assembly = typeof(ResourceReader).Assembly; resourceName = resourceName.ReplaceExact("/", "."); using (var stream = assembly.GetManifestResourceStream(resourceName)) { if (stream == null) { throw new InvalidOperationException("Could not load manifest resource stream."); } using (var reader = new StreamReader(stream)) { return reader.ReadToEnd().NormalizeNewLines(); } } } } ================================================ FILE: src/Spectre.Console/Internal/Text/Encoding/EncoderCapabilities.cs ================================================ namespace Spectre.Console; internal sealed class EncoderCapabilities : IReadOnlyCapabilities { public ColorSystem ColorSystem { get; } public bool Ansi => false; public bool Links => false; public bool Legacy => false; public bool IsTerminal => false; public bool Interactive => false; public bool Unicode => true; public bool AlternateBuffer => false; public EncoderCapabilities(ColorSystem colors) { ColorSystem = colors; } } ================================================ FILE: src/Spectre.Console/Internal/Text/Encoding/HtmlEncoder.cs ================================================ namespace Spectre.Console; internal sealed class HtmlEncoder : IAnsiConsoleEncoder { public string Encode(IAnsiConsole console, IEnumerable renderables) { var context = RenderOptions.Create(console, new EncoderCapabilities(ColorSystem.TrueColor)); var builder = new StringBuilder(); builder.Append("
\n");

        foreach (var renderable in renderables)
        {
            var segments = renderable.Render(context, console.Profile.Width);
            foreach (var (_, first, _, segment) in segments.Enumerate())
            {
                if (segment.IsControlCode)
                {
                    continue;
                }

                if (segment.Text == "\n" && !first)
                {
                    builder.Append('\n');
                    continue;
                }

                var parts = segment.Text.Split(['\n'], StringSplitOptions.None);
                foreach (var (_, _, last, line) in parts.Enumerate())
                {
                    if (string.IsNullOrEmpty(line))
                    {
                        continue;
                    }

                    builder.Append("');
                    builder.Append(line);
                    builder.Append("");

                    if (parts.Length > 1 && !last)
                    {
                        builder.Append('\n');
                    }
                }
            }
        }

        builder.Append("
"); return builder.ToString().TrimEnd('\n'); } private static string BuildCss(Style style) { var css = new List(); var foreground = style.Foreground; var background = style.Background; if ((style.Decoration & Decoration.Invert) != 0) { var temp = foreground; foreground = background; background = temp; } if ((style.Decoration & Decoration.Dim) != 0) { var blender = background; if (blender.Equals(Color.Default)) { blender = Color.White; } foreground = foreground.Blend(blender, 0.5f); } if (!foreground.Equals(Color.Default)) { css.Add($"color: #{foreground.ToHex()}"); } if (!background.Equals(Color.Default)) { css.Add($"background-color: #{background.ToHex()}"); } if ((style.Decoration & Decoration.Bold) != 0) { css.Add("font-weight: bold"); } if ((style.Decoration & Decoration.Italic) != 0) { css.Add("font-style: italic"); } if ((style.Decoration & Decoration.Underline) != 0) { css.Add("text-decoration: underline"); } if ((style.Decoration & Decoration.Strikethrough) != 0) { css.Add("text-decoration: line-through"); } return string.Join(";", css); } } ================================================ FILE: src/Spectre.Console/Internal/Text/Encoding/TextEncoder.cs ================================================ namespace Spectre.Console; internal sealed class TextEncoder : IAnsiConsoleEncoder { public string Encode(IAnsiConsole console, IEnumerable renderables) { var context = RenderOptions.Create(console, new EncoderCapabilities(ColorSystem.TrueColor)); var builder = new StringBuilder(); foreach (var renderable in renderables) { var segments = renderable.Render(context, console.Profile.Width); foreach (var segment in Segment.Merge(segments)) { if (segment.IsControlCode) { continue; } builder.Append(segment.Text); } } return builder.ToString().TrimEnd('\n'); } } ================================================ FILE: src/Spectre.Console/Internal/Text/StringBuffer.cs ================================================ namespace Spectre.Console; internal sealed class StringBuffer : IDisposable { private readonly StringReader _reader; private readonly int _length; public int Position { get; private set; } public bool Eof => Position >= _length; public StringBuffer(string text) { text ??= string.Empty; _reader = new StringReader(text); _length = text.Length; Position = 0; } public void Dispose() { _reader.Dispose(); } public char Expect(char character) { var read = Read(); if (read != character) { throw new InvalidOperationException($"Expected '{character}', but found '{read}'"); } return read; } public char Peek() { if (Eof) { return '\0'; } return (char)_reader.Peek(); } public char Read() { if (Eof) { return '\0'; } Position++; return (char)_reader.Read(); } } ================================================ FILE: src/Spectre.Console/Internal/Text/WhiteSpaceSegmentEnumerator.cs ================================================ namespace Spectre.Console; internal ref struct WhiteSpaceSegmentEnumerator { private ReadOnlySpan _remaining; private ReadOnlySpan _current; public WhiteSpaceSegmentEnumerator(ReadOnlySpan buffer) { _remaining = buffer; _current = default; } public ReadOnlySpan Current => _current; public WhiteSpaceSegmentEnumerator GetEnumerator() => this; public bool MoveNext() { if (_remaining.IsEmpty) { _current = default; return false; } var i = 0; var isWhiteSpace = false; for (; i < _remaining.Length; i++) { if (i == 0) { isWhiteSpace = char.IsWhiteSpace(_remaining[i]); } else if (char.IsWhiteSpace(_remaining[i]) != isWhiteSpace) { break; } } _current = _remaining[..i]; _remaining = _remaining[i..]; return true; } } ================================================ FILE: src/Spectre.Console/Internal/TypeConverterHelper.cs ================================================ namespace Spectre.Console; internal static class TypeConverterHelper { internal const DynamicallyAccessedMemberTypes ConverterAnnotation = DynamicallyAccessedMemberTypes.PublicParameterlessConstructor | DynamicallyAccessedMemberTypes.PublicFields; internal static bool IsGetConverterSupported => !AppContext.TryGetSwitch("Spectre.Console.TypeConverterHelper.IsGetConverterSupported ", out var enabled) || enabled; public static string ConvertToString(T input) { var result = GetTypeConverter().ConvertToInvariantString(input); if (result == null) { throw new InvalidOperationException("Could not convert input to a string"); } return result; } public static bool TryConvertFromString(string input, [MaybeNull] out T? result) { try { result = (T?)GetTypeConverter().ConvertFromInvariantString(input); return true; } catch { result = default; return false; } } public static bool TryConvertFromStringWithCulture(string input, CultureInfo? info, [MaybeNull] out T? result) { try { if (info == null) { return TryConvertFromString(input, out result); } else { result = (T?)GetTypeConverter().ConvertFromString(null!, info, input); } return true; } catch { result = default; return false; } } public static TypeConverter GetTypeConverter() { var converter = GetConverter(); if (converter != null) { return converter; } var attribute = typeof(T).GetCustomAttribute(); if (attribute != null) { var type = Type.GetType(attribute.ConverterTypeName, false, false); if (type != null) { converter = Activator.CreateInstance(type) as TypeConverter; if (converter != null) { return converter; } } } throw new InvalidOperationException("Could not find type converter"); [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2087", Justification = "Feature switches are not currently supported in the analyzer")] [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2026", Justification = "Feature switches are not currently supported in the analyzer")] static TypeConverter? GetConverter() { if (IsGetConverterSupported) { // Spectre.Console.TypeConverterHelper.IsGetConverterSupported has been set so // fallback to original behavior return TypeDescriptor.GetConverter(typeof(T)); } // otherwise try and use the intrinsic converter. if we can't find one, then // try and use GetConverter. var intrinsicConverter = GetIntrinsicConverter(typeof(T)); return intrinsicConverter ?? TypeDescriptor.GetConverter(typeof(T)); } } private delegate TypeConverter FuncWithDam([DynamicallyAccessedMembers(ConverterAnnotation)] Type type); private static readonly Dictionary _intrinsicConverters; static TypeConverterHelper() { _intrinsicConverters = new() { [typeof(bool)] = _ => new BooleanConverter(), [typeof(byte)] = _ => new ByteConverter(), [typeof(sbyte)] = _ => new SByteConverter(), [typeof(char)] = _ => new CharConverter(), [typeof(double)] = _ => new DoubleConverter(), [typeof(string)] = _ => new StringConverter(), [typeof(int)] = _ => new Int32Converter(), [typeof(short)] = _ => new Int16Converter(), [typeof(long)] = _ => new Int64Converter(), [typeof(float)] = _ => new SingleConverter(), [typeof(ushort)] = _ => new UInt16Converter(), [typeof(uint)] = _ => new UInt32Converter(), [typeof(ulong)] = _ => new UInt64Converter(), [typeof(object)] = _ => new TypeConverter(), [typeof(CultureInfo)] = _ => new CultureInfoConverter(), [typeof(DateTime)] = _ => new DateTimeConverter(), [typeof(DateTimeOffset)] = _ => new DateTimeOffsetConverter(), [typeof(decimal)] = _ => new DecimalConverter(), [typeof(TimeSpan)] = _ => new TimeSpanConverter(), [typeof(Guid)] = _ => new GuidConverter(), [typeof(Uri)] = _ => new UriTypeConverter(), [typeof(Array)] = _ => new ArrayConverter(), [typeof(ICollection)] = _ => new CollectionConverter(), [typeof(Enum)] = CreateEnumConverter(), #if !NETSTANDARD2_0 [typeof(Int128)] = _ => new Int128Converter(), [typeof(Half)] = _ => new HalfConverter(), [typeof(UInt128)] = _ => new UInt128Converter(), [typeof(DateOnly)] = _ => new DateOnlyConverter(), [typeof(TimeOnly)] = _ => new TimeOnlyConverter(), [typeof(Version)] = _ => new VersionConverter(), #endif }; } [UnconditionalSuppressMessage("ReflectionAnalysis", "IL2111", Justification = "Delegate reflection is safe for all usages in this type.")] private static FuncWithDam CreateEnumConverter() => ([DynamicallyAccessedMembers(ConverterAnnotation)] Type type) => new EnumConverter(type); /// /// A highly-constrained version of that only returns intrinsic converters. /// private static TypeConverter? GetIntrinsicConverter([DynamicallyAccessedMembers(ConverterAnnotation)] Type type) { if (type.IsArray) { type = typeof(Array); } if (typeof(ICollection).IsAssignableFrom(type)) { type = typeof(ICollection); } if (type.IsEnum) { type = typeof(Enum); } if (_intrinsicConverters.TryGetValue(type, out var factory)) { return factory(type); } return null; } } ================================================ FILE: src/Spectre.Console/Justify.cs ================================================ namespace Spectre.Console; /// /// Represents text justification. /// public enum Justify { /// /// Left justified. /// Left = 0, /// /// Right justified. /// Right = 1, /// /// Centered. /// Center = 2, } ================================================ FILE: src/Spectre.Console/Live/LiveDisplay.cs ================================================ namespace Spectre.Console; /// /// Represents a live display. /// public sealed class LiveDisplay { private readonly IAnsiConsole _console; private readonly IRenderable _target; /// /// Gets or sets a value indicating whether or not the live display should /// be cleared when it's done. /// Defaults to false. /// public bool AutoClear { get; set; } /// /// Gets or sets the vertical overflow strategy. /// public VerticalOverflow Overflow { get; set; } = VerticalOverflow.Ellipsis; /// /// Gets or sets the vertical overflow cropping strategy. /// public VerticalOverflowCropping Cropping { get; set; } = VerticalOverflowCropping.Top; /// /// Initializes a new instance of the class. /// /// The console. /// The target renderable to update. public LiveDisplay(IAnsiConsole console, IRenderable target) { _console = console ?? throw new ArgumentNullException(nameof(console)); _target = target ?? throw new ArgumentNullException(nameof(target)); } /// /// Starts the live display. /// /// The action to execute. public void Start(Action action) { var task = StartAsync(ctx => { action(ctx); return Task.CompletedTask; }); task.GetAwaiter().GetResult(); } /// /// Starts the live display. /// /// The result type. /// The action to execute. /// The result. public T Start(Func func) { var task = StartAsync(ctx => Task.FromResult(func(ctx))); return task.GetAwaiter().GetResult(); } /// /// Starts the live display. /// /// The action to execute. /// The result. public async Task StartAsync(Func func) { ArgumentNullException.ThrowIfNull(func); _ = await StartAsync(async ctx => { await func(ctx).ConfigureAwait(false); return default; }).ConfigureAwait(false); } /// /// Starts the live display. /// /// The result type. /// The action to execute. /// The result. public async Task StartAsync(Func> func) { ArgumentNullException.ThrowIfNull(func); return await _console.RunExclusive(async () => { var context = new LiveDisplayContext(_console, _target); context.SetOverflow(Overflow, Cropping); var renderer = new LiveDisplayRenderer(_console, context); renderer.Started(); try { using (new RenderHookScope(_console, renderer)) { var result = await func(context).ConfigureAwait(false); context.Refresh(); return result; } } finally { renderer.Completed(AutoClear); } }).ConfigureAwait(false); } } /// /// Contains extension methods for . /// public static class LiveDisplayExtensions { /// /// Sets whether or not auto clear is enabled. /// If enabled, the live display will be cleared when done. /// /// The instance. /// Whether or not auto clear is enabled. /// The same instance so that multiple calls can be chained. public static LiveDisplay AutoClear(this LiveDisplay live, bool enabled) { ArgumentNullException.ThrowIfNull(live); live.AutoClear = enabled; return live; } /// /// Sets the vertical overflow strategy. /// /// The instance. /// The overflow strategy to use. /// The same instance so that multiple calls can be chained. public static LiveDisplay Overflow(this LiveDisplay live, VerticalOverflow overflow) { ArgumentNullException.ThrowIfNull(live); live.Overflow = overflow; return live; } /// /// Sets the vertical overflow cropping strategy. /// /// The instance. /// The overflow cropping strategy to use. /// The same instance so that multiple calls can be chained. public static LiveDisplay Cropping(this LiveDisplay live, VerticalOverflowCropping cropping) { ArgumentNullException.ThrowIfNull(live); live.Cropping = cropping; return live; } } ================================================ FILE: src/Spectre.Console/Live/LiveDisplayContext.cs ================================================ namespace Spectre.Console; /// /// Represents a context that can be used to interact with a . /// public sealed class LiveDisplayContext { private readonly IAnsiConsole _console; internal object Lock { get; } internal LiveRenderable Live { get; } internal LiveDisplayContext(IAnsiConsole console, IRenderable target) { _console = console ?? throw new ArgumentNullException(nameof(console)); Live = new LiveRenderable(_console, target); Lock = new(); } /// /// Updates the live display target. /// /// The new live display target. public void UpdateTarget(IRenderable? target) { lock (Lock) { Live.SetRenderable(target); Refresh(); } } /// /// Refreshes the live display. /// public void Refresh() { lock (Lock) { _console.Write(ControlCode.Empty); } } internal void SetOverflow(VerticalOverflow overflow, VerticalOverflowCropping cropping) { Live.Overflow = overflow; Live.OverflowCropping = cropping; } } ================================================ FILE: src/Spectre.Console/Live/LiveDisplayRenderer.cs ================================================ namespace Spectre.Console; internal sealed class LiveDisplayRenderer : IRenderHook { private readonly IAnsiConsole _console; private readonly LiveDisplayContext _context; public LiveDisplayRenderer(IAnsiConsole console, LiveDisplayContext context) { _console = console; _context = context; } public void Started() { _console.Cursor.Hide(); } public void Completed(bool autoclear) { lock (_context.Lock) { if (autoclear) { _console.Write(_context.Live.RestoreCursor()); } else { if (_context.Live.HasRenderable && _context.Live.DidOverflow) { // Redraw the whole live renderable _console.Write(_context.Live.RestoreCursor()); _context.Live.Overflow = VerticalOverflow.Visible; _console.Write(_context.Live.Target); } _console.WriteLine(); } _console.Cursor.Show(); } } public IEnumerable Process(RenderOptions options, IEnumerable renderables) { lock (_context.Lock) { yield return _context.Live.PositionCursor(options); foreach (var renderable in renderables) { yield return renderable; } yield return _context.Live; } } } ================================================ FILE: src/Spectre.Console/Live/LiveRenderable.cs ================================================ namespace Spectre.Console; internal sealed class LiveRenderable : Renderable { private readonly object _lock = new(); private readonly IAnsiConsole _console; private IRenderable? _renderable; private SegmentShape? _shape; public IRenderable? Target => _renderable; public bool DidOverflow { get; private set; } [MemberNotNullWhen(true, nameof(Target))] public bool HasRenderable => _renderable != null; public VerticalOverflow Overflow { get; set; } public VerticalOverflowCropping OverflowCropping { get; set; } public LiveRenderable(IAnsiConsole console) { _console = console ?? throw new ArgumentNullException(nameof(console)); Overflow = VerticalOverflow.Ellipsis; OverflowCropping = VerticalOverflowCropping.Top; } public LiveRenderable(IAnsiConsole console, IRenderable renderable) : this(console) { _renderable = renderable ?? throw new ArgumentNullException(nameof(renderable)); } public void SetRenderable(IRenderable? renderable) { lock (_lock) { _renderable = renderable; } } public IRenderable PositionCursor(RenderOptions options) { lock (_lock) { if (_shape == null) { return ControlCode.Empty; } // Check if the size have been reduced if (_shape.Value.Height > options.ConsoleSize.Height || _shape.Value.Width > options.ConsoleSize.Width) { // Important reset shape, so the size can shrink _shape = null; return ControlCode.Create(options.Capabilities, w => { w.EraseInDisplay(2); w.ClearScrollback(); w.CursorHome(); }); } var linesToMoveUp = _shape.Value.Height - 1; return ControlCode.Create(options.Capabilities, w => { w.Write("\r"); // More efficient than CHA (CSI 1 G)? w.CursorUp(linesToMoveUp); }); } } public IRenderable RestoreCursor() { lock (_lock) { if (_shape == null) { return ControlCode.Empty; } var linesToClear = _shape.Value.Height - 1; return ControlCode.Create(_console.Profile.Capabilities, w => { w.Write("\r"); // More efficient than CHA (CSI 1 G)? w.EraseInLine(2); for (var count = 0; count < linesToClear; count++) { w.CursorUp(1); w.EraseInLine(2); } }); } } protected override IEnumerable Render(RenderOptions options, int maxWidth) { lock (_lock) { DidOverflow = false; if (_renderable != null) { var segments = _renderable.Render(options, maxWidth); var lines = Segment.SplitLines(segments); var shape = SegmentShape.Calculate(options, lines); if (shape.Height > _console.Profile.Height) { if (Overflow == VerticalOverflow.Crop) { if (OverflowCropping == VerticalOverflowCropping.Bottom) { // Remove bottom lines var index = Math.Min(_console.Profile.Height, lines.Count); var count = lines.Count - index; lines.RemoveRange(index, count); } else { // Remove top lines var start = lines.Count - _console.Profile.Height; lines.RemoveRange(0, start); } shape = SegmentShape.Calculate(options, lines); } else if (Overflow == VerticalOverflow.Ellipsis) { var ellipsisText = _console.Profile.Capabilities.Unicode ? "…" : "..."; var ellipsis = new SegmentLine(((IRenderable)new Markup($"[yellow]{ellipsisText}[/]")).Render(options, maxWidth)); if (OverflowCropping == VerticalOverflowCropping.Bottom) { // Remove bottom lines var index = Math.Min(_console.Profile.Height - 1, lines.Count); var count = lines.Count - index; lines.RemoveRange(index, count); lines.Add(ellipsis); } else { // Remove top lines var start = lines.Count - _console.Profile.Height; lines.RemoveRange(0, start + 1); lines.Insert(0, ellipsis); } shape = SegmentShape.Calculate(options, lines); } DidOverflow = true; } _shape = _shape?.Inflate(shape) ?? shape; _shape.Value.Apply(options, ref lines); foreach (var (_, _, last, line) in lines.Enumerate()) { foreach (var item in line) { yield return item; } if (!last) { yield return Segment.LineBreak; } } yield break; } _shape = null; } } } ================================================ FILE: src/Spectre.Console/Live/Progress/Columns/DownloadedColumn.cs ================================================ namespace Spectre.Console; /// /// A column showing download progress. /// public sealed class DownloadedColumn : ProgressColumn { /// /// Gets or sets the to use. /// public CultureInfo? Culture { get; set; } /// /// Gets or sets the to use. /// public FileSizeBase Base { get; set; } = FileSizeBase.Binary; /// /// Gets or sets a value indicating whether to display the transfer speed in bits. /// public bool ShowBits { get; set; } /// public override IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime) { var total = new FileSize(task.MaxValue, Base, ShowBits); if (task.IsFinished) { return new Markup(string.Format( "[green]{0} {1}[/]", total.Format(Culture), total.Suffix)); } else { var downloaded = new FileSize(task.Value, total.Prefix, Base, ShowBits); return new Markup(string.Format( "{0}[grey]/[/]{1} [grey]{2}[/]", downloaded.Format(Culture), total.Format(Culture), total.Suffix)); } } } ================================================ FILE: src/Spectre.Console/Live/Progress/Columns/ElapsedTimeColumn.cs ================================================ namespace Spectre.Console; /// /// A column showing the elapsed time of a task. /// public sealed class ElapsedTimeColumn : ProgressColumn { /// protected internal override bool NoWrap => true; /// /// Gets or sets the style of the remaining time text. /// public Style Style { get; set; } = Color.Blue; /// public override IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime) { var elapsed = task.ElapsedTime; if (elapsed == null) { return new Markup("--:--:--"); } if (elapsed.Value.TotalHours > 99) { return new Markup("**:**:**"); } return new Text($"{elapsed.Value:hh\\:mm\\:ss}", Style); } /// public override int? GetColumnWidth(RenderOptions options) { return 8; } } ================================================ FILE: src/Spectre.Console/Live/Progress/Columns/PercentageColumn.cs ================================================ namespace Spectre.Console; /// /// A column showing task progress in percentage. /// public sealed class PercentageColumn : ProgressColumn { /// /// Gets or sets the style for a non-complete task. /// public Style Style { get; set; } = Style.Plain; /// /// Gets or sets the style for a completed task. /// public Style CompletedStyle { get; set; } = Color.Green; /// public override IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime) { var percentage = (int)task.Percentage; var style = percentage == 100 ? CompletedStyle : Style; return new Text($"{percentage}%", style).RightJustified(); } /// public override int? GetColumnWidth(RenderOptions options) { return 4; } } /// /// Contains extension methods for . /// public static class PercentageColumnExtensions { /// /// Sets the style for a non-complete task. /// /// The column. /// The style. /// The same instance so that multiple calls can be chained. public static PercentageColumn Style(this PercentageColumn column, Style style) { ArgumentNullException.ThrowIfNull(column); column.Style = style; return column; } /// /// Sets the style for a completed task. /// /// The column. /// The style. /// The same instance so that multiple calls can be chained. public static PercentageColumn CompletedStyle(this PercentageColumn column, Style style) { ArgumentNullException.ThrowIfNull(column); column.CompletedStyle = style; return column; } } ================================================ FILE: src/Spectre.Console/Live/Progress/Columns/ProgressBarColumn.cs ================================================ namespace Spectre.Console; /// /// A column showing task progress as a progress bar. /// public sealed class ProgressBarColumn : ProgressColumn { /// /// Gets or sets the width of the column. /// public int? Width { get; set; } = 40; /// /// Gets or sets the style of completed portions of the progress bar. /// public Style CompletedStyle { get; set; } = Color.Yellow; /// /// Gets or sets the style of a finished progress bar. /// public Style FinishedStyle { get; set; } = Color.Green; /// /// Gets or sets the style of remaining portions of the progress bar. /// public Style RemainingStyle { get; set; } = Color.Grey; /// /// Gets or sets the style of an indeterminate progress bar. /// public Style IndeterminateStyle { get; set; } = ProgressBar.DefaultPulseStyle; /// public override IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime) { return new ProgressBar { MaxValue = task.MaxValue, Value = task.Value, Width = Width, CompletedStyle = CompletedStyle, FinishedStyle = FinishedStyle, RemainingStyle = RemainingStyle, IndeterminateStyle = IndeterminateStyle, IsIndeterminate = task.IsIndeterminate, }; } } /// /// Contains extension methods for . /// public static class ProgressBarColumnExtensions { /// /// Sets the style of completed portions of the progress bar. /// /// The column. /// The style. /// The same instance so that multiple calls can be chained. public static ProgressBarColumn CompletedStyle(this ProgressBarColumn column, Style style) { ArgumentNullException.ThrowIfNull(column); column.CompletedStyle = style; return column; } /// /// Sets the style of a finished progress bar. /// /// The column. /// The style. /// The same instance so that multiple calls can be chained. public static ProgressBarColumn FinishedStyle(this ProgressBarColumn column, Style style) { ArgumentNullException.ThrowIfNull(column); column.FinishedStyle = style; return column; } /// /// Sets the style of remaining portions of the progress bar. /// /// The column. /// The style. /// The same instance so that multiple calls can be chained. public static ProgressBarColumn RemainingStyle(this ProgressBarColumn column, Style style) { ArgumentNullException.ThrowIfNull(column); column.RemainingStyle = style; return column; } } ================================================ FILE: src/Spectre.Console/Live/Progress/Columns/RemainingTimeColumn.cs ================================================ namespace Spectre.Console; /// /// A column showing the remaining time of a task. /// Displays "**:**:**" if the task is indeterminate or the remaining time is greater than 99 hours. /// public sealed class RemainingTimeColumn : ProgressColumn { /// protected internal override bool NoWrap => true; /// /// Gets or sets the style of the remaining time text. /// public Style Style { get; set; } = Color.Blue; /// public override IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime) { var remaining = task.RemainingTime; if (remaining == null) { return new Markup("--:--:--"); } if (remaining.Value.TotalHours > 99 || task.IsIndeterminate) { return new Markup("**:**:**"); } return new Text($"{remaining.Value:hh\\:mm\\:ss}", Style); } /// public override int? GetColumnWidth(RenderOptions options) { return 8; } } /// /// Contains extension methods for . /// public static class RemainingTimeColumnExtensions { /// /// Sets the style of the remaining time text. /// /// The column. /// The style. /// The same instance so that multiple calls can be chained. public static RemainingTimeColumn Style(this RemainingTimeColumn column, Style style) { ArgumentNullException.ThrowIfNull(column); column.Style = style; return column; } } ================================================ FILE: src/Spectre.Console/Live/Progress/Columns/SpinnerColumn.cs ================================================ namespace Spectre.Console; /// /// A column showing a spinner. /// public sealed class SpinnerColumn : ProgressColumn { private const string ACCUMULATED = "SPINNER_ACCUMULATED"; private const string INDEX = "SPINNER_INDEX"; private readonly Lock _lock; private Spinner _spinner; private int? _maxWidth; private string? _completed; private string? _pending; /// protected internal override bool NoWrap => true; /// /// Gets or sets the . /// public Spinner Spinner { get => _spinner; set { lock (_lock) { _spinner = value ?? Spinner.Known.Default; _maxWidth = null; } } } /// /// Gets or sets the text that should be shown instead /// of the spinner once a task completes. /// public string? CompletedText { get => _completed; set { _completed = value; _maxWidth = null; } } /// /// Gets or sets the text that should be shown instead /// of the spinner before a task begins. /// public string? PendingText { get => _pending; set { _pending = value; _maxWidth = null; } } /// /// Gets or sets the completed style. /// public Style? CompletedStyle { get; set; } /// /// Gets or sets the pending style. /// public Style? PendingStyle { get; set; } /// /// Gets or sets the style of the spinner. /// public Style? Style { get; set; } = Color.Yellow; /// /// Initializes a new instance of the class. /// public SpinnerColumn() : this(Spinner.Known.Default) { } /// /// Initializes a new instance of the class. /// /// The spinner to use. public SpinnerColumn(Spinner spinner) { _spinner = spinner ?? throw new ArgumentNullException(nameof(spinner)); _lock = LockFactory.Create(); } /// public override IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime) { var useAscii = !options.Unicode && _spinner.IsUnicode; var spinner = useAscii ? Spinner.Known.Ascii : _spinner ?? Spinner.Known.Default; if (!task.IsStarted) { return new Markup(PendingText ?? " ", PendingStyle ?? Spectre.Console.Style.Plain); } if (task.IsFinished) { return new Markup(CompletedText ?? " ", CompletedStyle ?? Spectre.Console.Style.Plain); } var accumulated = task.State.Update(ACCUMULATED, acc => acc + deltaTime.TotalMilliseconds); if (accumulated >= spinner.Interval.TotalMilliseconds) { task.State.Update(ACCUMULATED, _ => 0); task.State.Update(INDEX, index => index + 1); } var index = task.State.Get(INDEX); var frame = spinner.Frames[index % spinner.Frames.Count]; return new Markup(frame.EscapeMarkup(), Style ?? Spectre.Console.Style.Plain); } /// public override int? GetColumnWidth(RenderOptions options) { return GetMaxWidth(options); } private int GetMaxWidth(RenderOptions options) { lock (_lock) { if (_maxWidth == null) { var useAscii = !options.Unicode && _spinner.IsUnicode; var spinner = useAscii ? Spinner.Known.Ascii : _spinner ?? Spinner.Known.Default; _maxWidth = Math.Max( Math.Max( ((IRenderable)new Markup(PendingText ?? " ")).Measure(options, int.MaxValue).Max, ((IRenderable)new Markup(CompletedText ?? " ")).Measure(options, int.MaxValue).Max), spinner.Frames.Max(frame => Cell.GetCellLength(frame))); } return _maxWidth.Value; } } } /// /// Contains extension methods for . /// public static class SpinnerColumnExtensions { /// /// Sets the style of the spinner. /// /// The column. /// The style. /// The same instance so that multiple calls can be chained. public static SpinnerColumn Style(this SpinnerColumn column, Style? style) { ArgumentNullException.ThrowIfNull(column); column.Style = style; return column; } /// /// Sets the text that should be shown instead of the spinner /// once a task completes. /// /// The column. /// The text. /// The same instance so that multiple calls can be chained. public static SpinnerColumn CompletedText(this SpinnerColumn column, string? text) { ArgumentNullException.ThrowIfNull(column); column.CompletedText = text; return column; } /// /// Sets the completed style of the spinner. /// /// The column. /// The style. /// The same instance so that multiple calls can be chained. public static SpinnerColumn CompletedStyle(this SpinnerColumn column, Style? style) { ArgumentNullException.ThrowIfNull(column); column.CompletedStyle = style; return column; } } ================================================ FILE: src/Spectre.Console/Live/Progress/Columns/TaskDescriptionColumn.cs ================================================ namespace Spectre.Console; /// /// A column showing the task description. /// public sealed class TaskDescriptionColumn : ProgressColumn { /// protected internal override bool NoWrap => true; /// /// Gets or sets the alignment of the task description. /// public Justify Alignment { get; set; } = Justify.Right; /// public override IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime) { var text = task.Description?.RemoveNewLines()?.Trim(); return new Markup(text ?? string.Empty).Overflow(Overflow.Ellipsis).Justify(Alignment); } } ================================================ FILE: src/Spectre.Console/Live/Progress/Columns/TransferSpeedColumn.cs ================================================ namespace Spectre.Console; /// /// A column showing transfer speed. /// public sealed class TransferSpeedColumn : ProgressColumn { /// /// Gets or sets the to use. /// public CultureInfo? Culture { get; set; } /// /// Gets or sets the to use. /// public FileSizeBase Base { get; set; } = FileSizeBase.Binary; /// /// Gets or sets a value indicating whether to display the transfer speed in bits. /// public bool ShowBits { get; set; } /// public override IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime) { if (task.Speed == null) { return new Text("?/s"); } if (task.IsFinished) { return new Markup(string.Empty, Style.Plain); } else { var size = new FileSize(task.Speed.Value, Base, ShowBits); return new Markup(string.Format("{0}/s", size.ToString(suffix: true, Culture))); } } } ================================================ FILE: src/Spectre.Console/Live/Progress/Progress.cs ================================================ namespace Spectre.Console; /// /// Represents a task list. /// public sealed class Progress { private readonly IAnsiConsole _console; private readonly TimeProvider _timeProvider; /// /// Gets or sets a optional custom render function. /// public Func, IRenderable> RenderHook { get; set; } = (renderable, _) => renderable; /// /// Gets or sets a value indicating whether or not task list should auto refresh. /// Defaults to true. /// public bool AutoRefresh { get; set; } = true; /// /// Gets or sets a value indicating whether or not the task list should /// be cleared once it completes. /// Defaults to false. /// public bool AutoClear { get; set; } /// /// Gets or sets a value indicating whether or not the task list should /// only include tasks not completed /// Defaults to false. /// public bool HideCompleted { get; set; } /// /// Gets or sets the refresh rate if AutoRefresh is enabled. /// Defaults to 10 times/second. /// public TimeSpan RefreshRate { get; set; } = TimeSpan.FromMilliseconds(100); internal List Columns { get; } internal ProgressRenderer? FallbackRenderer { get; set; } /// /// Initializes a new instance of the class. /// /// The console to render to. /// The time provider to use. Defaults to . public Progress(IAnsiConsole console, TimeProvider? timeProvider = null) { _console = console ?? throw new ArgumentNullException(nameof(console)); _timeProvider = timeProvider ?? TimeProvider.System; // Initialize with default columns Columns = [ new TaskDescriptionColumn(), new ProgressBarColumn(), new PercentageColumn() ]; } /// /// Starts the progress task list. /// /// The action to execute. public void Start(Action action) { var task = StartAsync(ctx => { action(ctx); return Task.CompletedTask; }); task.GetAwaiter().GetResult(); } /// /// Starts the progress task list and returns a result. /// /// The result type. /// he action to execute. /// The result. public T Start(Func func) { var task = StartAsync(ctx => Task.FromResult(func(ctx))); return task.GetAwaiter().GetResult(); } /// /// Starts the progress task list. /// /// The action to execute. /// A representing the asynchronous operation. public async Task StartAsync(Func action) { ArgumentNullException.ThrowIfNull(action); _ = await StartAsync(async progressContext => { await action(progressContext).ConfigureAwait(false); return null; }).ConfigureAwait(false); } /// /// Starts the progress task list and returns a result. /// /// The action to execute. /// The result type of task. /// A representing the asynchronous operation. public async Task StartAsync(Func> action) { ArgumentNullException.ThrowIfNull(action); return await _console.RunExclusive(async () => { var renderer = CreateRenderer(); renderer.Started(); T result; try { using (new RenderHookScope(_console, renderer)) { var context = new ProgressContext(_console, renderer, _timeProvider); if (AutoRefresh) { using (var thread = new ProgressRefreshThread(context, renderer.RefreshRate)) { result = await action(context).ConfigureAwait(false); } } else { result = await action(context).ConfigureAwait(false); } context.Refresh(); } } finally { renderer.Completed(AutoClear); } return result; }).ConfigureAwait(false); } private ProgressRenderer CreateRenderer() { var caps = _console.Profile.Capabilities; var interactive = caps.Interactive && caps.Ansi; if (interactive) { var columns = new List(Columns); return new DefaultProgressRenderer(_console, columns, RefreshRate, HideCompleted, RenderHook); } else { return FallbackRenderer ?? new FallbackProgressRenderer(_timeProvider); } } } /// /// Contains extension methods for . /// public static class ProgressExtensions { /// /// Sets the columns to be used for an instance. /// /// The instance. /// The columns to use. /// The same instance so that multiple calls can be chained. public static Progress Columns(this Progress progress, params ProgressColumn[] columns) { ArgumentNullException.ThrowIfNull(progress); ArgumentNullException.ThrowIfNull(columns); if (!columns.Any()) { throw new InvalidOperationException("At least one column must be specified."); } progress.Columns.Clear(); progress.Columns.AddRange(columns); return progress; } /// /// Sets an optional hook to intercept rendering. /// /// The instance. /// The custom render function. /// The same instance so that multiple calls can be chained. public static Progress UseRenderHook(this Progress progress, Func, IRenderable> renderHook) { progress.RenderHook = renderHook; return progress; } /// /// Sets whether or not auto refresh is enabled. /// If disabled, you will manually have to refresh the progress. /// /// The instance. /// Whether or not auto refresh is enabled. /// The same instance so that multiple calls can be chained. public static Progress AutoRefresh(this Progress progress, bool enabled) { ArgumentNullException.ThrowIfNull(progress); progress.AutoRefresh = enabled; return progress; } /// /// Sets whether or not auto clear is enabled. /// If enabled, the task tabled will be removed once /// all tasks have completed. /// /// The instance. /// Whether or not auto clear is enabled. /// The same instance so that multiple calls can be chained. public static Progress AutoClear(this Progress progress, bool enabled) { ArgumentNullException.ThrowIfNull(progress); progress.AutoClear = enabled; return progress; } /// /// Sets whether or not hide completed is enabled. /// If enabled, the task tabled will be removed once it is /// completed. /// /// The instance. /// Whether or not hide completed is enabled. /// The same instance so that multiple calls can be chained. public static Progress HideCompleted(this Progress progress, bool enabled) { ArgumentNullException.ThrowIfNull(progress); progress.HideCompleted = enabled; return progress; } } ================================================ FILE: src/Spectre.Console/Live/Progress/ProgressColumn.cs ================================================ namespace Spectre.Console; /// /// Represents a progress column. /// public abstract class ProgressColumn { /// /// Gets a value indicating whether or not content should not wrap. /// protected internal virtual bool NoWrap { get; } /// /// Gets a renderable representing the column. /// /// The render options. /// The task. /// The elapsed time since last call. /// A renderable representing the column. public abstract IRenderable Render(RenderOptions options, ProgressTask task, TimeSpan deltaTime); /// /// Gets the width of the column. /// /// The render options. /// The width of the column, or null to calculate. public virtual int? GetColumnWidth(RenderOptions options) { return null; } } ================================================ FILE: src/Spectre.Console/Live/Progress/ProgressContext.cs ================================================ namespace Spectre.Console; /// /// Represents a context that can be used to interact with a . /// public sealed class ProgressContext { private readonly List _tasks; private readonly Lock _taskLock; private readonly IAnsiConsole _console; private readonly ProgressRenderer _renderer; private readonly TimeProvider _timeProvider; private int _taskId; /// /// Gets a value indicating whether or not all started tasks have completed. /// public bool IsFinished { get { lock (_taskLock) { return _tasks.Where(x => x.IsStarted).All(task => task.IsFinished); } } } internal ProgressContext(IAnsiConsole console, ProgressRenderer renderer, TimeProvider timeProvider) { _tasks = []; _taskLock = LockFactory.Create(); _console = console ?? throw new ArgumentNullException(nameof(console)); _renderer = renderer ?? throw new ArgumentNullException(nameof(renderer)); _timeProvider = timeProvider ?? throw new ArgumentNullException(nameof(timeProvider)); } /// /// Adds a task. /// /// The task description. /// Whether or not the task should start immediately. /// The task's max value. /// The newly created task. public ProgressTask AddTask(string description, bool autoStart = true, double maxValue = 100) { lock (_taskLock) { var settings = new ProgressTaskSettings { AutoStart = autoStart, MaxValue = maxValue, }; return AddTaskAtInternal(description, settings, _tasks.Count); } } /// /// Adds a task. /// /// The task description. /// The index at which the task should be inserted. /// Whether or not the task should start immediately. /// The task's max value. /// The newly created task. public ProgressTask AddTaskAt(string description, int index, bool autoStart = true, double maxValue = 100) { lock (_taskLock) { var settings = new ProgressTaskSettings { AutoStart = autoStart, MaxValue = maxValue, }; return AddTaskAtInternal(description, settings, index); } } /// /// Adds a task before the reference task. /// /// The task description. /// The reference task to add before. /// Whether or not the task should start immediately. /// The task's max value. /// The newly created task. public ProgressTask AddTaskBefore(string description, ProgressTask referenceProgressTask, bool autoStart = true, double maxValue = 100) { lock (_taskLock) { var settings = new ProgressTaskSettings { AutoStart = autoStart, MaxValue = maxValue, }; var indexOfReference = _tasks.IndexOf(referenceProgressTask); return AddTaskAtInternal(description, settings, indexOfReference); } } /// /// Adds a task after the reference task. /// /// The task description. /// The reference task to add after. /// Whether or not the task should start immediately. /// The task's max value. /// The newly created task. public ProgressTask AddTaskAfter(string description, ProgressTask referenceProgressTask, bool autoStart = true, double maxValue = 100) { lock (_taskLock) { var settings = new ProgressTaskSettings { AutoStart = autoStart, MaxValue = maxValue, }; var indexOfReference = _tasks.IndexOf(referenceProgressTask); return AddTaskAtInternal(description, settings, indexOfReference + 1); } } /// /// Adds a task. /// /// The task description. /// The task settings. /// The newly created task. public ProgressTask AddTask(string description, ProgressTaskSettings settings) { lock (_taskLock) { return AddTaskAtInternal(description, settings, _tasks.Count); } } /// /// Adds a task at the specified index. /// /// The task description. /// The task settings. /// The index at which the task should be inserted. /// The newly created task. public ProgressTask AddTaskAt(string description, ProgressTaskSettings settings, int index) { lock (_taskLock) { return AddTaskAtInternal(description, settings, index); } } /// /// Adds a task before the reference task. /// /// The task description. /// The task settings. /// The reference task to add before. /// The newly created task. public ProgressTask AddTaskBefore(string description, ProgressTaskSettings settings, ProgressTask referenceProgressTask) { lock (_taskLock) { var indexOfReference = _tasks.IndexOf(referenceProgressTask); return AddTaskAtInternal(description, settings, indexOfReference); } } /// /// Adds a task after the reference task. /// /// The task description. /// The task settings. /// The reference task to add after. /// The newly created task. public ProgressTask AddTaskAfter(string description, ProgressTaskSettings settings, ProgressTask referenceProgressTask) { lock (_taskLock) { var indexOfReference = _tasks.IndexOf(referenceProgressTask); return AddTaskAtInternal(description, settings, indexOfReference + 1); } } /// /// Removes the task from the task collection. /// /// The task to remove. /// true if the task was successfully removed; otherwise, false. public bool RemoveTask(ProgressTask task) { lock (_taskLock) { return _tasks.Remove(task); } } /// /// Refreshes the current progress. /// public void Refresh() { _renderer.Update(this); _console.Write(ControlCode.Empty); } private ProgressTask AddTaskAtInternal(string description, ProgressTaskSettings settings, int position) { ArgumentNullException.ThrowIfNull(settings); var task = new ProgressTask(_taskId++, description, settings.MaxValue, settings.AutoStart, _timeProvider); _tasks.Insert(position, task); return task; } internal IReadOnlyList GetTasks() { lock (_taskLock) { return new List(_tasks); } } } ================================================ FILE: src/Spectre.Console/Live/Progress/ProgressRefreshThread.cs ================================================ namespace Spectre.Console; internal sealed class ProgressRefreshThread : IDisposable { private readonly ProgressContext _context; private readonly TimeSpan _refreshRate; private readonly ManualResetEvent _running; private readonly ManualResetEvent _stopped; private readonly Thread? _thread; public ProgressRefreshThread(ProgressContext context, TimeSpan refreshRate) { _context = context ?? throw new ArgumentNullException(nameof(context)); _refreshRate = refreshRate; _running = new ManualResetEvent(false); _stopped = new ManualResetEvent(false); _thread = new Thread(Run); _thread.IsBackground = true; _thread.Start(); } public void Dispose() { if (_thread == null || !_running.WaitOne(0)) { return; } _stopped.Set(); _thread.Join(); _stopped.Dispose(); _running.Dispose(); } private void Run() { _running.Set(); try { while (!_stopped.WaitOne(_refreshRate)) { _context.Refresh(); } } finally { _stopped.Reset(); _running.Reset(); } } } ================================================ FILE: src/Spectre.Console/Live/Progress/ProgressRenderer.cs ================================================ namespace Spectre.Console; internal abstract class ProgressRenderer : IRenderHook { public abstract TimeSpan RefreshRate { get; } public virtual void Started() { } public virtual void Completed(bool clear) { } public abstract void Update(ProgressContext context); public abstract IEnumerable Process(RenderOptions options, IEnumerable renderables); } ================================================ FILE: src/Spectre.Console/Live/Progress/ProgressSample.cs ================================================ namespace Spectre.Console; internal readonly struct ProgressSample { public double Value { get; } public DateTime Timestamp { get; } public ProgressSample(DateTime timestamp, double value) { Timestamp = timestamp; Value = value; } } ================================================ FILE: src/Spectre.Console/Live/Progress/ProgressTask.cs ================================================ namespace Spectre.Console; /// /// Represents a progress task. /// public sealed class ProgressTask : IProgress { private readonly Lazy> lazySamples; private readonly Lock _lock; private readonly TimeProvider _timeProvider; private double _maxValue; private string _description; private double _value; private volatile bool _samplesChanged; private double? _cachedLastSpeed; private DateTime _lastSpeedCalculation = DateTime.MinValue; private CircularBuffer Samples => lazySamples.Value; /// /// Gets the task ID. /// public int Id { get; } /// /// Gets or sets optional user tag data. /// public object? Tag { get; set; } /// /// Gets or sets a value indicating whether to override the default hiding behavior of this task when completed. /// public bool? HideWhenCompleted { get; set; } /// /// Gets or sets the task description. /// public string Description { get => _description; set => Update(description: value); } /// /// Gets or sets the max value of the task. /// public double MaxValue { get => _maxValue; set => Update(maxValue: value); } /// /// Gets or sets the value of the task. /// public double Value { get => _value; set => Update(value: value); } /// /// Gets the start time of the task. /// public DateTime? StartTime { get; private set; } /// /// Gets the stop time of the task. /// public DateTime? StopTime { get; private set; } /// /// Gets the task state. /// public ProgressTaskState State { get; } /// /// Gets a value indicating whether or not the task has started. /// public bool IsStarted => StartTime != null; /// /// Gets a value indicating whether or not the task has finished. /// public bool IsFinished => StopTime != null || Value >= MaxValue; /// /// Gets the percentage done of the task. /// public double Percentage => GetPercentage(); /// /// Gets the speed measured in steps/second. /// public double? Speed => GetSpeed(); /// /// Gets the elapsed time. /// public TimeSpan? ElapsedTime => GetElapsedTime(); /// /// Gets the remaining time. /// public TimeSpan? RemainingTime => GetRemainingTime(); /// /// Gets or sets the maximum time a calculated speed value is cached. /// When estimating speed, if the oldest sample is older than this value, the current time is used as the end of the timespan instead. /// This causes the predicted speed to naturally decay if no new samples are received. /// public TimeSpan MaxTimeForSpeedCache { get; set; } = TimeSpan.FromSeconds(1); /// /// Gets or sets a value indicating whether the ProgressBar shows /// actual values or generic, continuous progress feedback. /// public bool IsIndeterminate { get; set; } /// /// Initializes a new instance of the class. /// /// The task ID. /// The task description. /// The task max value. /// Whether or not the task should start automatically. /// The time provider to use. Defaults to . public ProgressTask(int id, string description, double maxValue, bool autoStart = true, TimeProvider? timeProvider = null) { lazySamples = new(() => new CircularBuffer(MaxSamplesKept) { UniqueRemovedCheck = false }); _lock = LockFactory.Create(); _timeProvider = timeProvider ?? TimeProvider.System; _maxValue = maxValue; _value = 0; _description = description?.RemoveNewLines()?.Trim() ?? throw new ArgumentNullException(nameof(description)); if (string.IsNullOrWhiteSpace(_description)) { throw new ArgumentException("Task name cannot be empty", nameof(description)); } Id = id; State = new ProgressTaskState(); StartTime = autoStart ? _timeProvider.GetLocalNow().LocalDateTime : null; } /// /// Starts the task. /// public void StartTask() { lock (_lock) { if (StopTime != null) { throw new InvalidOperationException("Stopped tasks cannot be restarted"); } StartTime = _timeProvider.GetLocalNow().LocalDateTime; StopTime = null; } } /// /// Stops and marks the task as finished. /// public void StopTask() { lock (_lock) { var now = _timeProvider.GetLocalNow().LocalDateTime; StartTime ??= now; StopTime = now; } } /// /// Increments the task's value. /// /// The value to increment with. public void Increment(double value) { Update(increment: value); } /// /// Gets or sets the maximum age of samples kept for calculating speed and estimated time remaining. /// Samples older than this value are discarded to more accurately reflect the current speed. /// public TimeSpan MaxSamplingAge { get; set; } = TimeSpan.FromSeconds(30); /// /// Gets or sets the maximum number of samples to keep for calculating speed and estimated time remaining. /// If set to 0, no samples are kept. /// public int MaxSamplesKept { get; set; } = 1000; private void Update( string? description = null, double? maxValue = null, double? increment = null, double? value = null) { lock (_lock) { var startValue = Value; if (description != null) { description = description?.RemoveNewLines()?.Trim(); if (string.IsNullOrWhiteSpace(description)) { throw new InvalidOperationException("Task name cannot be empty."); } _description = description; } if (maxValue != null) { _maxValue = maxValue.Value; } if (increment != null) { _value += increment.Value; } if (value != null) { _value = value.Value; } // Need to cap the max value? if (_value > _maxValue) { _value = _maxValue; } if (MaxSamplesKept == 0) { return; } _samplesChanged = true; var timestamp = _timeProvider.GetLocalNow().LocalDateTime; if (Samples.Count == 0 && StartTime != null) { Samples.Add(new ProgressSample(StartTime.Value, 0)); } Samples.Add(new ProgressSample(timestamp, Value - startValue)); } } private double GetPercentage() { if (MaxValue == 0) { return 100; } var percentage = (Value / MaxValue) * 100; percentage = Math.Min(100, Math.Max(0, percentage)); return percentage; } private double? GetSpeed() { var now = _timeProvider.GetLocalNow().LocalDateTime; if (!_samplesChanged && (now - _lastSpeedCalculation) < MaxTimeForSpeedCache) { return _cachedLastSpeed; } lock (_lock) { if (StartTime == null || !lazySamples.IsValueCreated || Samples.Count == 0 || StopTime != null) { return _cachedLastSpeed; } _lastSpeedCalculation = now; _samplesChanged = false; var threshold = now - MaxSamplingAge; var validSamples = Samples.Where(a => a.Timestamp >= threshold).ToList(); if (validSamples.Count == 0) { return _cachedLastSpeed = null; } var first = validSamples[0]; var newestSampleTime = Samples[Samples.Count - 1].Timestamp; if (StopTime == null) { if (now - newestSampleTime > MaxTimeForSpeedCache) { newestSampleTime = now; } } var totalTime = newestSampleTime - first.Timestamp; if (totalTime == TimeSpan.Zero) { return _cachedLastSpeed = null; } var totalCompleted = validSamples.Sum(x => x.Value); return _cachedLastSpeed = totalCompleted / totalTime.TotalSeconds; } } private TimeSpan? GetElapsedTime() { lock (_lock) { if (StartTime == null) { return null; } if (StopTime != null) { return StopTime - StartTime; } return _timeProvider.GetLocalNow().LocalDateTime - StartTime; } } private TimeSpan? GetRemainingTime() { lock (_lock) { if (IsFinished) { return TimeSpan.Zero; } var speed = GetSpeed(); if (speed == null || speed == 0) { return null; } // If the speed is near zero, the estimate below causes the // TimeSpan creation to throw an OverflowException. Just return // the maximum possible remaining time instead of overflowing. var estimate = (MaxValue - Value) / speed.Value; if (estimate > TimeSpan.MaxValue.TotalSeconds) { return TimeSpan.MaxValue; } return TimeSpan.FromSeconds(estimate); } } /// void IProgress.Report(double value) { Update(increment: value - Value); } } /// /// Contains extension methods for . /// public static class ProgressTaskExtensions { /// /// Sets the task description. /// /// The task. /// The description. /// The same instance so that multiple calls can be chained. public static ProgressTask Description(this ProgressTask task, string description) { ArgumentNullException.ThrowIfNull(task); task.Description = description; return task; } /// /// Sets the max value of the task. /// /// The task. /// The max value. /// The same instance so that multiple calls can be chained. public static ProgressTask MaxValue(this ProgressTask task, double value) { ArgumentNullException.ThrowIfNull(task); task.MaxValue = value; return task; } /// /// Sets the value of the task. /// /// The task. /// The value. /// The same instance so that multiple calls can be chained. public static ProgressTask Value(this ProgressTask task, double value) { ArgumentNullException.ThrowIfNull(task); task.Value = value; return task; } /// /// Sets whether the task is considered indeterminate or not. /// /// The task. /// Whether the task is considered indeterminate or not. /// The same instance so that multiple calls can be chained. public static ProgressTask IsIndeterminate(this ProgressTask task, bool indeterminate = true) { ArgumentNullException.ThrowIfNull(task); task.IsIndeterminate = indeterminate; return task; } /// /// Sets whether to override the default hiding behavior of this task when completed. /// /// The task. /// Whether the task should be hidden once completed or not. /// The same instance so that multiple calls can be chained. public static ProgressTask HideWhenCompleted(this ProgressTask task, bool hideWhenCompleted = true) { ArgumentNullException.ThrowIfNull(task); task.HideWhenCompleted = hideWhenCompleted; return task; } /// /// Sets the task's tag. /// /// The task. /// The tag. /// The same instance so that multiple calls can be chained. public static ProgressTask Tag(this ProgressTask task, object? tag) { ArgumentNullException.ThrowIfNull(task); task.Tag = tag; return task; } } ================================================ FILE: src/Spectre.Console/Live/Progress/ProgressTaskSettings.cs ================================================ namespace Spectre.Console; /// /// Represents settings for a progress task. /// public sealed class ProgressTaskSettings { /// /// Gets or sets the task's max value. /// Defaults to 100. /// public double MaxValue { get; set; } = 100; /// /// Gets or sets a value indicating whether or not the task /// will be auto started. Defaults to true. /// public bool AutoStart { get; set; } = true; /// /// Gets the default progress task settings. /// internal static ProgressTaskSettings Default { get; } = new ProgressTaskSettings(); } ================================================ FILE: src/Spectre.Console/Live/Progress/ProgressTaskState.cs ================================================ namespace Spectre.Console; /// /// Represents progress task state. /// public sealed class ProgressTaskState { private readonly Dictionary _state; private readonly Lock _lock; /// /// Initializes a new instance of the class. /// public ProgressTaskState() { _state = new Dictionary(); _lock = LockFactory.Create(); } /// /// Gets the state value for the specified key. /// /// The state value type. /// The state key. /// The value for the specified key. public T Get(string key) where T : struct { lock (_lock) { if (!_state.TryGetValue(key, out var value)) { return default; } if (!(value is T)) { throw new InvalidOperationException("State value is of the wrong type."); } return (T)value; } } /// /// Updates a task state value. /// /// The state value type. /// The key. /// The transformation function. /// The updated value. public T Update(string key, Func func) where T : struct { lock (_lock) { ArgumentNullException.ThrowIfNull(func); var old = default(T); if (_state.TryGetValue(key, out var value)) { if (!(value is T)) { throw new InvalidOperationException("State value is of the wrong type."); } old = (T)value; } _state[key] = func(old); return (T)_state[key]; } } } ================================================ FILE: src/Spectre.Console/Live/Progress/Renderers/DefaultProgressRenderer.cs ================================================ namespace Spectre.Console; internal sealed class DefaultProgressRenderer : ProgressRenderer { private readonly IAnsiConsole _console; private readonly List _columns; private readonly LiveRenderable _live; private readonly object _lock; private readonly Stopwatch _stopwatch; private readonly bool _hideCompleted; private readonly Func, IRenderable> _renderHook; private TimeSpan _lastUpdate; public override TimeSpan RefreshRate { get; } public DefaultProgressRenderer(IAnsiConsole console, List columns, TimeSpan refreshRate, bool hideCompleted, Func, IRenderable> renderHook) { _console = console ?? throw new ArgumentNullException(nameof(console)); _columns = columns ?? throw new ArgumentNullException(nameof(columns)); _live = new LiveRenderable(console); _lock = new(); _stopwatch = new Stopwatch(); _lastUpdate = TimeSpan.Zero; _hideCompleted = hideCompleted; _renderHook = renderHook; RefreshRate = refreshRate; } public override void Started() { _console.Cursor.Hide(); } public override void Completed(bool clear) { lock (_lock) { if (clear) { _console.Write(_live.RestoreCursor()); } else { if (_live.HasRenderable && _live.DidOverflow) { // Redraw the whole live renderable _console.Write(_live.RestoreCursor()); _live.Overflow = VerticalOverflow.Visible; _console.Write(_live.Target); } _console.WriteLine(); } _console.Cursor.Show(); } } public override void Update(ProgressContext context) { lock (_lock) { if (!_stopwatch.IsRunning) { _stopwatch.Start(); } var renderContext = RenderOptions.Create(_console, _console.Profile.Capabilities); var delta = _stopwatch.Elapsed - _lastUpdate; _lastUpdate = _stopwatch.Elapsed; var grid = new Grid(); for (var columnIndex = 0; columnIndex < _columns.Count; columnIndex++) { var column = new GridColumn().PadRight(1); var columnWidth = _columns[columnIndex].GetColumnWidth(renderContext); if (columnWidth != null) { column.Width = columnWidth; } if (_columns[columnIndex].NoWrap) { column.NoWrap(); } // Last column? if (columnIndex == _columns.Count - 1) { column.PadRight(0); } grid.AddColumn(column); } // Add rows var tasks = context.GetTasks(); var layout = new Grid(); layout.AddColumn(); foreach (var task in tasks.Where(tsk => !((tsk.HideWhenCompleted ?? _hideCompleted) && tsk.IsFinished))) { var columns = _columns.Select(column => column.Render(renderContext, task, delta)); grid.AddRow(columns.ToArray()); } layout.AddRow(grid); _live.SetRenderable(new Padder(_renderHook(layout, tasks), new Padding(0, 1))); } } public override IEnumerable Process(RenderOptions options, IEnumerable renderables) { lock (_lock) { yield return _live.PositionCursor(options); foreach (var renderable in renderables) { yield return renderable; } yield return _live; } } } ================================================ FILE: src/Spectre.Console/Live/Progress/Renderers/FallbackProgressRenderer.cs ================================================ namespace Spectre.Console; internal sealed class FallbackProgressRenderer : ProgressRenderer { private const double FirstMilestone = 25; private static readonly double?[] _milestones = [FirstMilestone, 50, 75, 95, 96, 97, 98, 99, 100]; private readonly Dictionary _taskMilestones; private readonly Lock _lock; private readonly TimeProvider _timeProvider; private IRenderable? _renderable; private DateTime _lastUpdate; public override TimeSpan RefreshRate => TimeSpan.FromSeconds(1); public FallbackProgressRenderer(TimeProvider timeProvider) { _taskMilestones = new Dictionary(); _lock = LockFactory.Create(); _timeProvider = timeProvider ?? throw new ArgumentNullException(nameof(timeProvider)); } public override void Update(ProgressContext context) { lock (_lock) { var hasStartedTasks = false; var updates = new List<(string, double)>(); foreach (var task in context.GetTasks()) { if (!task.IsStarted || task.IsFinished) { continue; } hasStartedTasks = true; if (TryAdvance(task.Id, task.Percentage)) { updates.Add((task.Description, task.Percentage)); } } // Got started tasks but no updates for 30 seconds? if (hasStartedTasks && updates.Count == 0 && (_timeProvider.GetLocalNow().LocalDateTime - _lastUpdate) > TimeSpan.FromSeconds(30)) { foreach (var task in context.GetTasks()) { updates.Add((task.Description, task.Percentage)); } } if (updates.Count > 0) { _lastUpdate = _timeProvider.GetLocalNow().LocalDateTime; } _renderable = BuildTaskGrid(updates); } } public override IEnumerable Process(RenderOptions options, IEnumerable renderables) { lock (_lock) { var result = new List(); result.AddRange(renderables); if (_renderable != null) { result.Add(_renderable); } _renderable = null; return result; } } private bool TryAdvance(int task, double percentage) { if (!_taskMilestones.TryGetValue(task, out var milestone)) { _taskMilestones.Add(task, FirstMilestone); return true; } if (percentage > milestone) { var nextMilestone = GetNextMilestone(percentage); if (nextMilestone != null && _taskMilestones[task] != nextMilestone) { _taskMilestones[task] = nextMilestone.Value; return true; } } return false; } private static double? GetNextMilestone(double percentage) { return Array.Find(_milestones, p => p > percentage); } private static IRenderable? BuildTaskGrid(List<(string Name, double Percentage)> updates) { if (updates.Count > 0) { var renderables = new List(); foreach (var (name, percentage) in updates) { renderables.Add(new Markup($"[blue]{name}[/]: {(int)percentage}%")); } return new Rows(renderables); } return null; } } ================================================ FILE: src/Spectre.Console/Live/Progress/Renderers/FallbackStatusRenderer.cs ================================================ namespace Spectre.Console; internal sealed class FallbackStatusRenderer : ProgressRenderer { private readonly Lock _lock; private IRenderable? _renderable; private string? _lastStatus; public override TimeSpan RefreshRate => TimeSpan.FromMilliseconds(100); public FallbackStatusRenderer() { _lock = LockFactory.Create(); } public override void Update(ProgressContext context) { lock (_lock) { var task = context.GetTasks().SingleOrDefault(); if (task != null) { // Not same description? if (_lastStatus != task.Description) { _lastStatus = task.Description; _renderable = new Markup(task.Description + Environment.NewLine); return; } } _renderable = null; return; } } public override IEnumerable Process(RenderOptions options, IEnumerable renderables) { lock (_lock) { var result = new List(); result.AddRange(renderables); if (_renderable != null) { result.Add(_renderable); } _renderable = null; return result; } } } ================================================ FILE: src/Spectre.Console/Live/Progress/Spinner.cs ================================================ namespace Spectre.Console; /// /// Represents a spinner used in a . /// public abstract partial class Spinner { /// /// Gets the update interval for the spinner. /// public abstract TimeSpan Interval { get; } /// /// Gets a value indicating whether or not the spinner /// uses Unicode characters. /// public abstract bool IsUnicode { get; } /// /// Gets the spinner frames. /// public abstract IReadOnlyList Frames { get; } } ================================================ FILE: src/Spectre.Console/Live/Status/Status.cs ================================================ namespace Spectre.Console; /// /// Represents a status display. /// public sealed class Status { private readonly IAnsiConsole _console; /// /// Gets or sets the spinner. /// public Spinner? Spinner { get; set; } /// /// Gets or sets the spinner style. /// public Style? SpinnerStyle { get; set; } = Color.Yellow; /// /// Gets or sets a value indicating whether or not status /// should auto refresh. Defaults to true. /// public bool AutoRefresh { get; set; } = true; /// /// Initializes a new instance of the class. /// /// The console. public Status(IAnsiConsole console) { _console = console ?? throw new ArgumentNullException(nameof(console)); } /// /// Starts a new status display. /// /// The status to display. /// The action to execute. public void Start(string status, Action action) { var task = StartAsync(status, ctx => { action(ctx); return Task.CompletedTask; }); task.GetAwaiter().GetResult(); } /// /// Starts a new status display. /// /// The result type. /// The status to display. /// The action to execute. /// The result. public T Start(string status, Func func) { var task = StartAsync(status, ctx => Task.FromResult(func(ctx))); return task.GetAwaiter().GetResult(); } /// /// Starts a new status display. /// /// The status to display. /// The action to execute. /// A representing the asynchronous operation. public async Task StartAsync(string status, Func action) { ArgumentNullException.ThrowIfNull(action); _ = await StartAsync(status, async statusContext => { await action(statusContext).ConfigureAwait(false); return default; }).ConfigureAwait(false); } /// /// Starts a new status display and returns a result. /// /// The result type of task. /// The status to display. /// The action to execute. /// A representing the asynchronous operation. public async Task StartAsync(string status, Func> func) { ArgumentNullException.ThrowIfNull(func); // Set the progress columns var spinnerColumn = new SpinnerColumn(Spinner ?? Spinner.Known.Default) { Style = SpinnerStyle ?? Style.Plain, }; var progress = new Progress(_console) { FallbackRenderer = new FallbackStatusRenderer(), AutoClear = true, AutoRefresh = AutoRefresh, }; progress.Columns(new ProgressColumn[] { spinnerColumn, new TaskDescriptionColumn(), }); return await progress.StartAsync(async ctx => { var statusContext = new StatusContext(ctx, ctx.AddTask(status), spinnerColumn); return await func(statusContext).ConfigureAwait(false); }).ConfigureAwait(false); } } /// /// Contains extension methods for . /// public static class StatusExtensions { /// /// Sets whether or not auto refresh is enabled. /// If disabled, you will manually have to refresh the progress. /// /// The instance. /// Whether or not auto refresh is enabled. /// The same instance so that multiple calls can be chained. public static Status AutoRefresh(this Status status, bool enabled) { ArgumentNullException.ThrowIfNull(status); status.AutoRefresh = enabled; return status; } /// /// Sets the spinner. /// /// The instance. /// The spinner. /// The same instance so that multiple calls can be chained. public static Status Spinner(this Status status, Spinner spinner) { ArgumentNullException.ThrowIfNull(status); status.Spinner = spinner; return status; } /// /// Sets the spinner style. /// /// The instance. /// The spinner style. /// The same instance so that multiple calls can be chained. public static Status SpinnerStyle(this Status status, Style? style) { ArgumentNullException.ThrowIfNull(status); status.SpinnerStyle = style; return status; } } ================================================ FILE: src/Spectre.Console/Live/Status/StatusContext.cs ================================================ namespace Spectre.Console; /// /// Represents a context that can be used to interact with a . /// public sealed class StatusContext { private readonly ProgressContext _context; private readonly ProgressTask _task; private readonly SpinnerColumn _spinnerColumn; /// /// Gets or sets the current status. /// public string Status { get => _task.Description; set => SetStatus(value); } /// /// Gets or sets the current spinner. /// public Spinner Spinner { get => _spinnerColumn.Spinner; set => SetSpinner(value); } /// /// Gets or sets the current spinner style. /// public Style? SpinnerStyle { get => _spinnerColumn.Style; set => _spinnerColumn.Style = value; } internal StatusContext(ProgressContext context, ProgressTask task, SpinnerColumn spinnerColumn) { _context = context ?? throw new ArgumentNullException(nameof(context)); _task = task ?? throw new ArgumentNullException(nameof(task)); _spinnerColumn = spinnerColumn ?? throw new ArgumentNullException(nameof(spinnerColumn)); } /// /// Refreshes the status. /// public void Refresh() { _context.Refresh(); } private void SetStatus(string status) { ArgumentNullException.ThrowIfNull(status); _task.Description = status; } private void SetSpinner(Spinner spinner) { ArgumentNullException.ThrowIfNull(spinner); _spinnerColumn.Spinner = spinner; } } /// /// Contains extension methods for . /// public static class StatusContextExtensions { /// /// Sets the status message. /// /// The status context. /// The status message. /// The same instance so that multiple calls can be chained. public static StatusContext Status(this StatusContext context, string status) { ArgumentNullException.ThrowIfNull(context); context.Status = status; return context; } /// /// Sets the spinner. /// /// The status context. /// The spinner. /// The same instance so that multiple calls can be chained. public static StatusContext Spinner(this StatusContext context, Spinner spinner) { ArgumentNullException.ThrowIfNull(context); context.Spinner = spinner; return context; } /// /// Sets the spinner style. /// /// The status context. /// The spinner style. /// The same instance so that multiple calls can be chained. public static StatusContext SpinnerStyle(this StatusContext context, Style? style) { ArgumentNullException.ThrowIfNull(context); context.SpinnerStyle = style; return context; } } ================================================ FILE: src/Spectre.Console/Overflow.cs ================================================ namespace Spectre.Console; /// /// Represents text overflow. /// public enum Overflow { /// /// Put any excess characters on the next line. /// Fold = 0, /// /// Truncates the text at the end of the line. /// Crop = 1, /// /// Truncates the text at the end of the line and /// also inserts an ellipsis character. /// Ellipsis = 2, } ================================================ FILE: src/Spectre.Console/Padding.cs ================================================ namespace Spectre.Console; /// /// Represents padding. /// public readonly struct Padding : IEquatable { /// /// Gets the left padding. /// public int Left { get; } /// /// Gets the top padding. /// public int Top { get; } /// /// Gets the right padding. /// public int Right { get; } /// /// Gets the bottom padding. /// public int Bottom { get; } /// /// Initializes a new instance of the struct. /// /// The padding for all sides. public Padding(int size) : this(size, size, size, size) { } /// /// Initializes a new instance of the struct. /// /// The left and right padding. /// The top and bottom padding. public Padding(int horizontal, int vertical) : this(horizontal, vertical, horizontal, vertical) { } /// /// Initializes a new instance of the struct. /// /// The left padding. /// The top padding. /// The right padding. /// The bottom padding. public Padding(int left, int top, int right, int bottom) { Left = left; Top = top; Right = right; Bottom = bottom; } /// public override bool Equals(object? obj) { return obj is Padding padding && Equals(padding); } /// public override int GetHashCode() { unchecked { var hash = (int)2166136261; hash = (hash * 16777619) ^ Left.GetHashCode(); hash = (hash * 16777619) ^ Top.GetHashCode(); hash = (hash * 16777619) ^ Right.GetHashCode(); hash = (hash * 16777619) ^ Bottom.GetHashCode(); return hash; } } /// public bool Equals(Padding other) { return Left == other.Left && Top == other.Top && Right == other.Right && Bottom == other.Bottom; } /// /// Checks if two instances are equal. /// /// The first instance to compare. /// The second instance to compare. /// true if the two instances are equal, otherwise false. public static bool operator ==(Padding left, Padding right) { return left.Equals(right); } /// /// Checks if two instances are not equal. /// /// The first instance to compare. /// The second instance to compare. /// true if the two instances are not equal, otherwise false. public static bool operator !=(Padding left, Padding right) { return !(left == right); } /// /// Gets the padding width. /// /// The padding width. public int GetWidth() { return Left + Right; } /// /// Gets the padding height. /// /// The padding height. public int GetHeight() { return Top + Bottom; } } /// /// Contains extension methods for . /// public static class PaddingExtensions { /// /// Gets the left padding. /// /// The padding. /// The left padding or zero if padding is null. public static int GetLeftSafe(this Padding? padding) { return padding?.Left ?? 0; } /// /// Gets the right padding. /// /// The padding. /// The right padding or zero if padding is null. public static int GetRightSafe(this Padding? padding) { return padding?.Right ?? 0; } /// /// Gets the top padding. /// /// The padding. /// The top padding or zero if padding is null. public static int GetTopSafe(this Padding? padding) { return padding?.Top ?? 0; } /// /// Gets the bottom padding. /// /// The padding. /// The bottom padding or zero if padding is null. public static int GetBottomSafe(this Padding? padding) { return padding?.Bottom ?? 0; } } ================================================ FILE: src/Spectre.Console/Profile.cs ================================================ namespace Spectre.Console; /// /// Represents a console profile. /// public sealed class Profile { private readonly HashSet _enrichers; private static readonly string[] _defaultEnricher = ["Default"]; private IAnsiConsoleOutput _out; private Encoding _encoding; private Capabilities _capabilities; private int? _width; private int? _height; /// /// Gets the enrichers used to build this profile. /// public IReadOnlyCollection Enrichers { get { if (_enrichers.Count > 0) { return _enrichers; } return _defaultEnricher; } } /// /// Gets or sets the out buffer. /// public IAnsiConsoleOutput Out { get => _out; set { _out = value ?? throw new InvalidOperationException("Output buffer cannot be null"); // Reset the width and height if this is a terminal. if (value.IsTerminal) { _width = null; _height = null; } } } /// /// Gets or sets the console output encoding. /// public Encoding Encoding { get => _encoding; set { if (value == null) { throw new InvalidOperationException("Encoding cannot be null"); } _out.SetEncoding(value); _encoding = value; } } /// /// Gets or sets an explicit console width. /// public int Width { get => _width ?? _out.Width; set { if (value <= 0) { throw new InvalidOperationException("Console width must be greater than zero"); } _width = value; } } /// /// Gets or sets an explicit console height. /// public int Height { get => _height ?? _out.Height; set { if (value <= 0) { throw new InvalidOperationException("Console height must be greater than zero"); } _height = value; } } /// /// Gets or sets the capabilities of the profile. /// public Capabilities Capabilities { get => _capabilities; set { _capabilities = value ?? throw new InvalidOperationException("Profile capabilities cannot be null"); } } /// /// Initializes a new instance of the class. /// /// The output buffer. /// The capabilities. /// The output encoding. public Profile(IAnsiConsoleOutput @out, Capabilities capabilities, Encoding encoding) { _enrichers = new HashSet(StringComparer.OrdinalIgnoreCase); _out = @out ?? throw new ArgumentNullException(nameof(@out)); _capabilities = capabilities ?? throw new ArgumentNullException(nameof(capabilities)); _encoding = encoding ?? throw new ArgumentNullException(nameof(encoding)); } /// /// Checks whether the current profile supports /// the specified color system. /// /// The color system to check. /// true if the color system is supported, otherwise false. public bool Supports(ColorSystem colorSystem) { return (int)colorSystem <= (int)Capabilities.ColorSystem; } internal void AddEnricher(string name) { ArgumentNullException.ThrowIfNull(name); _enrichers.Add(name); } } ================================================ FILE: src/Spectre.Console/Prompts/ConfirmationPrompt.cs ================================================ namespace Spectre.Console; /// /// A prompt that is answered with a yes or no. /// public sealed class ConfirmationPrompt : IPrompt { private readonly string _prompt; /// /// Gets or sets the character that represents "yes". /// public char Yes { get; set; } = 'y'; /// /// Gets or sets the character that represents "no". /// public char No { get; set; } = 'n'; /// /// Gets or sets a value indicating whether "yes" is the default answer. /// public bool DefaultValue { get; set; } = true; /// /// Gets or sets the message for invalid choices. /// public string InvalidChoiceMessage { get; set; } = "[red]Please select one of the available options[/]"; /// /// Gets or sets a value indicating whether or not /// choices should be shown. /// public bool ShowChoices { get; set; } = true; /// /// Gets or sets a value indicating whether or not /// default values should be shown. /// public bool ShowDefaultValue { get; set; } = true; /// /// Gets or sets the style in which the default value is displayed. Defaults to green when . /// public Style? DefaultValueStyle { get; set; } /// /// Gets or sets the style in which the list of choices is displayed. Defaults to blue when . /// public Style? ChoicesStyle { get; set; } /// /// Gets or sets the string comparer to use when comparing user input /// against Yes/No choices. /// /// /// Defaults to . /// public StringComparer Comparer { get; set; } = StringComparer.CurrentCultureIgnoreCase; /// /// Initializes a new instance of the class. /// /// The prompt markup text. public ConfirmationPrompt(string prompt) { _prompt = prompt ?? throw new System.ArgumentNullException(nameof(prompt)); } /// public bool Show(IAnsiConsole console) { return ShowAsync(console, CancellationToken.None).GetAwaiter().GetResult(); } /// public async Task ShowAsync(IAnsiConsole console, CancellationToken cancellationToken) { var comparer = Comparer ?? StringComparer.CurrentCultureIgnoreCase; var prompt = new TextPrompt(_prompt, comparer) .InvalidChoiceMessage(InvalidChoiceMessage) .ValidationErrorMessage(InvalidChoiceMessage) .ShowChoices(ShowChoices) .ChoicesStyle(ChoicesStyle) .ShowDefaultValue(ShowDefaultValue) .DefaultValue(DefaultValue ? Yes : No) .DefaultValueStyle(DefaultValueStyle) .AddChoice(Yes) .AddChoice(No); var result = await prompt.ShowAsync(console, cancellationToken).ConfigureAwait(false); return comparer.Compare(Yes.ToString(), result.ToString()) == 0; } } /// /// Contains extension methods for . /// public static class ConfirmationPromptExtensions { /// /// Show or hide choices. /// /// The prompt. /// Whether or not the choices should be visible. /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt ShowChoices(this ConfirmationPrompt obj, bool show) { ArgumentNullException.ThrowIfNull(obj); obj.ShowChoices = show; return obj; } /// /// Shows choices. /// /// The prompt. /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt ShowChoices(this ConfirmationPrompt obj) { return ShowChoices(obj, true); } /// /// Hides choices. /// /// The prompt. /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt HideChoices(this ConfirmationPrompt obj) { return ShowChoices(obj, false); } /// /// Sets the style in which the list of choices is displayed. /// /// The confirmation prompt. /// The style to use for displaying the choices or to use the default style (blue). /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt ChoicesStyle(this ConfirmationPrompt obj, Style? style) { ArgumentNullException.ThrowIfNull(obj); obj.ChoicesStyle = style; return obj; } /// /// Show or hide the default value. /// /// The prompt. /// Whether or not the default value should be visible. /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt ShowDefaultValue(this ConfirmationPrompt obj, bool show) { ArgumentNullException.ThrowIfNull(obj); obj.ShowDefaultValue = show; return obj; } /// /// Shows the default value. /// /// The prompt. /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt ShowDefaultValue(this ConfirmationPrompt obj) { return ShowDefaultValue(obj, true); } /// /// Hides the default value. /// /// The prompt. /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt HideDefaultValue(this ConfirmationPrompt obj) { return ShowDefaultValue(obj, false); } /// /// Sets the style in which the default value is displayed. /// /// The confirmation prompt. /// The default value style or to use the default style (green). /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt DefaultValueStyle(this ConfirmationPrompt obj, Style? style) { ArgumentNullException.ThrowIfNull(obj); obj.DefaultValueStyle = style; return obj; } /// /// Sets the "invalid choice" message for the prompt. /// /// The prompt. /// The "invalid choice" message. /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt InvalidChoiceMessage(this ConfirmationPrompt obj, string message) { ArgumentNullException.ThrowIfNull(obj); obj.InvalidChoiceMessage = message; return obj; } /// /// Sets the character to interpret as "yes". /// /// The confirmation prompt. /// The character to interpret as "yes". /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt Yes(this ConfirmationPrompt obj, char character) { ArgumentNullException.ThrowIfNull(obj); obj.Yes = character; return obj; } /// /// Sets the character to interpret as "no". /// /// The confirmation prompt. /// The character to interpret as "no". /// The same instance so that multiple calls can be chained. public static ConfirmationPrompt No(this ConfirmationPrompt obj, char character) { ArgumentNullException.ThrowIfNull(obj); obj.No = character; return obj; } } ================================================ FILE: src/Spectre.Console/Prompts/DefaultPromptValue.cs ================================================ namespace Spectre.Console; internal sealed class DefaultPromptValue { public T Value { get; } public DefaultPromptValue(T value) { Value = value; } } ================================================ FILE: src/Spectre.Console/Prompts/IMultiSelectionItem.cs ================================================ namespace Spectre.Console; /// /// Represent a multi selection prompt item. /// /// The data type. public interface IMultiSelectionItem : ISelectionItem where T : notnull { /// /// Gets a value indicating whether or not this item is selected. /// bool IsSelected { get; } /// /// Selects the item. /// /// The same instance so that multiple calls can be chained. IMultiSelectionItem Select(); } ================================================ FILE: src/Spectre.Console/Prompts/IPrompt.cs ================================================ namespace Spectre.Console; /// /// Represents a prompt. /// /// The prompt result type. public interface IPrompt { /// /// Shows the prompt. /// /// The console. /// The prompt input result. T Show(IAnsiConsole console); /// /// Shows the prompt asynchronously. /// /// The console. /// The token to monitor for cancellation requests. /// The prompt input result. Task ShowAsync(IAnsiConsole console, CancellationToken cancellationToken); } ================================================ FILE: src/Spectre.Console/Prompts/ISelectionItem.cs ================================================ namespace Spectre.Console; /// /// Represent a selection item. /// /// The data type. public interface ISelectionItem where T : notnull { /// /// Adds a child to the item. /// /// The child to add. /// A new instance representing the child. ISelectionItem AddChild(T child); } ================================================ FILE: src/Spectre.Console/Prompts/List/IListPromptStrategy.cs ================================================ namespace Spectre.Console; /// /// Represents a strategy for a list prompt. /// /// The list data type. internal interface IListPromptStrategy where T : notnull { /// /// Handles any input received from the user. /// /// The key that was pressed. /// The current state. /// A result representing an action. ListPromptInputResult HandleInput(ConsoleKeyInfo key, ListPromptState state); /// /// Calculates the page size. /// /// The console. /// The total number of items. /// The requested number of items to show. /// The page size that should be used. public int CalculatePageSize(IAnsiConsole console, int totalItemCount, int requestedPageSize); /// /// Builds a from the current state. /// /// The console. /// Whether or not the list is scrollable. /// The cursor index. /// The visible items. /// A value indicating whether or not the prompt should skip unselectable items. /// The search text. /// A representing the items. public IRenderable Render(IAnsiConsole console, bool scrollable, int cursorIndex, IEnumerable<(int Index, ListPromptItem Node)> items, bool skipUnselectableItems, string searchText); } ================================================ FILE: src/Spectre.Console/Prompts/List/ListPrompt.cs ================================================ namespace Spectre.Console; internal sealed class ListPrompt where T : notnull { private readonly IAnsiConsole _console; private readonly IListPromptStrategy _strategy; public ListPrompt(IAnsiConsole console, IListPromptStrategy strategy) { _console = console ?? throw new ArgumentNullException(nameof(console)); _strategy = strategy ?? throw new ArgumentNullException(nameof(strategy)); } public async Task> Show( ListPromptTree tree, Func converter, SelectionMode selectionMode, bool skipUnselectableItems, bool searchEnabled, int requestedPageSize, bool wrapAround, CancellationToken cancellationToken = default) { ArgumentNullException.ThrowIfNull(tree); if (!_console.Profile.Capabilities.Interactive) { throw new NotSupportedException( "Cannot show selection prompt since the current " + "terminal isn't interactive."); } if (!_console.Profile.Capabilities.Ansi) { throw new NotSupportedException( "Cannot show selection prompt since the current " + "terminal does not support ANSI escape sequences."); } var nodes = tree.Traverse().ToList(); if (nodes.Count == 0) { throw new InvalidOperationException("Cannot show an empty selection prompt. Please call the AddChoice() method to configure the prompt."); } var state = new ListPromptState(nodes, converter, _strategy.CalculatePageSize(_console, nodes.Count, requestedPageSize), wrapAround, selectionMode, skipUnselectableItems, searchEnabled); var hook = new ListPromptRenderHook(_console, () => BuildRenderable(state)); using (new RenderHookScope(_console, hook)) { _console.Cursor.Hide(); hook.Refresh(); while (true) { cancellationToken.ThrowIfCancellationRequested(); var rawKey = await _console.Input.ReadKeyAsync(true, cancellationToken).ConfigureAwait(false); if (rawKey == null) { continue; } var key = rawKey.Value; var result = _strategy.HandleInput(key, state); if (result == ListPromptInputResult.Submit) { break; } else if (result == ListPromptInputResult.Abort) { state.Cancel(); break; } if (state.Update(key) || result == ListPromptInputResult.Refresh) { hook.Refresh(); } } } hook.Clear(); _console.Cursor.Show(); return state; } private IRenderable BuildRenderable(ListPromptState state) { var pageSize = state.PageSize; var middleOfList = pageSize / 2; var skip = 0; var take = state.ItemCount; var cursorIndex = state.Index; var scrollable = state.ItemCount > pageSize; if (scrollable) { skip = Math.Max(0, state.Index - middleOfList); take = Math.Min(pageSize, state.ItemCount - skip); if (take < pageSize) { // Pointer should be below the middle of the (visual) list var diff = pageSize - take; skip -= diff; take += diff; cursorIndex = middleOfList + diff; } else { // Take skip into account cursorIndex -= skip; } } // Build the renderable return _strategy.Render( _console, scrollable, cursorIndex, state.Items.Skip(skip).Take(take) .Select((node, index) => (index, node)), state.SkipUnselectableItems, state.SearchText); } } ================================================ FILE: src/Spectre.Console/Prompts/List/ListPromptConstants.cs ================================================ namespace Spectre.Console; internal sealed class ListPromptConstants { public const string Arrow = ">"; public const string Checkbox = "[[ ]]"; public const string SelectedCheckbox = "[[[blue]X[/]]]"; public const string GroupSelectedCheckbox = "[[[grey]X[/]]]"; public const string InstructionsMarkup = "[grey](Press to select, to accept)[/]"; public const string MoreChoicesMarkup = "[grey](Move up and down to reveal more choices)[/]"; public const string SearchPlaceholderMarkup = "[grey](Type to search)[/]"; public static string GetSelectedCheckbox(bool isGroup, SelectionMode mode, Style? style = null) { if (style != null) { return "[[" + $"[{style.Value.ToMarkup()}]X[/]" + "]]"; } return isGroup && mode == SelectionMode.Leaf ? GroupSelectedCheckbox : SelectedCheckbox; } } ================================================ FILE: src/Spectre.Console/Prompts/List/ListPromptInputResult.cs ================================================ namespace Spectre.Console; internal enum ListPromptInputResult { None = 0, Refresh = 1, Submit = 2, Abort = 3, } ================================================ FILE: src/Spectre.Console/Prompts/List/ListPromptItem.cs ================================================ namespace Spectre.Console; internal sealed class ListPromptItem : IMultiSelectionItem where T : notnull { public T Data { get; } public ListPromptItem? Parent { get; } public List> Children { get; } public int Depth { get; } public bool IsSelected { get; set; } public bool IsGroup => Children.Count > 0; public ListPromptItem(T data, ListPromptItem? parent = null) { Data = data; Parent = parent; Children = []; Depth = CalculateDepth(parent); } public IMultiSelectionItem Select() { IsSelected = true; return this; } public ISelectionItem AddChild(T item) { var node = new ListPromptItem(item, this); Children.Add(node); return node; } public IEnumerable> Traverse(bool includeSelf) { var stack = new Stack>(); if (includeSelf) { stack.Push(this); } else { foreach (var child in Children) { stack.Push(child); } } while (stack.Count > 0) { var current = stack.Pop(); yield return current; if (current.Children.Count > 0) { foreach (var child in current.Children.ReverseEnumerable()) { stack.Push(child); } } } } private static int CalculateDepth(ListPromptItem? parent) { var level = 0; while (parent != null) { level++; parent = parent.Parent; } return level; } } ================================================ FILE: src/Spectre.Console/Prompts/List/ListPromptRenderHook.cs ================================================ namespace Spectre.Console; internal sealed class ListPromptRenderHook : IRenderHook where T : notnull { private readonly IAnsiConsole _console; private readonly Func _builder; private readonly LiveRenderable _live; private readonly object _lock; private bool _dirty; public ListPromptRenderHook( IAnsiConsole console, Func builder) { _console = console ?? throw new ArgumentNullException(nameof(console)); _builder = builder ?? throw new ArgumentNullException(nameof(builder)); _live = new LiveRenderable(console); _lock = new(); _dirty = true; } public void Clear() { _console.Write(_live.RestoreCursor()); } public void Refresh() { _dirty = true; _console.Write(ControlCode.Empty); } public IEnumerable Process(RenderOptions options, IEnumerable renderables) { lock (_lock) { if (!_live.HasRenderable || _dirty) { _live.SetRenderable(_builder()); _dirty = false; } yield return _live.PositionCursor(options); foreach (var renderable in renderables) { yield return renderable; } yield return _live; } } } ================================================ FILE: src/Spectre.Console/Prompts/List/ListPromptState.cs ================================================ namespace Spectre.Console; internal sealed class ListPromptState where T : notnull { private readonly Func _converter; public int Index { get; private set; } public int ItemCount => Items.Count; public int PageSize { get; } public bool WrapAround { get; } public SelectionMode Mode { get; } public bool SkipUnselectableItems { get; private set; } public bool SearchEnabled { get; } public bool IsCancelled { get; private set; } public IReadOnlyList> Items { get; } private readonly IReadOnlyList? _leafIndexes; public ListPromptItem Current => Items[Index]; public string SearchText { get; private set; } public ListPromptState( IReadOnlyList> items, Func converter, int pageSize, bool wrapAround, SelectionMode mode, bool skipUnselectableItems, bool searchEnabled) { _converter = converter ?? throw new ArgumentNullException(nameof(converter)); Items = items; PageSize = pageSize; WrapAround = wrapAround; Mode = mode; SkipUnselectableItems = skipUnselectableItems; SearchEnabled = searchEnabled; SearchText = string.Empty; if (SkipUnselectableItems && mode == SelectionMode.Leaf) { _leafIndexes = Items .Select((item, index) => new { item, index }) .Where(x => !x.item.IsGroup) .Select(x => x.index) .ToList() .AsReadOnly(); Index = _leafIndexes.FirstOrDefault(); } else { Index = 0; } } public bool Update(ConsoleKeyInfo keyInfo) { var index = Index; if (SkipUnselectableItems && Mode == SelectionMode.Leaf) { Debug.Assert(_leafIndexes != null, nameof(_leafIndexes) + " != null"); var currentLeafIndex = _leafIndexes.IndexOf(index); switch (keyInfo.Key) { case ConsoleKey.UpArrow: case ConsoleKey.K: if (currentLeafIndex > 0) { index = _leafIndexes[currentLeafIndex - 1]; } else if (WrapAround) { index = _leafIndexes.LastOrDefault(); } break; case ConsoleKey.DownArrow: case ConsoleKey.J: if (currentLeafIndex < _leafIndexes.Count - 1) { index = _leafIndexes[currentLeafIndex + 1]; } else if (WrapAround) { index = _leafIndexes.FirstOrDefault(); } break; case ConsoleKey.Home: index = _leafIndexes.FirstOrDefault(); break; case ConsoleKey.End: index = _leafIndexes.LastOrDefault(); break; case ConsoleKey.PageUp: index = Math.Max(currentLeafIndex - PageSize, 0); if (index < _leafIndexes.Count) { index = _leafIndexes[index]; } break; case ConsoleKey.PageDown: index = Math.Min(currentLeafIndex + PageSize, _leafIndexes.Count - 1); if (index < _leafIndexes.Count) { index = _leafIndexes[index]; } break; } } else { index = keyInfo.Key switch { ConsoleKey.UpArrow or ConsoleKey.K => Index - 1, ConsoleKey.DownArrow or ConsoleKey.J => Index + 1, ConsoleKey.Home => 0, ConsoleKey.End => ItemCount - 1, ConsoleKey.PageUp => Index - PageSize, ConsoleKey.PageDown => Index + PageSize, _ => Index, }; } var search = SearchText; if (SearchEnabled) { // If is text input, append to search filter if (!char.IsControl(keyInfo.KeyChar)) { search = SearchText + keyInfo.KeyChar; var item = Items.FirstOrDefault(x => _converter.Invoke(x.Data).Contains(search, StringComparison.OrdinalIgnoreCase) && (!x.IsGroup || Mode != SelectionMode.Leaf)); if (item != null) { index = Items.IndexOf(item); } } if (keyInfo.Key == ConsoleKey.Backspace) { if (search.Length > 0) { search = search.Substring(0, search.Length - 1); } var item = Items.FirstOrDefault(x => _converter.Invoke(x.Data).Contains(search, StringComparison.OrdinalIgnoreCase) && (!x.IsGroup || Mode != SelectionMode.Leaf)); if (item != null) { index = Items.IndexOf(item); } } } index = WrapAround ? (ItemCount + (index % ItemCount)) % ItemCount : index.Clamp(0, ItemCount - 1); if (index != Index || SearchText != search) { Index = index; SearchText = search; return true; } return false; } internal void Cancel() { IsCancelled = true; } } ================================================ FILE: src/Spectre.Console/Prompts/List/ListPromptTree.cs ================================================ namespace Spectre.Console; internal sealed class ListPromptTree where T : notnull { private readonly List> _roots; private readonly IEqualityComparer _comparer; public ListPromptTree(IEqualityComparer comparer) { _roots = []; _comparer = comparer ?? throw new ArgumentNullException(nameof(comparer)); } public ListPromptItem? Find(T item) { var stack = new Stack>(_roots); while (stack.Count > 0) { var current = stack.Pop(); if (_comparer.Equals(item, current.Data)) { return current; } stack.PushRange(current.Children); } return null; } public void Add(ListPromptItem node) { _roots.Add(node); } public IEnumerable> Traverse() { foreach (var root in _roots) { var stack = new Stack>(); stack.Push(root); while (stack.Count > 0) { var current = stack.Pop(); yield return current; foreach (var child in current.Children.ReverseEnumerable()) { stack.Push(child); } } } } } ================================================ FILE: src/Spectre.Console/Prompts/MultiSelectionPrompt.cs ================================================ namespace Spectre.Console; /// /// Represents a multi selection list prompt. /// /// The prompt result type. public sealed class MultiSelectionPrompt : IPrompt>, IListPromptStrategy where T : notnull { /// /// Gets or sets the title. /// public string? Title { get; set; } /// /// Gets or sets the page size. /// Defaults to 10. /// public int PageSize { get; set; } = 10; /// /// Gets or sets a value indicating whether the selection should wrap around when reaching the edge. /// Defaults to false. /// public bool WrapAround { get; set; } = false; /// /// Gets or sets the highlight style of the selected choice. /// public Style? HighlightStyle { get; set; } /// /// Gets or sets the converter to get the display string for a choice. By default /// the corresponding is used. /// public Func? Converter { get; set; } /// /// Gets or sets a value indicating whether or not /// at least one selection is required. /// public bool Required { get; set; } = true; /// /// Gets or sets the text that will be displayed if there are more choices to show. /// public string? MoreChoicesText { get; set; } /// /// Gets or sets the text that instructs the user of how to select items. /// public string? InstructionsText { get; set; } /// /// Gets or sets the selection mode. /// Defaults to . /// public SelectionMode Mode { get; set; } = SelectionMode.Leaf; internal ListPromptTree Tree { get; } /// /// Gets or sets a Func that will be triggered if Cancel is triggered by the 'ESC' key. /// public Func>? CancelResult { get; set; } /// /// Initializes a new instance of the class. /// /// /// The implementation to use when comparing items, /// or null to use the default for the type of the item. /// public MultiSelectionPrompt(IEqualityComparer? comparer = null) { Tree = new ListPromptTree(comparer ?? EqualityComparer.Default); } /// /// Adds a choice. /// /// The item to add. /// A so that multiple calls can be chained. public IMultiSelectionItem AddChoice(T item) { var node = new ListPromptItem(item); Tree.Add(node); return node; } /// public List Show(IAnsiConsole console) { return ShowAsync(console, CancellationToken.None).GetAwaiter().GetResult(); } /// public async Task> ShowAsync(IAnsiConsole console, CancellationToken cancellationToken) { // Create the list prompt var prompt = new ListPrompt(console, this); var converter = Converter ?? TypeConverterHelper.ConvertToString; var result = await prompt.Show(Tree, converter, Mode, false, false, PageSize, WrapAround, cancellationToken).ConfigureAwait(false); if (result.IsCancelled && CancelResult is not null) { return CancelResult(); } if (Mode == SelectionMode.Leaf) { return result.Items .Where(x => x.IsSelected && x.Children.Count == 0) .Select(x => x.Data) .ToList(); } return result.Items .Where(x => x.IsSelected) .Select(x => x.Data) .ToList(); } /// /// Returns all parent items of the given . /// /// The item for which to find the parents. /// The parent items, or an empty list, if the given item has no parents. public IEnumerable GetParents(T item) { var promptItem = Tree.Find(item); if (promptItem == null) { throw new ArgumentOutOfRangeException(nameof(item), "Item not found in tree."); } var parents = new List>(); while (promptItem.Parent != null) { promptItem = promptItem.Parent; parents.Add(promptItem); } return parents .ReverseEnumerable() .Select(x => x.Data); } /// /// Returns the parent item of the given . /// /// The item for which to find the parent. /// The parent item, or null if the given item has no parent. public T? GetParent(T item) { return GetParents(item).LastOrDefault(); } /// ListPromptInputResult IListPromptStrategy.HandleInput(ConsoleKeyInfo key, ListPromptState state) { if (key.Key == ConsoleKey.Escape && CancelResult is not null) { return ListPromptInputResult.Abort; } if (key.Key == ConsoleKey.Enter) { if (Required && state.Items.None(x => x.IsSelected)) { // Selection not permitted return ListPromptInputResult.None; } // Submit return ListPromptInputResult.Submit; } if (key.Key == ConsoleKey.Spacebar || key.Key == ConsoleKey.Packet) { var current = state.Items[state.Index]; var select = !current.IsSelected; if (Mode == SelectionMode.Leaf) { // Select the node and all its children foreach (var item in current.Traverse(includeSelf: true)) { item.IsSelected = select; } // Visit every parent and evaluate if its selection // status need to be updated var parent = current.Parent; while (parent != null) { parent.IsSelected = parent.Traverse(includeSelf: false).All(x => x.IsSelected); parent = parent.Parent; } } else { current.IsSelected = !current.IsSelected; } // Refresh the list return ListPromptInputResult.Refresh; } return ListPromptInputResult.None; } /// int IListPromptStrategy.CalculatePageSize(IAnsiConsole console, int totalItemCount, int requestedPageSize) { // The instructions take up two rows including a blank line var extra = 2; if (Title != null) { // Title takes up two rows including a blank line extra += 2; } // Scrolling? if (totalItemCount > requestedPageSize) { // The scrolling instructions takes up one row extra++; } var pageSize = requestedPageSize; if (pageSize > console.Profile.Height - extra) { pageSize = console.Profile.Height - extra; } return pageSize; } /// IRenderable IListPromptStrategy.Render(IAnsiConsole console, bool scrollable, int cursorIndex, IEnumerable<(int Index, ListPromptItem Node)> items, bool skipUnselectableItems, string searchText) { var list = new List(); var highlightStyle = HighlightStyle ?? Color.Blue; if (Title != null) { list.Add(new Markup(Title)); } var grid = new Grid(); grid.AddColumn(new GridColumn().Padding(0, 0, 1, 0).NoWrap()); if (Title != null) { grid.AddEmptyRow(); } foreach (var item in items) { var current = item.Index == cursorIndex; var style = current ? highlightStyle : Style.Plain; var indent = new string(' ', item.Node.Depth * 2); var prompt = item.Index == cursorIndex ? ListPromptConstants.Arrow : new string(' ', ListPromptConstants.Arrow.Length); var text = (Converter ?? TypeConverterHelper.ConvertToString)?.Invoke(item.Node.Data) ?? item.Node.Data.ToString() ?? "?"; if (current) { text = text.RemoveMarkup().EscapeMarkup(); } var checkbox = item.Node.IsSelected ? ListPromptConstants.GetSelectedCheckbox(item.Node.IsGroup, Mode, HighlightStyle) : ListPromptConstants.Checkbox; grid.AddRow(new Markup(indent + prompt + " " + checkbox + " " + text, style)); } list.Add(grid); list.Add(Text.Empty); if (scrollable) { // There are more choices list.Add(new Markup(MoreChoicesText ?? ListPromptConstants.MoreChoicesMarkup)); } // Instructions list.Add(new Markup(InstructionsText ?? ListPromptConstants.InstructionsMarkup)); // Combine all items return new Rows(list); } } ================================================ FILE: src/Spectre.Console/Prompts/MultiSelectionPromptExtensions.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static class MultiSelectionPromptExtensions { /// /// Sets the selection mode. /// /// The prompt result type. /// The prompt. /// The selection mode. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt Mode(this MultiSelectionPrompt obj, SelectionMode mode) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.Mode = mode; return obj; } /// /// Adds a choice. /// /// The prompt result type. /// The prompt. /// The choice to add. /// The configurator for the choice. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddChoices(this MultiSelectionPrompt obj, T choice, Action> configurator) where T : notnull { ArgumentNullException.ThrowIfNull(obj); ArgumentNullException.ThrowIfNull(configurator); var result = obj.AddChoice(choice); configurator(result); return obj; } /// /// Adds multiple choices. /// /// The prompt result type. /// The prompt. /// The choices to add. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddChoices(this MultiSelectionPrompt obj, params T[] choices) where T : notnull { ArgumentNullException.ThrowIfNull(obj); foreach (var choice in choices) { obj.AddChoice(choice); } return obj; } /// /// Adds multiple choices. /// /// The prompt result type. /// The prompt. /// The choices to add. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddChoices(this MultiSelectionPrompt obj, IEnumerable choices) where T : notnull { ArgumentNullException.ThrowIfNull(obj); foreach (var choice in choices) { obj.AddChoice(choice); } return obj; } /// /// Adds multiple grouped choices. /// /// The prompt result type. /// The prompt. /// The group. /// The choices to add. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddChoiceGroup(this MultiSelectionPrompt obj, T group, IEnumerable choices) where T : notnull { ArgumentNullException.ThrowIfNull(obj); var root = obj.AddChoice(group); foreach (var choice in choices) { root.AddChild(choice); } return obj; } /// /// Adds multiple grouped choices. /// /// The prompt result type. /// The prompt. /// The group. /// The choices to add. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddChoiceGroup(this MultiSelectionPrompt obj, T group, params T[] choices) where T : notnull { ArgumentNullException.ThrowIfNull(obj); var root = obj.AddChoice(group); foreach (var choice in choices) { root.AddChild(choice); } return obj; } /// /// Marks an item as selected. /// /// The prompt result type. /// The prompt. /// The item to select. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt Select(this MultiSelectionPrompt obj, T item) where T : notnull { ArgumentNullException.ThrowIfNull(obj); var node = obj.Tree.Find(item); node?.Select(); return obj; } /// /// Sets the title. /// /// The prompt result type. /// The prompt. /// The title markup text. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt Title(this MultiSelectionPrompt obj, string? title) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.Title = title; return obj; } /// /// Sets how many choices that are displayed to the user. /// /// The prompt result type. /// The prompt. /// The number of choices that are displayed to the user. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt PageSize(this MultiSelectionPrompt obj, int pageSize) where T : notnull { ArgumentNullException.ThrowIfNull(obj); if (pageSize <= 2) { throw new ArgumentException("Page size must be greater or equal to 3.", nameof(pageSize)); } obj.PageSize = pageSize; return obj; } /// /// Sets whether the selection should wrap around when reaching its edges. /// /// The prompt result type. /// The prompt. /// Whether the selection should wrap around. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt WrapAround(this MultiSelectionPrompt obj, bool shouldWrap = true) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.WrapAround = shouldWrap; return obj; } /// /// Sets the highlight style of the selected choice. /// /// The prompt result type. /// The prompt. /// The highlight style of the selected choice. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt HighlightStyle(this MultiSelectionPrompt obj, Style highlightStyle) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.HighlightStyle = highlightStyle; return obj; } /// /// Sets the text that will be displayed if there are more choices to show. /// /// The prompt result type. /// The prompt. /// The text to display. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt MoreChoicesText(this MultiSelectionPrompt obj, string? text) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.MoreChoicesText = text; return obj; } /// /// Sets the text that instructs the user of how to select items. /// /// The prompt result type. /// The prompt. /// The text to display. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt InstructionsText(this MultiSelectionPrompt obj, string? text) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.InstructionsText = text; return obj; } /// /// Requires no choice to be selected. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt NotRequired(this MultiSelectionPrompt obj) where T : notnull { return Required(obj, false); } /// /// Requires a choice to be selected. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt Required(this MultiSelectionPrompt obj) where T : notnull { return Required(obj, true); } /// /// Sets a value indicating whether or not at least one choice must be selected. /// /// The prompt result type. /// The prompt. /// Whether or not at least one choice must be selected. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt Required(this MultiSelectionPrompt obj, bool required) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.Required = required; return obj; } /// /// Sets the function to create a display string for a given choice. /// /// The prompt type. /// The prompt. /// The function to get a display string for a given choice. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt UseConverter(this MultiSelectionPrompt obj, Func? displaySelector) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.Converter = displaySelector; return obj; } /// /// Sets the value that will be returned if the prompt is cancelled with 'ESC'. /// /// The prompt result type. /// The prompt. /// A Func that is returning a value on cancel. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddCancelResult(this MultiSelectionPrompt obj, Func> cancelResultFunc) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.CancelResult = cancelResultFunc; return obj; } /// /// Sets a Func that will be triggered if the prompt is cancelled with 'ESC'. /// Sets result to the configured List. /// /// The prompt result type. /// The prompt. /// The value to be returned on cancel. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddCancelResult(this MultiSelectionPrompt obj, List cancelResult) where T : notnull { ArgumentNullException.ThrowIfNull(obj); return obj.AddCancelResult(() => cancelResult); } /// /// Sets a Func that will be triggered if the prompt is cancelled with 'ESC'. /// Sets result to a List containing only the configured item. /// /// The prompt result type. /// The prompt. /// The value to be returned on cancel. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddCancelResult(this MultiSelectionPrompt obj, T cancelResult) where T : notnull { ArgumentNullException.ThrowIfNull(obj); return obj.AddCancelResult([cancelResult]); } /// /// Sets a Func that will be triggered if the prompt is cancelled with 'ESC'. /// Sets result to an empty List. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static MultiSelectionPrompt AddCancelResult(this MultiSelectionPrompt obj) where T : notnull { ArgumentNullException.ThrowIfNull(obj); return obj.AddCancelResult([]); } } ================================================ FILE: src/Spectre.Console/Prompts/SelectionPrompt.cs ================================================ namespace Spectre.Console; /// /// Represents a single list prompt. /// /// The prompt result type. public sealed class SelectionPrompt : IPrompt, IListPromptStrategy where T : notnull { private readonly ListPromptTree _tree; /// /// Gets or sets the title. /// public string? Title { get; set; } /// /// Gets or sets the page size. /// Defaults to 10. /// public int PageSize { get; set; } = 10; /// /// Gets or sets a value indicating whether the selection should wrap around when reaching the edge. /// Defaults to false. /// public bool WrapAround { get; set; } = false; /// /// Gets or sets the highlight style of the selected choice. /// public Style? HighlightStyle { get; set; } /// /// Gets or sets the style of a disabled choice. /// public Style? DisabledStyle { get; set; } /// /// Gets or sets the style of highlighted search matches. /// public Style? SearchHighlightStyle { get; set; } /// /// Gets or sets the text that will be displayed when no search text has been entered. /// public string? SearchPlaceholderText { get; set; } /// /// Gets or sets the converter to get the display string for a choice. By default /// the corresponding is used. /// public Func? Converter { get; set; } /// /// Gets or sets the text that will be displayed if there are more choices to show. /// public string? MoreChoicesText { get; set; } /// /// Gets or sets the selection mode. /// Defaults to . /// public SelectionMode Mode { get; set; } = SelectionMode.Leaf; /// /// Gets or sets a value indicating whether or not search is enabled. /// public bool SearchEnabled { get; set; } /// /// Gets or sets a Func that will be triggered if Cancel is triggered by the 'ESC' key. /// public Func? CancelResult { get; set; } /// /// Initializes a new instance of the class. /// public SelectionPrompt() { _tree = new ListPromptTree(EqualityComparer.Default); } /// /// Adds a choice. /// /// The item to add. /// A so that multiple calls can be chained. public ISelectionItem AddChoice(T item) { var node = new ListPromptItem(item); _tree.Add(node); return node; } /// public T Show(IAnsiConsole console) { return ShowAsync(console, CancellationToken.None).GetAwaiter().GetResult(); } /// public async Task ShowAsync(IAnsiConsole console, CancellationToken cancellationToken) { // Create the list prompt var prompt = new ListPrompt(console, this); var converter = Converter ?? TypeConverterHelper.ConvertToString; var result = await prompt.Show(_tree, converter, Mode, true, SearchEnabled, PageSize, WrapAround, cancellationToken).ConfigureAwait(false); if (result.IsCancelled && CancelResult is not null) { return CancelResult(); } // Return the selected item return result.Items[result.Index].Data; } /// ListPromptInputResult IListPromptStrategy.HandleInput(ConsoleKeyInfo key, ListPromptState state) { if (key.Key == ConsoleKey.Enter || key.Key == ConsoleKey.Packet || (!state.SearchEnabled && key.Key == ConsoleKey.Spacebar)) { // Selecting a non leaf in "leaf mode" is not allowed if (state.Current.IsGroup && Mode == SelectionMode.Leaf) { return ListPromptInputResult.None; } return ListPromptInputResult.Submit; } if (key.Key == ConsoleKey.Escape && CancelResult is not null) { return ListPromptInputResult.Abort; } return ListPromptInputResult.None; } /// int IListPromptStrategy.CalculatePageSize(IAnsiConsole console, int totalItemCount, int requestedPageSize) { var extra = 0; if (Title != null) { // Title takes up two rows including a blank line extra += 2; } var scrollable = totalItemCount > requestedPageSize; if (SearchEnabled || scrollable) { extra += 1; } if (SearchEnabled) { extra += 1; } if (scrollable) { extra += 1; } if (requestedPageSize > console.Profile.Height - extra) { return console.Profile.Height - extra; } return requestedPageSize; } /// IRenderable IListPromptStrategy.Render(IAnsiConsole console, bool scrollable, int cursorIndex, IEnumerable<(int Index, ListPromptItem Node)> items, bool skipUnselectableItems, string searchText) { var list = new List(); var disabledStyle = DisabledStyle ?? Color.Grey; var highlightStyle = HighlightStyle ?? Color.Blue; var searchHighlightStyle = SearchHighlightStyle ?? new Style(foreground: Color.Default, background: Color.Yellow, Decoration.Bold); if (Title != null) { list.Add(new Markup(Title)); } var grid = new Grid(); grid.AddColumn(new GridColumn().Padding(0, 0, 1, 0).NoWrap()); if (Title != null) { grid.AddEmptyRow(); } foreach (var item in items) { var current = item.Index == cursorIndex; var prompt = item.Index == cursorIndex ? ListPromptConstants.Arrow : new string(' ', ListPromptConstants.Arrow.Length); var style = item.Node.IsGroup && Mode == SelectionMode.Leaf ? disabledStyle : current ? highlightStyle : Style.Plain; var indent = new string(' ', item.Node.Depth * 2); var text = (Converter ?? TypeConverterHelper.ConvertToString)?.Invoke(item.Node.Data) ?? item.Node.Data.ToString() ?? "?"; if (current) { text = text.RemoveMarkup().EscapeMarkup(); } if (searchText.Length > 0 && !(item.Node.IsGroup && Mode == SelectionMode.Leaf)) { text = AnsiMarkup.Highlight(text, searchText, searchHighlightStyle); } grid.AddRow(new Markup(indent + prompt + " " + text, style)); } list.Add(grid); if (SearchEnabled || scrollable) { // Add padding list.Add(Text.Empty); } if (SearchEnabled) { list.Add(new Markup( searchText.Length > 0 ? searchText.EscapeMarkup() : SearchPlaceholderText ?? ListPromptConstants.SearchPlaceholderMarkup)); } if (scrollable) { // (Move up and down to reveal more choices) list.Add(new Markup(MoreChoicesText ?? ListPromptConstants.MoreChoicesMarkup)); } return new Rows(list); } } ================================================ FILE: src/Spectre.Console/Prompts/SelectionPromptExtensions.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static class SelectionPromptExtensions { /// /// Sets the selection mode. /// /// The prompt result type. /// The prompt. /// The selection mode. /// The same instance so that multiple calls can be chained. public static SelectionPrompt Mode(this SelectionPrompt obj, SelectionMode mode) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.Mode = mode; return obj; } /// /// Adds multiple choices. /// /// The prompt result type. /// The prompt. /// The choices to add. /// The same instance so that multiple calls can be chained. public static SelectionPrompt AddChoices(this SelectionPrompt obj, params T[] choices) where T : notnull { ArgumentNullException.ThrowIfNull(obj); foreach (var choice in choices) { obj.AddChoice(choice); } return obj; } /// /// Adds multiple choices. /// /// The prompt result type. /// The prompt. /// The choices to add. /// The same instance so that multiple calls can be chained. public static SelectionPrompt AddChoices(this SelectionPrompt obj, IEnumerable choices) where T : notnull { ArgumentNullException.ThrowIfNull(obj); foreach (var choice in choices) { obj.AddChoice(choice); } return obj; } /// /// Adds multiple grouped choices. /// /// The prompt result type. /// The prompt. /// The group. /// The choices to add. /// The same instance so that multiple calls can be chained. public static SelectionPrompt AddChoiceGroup(this SelectionPrompt obj, T group, IEnumerable choices) where T : notnull { ArgumentNullException.ThrowIfNull(obj); var root = obj.AddChoice(group); foreach (var choice in choices) { root.AddChild(choice); } return obj; } /// /// Adds multiple grouped choices. /// /// The prompt result type. /// The prompt. /// The group. /// The choices to add. /// The same instance so that multiple calls can be chained. public static SelectionPrompt AddChoiceGroup(this SelectionPrompt obj, T group, params T[] choices) where T : notnull { ArgumentNullException.ThrowIfNull(obj); var root = obj.AddChoice(group); foreach (var choice in choices) { root.AddChild(choice); } return obj; } /// /// Sets the title. /// /// The prompt result type. /// The prompt. /// The title markup text. /// The same instance so that multiple calls can be chained. public static SelectionPrompt Title(this SelectionPrompt obj, string? title) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.Title = title; return obj; } /// /// Sets how many choices that are displayed to the user. /// /// The prompt result type. /// The prompt. /// The number of choices that are displayed to the user. /// The same instance so that multiple calls can be chained. public static SelectionPrompt PageSize(this SelectionPrompt obj, int pageSize) where T : notnull { ArgumentNullException.ThrowIfNull(obj); if (pageSize <= 2) { throw new ArgumentException("Page size must be greater or equal to 3.", nameof(pageSize)); } obj.PageSize = pageSize; return obj; } /// /// Sets whether the selection should wrap around when reaching its edges. /// /// The prompt result type. /// The prompt. /// Whether the selection should wrap around. /// The same instance so that multiple calls can be chained. public static SelectionPrompt WrapAround(this SelectionPrompt obj, bool shouldWrap = true) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.WrapAround = shouldWrap; return obj; } /// /// Enables search for the prompt. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static SelectionPrompt EnableSearch(this SelectionPrompt obj) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.SearchEnabled = true; return obj; } /// /// Disables search for the prompt. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static SelectionPrompt DisableSearch(this SelectionPrompt obj) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.SearchEnabled = false; return obj; } /// /// Sets the text that will be displayed when no search text has been entered. /// /// The prompt result type. /// The prompt. /// The text to display. /// The same instance so that multiple calls can be chained. public static SelectionPrompt SearchPlaceholderText(this SelectionPrompt obj, string? text) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.SearchPlaceholderText = text; return obj; } /// /// Sets the value that will be returned if the prompt is cancelled with 'ESC'. /// /// The prompt result type. /// The prompt. /// A Func that is returning a value on cancel. /// The same instance so that multiple calls can be chained. public static SelectionPrompt AddCancelResult(this SelectionPrompt obj, Func cancelResultFunc) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.CancelResult = cancelResultFunc; return obj; } /// /// Sets a Func that will be triggered if the prompt is cancelled with 'ESC'. /// /// The prompt result type. /// The prompt. /// The value to be returned on cancel. /// The same instance so that multiple calls can be chained. public static SelectionPrompt AddCancelResult(this SelectionPrompt obj, T cancelResult) where T : notnull { ArgumentNullException.ThrowIfNull(obj); return obj.AddCancelResult(() => cancelResult); } /// /// Sets the highlight style of the selected choice. /// /// The prompt result type. /// The prompt. /// The highlight style of the selected choice. /// The same instance so that multiple calls can be chained. public static SelectionPrompt HighlightStyle(this SelectionPrompt obj, Style highlightStyle) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.HighlightStyle = highlightStyle; return obj; } /// /// Sets the text that will be displayed if there are more choices to show. /// /// The prompt result type. /// The prompt. /// The text to display. /// The same instance so that multiple calls can be chained. public static SelectionPrompt MoreChoicesText(this SelectionPrompt obj, string? text) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.MoreChoicesText = text; return obj; } /// /// Sets the function to create a display string for a given choice. /// /// The prompt type. /// The prompt. /// The function to get a display string for a given choice. /// The same instance so that multiple calls can be chained. public static SelectionPrompt UseConverter(this SelectionPrompt obj, Func? displaySelector) where T : notnull { ArgumentNullException.ThrowIfNull(obj); obj.Converter = displaySelector; return obj; } } ================================================ FILE: src/Spectre.Console/Prompts/SelectionType.cs ================================================ namespace Spectre.Console; /// /// Represents how selections are made in a hierarchical prompt. /// public enum SelectionMode { /// /// Will only return lead nodes in results. /// Leaf = 0, /// /// Allows selection of parent nodes, but each node /// is independent of its parent and children. /// Independent = 1, } ================================================ FILE: src/Spectre.Console/Prompts/TextPrompt.cs ================================================ namespace Spectre.Console; /// /// Represents a prompt. /// /// The prompt result type. public sealed class TextPrompt : IPrompt, IHasCulture { private readonly string _prompt; private readonly StringComparer? _comparer; /// /// Gets or sets the prompt style. /// public Style? PromptStyle { get; set; } /// /// Gets the list of choices. /// public List Choices { get; } = []; /// /// Gets or sets the culture to use when converting input to object. /// public CultureInfo? Culture { get; set; } /// /// Gets or sets the message for invalid choices. /// public string InvalidChoiceMessage { get; set; } = "[red]Please select one of the available options[/]"; /// /// Gets or sets a value indicating whether input should /// be hidden in the console. /// public bool IsSecret { get; set; } /// /// Gets or sets the character to use while masking /// a secret prompt. /// public char? Mask { get; set; } = '*'; /// /// Gets or sets the validation error message. /// public string ValidationErrorMessage { get; set; } = "[red]Invalid input[/]"; /// /// Gets or sets a value indicating whether or not /// choices should be shown. /// public bool ShowChoices { get; set; } = true; /// /// Gets or sets a value indicating whether or not /// default values should be shown. /// public bool ShowDefaultValue { get; set; } = true; /// /// Gets or sets the default value editable state that allows the injection of the DefaultValue in the text field. /// If true this places the DefaultValue in the input buffer which can then be edited by the user. /// public bool EditableDefaultValue { get; set; } /// /// Gets or sets a value indicating whether or not an empty result is valid. /// public bool AllowEmpty { get; set; } /// /// Gets or sets a value indicating whether the prompt line /// should be cleared after a successful input. /// public bool ClearOnFinish { get; set; } /// /// Gets or sets the converter to get the display string for a choice. By default /// the corresponding is used. /// public Func? Converter { get; set; } = TypeConverterHelper.ConvertToString; /// /// Gets or sets the validator. /// public Func? Validator { get; set; } /// /// Gets or sets the style in which the default value is displayed. Defaults to green when . /// public Style? DefaultValueStyle { get; set; } /// /// Gets or sets the style in which the list of choices is displayed. Defaults to blue when . /// public Style? ChoicesStyle { get; set; } /// /// Gets or sets the default value. /// internal DefaultPromptValue? DefaultValue { get; set; } /// /// Initializes a new instance of the class. /// /// The prompt markup text. /// The comparer used for choices. public TextPrompt(string prompt, StringComparer? comparer = null) { _prompt = prompt ?? throw new System.ArgumentNullException(nameof(prompt)); _comparer = comparer; } /// /// Shows the prompt and requests input from the user. /// /// The console to show the prompt in. /// The user input converted to the expected type. /// public T Show(IAnsiConsole console) { return ShowAsync(console, CancellationToken.None).GetAwaiter().GetResult(); } /// public async Task ShowAsync(IAnsiConsole console, CancellationToken cancellationToken) { ArgumentNullException.ThrowIfNull(console); return await console.RunExclusive(async () => { var promptStyle = PromptStyle ?? Style.Plain; var converter = Converter ?? TypeConverterHelper.ConvertToString; var choices = Choices.Select(choice => converter(choice)).ToList(); var choiceMap = Choices.ToDictionary(choice => converter(choice), choice => choice, _comparer); WritePrompt(console); while (true) { string input; if (EditableDefaultValue && DefaultValue != null) { input = await console.ReadLine(promptStyle, IsSecret, Mask, choices, cancellationToken, converter(DefaultValue.Value)).ConfigureAwait(false); } else { input = await console.ReadLine(promptStyle, IsSecret, Mask, choices, cancellationToken).ConfigureAwait(false); } // Nothing entered? if (string.IsNullOrWhiteSpace(input)) { if (DefaultValue != null) { var defaultValue = converter(DefaultValue.Value); console.Write(IsSecret ? defaultValue.Mask(Mask) : defaultValue, promptStyle); console.WriteLine(); ClearPromptLine(console); return DefaultValue.Value; } if (!AllowEmpty) { continue; } } console.WriteLine(); T? result; if (Choices.Count > 0) { if (choiceMap.TryGetValue(input, out result) && result != null) { ClearPromptLine(console); return result; } else { console.MarkupLine(InvalidChoiceMessage); WritePrompt(console); continue; } } else if (!TypeConverterHelper.TryConvertFromStringWithCulture(input, Culture, out result) || result == null) { console.MarkupLine(ValidationErrorMessage); WritePrompt(console); continue; } // Run all validators if (!ValidateResult(result, out var validationMessage)) { console.MarkupLine(validationMessage); WritePrompt(console); continue; } ClearPromptLine(console); return result; } }).ConfigureAwait(false); } /// /// Writes the prompt to the console. /// /// The console to write the prompt to. private void WritePrompt(IAnsiConsole console) { ArgumentNullException.ThrowIfNull(console); var builder = new StringBuilder(); builder.Append(_prompt.TrimEnd()); var appendSuffix = false; if (ShowChoices && Choices.Count > 0) { appendSuffix = true; var converter = Converter ?? TypeConverterHelper.ConvertToString; var choices = string.Join("/", Choices.Select(choice => converter(choice))); var choicesStyle = ChoicesStyle?.ToMarkup() ?? "blue"; builder.AppendFormat(CultureInfo.InvariantCulture, " [{0}][[{1}]][/]", choicesStyle, choices); } if (ShowDefaultValue && DefaultValue != null) { appendSuffix = true; var converter = Converter ?? TypeConverterHelper.ConvertToString; var defaultValueStyle = DefaultValueStyle?.ToMarkup() ?? "green"; var defaultValue = converter(DefaultValue.Value); builder.AppendFormat( CultureInfo.InvariantCulture, " [{0}]({1})[/]", defaultValueStyle, IsSecret ? defaultValue.Mask(Mask) : defaultValue); } var markup = builder.ToString().Trim(); if (appendSuffix) { markup += ":"; } console.Markup(markup + " "); } /// /// Clears the prompt line when enabled. /// /// The console to clear the prompt from. private void ClearPromptLine(IAnsiConsole console) { if (!ClearOnFinish) { return; } ArgumentNullException.ThrowIfNull(console); if (!console.Profile.Capabilities.Ansi) { return; } console.Cursor.MoveUp(); console.Write(ControlCode.Create(console, writer => { writer.Write("\r"); writer.EraseInLine(2); })); } private bool ValidateResult(T value, [NotNullWhen(false)] out string? message) { if (Validator != null) { var result = Validator(value); if (!result.Successful) { message = result.Message ?? ValidationErrorMessage; return false; } } message = null; return true; } } ================================================ FILE: src/Spectre.Console/Prompts/TextPromptExtensions.cs ================================================ namespace Spectre.Console; /// /// Contains extension methods for . /// public static class TextPromptExtensions { /// /// Allow empty input. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static TextPrompt AllowEmpty(this TextPrompt obj) { ArgumentNullException.ThrowIfNull(obj); obj.AllowEmpty = true; return obj; } /// /// Sets the prompt style. /// /// The prompt result type. /// The prompt. /// The prompt style. /// The same instance so that multiple calls can be chained. public static TextPrompt PromptStyle(this TextPrompt obj, Style style) { ArgumentNullException.ThrowIfNull(obj); obj.PromptStyle = style; return obj; } /// /// Show or hide choices. /// /// The prompt result type. /// The prompt. /// Whether or not choices should be visible. /// The same instance so that multiple calls can be chained. public static TextPrompt ShowChoices(this TextPrompt obj, bool show) { ArgumentNullException.ThrowIfNull(obj); obj.ShowChoices = show; return obj; } /// /// Shows choices. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static TextPrompt ShowChoices(this TextPrompt obj) { return ShowChoices(obj, true); } /// /// Hides choices. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static TextPrompt HideChoices(this TextPrompt obj) { return ShowChoices(obj, false); } /// /// Show or hide the default value. /// /// The prompt result type. /// The prompt. /// Whether or not the default value should be visible. /// The same instance so that multiple calls can be chained. public static TextPrompt ShowDefaultValue(this TextPrompt obj, bool show) { ArgumentNullException.ThrowIfNull(obj); obj.ShowDefaultValue = show; return obj; } /// /// Shows the default value. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static TextPrompt ShowDefaultValue(this TextPrompt obj) { return ShowDefaultValue(obj, true); } /// /// Whether or not to write the default value in the text input field to be modified by the end user. /// /// The prompt result type. /// The prompt. /// Whether or not the default value should be editable. /// The same instance so that multiple calls can be chained. public static TextPrompt EditableDefaultValue(this TextPrompt obj, bool state) { ArgumentNullException.ThrowIfNull(obj); obj.EditableDefaultValue = state; return obj; } /// /// Hides the default value. /// /// The prompt result type. /// The prompt. /// The same instance so that multiple calls can be chained. public static TextPrompt HideDefaultValue(this TextPrompt obj) { return ShowDefaultValue(obj, false); } /// /// Sets the validation error message for the prompt. /// /// The prompt result type. /// The prompt. /// The validation error message. /// The same instance so that multiple calls can be chained. public static TextPrompt ValidationErrorMessage(this TextPrompt obj, string message) { ArgumentNullException.ThrowIfNull(obj); obj.ValidationErrorMessage = message; return obj; } /// /// Sets the "invalid choice" message for the prompt. /// /// The prompt result type. /// The prompt. /// The "invalid choice" message. /// The same instance so that multiple calls can be chained. public static TextPrompt InvalidChoiceMessage(this TextPrompt obj, string message) { ArgumentNullException.ThrowIfNull(obj); obj.InvalidChoiceMessage = message; return obj; } /// /// Sets the default value of the prompt. /// /// The prompt result type. /// The prompt. /// The default value. /// The same instance so that multiple calls can be chained. public static TextPrompt DefaultValue(this TextPrompt obj, T value) { ArgumentNullException.ThrowIfNull(obj); obj.DefaultValue = new DefaultPromptValue(value); return obj; } /// /// Sets the validation criteria for the prompt. /// /// The prompt result type. /// The prompt. /// The validation criteria. /// The validation error message. /// The same instance so that multiple calls can be chained. public static TextPrompt Validate(this TextPrompt obj, Func validator, string? message = null) { ArgumentNullException.ThrowIfNull(obj); obj.Validator = result => { if (validator(result)) { return ValidationResult.Success(); } return ValidationResult.Error(message); }; return obj; } /// /// Sets the validation criteria for the prompt. /// /// The prompt result type. /// The prompt. /// The validation criteria. /// The same instance so that multiple calls can be chained. public static TextPrompt Validate(this TextPrompt obj, Func validator) { ArgumentNullException.ThrowIfNull(obj); obj.Validator = validator; return obj; } /// /// Adds a choice to the prompt. /// /// The prompt result type. /// The prompt. /// The choice to add. /// The same instance so that multiple calls can be chained. public static TextPrompt AddChoice(this TextPrompt obj, T choice) { ArgumentNullException.ThrowIfNull(obj); obj.Choices.Add(choice); return obj; } /// /// Adds multiple choices to the prompt. /// /// The prompt result type. /// The prompt. /// The choices to add. /// The same instance so that multiple calls can be chained. public static TextPrompt AddChoices(this TextPrompt obj, IEnumerable choices) { ArgumentNullException.ThrowIfNull(obj); ArgumentNullException.ThrowIfNull(choices); foreach (var choice in choices) { obj.Choices.Add(choice); } return obj; } /// /// Replaces prompt user input with asterisks in the console. /// /// The prompt type. /// The prompt. /// The same instance so that multiple calls can be chained. public static TextPrompt Secret(this TextPrompt obj) { ArgumentNullException.ThrowIfNull(obj); obj.IsSecret = true; return obj; } /// /// Replaces prompt user input with mask in the console. /// /// The prompt type. /// The prompt. /// The masking character to use for the secret. /// The same instance so that multiple calls can be chained. public static TextPrompt Secret(this TextPrompt obj, char? mask) { ArgumentNullException.ThrowIfNull(obj); obj.IsSecret = true; obj.Mask = mask; return obj; } /// /// Sets the function to create a display string for a given choice. /// /// The prompt type. /// The prompt. /// The function to get a display string for a given choice. /// The same instance so that multiple calls can be chained. public static TextPrompt WithConverter(this TextPrompt obj, Func? displaySelector) { ArgumentNullException.ThrowIfNull(obj); obj.Converter = displaySelector; return obj; } /// /// Sets the style in which the default value is displayed. /// /// The prompt result type. /// The prompt. /// The default value style or to use the default style (green). /// The same instance so that multiple calls can be chained. public static TextPrompt DefaultValueStyle(this TextPrompt obj, Style? style) { ArgumentNullException.ThrowIfNull(obj); obj.DefaultValueStyle = style; return obj; } /// /// Sets the style in which the list of choices is displayed. /// /// The prompt result type. /// The prompt. /// The style to use for displaying the choices or to use the default style (blue). /// The same instance so that multiple calls can be chained. public static TextPrompt ChoicesStyle(this TextPrompt obj, Style? style) { ArgumentNullException.ThrowIfNull(obj); obj.ChoicesStyle = style; return obj; } /// /// Clears the prompt line after successful input. /// /// The prompt result type. /// The prompt. /// Whether the prompt line should be cleared /// The same instance so that multiple calls can be chained. public static TextPrompt ClearOnFinish(this TextPrompt obj, bool clear = true) { ArgumentNullException.ThrowIfNull(obj); obj.ClearOnFinish = clear; return obj; } } ================================================ FILE: src/Spectre.Console/Properties/Usings.cs ================================================ global using System; global using System.Collections; global using System.Collections.Generic; global using System.ComponentModel; global using System.Diagnostics; global using System.Diagnostics.CodeAnalysis; global using System.Globalization; global using System.IO; global using System.Linq; global using System.Net; global using System.Reflection; global using System.Runtime.CompilerServices; global using System.Text; global using System.Threading; global using System.Threading.Tasks; global using Spectre.Console.Enrichment; global using Spectre.Console.Rendering; global using Wcwidth; ================================================ FILE: src/Spectre.Console/Recorder.cs ================================================ namespace Spectre.Console; /// /// A console recorder used to record output from a console. /// public class Recorder : IAnsiConsole, IDisposable { private readonly IAnsiConsole _console; private readonly List _recorded; /// public Profile Profile => _console.Profile; /// public IAnsiConsoleCursor Cursor => _console.Cursor; /// public IAnsiConsoleInput Input => _console.Input; /// public IExclusivityMode ExclusivityMode => _console.ExclusivityMode; /// public RenderPipeline Pipeline => _console.Pipeline; /// /// Initializes a new instance of the class. /// /// The console to record output for. public Recorder(IAnsiConsole console) { _console = console ?? throw new ArgumentNullException(nameof(console)); _recorded = []; } /// [SuppressMessage("Usage", "CA1816:Dispose methods should call SuppressFinalize")] public void Dispose() { // Only used for scoping. } /// public void Clear(bool home) { _console.Clear(home); } /// public void Write(IRenderable renderable) { ArgumentNullException.ThrowIfNull(renderable); _recorded.Add(renderable); _console.Write(renderable); } /// public void WriteAnsi(Action action) { // Do nothing } internal Recorder Clone(IAnsiConsole console) { var recorder = new Recorder(console); recorder._recorded.AddRange(_recorded); return recorder; } /// /// Exports the recorded data. /// /// The encoder. /// The recorded data represented as a string. public string Export(IAnsiConsoleEncoder encoder) { ArgumentNullException.ThrowIfNull(encoder); return encoder.Encode(_console, _recorded); } } /// /// Contains extension methods for . /// public static class RecorderExtensions { private static readonly TextEncoder _textEncoder = new TextEncoder(); private static readonly HtmlEncoder _htmlEncoder = new HtmlEncoder(); /// /// Exports the recorded content as text. /// /// The recorder. /// The recorded content as text. public static string ExportText(this Recorder recorder) { ArgumentNullException.ThrowIfNull(recorder); return recorder.Export(_textEncoder); } /// /// Exports the recorded content as HTML. /// /// The recorder. /// The recorded content as HTML. public static string ExportHtml(this Recorder recorder) { ArgumentNullException.ThrowIfNull(recorder); return recorder.Export(_htmlEncoder); } } ================================================ FILE: src/Spectre.Console/Region.cs ================================================ namespace Spectre.Console; /// /// Represents a region. /// [DebuggerDisplay("[X={X,nq}, Y={Y,nq}, W={Width,nq}, H={Height,nq}]")] public readonly struct Region { /// /// Gets the x-coordinate. /// public int X { get; } /// /// Gets the y-coordinate. /// public int Y { get; } /// /// Gets the width. /// public int Width { get; } /// /// Gets the height. /// public int Height { get; } /// /// Initializes a new instance of the struct. /// /// The x-coordinate. /// The y-coordinate. /// The width. /// The height. public Region(int x, int y, int width, int height) { X = x; Y = y; Width = width; Height = height; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/BoxBorderPart.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents the different parts of a box border. /// public enum BoxBorderPart { /// /// The top left part of a box. /// TopLeft, /// /// The top part of a box. /// Top, /// /// The top right part of a box. /// TopRight, /// /// The left part of a box. /// Left, /// /// The right part of a box. /// Right, /// /// The bottom left part of a box. /// BottomLeft, /// /// The bottom part of a box. /// Bottom, /// /// The bottom right part of a box. /// BottomRight, } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Boxes/AsciiBoxBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents an old school ASCII border. /// public sealed class AsciiBoxBorder : BoxBorder { /// public override string GetPart(BoxBorderPart part) { return part switch { BoxBorderPart.TopLeft => "+", BoxBorderPart.Top => "-", BoxBorderPart.TopRight => "+", BoxBorderPart.Left => "|", BoxBorderPart.Right => "|", BoxBorderPart.BottomLeft => "+", BoxBorderPart.Bottom => "-", BoxBorderPart.BottomRight => "+", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Boxes/DoubleBoxBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a double border. /// public sealed class DoubleBoxBorder : BoxBorder { /// public override string GetPart(BoxBorderPart part) { return part switch { BoxBorderPart.TopLeft => "╔", BoxBorderPart.Top => "═", BoxBorderPart.TopRight => "╗", BoxBorderPart.Left => "║", BoxBorderPart.Right => "║", BoxBorderPart.BottomLeft => "╚", BoxBorderPart.Bottom => "═", BoxBorderPart.BottomRight => "╝", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Boxes/HeavyBoxBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a heavy border. /// public sealed class HeavyBoxBorder : BoxBorder { /// public override BoxBorder? SafeBorder => BoxBorder.Square; /// public override string GetPart(BoxBorderPart part) { return part switch { BoxBorderPart.TopLeft => "┏", BoxBorderPart.Top => "━", BoxBorderPart.TopRight => "┓", BoxBorderPart.Left => "┃", BoxBorderPart.Right => "┃", BoxBorderPart.BottomLeft => "┗", BoxBorderPart.Bottom => "━", BoxBorderPart.BottomRight => "┛", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Boxes/NoBoxBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents an invisible border. /// public sealed class NoBoxBorder : BoxBorder { /// public override string GetPart(BoxBorderPart part) { return " "; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Boxes/RoundedBoxBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a rounded border. /// public sealed class RoundedBoxBorder : BoxBorder { /// public override BoxBorder? SafeBorder => BoxBorder.Square; /// public override string GetPart(BoxBorderPart part) { return part switch { BoxBorderPart.TopLeft => "╭", BoxBorderPart.Top => "─", BoxBorderPart.TopRight => "╮", BoxBorderPart.Left => "│", BoxBorderPart.Right => "│", BoxBorderPart.BottomLeft => "╰", BoxBorderPart.Bottom => "─", BoxBorderPart.BottomRight => "╯", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Boxes/SquareBoxBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a square border. /// public sealed class SquareBoxBorder : BoxBorder { /// public override string GetPart(BoxBorderPart part) { return part switch { BoxBorderPart.TopLeft => "┌", BoxBorderPart.Top => "─", BoxBorderPart.TopRight => "┐", BoxBorderPart.Left => "│", BoxBorderPart.Right => "│", BoxBorderPart.BottomLeft => "└", BoxBorderPart.Bottom => "─", BoxBorderPart.BottomRight => "┘", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/TableBorderPart.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents the different parts of a table border. /// public enum TableBorderPart { /// /// The top left part of a header. /// HeaderTopLeft, /// /// The top part of a header. /// HeaderTop, /// /// The top separator part of a header. /// HeaderTopSeparator, /// /// The top right part of a header. /// HeaderTopRight, /// /// The left part of a header. /// HeaderLeft, /// /// A header separator. /// HeaderSeparator, /// /// The right part of a header. /// HeaderRight, /// /// The bottom left part of a header. /// HeaderBottomLeft, /// /// The bottom part of a header. /// HeaderBottom, /// /// The bottom separator part of a header. /// HeaderBottomSeparator, /// /// The bottom right part of a header. /// HeaderBottomRight, /// /// The top left part of a footer. /// FooterTopLeft, /// /// The top part of a footer. /// FooterTop, /// /// The top separator part of a footer. /// FooterTopSeparator, /// /// The top right part of a footer. /// FooterTopRight, /// /// The left part of a cell. /// CellLeft, /// /// A cell separator. /// CellSeparator, /// /// The right part of a cell. /// CellRight, /// /// The bottom left part of a footer. /// FooterBottomLeft, /// /// The bottom part of a footer. /// FooterBottom, /// /// The bottom separator part of a footer. /// FooterBottomSeparator, /// /// The bottom right part of a footer. /// FooterBottomRight, /// /// The left part of a row. /// RowLeft, /// /// The center part of a row. /// RowCenter, /// /// The separator part of a row. /// RowSeparator, /// /// The right part of a row. /// RowRight, } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/Ascii2TableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents another old school ASCII border. /// public sealed class Ascii2TableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "+", TableBorderPart.HeaderTop => "-", TableBorderPart.HeaderTopSeparator => "+", TableBorderPart.HeaderTopRight => "+", TableBorderPart.HeaderLeft => "|", TableBorderPart.HeaderSeparator => "|", TableBorderPart.HeaderRight => "|", TableBorderPart.HeaderBottomLeft => "|", TableBorderPart.HeaderBottom => "-", TableBorderPart.HeaderBottomSeparator => "+", TableBorderPart.HeaderBottomRight => "|", TableBorderPart.CellLeft => "|", TableBorderPart.CellSeparator => "|", TableBorderPart.CellRight => "|", TableBorderPart.FooterTopLeft => "|", TableBorderPart.FooterTop => "-", TableBorderPart.FooterTopSeparator => "+", TableBorderPart.FooterTopRight => "|", TableBorderPart.FooterBottomLeft => "+", TableBorderPart.FooterBottom => "-", TableBorderPart.FooterBottomSeparator => "+", TableBorderPart.FooterBottomRight => "+", TableBorderPart.RowLeft => "|", TableBorderPart.RowCenter => "-", TableBorderPart.RowSeparator => "+", TableBorderPart.RowRight => "|", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/AsciiDoubleHeadTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents an old school ASCII border with a double header border. /// public sealed class AsciiDoubleHeadTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "+", TableBorderPart.HeaderTop => "-", TableBorderPart.HeaderTopSeparator => "+", TableBorderPart.HeaderTopRight => "+", TableBorderPart.HeaderLeft => "|", TableBorderPart.HeaderSeparator => "|", TableBorderPart.HeaderRight => "|", TableBorderPart.HeaderBottomLeft => "|", TableBorderPart.HeaderBottom => "=", TableBorderPart.HeaderBottomSeparator => "+", TableBorderPart.HeaderBottomRight => "|", TableBorderPart.CellLeft => "|", TableBorderPart.CellSeparator => "|", TableBorderPart.CellRight => "|", TableBorderPart.FooterTopLeft => "+", TableBorderPart.FooterTop => "-", TableBorderPart.FooterTopSeparator => "+", TableBorderPart.FooterTopRight => "+", TableBorderPart.FooterBottomLeft => "+", TableBorderPart.FooterBottom => "-", TableBorderPart.FooterBottomSeparator => "+", TableBorderPart.FooterBottomRight => "+", TableBorderPart.RowLeft => "|", TableBorderPart.RowCenter => "-", TableBorderPart.RowSeparator => "+", TableBorderPart.RowRight => "|", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/AsciiTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents an old school ASCII border. /// public sealed class AsciiTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "+", TableBorderPart.HeaderTop => "-", TableBorderPart.HeaderTopSeparator => "-", TableBorderPart.HeaderTopRight => "+", TableBorderPart.HeaderLeft => "|", TableBorderPart.HeaderSeparator => "|", TableBorderPart.HeaderRight => "|", TableBorderPart.HeaderBottomLeft => "|", TableBorderPart.HeaderBottom => "-", TableBorderPart.HeaderBottomSeparator => "+", TableBorderPart.HeaderBottomRight => "|", TableBorderPart.CellLeft => "|", TableBorderPart.CellSeparator => "|", TableBorderPart.CellRight => "|", TableBorderPart.FooterTopLeft => "|", TableBorderPart.FooterTop => "-", TableBorderPart.FooterTopSeparator => "+", TableBorderPart.FooterTopRight => "|", TableBorderPart.FooterBottomLeft => "+", TableBorderPart.FooterBottom => "-", TableBorderPart.FooterBottomSeparator => "-", TableBorderPart.FooterBottomRight => "+", TableBorderPart.RowLeft => "|", TableBorderPart.RowCenter => "-", TableBorderPart.RowSeparator => "+", TableBorderPart.RowRight => "|", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/DoubleEdgeTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a border with a double edge. /// public sealed class DoubleEdgeTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "╔", TableBorderPart.HeaderTop => "═", TableBorderPart.HeaderTopSeparator => "╤", TableBorderPart.HeaderTopRight => "╗", TableBorderPart.HeaderLeft => "║", TableBorderPart.HeaderSeparator => "│", TableBorderPart.HeaderRight => "║", TableBorderPart.HeaderBottomLeft => "╟", TableBorderPart.HeaderBottom => "─", TableBorderPart.HeaderBottomSeparator => "┼", TableBorderPart.HeaderBottomRight => "╢", TableBorderPart.CellLeft => "║", TableBorderPart.CellSeparator => "│", TableBorderPart.CellRight => "║", TableBorderPart.FooterTopLeft => "╟", TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "┼", TableBorderPart.FooterTopRight => "╢", TableBorderPart.FooterBottomLeft => "╚", TableBorderPart.FooterBottom => "═", TableBorderPart.FooterBottomSeparator => "╧", TableBorderPart.FooterBottomRight => "╝", TableBorderPart.RowLeft => "╟", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "┼", TableBorderPart.RowRight => "╢", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/DoubleTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a double border. /// public sealed class DoubleTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "╔", TableBorderPart.HeaderTop => "═", TableBorderPart.HeaderTopSeparator => "╦", TableBorderPart.HeaderTopRight => "╗", TableBorderPart.HeaderLeft => "║", TableBorderPart.HeaderSeparator => "║", TableBorderPart.HeaderRight => "║", TableBorderPart.HeaderBottomLeft => "╠", TableBorderPart.HeaderBottom => "═", TableBorderPart.HeaderBottomSeparator => "╬", TableBorderPart.HeaderBottomRight => "╣", TableBorderPart.CellLeft => "║", TableBorderPart.CellSeparator => "║", TableBorderPart.CellRight => "║", TableBorderPart.FooterTopLeft => "╠", TableBorderPart.FooterTop => "═", TableBorderPart.FooterTopSeparator => "╬", TableBorderPart.FooterTopRight => "╣", TableBorderPart.FooterBottomLeft => "╚", TableBorderPart.FooterBottom => "═", TableBorderPart.FooterBottomSeparator => "╩", TableBorderPart.FooterBottomRight => "╝", TableBorderPart.RowLeft => "╠", TableBorderPart.RowCenter => "═", TableBorderPart.RowSeparator => "╬", TableBorderPart.RowRight => "╣", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/HeavyEdgeTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a border with a heavy edge. /// public sealed class HeavyEdgeTableBorder : TableBorder { /// public override TableBorder? SafeBorder => TableBorder.Square; /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "┏", TableBorderPart.HeaderTop => "━", TableBorderPart.HeaderTopSeparator => "┯", TableBorderPart.HeaderTopRight => "┓", TableBorderPart.HeaderLeft => "┃", TableBorderPart.HeaderSeparator => "│", TableBorderPart.HeaderRight => "┃", TableBorderPart.HeaderBottomLeft => "┠", TableBorderPart.HeaderBottom => "─", TableBorderPart.HeaderBottomSeparator => "┼", TableBorderPart.HeaderBottomRight => "┨", TableBorderPart.CellLeft => "┃", TableBorderPart.CellSeparator => "│", TableBorderPart.CellRight => "┃", TableBorderPart.FooterTopLeft => "┠", TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "┼", TableBorderPart.FooterTopRight => "┨", TableBorderPart.FooterBottomLeft => "┗", TableBorderPart.FooterBottom => "━", TableBorderPart.FooterBottomSeparator => "┷", TableBorderPart.FooterBottomRight => "┛", TableBorderPart.RowLeft => "┠", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "┼", TableBorderPart.RowRight => "┨", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/HeavyHeadTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a border with a heavy header. /// public sealed class HeavyHeadTableBorder : TableBorder { /// public override TableBorder? SafeBorder => TableBorder.Square; /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "┏", TableBorderPart.HeaderTop => "━", TableBorderPart.HeaderTopSeparator => "┳", TableBorderPart.HeaderTopRight => "┓", TableBorderPart.HeaderLeft => "┃", TableBorderPart.HeaderSeparator => "┃", TableBorderPart.HeaderRight => "┃", TableBorderPart.HeaderBottomLeft => "┡", TableBorderPart.HeaderBottom => "━", TableBorderPart.HeaderBottomSeparator => "╇", TableBorderPart.HeaderBottomRight => "┩", TableBorderPart.CellLeft => "│", TableBorderPart.CellSeparator => "│", TableBorderPart.CellRight => "│", TableBorderPart.FooterTopLeft => "├", TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "┼", TableBorderPart.FooterTopRight => "┤", TableBorderPart.FooterBottomLeft => "└", TableBorderPart.FooterBottom => "─", TableBorderPart.FooterBottomSeparator => "┴", TableBorderPart.FooterBottomRight => "┘", TableBorderPart.RowLeft => "├", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "┼", TableBorderPart.RowRight => "┤", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/HeavyTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a heavy border. /// public sealed class HeavyTableBorder : TableBorder { /// public override TableBorder? SafeBorder => TableBorder.Square; /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "┏", TableBorderPart.HeaderTop => "━", TableBorderPart.HeaderTopSeparator => "┳", TableBorderPart.HeaderTopRight => "┓", TableBorderPart.HeaderLeft => "┃", TableBorderPart.HeaderSeparator => "┃", TableBorderPart.HeaderRight => "┃", TableBorderPart.HeaderBottomLeft => "┣", TableBorderPart.HeaderBottom => "━", TableBorderPart.HeaderBottomSeparator => "╋", TableBorderPart.HeaderBottomRight => "┫", TableBorderPart.CellLeft => "┃", TableBorderPart.CellSeparator => "┃", TableBorderPart.CellRight => "┃", TableBorderPart.FooterTopLeft => "┣", TableBorderPart.FooterTop => "━", TableBorderPart.FooterTopSeparator => "╋", TableBorderPart.FooterTopRight => "┫", TableBorderPart.FooterBottomLeft => "┗", TableBorderPart.FooterBottom => "━", TableBorderPart.FooterBottomSeparator => "┻", TableBorderPart.FooterBottomRight => "┛", TableBorderPart.RowLeft => "┣", TableBorderPart.RowCenter => "━", TableBorderPart.RowSeparator => "╋", TableBorderPart.RowRight => "┫", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/HorizontalTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a horizontal border. /// public sealed class HorizontalTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "─", TableBorderPart.HeaderTop => "─", TableBorderPart.HeaderTopSeparator => "─", TableBorderPart.HeaderTopRight => "─", TableBorderPart.HeaderLeft => " ", TableBorderPart.HeaderSeparator => " ", TableBorderPart.HeaderRight => " ", TableBorderPart.HeaderBottomLeft => "─", TableBorderPart.HeaderBottom => "─", TableBorderPart.HeaderBottomSeparator => "─", TableBorderPart.HeaderBottomRight => "─", TableBorderPart.CellLeft => " ", TableBorderPart.CellSeparator => " ", TableBorderPart.CellRight => " ", TableBorderPart.FooterTopLeft => "─", TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "─", TableBorderPart.FooterTopRight => "─", TableBorderPart.FooterBottomLeft => "─", TableBorderPart.FooterBottom => "─", TableBorderPart.FooterBottomSeparator => "─", TableBorderPart.FooterBottomRight => "─", TableBorderPart.RowLeft => "─", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "─", TableBorderPart.RowRight => "─", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/MarkdownTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a Markdown border. /// public sealed class MarkdownTableBorder : TableBorder { /// public override bool SupportsRowSeparator => false; /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => " ", TableBorderPart.HeaderTop => " ", TableBorderPart.HeaderTopSeparator => " ", TableBorderPart.HeaderTopRight => " ", TableBorderPart.HeaderLeft => "|", TableBorderPart.HeaderSeparator => "|", TableBorderPart.HeaderRight => "|", TableBorderPart.HeaderBottomLeft => "|", TableBorderPart.HeaderBottom => "-", TableBorderPart.HeaderBottomSeparator => "|", TableBorderPart.HeaderBottomRight => "|", TableBorderPart.CellLeft => "|", TableBorderPart.CellSeparator => "|", TableBorderPart.CellRight => "|", TableBorderPart.FooterTopLeft => " ", TableBorderPart.FooterTop => " ", TableBorderPart.FooterTopSeparator => " ", TableBorderPart.FooterTopRight => " ", TableBorderPart.FooterBottomLeft => " ", TableBorderPart.FooterBottom => " ", TableBorderPart.FooterBottomSeparator => " ", TableBorderPart.FooterBottomRight => " ", TableBorderPart.RowLeft => " ", TableBorderPart.RowCenter => " ", TableBorderPart.RowSeparator => " ", TableBorderPart.RowRight => " ", _ => throw new InvalidOperationException("Unknown border part."), }; } /// public override string GetColumnRow(TablePart part, IReadOnlyList widths, IReadOnlyList columns) { if (part == TablePart.FooterSeparator) { return string.Empty; } if (part != TablePart.HeaderSeparator) { return base.GetColumnRow(part, widths, columns); } var (left, center, separator, right) = GetTableParts(part); var builder = new StringBuilder(); builder.Append(left); foreach (var (columnIndex, _, lastColumn, columnWidth) in widths.Enumerate()) { var padding = columns[columnIndex].Padding; if (padding != null && padding.Value.Left > 0) { // Left padding builder.Append(" ".Repeat(padding.Value.Left)); } var justification = columns[columnIndex].Alignment; if (justification == null) { // No alignment builder.Append(center.Repeat(columnWidth)); } else if (justification.Value == Justify.Left) { // Left builder.Append(':'); builder.Append(center.Repeat(columnWidth - 1)); } else if (justification.Value == Justify.Center) { // Centered builder.Append(':'); builder.Append(center.Repeat(columnWidth - 2)); builder.Append(':'); } else if (justification.Value == Justify.Right) { // Right builder.Append(center.Repeat(columnWidth - 1)); builder.Append(':'); } // Right padding if (padding != null && padding.Value.Right > 0) { builder.Append(" ".Repeat(padding.Value.Right)); } if (!lastColumn) { builder.Append(separator); } } builder.Append(right); return builder.ToString(); } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/MinimalDoubleHeadTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a minimal border with a double header border. /// public sealed class MinimalDoubleHeadTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => " ", TableBorderPart.HeaderTop => " ", TableBorderPart.HeaderTopSeparator => " ", TableBorderPart.HeaderTopRight => " ", TableBorderPart.HeaderLeft => " ", TableBorderPart.HeaderSeparator => "│", TableBorderPart.HeaderRight => " ", TableBorderPart.HeaderBottomLeft => " ", TableBorderPart.HeaderBottom => "═", TableBorderPart.HeaderBottomSeparator => "╪", TableBorderPart.HeaderBottomRight => " ", TableBorderPart.CellLeft => " ", TableBorderPart.CellSeparator => "│", TableBorderPart.CellRight => " ", TableBorderPart.FooterTopLeft => " ", TableBorderPart.FooterTop => "═", TableBorderPart.FooterTopSeparator => "╪", TableBorderPart.FooterTopRight => " ", TableBorderPart.FooterBottomLeft => " ", TableBorderPart.FooterBottom => " ", TableBorderPart.FooterBottomSeparator => " ", TableBorderPart.FooterBottomRight => " ", TableBorderPart.RowLeft => " ", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "┼", TableBorderPart.RowRight => " ", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/MinimalHeavyHeadTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a minimal border with a heavy header. /// public sealed class MinimalHeavyHeadTableBorder : TableBorder { /// public override TableBorder? SafeBorder => TableBorder.Minimal; /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => " ", TableBorderPart.HeaderTop => " ", TableBorderPart.HeaderTopSeparator => " ", TableBorderPart.HeaderTopRight => " ", TableBorderPart.HeaderLeft => " ", TableBorderPart.HeaderSeparator => "│", TableBorderPart.HeaderRight => " ", TableBorderPart.HeaderBottomLeft => " ", TableBorderPart.HeaderBottom => "━", TableBorderPart.HeaderBottomSeparator => "┿", TableBorderPart.HeaderBottomRight => " ", TableBorderPart.CellLeft => " ", TableBorderPart.CellSeparator => "│", TableBorderPart.CellRight => " ", TableBorderPart.FooterTopLeft => " ", TableBorderPart.FooterTop => "━", TableBorderPart.FooterTopSeparator => "┿", TableBorderPart.FooterTopRight => " ", TableBorderPart.FooterBottomLeft => " ", TableBorderPart.FooterBottom => " ", TableBorderPart.FooterBottomSeparator => " ", TableBorderPart.FooterBottomRight => " ", TableBorderPart.RowLeft => " ", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "┼", TableBorderPart.RowRight => " ", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/MinimalTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a minimal border. /// public sealed class MinimalTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => " ", TableBorderPart.HeaderTop => " ", TableBorderPart.HeaderTopSeparator => " ", TableBorderPart.HeaderTopRight => " ", TableBorderPart.HeaderLeft => " ", TableBorderPart.HeaderSeparator => "│", TableBorderPart.HeaderRight => " ", TableBorderPart.HeaderBottomLeft => " ", TableBorderPart.HeaderBottom => "─", TableBorderPart.HeaderBottomSeparator => "┼", TableBorderPart.HeaderBottomRight => " ", TableBorderPart.CellLeft => " ", TableBorderPart.CellSeparator => "│", TableBorderPart.CellRight => " ", TableBorderPart.FooterTopLeft => " ", TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "┼", TableBorderPart.FooterTopRight => " ", TableBorderPart.FooterBottomLeft => " ", TableBorderPart.FooterBottom => " ", TableBorderPart.FooterBottomSeparator => " ", TableBorderPart.FooterBottomRight => " ", TableBorderPart.RowLeft => " ", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "┼", TableBorderPart.RowRight => " ", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/MinimalistTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a minimalist border. /// public sealed class MinimalistTableBorder : TableBorder { /// public override bool SupportsRowSeparator => false; /// public override bool UsePadding => false; /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => string.Empty, TableBorderPart.HeaderTop => string.Empty, TableBorderPart.HeaderTopSeparator => string.Empty, TableBorderPart.HeaderTopRight => string.Empty, TableBorderPart.HeaderLeft => string.Empty, TableBorderPart.HeaderSeparator => " ", TableBorderPart.HeaderRight => string.Empty, TableBorderPart.HeaderBottomLeft => string.Empty, TableBorderPart.HeaderBottom => "─", TableBorderPart.HeaderBottomSeparator => "─", TableBorderPart.HeaderBottomRight => string.Empty, TableBorderPart.CellLeft => string.Empty, TableBorderPart.CellSeparator => " ", TableBorderPart.CellRight => string.Empty, TableBorderPart.FooterTopLeft => string.Empty, TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "─", TableBorderPart.FooterTopRight => string.Empty, TableBorderPart.FooterBottomLeft => string.Empty, TableBorderPart.FooterBottom => string.Empty, TableBorderPart.FooterBottomSeparator => string.Empty, TableBorderPart.FooterBottomRight => string.Empty, TableBorderPart.RowLeft => string.Empty, TableBorderPart.RowCenter => string.Empty, TableBorderPart.RowSeparator => string.Empty, TableBorderPart.RowRight => string.Empty, _ => throw new InvalidOperationException("Unknown border part."), }; } /// public override string GetColumnRow(TablePart part, IReadOnlyList widths, IReadOnlyList columns) { ArgumentNullException.ThrowIfNull(widths); ArgumentNullException.ThrowIfNull(columns); var (_, center, separator, _) = GetTableParts(part); var builder = new StringBuilder(); foreach (var (columnIndex, _, lastColumn, columnWidth) in widths.Enumerate()) { builder.Append(center.Repeat(columnWidth)); if (!lastColumn) { builder.Append(separator); } } return builder.ToString(); } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/NoTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents an invisible border. /// public sealed class NoTableBorder : TableBorder { /// public override bool Visible => false; /// public override bool SupportsRowSeparator => false; /// public override string GetPart(TableBorderPart part) { return " "; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/RoundedTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a rounded border. /// public sealed class RoundedTableBorder : TableBorder { /// public override TableBorder? SafeBorder => TableBorder.Square; /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "╭", TableBorderPart.HeaderTop => "─", TableBorderPart.HeaderTopSeparator => "┬", TableBorderPart.HeaderTopRight => "╮", TableBorderPart.HeaderLeft => "│", TableBorderPart.HeaderSeparator => "│", TableBorderPart.HeaderRight => "│", TableBorderPart.HeaderBottomLeft => "├", TableBorderPart.HeaderBottom => "─", TableBorderPart.HeaderBottomSeparator => "┼", TableBorderPart.HeaderBottomRight => "┤", TableBorderPart.CellLeft => "│", TableBorderPart.CellSeparator => "│", TableBorderPart.CellRight => "│", TableBorderPart.FooterTopLeft => "├", TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "┼", TableBorderPart.FooterTopRight => "┤", TableBorderPart.FooterBottomLeft => "╰", TableBorderPart.FooterBottom => "─", TableBorderPart.FooterBottomSeparator => "┴", TableBorderPart.FooterBottomRight => "╯", TableBorderPart.RowLeft => "├", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "┼", TableBorderPart.RowRight => "┤", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/SimpleHeavyTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a simple border with heavy lines. /// public sealed class SimpleHeavyTableBorder : TableBorder { /// public override TableBorder? SafeBorder => TableBorder.Simple; /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => " ", TableBorderPart.HeaderTop => " ", TableBorderPart.HeaderTopSeparator => " ", TableBorderPart.HeaderTopRight => " ", TableBorderPart.HeaderLeft => " ", TableBorderPart.HeaderSeparator => " ", TableBorderPart.HeaderRight => " ", TableBorderPart.HeaderBottomLeft => "━", TableBorderPart.HeaderBottom => "━", TableBorderPart.HeaderBottomSeparator => "━", TableBorderPart.HeaderBottomRight => "━", TableBorderPart.CellLeft => " ", TableBorderPart.CellSeparator => " ", TableBorderPart.CellRight => " ", TableBorderPart.FooterTopLeft => "━", TableBorderPart.FooterTop => "━", TableBorderPart.FooterTopSeparator => "━", TableBorderPart.FooterTopRight => "━", TableBorderPart.FooterBottomLeft => " ", TableBorderPart.FooterBottom => " ", TableBorderPart.FooterBottomSeparator => " ", TableBorderPart.FooterBottomRight => " ", TableBorderPart.RowLeft => "─", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "─", TableBorderPart.RowRight => "─", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/SimpleTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a simple border. /// public sealed class SimpleTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => " ", TableBorderPart.HeaderTop => " ", TableBorderPart.HeaderTopSeparator => " ", TableBorderPart.HeaderTopRight => " ", TableBorderPart.HeaderLeft => " ", TableBorderPart.HeaderSeparator => " ", TableBorderPart.HeaderRight => " ", TableBorderPart.HeaderBottomLeft => "─", TableBorderPart.HeaderBottom => "─", TableBorderPart.HeaderBottomSeparator => "─", TableBorderPart.HeaderBottomRight => "─", TableBorderPart.CellLeft => " ", TableBorderPart.CellSeparator => " ", TableBorderPart.CellRight => " ", TableBorderPart.FooterTopLeft => "─", TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "─", TableBorderPart.FooterTopRight => "─", TableBorderPart.FooterBottomLeft => " ", TableBorderPart.FooterBottom => " ", TableBorderPart.FooterBottomSeparator => " ", TableBorderPart.FooterBottomRight => " ", TableBorderPart.RowLeft => "─", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "─", TableBorderPart.RowRight => "─", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Borders/Tables/SquareTableBorder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a square border. /// public sealed class SquareTableBorder : TableBorder { /// public override string GetPart(TableBorderPart part) { return part switch { TableBorderPart.HeaderTopLeft => "┌", TableBorderPart.HeaderTop => "─", TableBorderPart.HeaderTopSeparator => "┬", TableBorderPart.HeaderTopRight => "┐", TableBorderPart.HeaderLeft => "│", TableBorderPart.HeaderSeparator => "│", TableBorderPart.HeaderRight => "│", TableBorderPart.HeaderBottomLeft => "├", TableBorderPart.HeaderBottom => "─", TableBorderPart.HeaderBottomSeparator => "┼", TableBorderPart.HeaderBottomRight => "┤", TableBorderPart.CellLeft => "│", TableBorderPart.CellSeparator => "│", TableBorderPart.CellRight => "│", TableBorderPart.FooterTopLeft => "├", TableBorderPart.FooterTop => "─", TableBorderPart.FooterTopSeparator => "┼", TableBorderPart.FooterTopRight => "┤", TableBorderPart.FooterBottomLeft => "└", TableBorderPart.FooterBottom => "─", TableBorderPart.FooterBottomSeparator => "┴", TableBorderPart.FooterBottomRight => "┘", TableBorderPart.RowLeft => "├", TableBorderPart.RowCenter => "─", TableBorderPart.RowSeparator => "┼", TableBorderPart.RowRight => "┤", _ => throw new InvalidOperationException("Unknown border part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/IAnsiConsoleEncoder.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a console encoder that can encode /// recorded segments into a string. /// public interface IAnsiConsoleEncoder { /// /// Encodes the specified enumerator. /// /// The console to use when encoding. /// The renderable objects to encode. /// A string representing the encoded result. string Encode(IAnsiConsole console, IEnumerable renderable); } ================================================ FILE: src/Spectre.Console/Rendering/IHasDirtyState.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents something that can be dirty. /// public interface IHasDirtyState { /// /// Gets a value indicating whether the object is dirty. /// bool IsDirty { get; } } ================================================ FILE: src/Spectre.Console/Rendering/IRenderHook.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a render hook. /// public interface IRenderHook { /// /// Processes the specified renderables. /// /// The render options. /// The renderables to process. /// The processed renderables. IEnumerable Process(RenderOptions options, IEnumerable renderables); } ================================================ FILE: src/Spectre.Console/Rendering/IRenderable.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents something that can be rendered to the console. /// public interface IRenderable { /// /// Measures the renderable object. /// /// The render options. /// The maximum allowed width. /// The minimum and maximum width of the object. Measurement Measure(RenderOptions options, int maxWidth); /// /// Renders the object. /// /// The render options. /// The maximum allowed width. /// A collection of segments. IEnumerable Render(RenderOptions options, int maxWidth); } /// /// Contains extension methods for . /// public static class RenderableExtensions { /// /// Gets the segments for a renderable using the specified console. /// /// The renderable. /// The console. /// An enumerable containing segments representing the specified . public static IEnumerable GetSegments(this IRenderable renderable, IAnsiConsole console) { ArgumentNullException.ThrowIfNull(console); ArgumentNullException.ThrowIfNull(renderable); var context = RenderOptions.Create(console, console.Profile.Capabilities); var renderables = console.Pipeline.Process(context, [renderable]); return GetSegments(console, context, renderables); } private static IEnumerable GetSegments(IAnsiConsole console, RenderOptions options, IEnumerable renderables) { var result = new List(); foreach (var renderable in renderables) { result.AddRange(renderable.Render(options, console.Profile.Width)); } return Segment.Merge(result); } } ================================================ FILE: src/Spectre.Console/Rendering/JustInTimeRenderable.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents something renderable that's reconstructed /// when its state change in any way. /// public abstract class JustInTimeRenderable : Renderable { private bool _dirty; private IRenderable? _rendered; /// protected sealed override Measurement Measure(RenderOptions context, int maxWidth) { return GetInner().Measure(context, maxWidth); } /// protected sealed override IEnumerable Render(RenderOptions context, int width) { return GetInner().Render(context, width); } /// /// Builds the inner renderable. /// /// A new inner renderable. protected abstract IRenderable Build(); /// /// Checks if there are any children that has changed. /// If so, the underlying renderable needs rebuilding. /// /// true if the object needs rebuilding, otherwise false. protected virtual bool HasDirtyChildren() { return false; } /// /// Marks this instance as dirty. /// protected void MarkAsDirty() { _dirty = true; } /// /// Marks this instance as dirty. /// /// /// The action to execute before marking the instance as dirty. /// protected void MarkAsDirty(Action action) { ArgumentNullException.ThrowIfNull(action); action(); _dirty = true; } private IRenderable GetInner() { if (_dirty || HasDirtyChildren() || _rendered == null) { _rendered = Build(); _dirty = false; } return _rendered; } } ================================================ FILE: src/Spectre.Console/Rendering/Measurement.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a measurement. /// public readonly struct Measurement : IEquatable { /// /// Gets the minimum width. /// public int Min { get; } /// /// Gets the maximum width. /// public int Max { get; } /// /// Initializes a new instance of the struct. /// /// The minimum width. /// The maximum width. public Measurement(int min, int max) { Min = min; Max = max; } /// public override bool Equals(object? obj) { return obj is Measurement measurement && Equals(measurement); } /// public override int GetHashCode() { unchecked { var hash = (int)2166136261; hash = (hash * 16777619) ^ Min.GetHashCode(); hash = (hash * 16777619) ^ Max.GetHashCode(); return hash; } } /// public bool Equals(Measurement other) { return Min == other.Min && Max == other.Max; } /// /// Checks if two instances are equal. /// /// The first measurement instance to compare. /// The second measurement instance to compare. /// true if the two measurements are equal, otherwise false. public static bool operator ==(Measurement left, Measurement right) { return left.Equals(right); } /// /// Checks if two instances are not equal. /// /// The first measurement instance to compare. /// The second measurement instance to compare. /// true if the two measurements are not equal, otherwise false. public static bool operator !=(Measurement left, Measurement right) { return !(left == right); } } ================================================ FILE: src/Spectre.Console/Rendering/RenderHookScope.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a render hook scope. /// public sealed class RenderHookScope : IDisposable { private readonly IAnsiConsole _console; private readonly IRenderHook _hook; /// /// Initializes a new instance of the class. /// /// The console to attach the render hook to. /// The render hook. public RenderHookScope(IAnsiConsole console, IRenderHook hook) { _console = console ?? throw new ArgumentNullException(nameof(console)); _hook = hook ?? throw new ArgumentNullException(nameof(hook)); _console.Pipeline.Attach(_hook); } /// public void Dispose() { _console.Pipeline.Detach(_hook); } } ================================================ FILE: src/Spectre.Console/Rendering/RenderOptions.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents render options. /// /// The capabilities. /// The console size. public record class RenderOptions(IReadOnlyCapabilities Capabilities, Size ConsoleSize) { /// /// Gets the current color system. /// public ColorSystem ColorSystem => Capabilities.ColorSystem; /// /// Gets a value indicating whether or not VT/Ansi codes are supported. /// public bool Ansi => Capabilities.Ansi; /// /// Gets a value indicating whether or not unicode is supported. /// public bool Unicode => Capabilities.Unicode; /// /// Gets the current justification. /// public Justify? Justification { get; init; } /// /// Gets the requested height. /// public int? Height { get; init; } /// /// Gets a value indicating whether the context want items to render without /// line breaks and return a single line where applicable. /// internal bool SingleLine { get; init; } /// /// Creates a instance from a . /// /// The console. /// The capabilities, or null to use the provided console's capabilities. /// A representing the provided . public static RenderOptions Create(IAnsiConsole console, IReadOnlyCapabilities? capabilities = null) { ArgumentNullException.ThrowIfNull(console); return new RenderOptions( capabilities ?? console.Profile.Capabilities, new Size(console.Profile.Width, console.Profile.Height)) { Justification = null, Height = null, SingleLine = false, }; } } internal static class RenderOptionsExtensions { public static BoxBorder GetSafeBorder(this RenderOptions options, T border) where T : IHasBoxBorder, IHasBorder { return BoxExtensions.GetSafeBorder(border.Border, !options.Unicode && border.UseSafeBorder); } } ================================================ FILE: src/Spectre.Console/Rendering/RenderPipeline.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents the render pipeline. /// public sealed class RenderPipeline { private readonly List _hooks; private readonly Lock _lock; /// /// Initializes a new instance of the class. /// public RenderPipeline() { _hooks = []; _lock = LockFactory.Create(); } /// /// Attaches a new render hook onto the pipeline. /// /// The render hook to attach. public void Attach(IRenderHook hook) { lock (_lock) { _hooks.Add(hook); } } /// /// Detaches a render hook from the pipeline. /// /// The render hook to detach. public void Detach(IRenderHook hook) { lock (_lock) { _hooks.Remove(hook); } } /// /// Processes the specified renderables. /// /// The render options. /// The renderables to process. /// The processed renderables. public IEnumerable Process(RenderOptions options, IEnumerable renderables) { lock (_lock) { var current = renderables; for (var index = _hooks.Count - 1; index >= 0; index--) { current = _hooks[index].Process(options, current); } return current; } } } ================================================ FILE: src/Spectre.Console/Rendering/Renderable.cs ================================================ namespace Spectre.Console.Rendering; /// /// Base class for a renderable object implementing . /// public abstract class Renderable : IRenderable { /// [DebuggerStepThrough] Measurement IRenderable.Measure(RenderOptions options, int maxWidth) { return Measure(options, maxWidth); } /// [DebuggerStepThrough] IEnumerable IRenderable.Render(RenderOptions options, int maxWidth) { return Render(options, maxWidth); } /// /// Measures the renderable object. /// /// The render options. /// The maximum allowed width. /// The minimum and maximum width of the object. protected virtual Measurement Measure(RenderOptions options, int maxWidth) { return new Measurement(maxWidth, maxWidth); } /// /// Renders the object. /// /// The render options. /// The maximum allowed width. /// A collection of segments. protected abstract IEnumerable Render(RenderOptions options, int maxWidth); } ================================================ FILE: src/Spectre.Console/Rendering/Segment.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a renderable segment. /// [DebuggerDisplay("{Text,nq}")] public class Segment { /// /// Gets the segment text. /// public string Text { get; } /// /// Gets a value indicating whether or not this is an explicit line break /// that should be preserved. /// public bool IsLineBreak { get; } /// /// Gets a value indicating whether or not this is a whitespace /// that should be preserved but not taken into account when /// layouting text. /// public bool IsWhiteSpace { get; } /// /// Gets a value indicating whether or not this is a /// control code such as cursor movement. /// public bool IsControlCode { get; } /// /// Gets the segment style. /// public Style Style { get; } /// /// Gets the segment link. /// public Link? Link { get; } /// /// Gets a segment representing a line break. /// public static Segment LineBreak { get; } = new Segment(Environment.NewLine, Style.Plain, null, true, false); /// /// Gets an empty segment. /// public static Segment Empty { get; } = new Segment(string.Empty, Style.Plain, null, false, false); /// /// Creates padding segment. /// /// Number of whitespace characters. /// Segment for specified padding size. public static Segment Padding(int size) => new(new string(' ', size)); /// /// Initializes a new instance of the class. /// /// The segment text. public Segment(string text) : this(text, Style.Plain) { } /// /// Initializes a new instance of the class. /// /// The segment text. /// The segment style. /// The segment link. public Segment(string text, Style style, Link? link = null) : this(text, style, link, false, false) { } private Segment(string text, Style style, Link? link, bool lineBreak, bool control) { Text = text?.NormalizeNewLines() ?? throw new ArgumentNullException(nameof(text)); Style = style; Link = link; IsLineBreak = lineBreak; IsWhiteSpace = string.IsNullOrWhiteSpace(text); IsControlCode = control; } /// /// Creates a control segment. /// /// The control code. /// A segment representing a control code. public static Segment Control(string control) { return new Segment(control, Style.Plain, null, false, true); } /// /// Gets the number of cells that this segment /// occupies in the console. /// /// The number of cells that this segment occupies in the console. public int CellCount() { if (IsControlCode) { return 0; } return Cell.GetCellLength(Text); } /// /// Gets the number of cells that the segments occupies in the console. /// /// The segments to measure. /// The number of cells that the segments occupies in the console. public static int CellCount(IEnumerable segments) { ArgumentNullException.ThrowIfNull(segments); var sum = 0; foreach (var segment in segments) { sum += segment.CellCount(); } return sum; } /// /// Returns a new segment without any trailing line endings. /// /// A new segment without any trailing line endings. public Segment StripLineEndings() { return new Segment(Text.TrimEnd('\n').TrimEnd('\r'), Style); } /// /// Splits the segment at the offset. /// /// The offset where to split the segment. /// One or two new segments representing the split. public (Segment First, Segment? Second) Split(int offset) { if (offset < 0) { return (this, null); } if (offset >= CellCount()) { return (this, null); } var index = 0; if (offset > 0) { var accumulated = 0; foreach (var character in Text) { index++; accumulated += Cell.GetCellLength(character); if (accumulated >= offset) { break; } } } return ( new Segment(Text.Substring(0, index), Style), new Segment(Text.Substring(index, Text.Length - index), Style)); } /// /// Clones the segment. /// /// A new segment that's identical to this one. public Segment Clone() { return new Segment(Text, Style); } /// /// Splits the provided segments into lines. /// /// The segments to split. /// A collection of lines. public static List SplitLines(IEnumerable segments) { ArgumentNullException.ThrowIfNull(segments); return SplitLines(segments, int.MaxValue); } /// /// Splits the provided segments into lines with a maximum width. /// /// The segments to split into lines. /// The maximum width. /// The height (if any). /// A list of lines. public static List SplitLines(IEnumerable segments, int maxWidth, int? height = null) { ArgumentNullException.ThrowIfNull(segments); var lines = new List(); var line = new SegmentLine(); var stack = new Stack(segments.Reverse()); while (stack.Count > 0) { var segment = stack.Pop(); var segmentLength = segment.CellCount(); // Does this segment make the line exceed the max width? var lineLength = line.CellCount(); if (lineLength + segmentLength > maxWidth) { var offset = maxWidth - lineLength; var (first, second) = segment.Split(offset); line.Add(first); lines.Add(line); line = []; if (second != null) { stack.Push(second); } continue; } // Does the segment contain a newline? if (segment.Text.ContainsExact("\n")) { // Is it a new line? if (segment.Text == "\n") { if (line.Length != 0 || segment.IsLineBreak) { lines.Add(line); line = []; } continue; } var text = segment.Text; while (text != null) { var parts = text.SplitLines(); if (parts.Length > 0) { if (parts[0].Length > 0) { line.Add(new Segment(parts[0], segment.Style)); } } if (parts.Length > 1) { if (line.Length > 0) { lines.Add(line); line = []; } text = string.Concat(parts.Skip(1).Take(parts.Length - 1)); } else { text = null; } } } else { line.Add(segment); } } if (line.Count > 0) { lines.Add(line); } // Got a height specified? if (height != null) { if (lines.Count >= height) { // Remove lines lines.RemoveRange(height.Value, lines.Count - height.Value); } else { // Add lines var missing = height - lines.Count; for (var i = 0; i < missing; i++) { lines.Add([]); } } } return lines; } /// /// Splits an overflowing segment into several new segments. /// /// The segment to split. /// The overflow strategy to use. /// The maximum width. /// A list of segments that has been split. public static List SplitOverflow(Segment segment, Overflow? overflow, int maxWidth) { ArgumentNullException.ThrowIfNull(segment); if (segment.CellCount() <= maxWidth) { return [segment]; } // Default to folding overflow ??= Overflow.Fold; var result = new List(); if (overflow == Overflow.Fold) { var splitted = SplitSegment(segment.Text, maxWidth); foreach (var str in splitted) { result.Add(new Segment(str, segment.Style)); } } else if (overflow == Overflow.Crop) { if (maxWidth <= 0) { result.Add(new Segment(string.Empty, segment.Style)); } else { var truncated = Truncate(segment, maxWidth); result.Add(truncated ?? new Segment(string.Empty, segment.Style)); } } else if (overflow == Overflow.Ellipsis) { if (Math.Max(0, maxWidth - 1) == 0) { result.Add(new Segment("…", segment.Style)); } else { var truncated = Truncate(segment, maxWidth - 1); var prefix = truncated?.Text ?? string.Empty; result.Add(new Segment(prefix + "…", segment.Style)); } } return result; } /// /// Truncates the segments to the specified width. /// /// The segments to truncate. /// The maximum width that the segments may occupy. /// A list of segments that has been truncated. public static List Truncate(IEnumerable segments, int maxWidth) { ArgumentNullException.ThrowIfNull(segments); var result = new List(); var totalWidth = 0; foreach (var segment in segments) { var segmentCellWidth = segment.CellCount(); if (totalWidth + segmentCellWidth > maxWidth) { break; } result.Add(segment); totalWidth += segmentCellWidth; } if (result.Count == 0 && segments.Any()) { var segment = Truncate(segments.First(), maxWidth); if (segment != null) { result.Add(segment); } } return result; } /// /// Truncates the segment to the specified width. /// /// The segment to truncate. /// The maximum width that the segment may occupy. /// A new truncated segment, or null. public static Segment? Truncate(Segment? segment, int maxWidth) { if (segment is null) { return null; } if (segment.CellCount() <= maxWidth) { return segment; } var builder = new StringBuilder(); var accumulatedCellWidth = 0; foreach (var character in segment.Text) { var characterWidth = UnicodeCalculator.GetWidth(character); if (accumulatedCellWidth + characterWidth > maxWidth) { break; } builder.Append(character); accumulatedCellWidth += characterWidth; } if (builder.Length == 0) { return null; } return new Segment(builder.ToString(), segment.Style); } internal static IEnumerable Merge(IEnumerable segments) { ArgumentNullException.ThrowIfNull(segments); var segmentBuilder = (SegmentBuilder?)null; foreach (var segment in segments) { if (segmentBuilder == null) { segmentBuilder = new SegmentBuilder(segment); continue; } // Both control codes? if (segment.IsControlCode && segmentBuilder.IsControlCode()) { segmentBuilder.Append(segment.Text); continue; } // Same style? if (segmentBuilder.StyleEquals(segment.Style) && !segmentBuilder.IsLineBreak() && !segmentBuilder.IsControlCode()) { segmentBuilder.Append(segment.Text); continue; } yield return segmentBuilder.Build(); segmentBuilder.Reset(segment); } if (segmentBuilder != null) { yield return segmentBuilder.Build(); } } internal static List TruncateWithEllipsis(IEnumerable segments, int maxWidth) { ArgumentNullException.ThrowIfNull(segments); if (CellCount(segments) <= maxWidth) { return [.. segments]; } segments = TrimEnd(Truncate(segments, maxWidth - 1)); if (!segments.Any()) { return new List(1); } var result = new List(segments); result.Add(new Segment("…", result.Last().Style)); return result; } internal static List TrimEnd(IEnumerable segments) { ArgumentNullException.ThrowIfNull(segments); var stack = new Stack(); var checkForWhitespace = true; foreach (var segment in segments.Reverse()) { if (checkForWhitespace) { if (segment.IsWhiteSpace) { continue; } checkForWhitespace = false; } stack.Push(segment); } return stack.ToList(); } // TODO: Move this to Table internal static List> MakeSameHeight(int cellHeight, List> cells) { ArgumentNullException.ThrowIfNull(cells); foreach (var cell in cells) { if (cell.Count < cellHeight) { while (cell.Count != cellHeight) { cell.Add([]); } } } return cells; } internal static List MakeWidth(int expectedWidth, List lines) { foreach (var line in lines) { var width = line.CellCount(); if (width < expectedWidth) { var diff = expectedWidth - width; line.Add(new Segment(new string(' ', diff))); } } return lines; } internal static List SplitSegment(string text, int maxCellLength) { var list = new List(); var length = 0; var sb = new StringBuilder(); foreach (var ch in text) { if (length + UnicodeCalculator.GetWidth(ch) > maxCellLength) { list.Add(sb.ToString()); sb.Clear(); length = 0; } length += UnicodeCalculator.GetWidth(ch); sb.Append(ch); } list.Add(sb.ToString()); return list; } private class SegmentBuilder { private readonly StringBuilder _textBuilder = new(); private Segment _originalSegment; public SegmentBuilder(Segment originalSegment) { _originalSegment = originalSegment; Reset(originalSegment); } public bool IsControlCode() => _originalSegment.IsControlCode; public bool IsLineBreak() => _originalSegment.IsLineBreak; public bool StyleEquals(Style segmentStyle) => segmentStyle.Equals(_originalSegment.Style); public void Append(string text) { _textBuilder.Append(text); } public Segment Build() { return new Segment( _textBuilder.ToString(), _originalSegment.Style, _originalSegment.Link, _originalSegment.IsLineBreak, _originalSegment.IsControlCode); } public void Reset(Segment segment) { _textBuilder.Clear(); _textBuilder.Append(segment.Text); _originalSegment = segment; } } } ================================================ FILE: src/Spectre.Console/Rendering/SegmentLine.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents a collection of segments. /// public sealed class SegmentLine : List { /// /// Gets the width of the line. /// public int Length => this.Sum(line => line.Text.Length); /// /// Initializes a new instance of the class. /// public SegmentLine() { } /// /// Initializes a new instance of the class. /// /// The segments. public SegmentLine(IEnumerable segments) : base(segments) { } /// /// Gets the number of cells the segment line occupies. /// /// The cell width of the segment line. public int CellCount() { return Segment.CellCount(this); } /// /// Preprends a segment to the line. /// /// The segment to prepend. public void Prepend(Segment segment) { ArgumentNullException.ThrowIfNull(segment); Insert(0, segment); } } ================================================ FILE: src/Spectre.Console/Rendering/SegmentLineEnumerator.cs ================================================ namespace Spectre.Console.Rendering; /// /// An enumerator for collections. /// public sealed class SegmentLineEnumerator : IEnumerable { private readonly List _lines; /// /// Initializes a new instance of the class. /// /// The lines to enumerate. public SegmentLineEnumerator(IEnumerable lines) { ArgumentNullException.ThrowIfNull(lines); _lines = new List(lines); } /// public IEnumerator GetEnumerator() { return new SegmentLineIterator(_lines); } /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } ================================================ FILE: src/Spectre.Console/Rendering/SegmentLineIterator.cs ================================================ namespace Spectre.Console.Rendering; /// /// An iterator for collections. /// public sealed class SegmentLineIterator : IEnumerator { private readonly List _lines; private int _currentLine; private int _currentIndex; private bool _lineBreakEmitted; /// /// Gets the current segment. /// public Segment Current { get; private set; } /// object? IEnumerator.Current => Current; /// /// Initializes a new instance of the class. /// /// The lines to iterate. public SegmentLineIterator(IEnumerable lines) { ArgumentNullException.ThrowIfNull(lines); _currentLine = 0; _currentIndex = -1; _lines = new List(lines); Current = Segment.Empty; } /// public void Dispose() { } /// public bool MoveNext() { if (_currentLine > _lines.Count - 1) { return false; } _currentIndex++; // Did we go past the end of the line? if (_currentIndex > _lines[_currentLine].Count - 1) { // We haven't just emitted a line break? if (!_lineBreakEmitted) { // Got any more lines? if (_currentIndex + 1 > _lines[_currentLine].Count - 1) { // Only emit a line break if the next one isn't a line break. if ((_currentLine + 1 <= _lines.Count - 1) && _lines[_currentLine + 1].Count > 0 && !_lines[_currentLine + 1][0].IsLineBreak) { _lineBreakEmitted = true; Current = Segment.LineBreak; return true; } } } // Increase the line and reset the index. _currentLine++; _currentIndex = 0; _lineBreakEmitted = false; // No more lines? if (_currentLine > _lines.Count - 1) { return false; } // Nothing on the line? while (_currentIndex > _lines[_currentLine].Count - 1) { _currentLine++; _currentIndex = 0; if (_currentLine > _lines.Count - 1) { return false; } } } // Reset the flag _lineBreakEmitted = false; Current = _lines[_currentLine][_currentIndex]; return true; } /// public void Reset() { _currentLine = 0; _currentIndex = -1; Current = Segment.Empty; } } ================================================ FILE: src/Spectre.Console/Rendering/SegmentShape.cs ================================================ namespace Spectre.Console.Rendering; internal readonly struct SegmentShape { public int Width { get; } public int Height { get; } public SegmentShape(int width, int height) { Width = width; Height = height; } public static SegmentShape Calculate(RenderOptions options, List lines) { ArgumentNullException.ThrowIfNull(lines); var height = lines.Count; var width = lines.Count > 0 ? lines.Max(l => Segment.CellCount(l)) : 0; return new SegmentShape(width, height); } public SegmentShape Inflate(SegmentShape other) { return new SegmentShape( Math.Max(Width, other.Width), Math.Max(Height, other.Height)); } public void Apply(RenderOptions options, ref List lines) { foreach (var line in lines) { var length = Segment.CellCount(line); var missing = Width - length; if (missing > 0) { line.Add(Segment.Padding(missing)); } } if (lines.Count < Height && Width > 0) { var missing = Height - lines.Count; for (var i = 0; i < missing; i++) { lines.Add([ Segment.Padding(Width) ]); } } } } ================================================ FILE: src/Spectre.Console/Rendering/TablePart.cs ================================================ namespace Spectre.Console.Rendering; /// /// Represents different parts of a table. /// public enum TablePart { /// /// The top of a table. /// Top, /// /// The separator between the header and the cells. /// HeaderSeparator, /// /// The separator between the rows. /// RowSeparator, /// /// The separator between the footer and the cells. /// FooterSeparator, /// /// The bottom of a table. /// Bottom, } ================================================ FILE: src/Spectre.Console/Rendering/Tree/AsciiTreeGuide.cs ================================================ namespace Spectre.Console.Rendering; /// /// An ASCII tree guide. /// public sealed class AsciiTreeGuide : TreeGuide { /// public override string GetPart(TreeGuidePart part) { return part switch { TreeGuidePart.Space => " ", TreeGuidePart.Continue => "| ", TreeGuidePart.Fork => "|-- ", TreeGuidePart.End => "`-- ", _ => throw new ArgumentOutOfRangeException(nameof(part), part, "Unknown tree part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Tree/BoldLineTreeGuide.cs ================================================ namespace Spectre.Console.Rendering; /// /// A tree guide made up of bold lines. /// public sealed class BoldLineTreeGuide : TreeGuide { /// public override TreeGuide? SafeTreeGuide => Ascii; /// public override string GetPart(TreeGuidePart part) { return part switch { TreeGuidePart.Space => " ", TreeGuidePart.Continue => "┃ ", TreeGuidePart.Fork => "┣━━ ", TreeGuidePart.End => "┗━━ ", _ => throw new ArgumentOutOfRangeException(nameof(part), part, "Unknown tree part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Tree/DoubleLineTreeGuide.cs ================================================ namespace Spectre.Console.Rendering; /// /// A tree guide made up of double lines. /// public sealed class DoubleLineTreeGuide : TreeGuide { /// public override TreeGuide? SafeTreeGuide => Ascii; /// public override string GetPart(TreeGuidePart part) { return part switch { TreeGuidePart.Space => " ", TreeGuidePart.Continue => "║ ", TreeGuidePart.Fork => "╠══ ", TreeGuidePart.End => "╚══ ", _ => throw new ArgumentOutOfRangeException(nameof(part), part, "Unknown tree part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/Tree/LineTreeGuide.cs ================================================ namespace Spectre.Console.Rendering; /// /// A tree guide made up of lines. /// public sealed class LineTreeGuide : TreeGuide { /// public override string GetPart(TreeGuidePart part) { return part switch { TreeGuidePart.Space => " ", TreeGuidePart.Continue => "│ ", TreeGuidePart.Fork => "├── ", TreeGuidePart.End => "└── ", _ => throw new ArgumentOutOfRangeException(nameof(part), part, "Unknown tree part."), }; } } ================================================ FILE: src/Spectre.Console/Rendering/TreeGuidePart.cs ================================================ namespace Spectre.Console.Rendering; /// /// Defines the different rendering parts of a . /// public enum TreeGuidePart { /// /// Represents a space. /// Space, /// /// Connection between siblings. /// Continue, /// /// Branch from parent to child. /// Fork, /// /// Branch from parent to child for the last child in a set. /// End, } ================================================ FILE: src/Spectre.Console/Size.cs ================================================ namespace Spectre.Console; /// /// Represents a size. /// [DebuggerDisplay("{Width,nq}x{Height,nq}")] public readonly struct Size { /// /// Gets the width. /// public int Width { get; } /// /// Gets the height. /// public int Height { get; } /// /// Initializes a new instance of the struct. /// /// The width. /// The height. public Size(int width, int height) { Width = width; Height = height; } } ================================================ FILE: src/Spectre.Console/Spectre.Console.csproj ================================================  net10.0;net9.0;net8.0;netstandard2.0 true $(DefineConstants)TRACE;WCWIDTH;WCWIDTH_VISIBILITY_INTERNAL true true Generated all analyzers ================================================ FILE: src/Spectre.Console/TableBorder.Known.cs ================================================ namespace Spectre.Console; /// /// Represents a border. /// public abstract partial class TableBorder { /// /// Gets an invisible border. /// public static TableBorder None { get; } = new NoTableBorder(); /// /// Gets an ASCII border. /// public static TableBorder Ascii { get; } = new AsciiTableBorder(); /// /// Gets an ASCII border. /// public static TableBorder Ascii2 { get; } = new Ascii2TableBorder(); /// /// Gets an ASCII border with a double header border. /// public static TableBorder AsciiDoubleHead { get; } = new AsciiDoubleHeadTableBorder(); /// /// Gets a square border. /// public static TableBorder Square { get; } = new SquareTableBorder(); /// /// Gets a rounded border. /// public static TableBorder Rounded { get; } = new RoundedTableBorder(); /// /// Gets a minimal border. /// public static TableBorder Minimal { get; } = new MinimalTableBorder(); /// /// Gets a minimal border with a heavy head. /// public static TableBorder MinimalHeavyHead { get; } = new MinimalHeavyHeadTableBorder(); /// /// Gets a minimal border with a double header border. /// public static TableBorder MinimalDoubleHead { get; } = new MinimalDoubleHeadTableBorder(); /// /// Gets a simple border. /// public static TableBorder Simple { get; } = new SimpleTableBorder(); /// /// Gets a simple border with heavy lines. /// public static TableBorder SimpleHeavy { get; } = new SimpleHeavyTableBorder(); /// /// Gets a horizontal border. /// public static TableBorder Horizontal { get; } = new HorizontalTableBorder(); /// /// Gets a heavy border. /// public static TableBorder Heavy { get; } = new HeavyTableBorder(); /// /// Gets a border with a heavy edge. /// public static TableBorder HeavyEdge { get; } = new HeavyEdgeTableBorder(); /// /// Gets a border with a heavy header. /// public static TableBorder HeavyHead { get; } = new HeavyHeadTableBorder(); /// /// Gets a double border. /// [SuppressMessage("Naming", "CA1720:Identifier contains type name")] public static TableBorder Double { get; } = new DoubleTableBorder(); /// /// Gets a border with a double edge. /// public static TableBorder DoubleEdge { get; } = new DoubleEdgeTableBorder(); /// /// Gets a minimalist border. /// public static TableBorder Minimalist { get; } = new MinimalistTableBorder(); /// /// Gets a markdown border. /// public static TableBorder Markdown { get; } = new MarkdownTableBorder(); } ================================================ FILE: src/Spectre.Console/TableBorder.cs ================================================ namespace Spectre.Console; /// /// Represents a border. /// public abstract partial class TableBorder { /// /// Gets a value indicating whether or not the border is visible. /// public virtual bool Visible { get; } = true; /// /// Gets the safe border for this border or null if none exist. /// public virtual TableBorder? SafeBorder { get; } = null; /// /// Gets a value indicating whether the border supports row separators or not. /// public virtual bool SupportsRowSeparator { get; } = true; /// /// Gets a value indicating whether or not the border uses cell padding. /// public virtual bool UsePadding { get; } = true; /// /// Gets the string representation of a specified table border part. /// /// The part to get the character representation for. /// A character representation of the specified border part. public abstract string GetPart(TableBorderPart part); /// /// Gets a whole column row for the specific column row part. /// /// The column row part. /// The column widths. /// The columns. /// A string representing the column row. public virtual string GetColumnRow(TablePart part, IReadOnlyList widths, IReadOnlyList columns) { ArgumentNullException.ThrowIfNull(widths); ArgumentNullException.ThrowIfNull(columns); var (left, center, separator, right) = GetTableParts(part); var builder = new StringBuilder(); builder.Append(left); foreach (var (columnIndex, _, lastColumn, columnWidth) in widths.Enumerate()) { var padding = columns[columnIndex].Padding; var centerWidth = padding.GetLeftSafe() + columnWidth + padding.GetRightSafe(); builder.Append(center.Repeat(centerWidth)); if (!lastColumn) { builder.Append(separator); } } builder.Append(right); return builder.ToString(); } /// /// Gets the table parts used to render a specific table row. /// /// The table part. /// The table parts used to render the specific table row. protected (string Left, string Center, string Separator, string Right) GetTableParts(TablePart part) { return part switch { // Top part TablePart.Top => (GetPart(TableBorderPart.HeaderTopLeft), GetPart(TableBorderPart.HeaderTop), GetPart(TableBorderPart.HeaderTopSeparator), GetPart(TableBorderPart.HeaderTopRight)), // Separator between header and cells TablePart.HeaderSeparator => (GetPart(TableBorderPart.HeaderBottomLeft), GetPart(TableBorderPart.HeaderBottom), GetPart(TableBorderPart.HeaderBottomSeparator), GetPart(TableBorderPart.HeaderBottomRight)), // Separator between header and cells TablePart.RowSeparator => (GetPart(TableBorderPart.RowLeft), GetPart(TableBorderPart.RowCenter), GetPart(TableBorderPart.RowSeparator), GetPart(TableBorderPart.RowRight)), // Separator between footer and cells TablePart.FooterSeparator => (GetPart(TableBorderPart.FooterTopLeft), GetPart(TableBorderPart.FooterTop), GetPart(TableBorderPart.FooterTopSeparator), GetPart(TableBorderPart.FooterTopRight)), // Bottom part TablePart.Bottom => (GetPart(TableBorderPart.FooterBottomLeft), GetPart(TableBorderPart.FooterBottom), GetPart(TableBorderPart.FooterBottomSeparator), GetPart(TableBorderPart.FooterBottomRight)), // Unknown _ => throw new NotSupportedException("Unknown column row part"), }; } } /// /// Contains extension methods for . /// public static class TableBorderExtensions { /// /// Gets the safe border for a border. /// /// The border to get the safe border for. /// Whether or not to return the safe border. /// The safe border if one exist, otherwise the original border. public static TableBorder GetSafeBorder(this TableBorder border, bool safe) { ArgumentNullException.ThrowIfNull(border); if (safe && border.SafeBorder != null) { border = border.SafeBorder; } return border; } } ================================================ FILE: src/Spectre.Console/TreeGuide.Known.cs ================================================ namespace Spectre.Console; /// /// Represents tree guide lines. /// public abstract partial class TreeGuide { /// /// Gets an instance. /// public static TreeGuide Ascii { get; } = new AsciiTreeGuide(); /// /// Gets a instance. /// public static TreeGuide Line { get; } = new LineTreeGuide(); /// /// Gets a instance. /// public static TreeGuide DoubleLine { get; } = new DoubleLineTreeGuide(); /// /// Gets a instance. /// public static TreeGuide BoldLine { get; } = new BoldLineTreeGuide(); } ================================================ FILE: src/Spectre.Console/TreeGuide.cs ================================================ namespace Spectre.Console; /// /// Represents tree guide lines. /// public abstract partial class TreeGuide { /// /// Gets the safe guide lines or null if none exist. /// public virtual TreeGuide? SafeTreeGuide { get; } /// /// Get the set of characters used to render the corresponding . /// /// The part of the tree to get rendering string for. /// Rendering string for the tree part. public abstract string GetPart(TreeGuidePart part); } /// /// Contains extension methods for . /// public static class TreeGuideExtensions { /// /// Gets the safe border for a border. /// /// The tree guide to get the safe version for. /// Whether or not to return the safe border. /// The safe border if one exist, otherwise the original border. public static TreeGuide GetSafeTreeGuide(this TreeGuide guide, bool safe) { ArgumentNullException.ThrowIfNull(guide); if (safe && guide.SafeTreeGuide != null) { return guide.SafeTreeGuide; } return guide; } } ================================================ FILE: src/Spectre.Console/ValidationResult.cs ================================================ namespace Spectre.Console; /// /// Represents a validation result. /// public sealed class ValidationResult { /// /// Gets a value indicating whether or not validation was successful. /// public bool Successful { get; } /// /// Gets the validation error message. /// public string? Message { get; } private ValidationResult(bool successful, string? message) { Successful = successful; Message = message; } /// /// Returns a representing successful validation. /// /// The validation result. public static ValidationResult Success() { return new ValidationResult(true, null); } /// /// Returns a representing a validation error. /// /// The validation error message, or null to show the default validation error message. /// The validation result. public static ValidationResult Error(string? message = null) { return new ValidationResult(false, message); } } ================================================ FILE: src/Spectre.Console/VerticalAlignment.cs ================================================ namespace Spectre.Console; /// /// Represents vertical alignment. /// public enum VerticalAlignment { /// /// Top aligned. /// Top, /// /// Middle aligned. /// Middle, /// /// Bottom aligned. /// Bottom, } ================================================ FILE: src/Spectre.Console/VerticalOverflow.cs ================================================ namespace Spectre.Console; /// /// Represents vertical overflow. /// public enum VerticalOverflow { /// /// Crop overflow. /// Crop = 0, /// /// Add an ellipsis at the end. /// Ellipsis = 1, /// /// Do not do anything about overflow. /// Visible = 2, } ================================================ FILE: src/Spectre.Console/VerticalOverflowCropping.cs ================================================ namespace Spectre.Console; /// /// Represent vertical overflow cropping. /// public enum VerticalOverflowCropping { /// /// Crops the top. /// Top = 0, /// /// Crops the bottom. /// Bottom = 1, } ================================================ FILE: src/Spectre.Console/Widgets/Align.cs ================================================ namespace Spectre.Console; /// /// Represents a renderable used to align content. /// public sealed class Align : Renderable { private readonly IRenderable _renderable; /// /// Gets or sets the horizontal alignment. /// public HorizontalAlignment Horizontal { get; set; } = HorizontalAlignment.Left; /// /// Gets or sets the vertical alignment. /// public VerticalAlignment? Vertical { get; set; } /// /// Gets or sets the width. /// public int? Width { get; set; } /// /// Gets or sets the height. /// public int? Height { get; set; } /// /// Initializes a new instance of the class. /// /// The renderable to align. /// The horizontal alignment. /// The vertical alignment, or null if none. public Align(IRenderable renderable, HorizontalAlignment horizontal, VerticalAlignment? vertical = null) { _renderable = renderable ?? throw new ArgumentNullException(nameof(renderable)); Horizontal = horizontal; Vertical = vertical; } /// /// Initializes a new instance of the class that is left aligned. /// /// The to align. /// The vertical alignment, or null if none. /// A new object. public static Align Left(IRenderable renderable, VerticalAlignment? vertical = null) { return new Align(renderable, HorizontalAlignment.Left, vertical); } /// /// Initializes a new instance of the class that is center aligned. /// /// The to align. /// The vertical alignment, or null if none. /// A new object. public static Align Center(IRenderable renderable, VerticalAlignment? vertical = null) { return new Align(renderable, HorizontalAlignment.Center, vertical); } /// /// Initializes a new instance of the class that is right aligned. /// /// The to align. /// The vertical alignment, or null if none. /// A new object. public static Align Right(IRenderable renderable, VerticalAlignment? vertical = null) { return new Align(renderable, HorizontalAlignment.Right, vertical); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var rendered = _renderable.Render(options with { Height = null }, maxWidth); var lines = Segment.SplitLines(rendered); var width = Math.Min(Width ?? maxWidth, maxWidth); var height = Height ?? options.Height; var blank = new SegmentLine([new Segment(new string(' ', width))]); // Align vertically if (Vertical != null && height != null) { switch (Vertical) { case VerticalAlignment.Top: { var diff = height - lines.Count; for (var i = 0; i < diff; i++) { lines.Add(blank); } break; } case VerticalAlignment.Middle: { var top = (height - lines.Count) / 2; var bottom = height - top - lines.Count; for (var i = 0; i < top; i++) { lines.Insert(0, blank); } for (var i = 0; i < bottom; i++) { lines.Add(blank); } break; } case VerticalAlignment.Bottom: { var diff = height - lines.Count; for (var i = 0; i < diff; i++) { lines.Insert(0, blank); } break; } default: throw new NotSupportedException("Unknown vertical alignment"); } } // Align horizontally foreach (var line in lines) { Aligner.AlignHorizontally(line, Horizontal, width); } return new SegmentLineEnumerator(lines); } } /// /// Contains extension methods for . /// public static class AlignExtensions { /// /// Sets the width. /// /// The object. /// The width, or null for no explicit width. /// The same instance so that multiple calls can be chained. public static Align Width(this Align align, int? width) { ArgumentNullException.ThrowIfNull(align); align.Width = width; return align; } /// /// Sets the height. /// /// The object. /// The height, or null for no explicit height. /// The same instance so that multiple calls can be chained. public static Align Height(this Align align, int? height) { ArgumentNullException.ThrowIfNull(align); align.Height = height; return align; } /// /// Sets the vertical alignment. /// /// The object. /// The vertical alignment, or null for no vertical alignment. /// The same instance so that multiple calls can be chained. public static Align VerticalAlignment(this Align align, VerticalAlignment? vertical) { ArgumentNullException.ThrowIfNull(align); align.Vertical = vertical; return align; } /// /// Sets the object to be top aligned. /// /// The object. /// The same instance so that multiple calls can be chained. public static Align TopAligned(this Align align) { ArgumentNullException.ThrowIfNull(align); align.Vertical = Console.VerticalAlignment.Top; return align; } /// /// Sets the object to be middle aligned. /// /// The object. /// The same instance so that multiple calls can be chained. public static Align MiddleAligned(this Align align) { ArgumentNullException.ThrowIfNull(align); align.Vertical = Console.VerticalAlignment.Middle; return align; } /// /// Sets the object to be bottom aligned. /// /// The object. /// The same instance so that multiple calls can be chained. public static Align BottomAligned(this Align align) { ArgumentNullException.ThrowIfNull(align); align.Vertical = Console.VerticalAlignment.Bottom; return align; } } ================================================ FILE: src/Spectre.Console/Widgets/Calendar.cs ================================================ namespace Spectre.Console; /// /// A renderable calendar. /// public sealed class Calendar : JustInTimeRenderable, IHasCulture, IHasTableBorder { private const int NumberOfWeekDays = 7; private const int ExpectedRowCount = 6; private readonly ListWithCallback _calendarEvents; private int _year; private int _month; private int _day; private TableBorder _border; private bool _useSafeBorder; private Style? _borderStyle; private CultureInfo? _culture; private Style _highlightStyle; private bool _showHeader; private Style? _headerStyle; /// /// Gets or sets the calendar year. /// public int Year { get => _year; set => MarkAsDirty(() => _year = value); } /// /// Gets or sets the calendar month. /// public int Month { get => _month; set => MarkAsDirty(() => _month = value); } /// /// Gets or sets the calendar day. /// public int Day { get => _day; set => MarkAsDirty(() => _day = value); } /// public TableBorder Border { get => _border; set => MarkAsDirty(() => _border = value); } /// public bool UseSafeBorder { get => _useSafeBorder; set => MarkAsDirty(() => _useSafeBorder = value); } /// public Style? BorderStyle { get => _borderStyle; set => MarkAsDirty(() => _borderStyle = value); } /// /// Gets or sets the calendar's . /// public CultureInfo? Culture { get => _culture; set => MarkAsDirty(() => _culture = value); } /// /// Gets or sets the calendar's highlight . /// public Style HighlightStyle { get => _highlightStyle; set => MarkAsDirty(() => _highlightStyle = value); } /// /// Gets or sets a value indicating whether or not the calendar header should be shown. /// public bool ShowHeader { get => _showHeader; set => MarkAsDirty(() => _showHeader = value); } /// /// Gets or sets the header style. /// public Style? HeaderStyle { get => _headerStyle; set => MarkAsDirty(() => _headerStyle = value); } /// /// Gets a list containing all calendar events. /// public IList CalendarEvents => _calendarEvents; /// /// Initializes a new instance of the class. /// /// The calendar date. public Calendar(DateTime date) : this(date.Year, date.Month, date.Day) { } /// /// Initializes a new instance of the class. /// /// The calendar year. /// The calendar month. public Calendar(int year, int month) : this(year, month, 1) { } /// /// Initializes a new instance of the class. /// /// The calendar year. /// The calendar month. /// The calendar day. public Calendar(int year, int month, int day) { _year = year; _month = month; _day = day; _border = TableBorder.Square; _useSafeBorder = true; _borderStyle = null; _culture = CultureInfo.InvariantCulture; _highlightStyle = Color.Blue; _showHeader = true; _calendarEvents = new ListWithCallback(MarkAsDirty); } /// protected override IRenderable Build() { var culture = Culture ?? CultureInfo.InvariantCulture; var table = new Table { Border = _border, UseSafeBorder = _useSafeBorder, BorderStyle = _borderStyle, }; if (ShowHeader) { var heading = new DateTime(Year, Month, Day).ToString("Y", culture).EscapeMarkup(); table.Title = new TableTitle(heading, HeaderStyle); } // Add columns foreach (var order in GetWeekdays()) { table.AddColumn(new TableColumn(order.GetAbbreviatedDayName(culture))); } var row = new List(); var currentDay = 1; var weekday = culture.DateTimeFormat.FirstDayOfWeek; var weekdays = BuildWeekDayTable(); var daysInMonth = DateTime.DaysInMonth(Year, Month); while (currentDay <= daysInMonth) { if (weekdays[currentDay - 1] == weekday) { var todayEvent = _calendarEvents.LastOrDefault(e => e.Month == Month && e.Day == currentDay); if (todayEvent != null) { row.Add(new Markup(currentDay.ToString(CultureInfo.InvariantCulture) + "*", todayEvent.CustomHighlightStyle ?? _highlightStyle)); } else { row.Add(new Text(currentDay.ToString(CultureInfo.InvariantCulture))); } currentDay++; } else { // Add empty cell row.Add(Text.Empty); } if (row.Count == NumberOfWeekDays) { // Flush row table.AddRow(row.ToArray()); row.Clear(); } weekday = weekday.GetNextWeekDay(); } if (row.Count > 0) { // Flush row table.AddRow(row.ToArray()); row.Clear(); } // We want all calendars to have the same height. if (table.Rows.Count < ExpectedRowCount) { var diff = Math.Max(0, ExpectedRowCount - table.Rows.Count); for (var i = 0; i < diff; i++) { table.AddEmptyRow(); } } return table; } private DayOfWeek[] GetWeekdays() { var culture = Culture ?? CultureInfo.InvariantCulture; var days = new DayOfWeek[7]; days[0] = culture.DateTimeFormat.FirstDayOfWeek; for (var i = 1; i < 7; i++) { days[i] = days[i - 1].GetNextWeekDay(); } return days; } private DayOfWeek[] BuildWeekDayTable() { var result = new List(); for (var day = 0; day < DateTime.DaysInMonth(Year, Month); day++) { result.Add(new DateTime(Year, Month, day + 1).DayOfWeek); } return result.ToArray(); } } /// /// Contains extension methods for . /// public static class CalendarExtensions { /// /// Adds a calendar event. /// /// The calendar to add the calendar event to. /// The calendar event date. /// The calendar event custom highlight style. /// The same instance so that multiple calls can be chained. public static Calendar AddCalendarEvent(this Calendar calendar, DateTime date, Style? customEventHighlightStyle = null) { return AddCalendarEvent(calendar, string.Empty, date.Year, date.Month, date.Day, customEventHighlightStyle); } /// /// Adds a calendar event. /// /// The calendar to add the calendar event to. /// The calendar event description. /// The calendar event date. /// The calendar event custom highlight style. /// The same instance so that multiple calls can be chained. public static Calendar AddCalendarEvent(this Calendar calendar, string description, DateTime date, Style? customEventHighlightStyle = null) { return AddCalendarEvent(calendar, description, date.Year, date.Month, date.Day, customEventHighlightStyle); } /// /// Adds a calendar event. /// /// The calendar to add the calendar event to. /// The year of the calendar event. /// The month of the calendar event. /// The day of the calendar event. /// The calendar event custom highlight style. /// The same instance so that multiple calls can be chained. public static Calendar AddCalendarEvent(this Calendar calendar, int year, int month, int day, Style? customEventHighlightStyle = null) { return AddCalendarEvent(calendar, string.Empty, year, month, day, customEventHighlightStyle); } /// /// Adds a calendar event. /// /// The calendar. /// The calendar event description. /// The year of the calendar event. /// The month of the calendar event. /// The day of the calendar event. /// The calendar event custom highlight style. /// The same instance so that multiple calls can be chained. public static Calendar AddCalendarEvent(this Calendar calendar, string description, int year, int month, int day, Style? customEventHighlightStyle = null) { ArgumentNullException.ThrowIfNull(calendar); calendar.CalendarEvents.Add(new CalendarEvent(description, year, month, day, customEventHighlightStyle)); return calendar; } /// /// Sets the calendar's highlight . /// /// The calendar. /// The default highlight style. /// The same instance so that multiple calls can be chained. public static Calendar HighlightStyle(this Calendar calendar, Style? style) { ArgumentNullException.ThrowIfNull(calendar); calendar.HighlightStyle = style ?? Style.Plain; return calendar; } /// /// Sets the calendar's header . /// /// The calendar. /// The header style. /// The same instance so that multiple calls can be chained. public static Calendar HeaderStyle(this Calendar calendar, Style? style) { ArgumentNullException.ThrowIfNull(calendar); calendar.HeaderStyle = style ?? Style.Plain; return calendar; } /// /// Shows the calendar header. /// /// The calendar. /// The same instance so that multiple calls can be chained. public static Calendar ShowHeader(this Calendar calendar) { ArgumentNullException.ThrowIfNull(calendar); calendar.ShowHeader = true; return calendar; } /// /// Hides the calendar header. /// /// The calendar. /// The same instance so that multiple calls can be chained. public static Calendar HideHeader(this Calendar calendar) { ArgumentNullException.ThrowIfNull(calendar); calendar.ShowHeader = false; return calendar; } } ================================================ FILE: src/Spectre.Console/Widgets/CalendarEvent.cs ================================================ namespace Spectre.Console; /// /// Represents a calendar event. /// public sealed class CalendarEvent { /// /// Gets the description of the calendar event. /// public string Description { get; } /// /// Gets the year of the calendar event. /// public int Year { get; } /// /// Gets the month of the calendar event. /// public int Month { get; } /// /// Gets the day of the calendar event. /// public int Day { get; } /// /// Gets the custom highlight style of the calendar event. /// public Style? CustomHighlightStyle { get; } /// /// Initializes a new instance of the class. /// /// The year of the calendar event. /// The month of the calendar event. /// The day of the calendar event. /// The custom highlight style of the calendar event. public CalendarEvent(int year, int month, int day, Style? customHighlightStyle = null) : this(string.Empty, year, month, day, customHighlightStyle) { } /// /// Initializes a new instance of the class. /// /// The calendar event description. /// The year of the calendar event. /// The month of the calendar event. /// The day of the calendar event. /// The custom highlight style of the calendar event. public CalendarEvent(string description, int year, int month, int day, Style? customHighlightStyle = null) { Description = description ?? string.Empty; Year = year; Month = month; Day = day; CustomHighlightStyle = customHighlightStyle; } } ================================================ FILE: src/Spectre.Console/Widgets/Canvas.cs ================================================ namespace Spectre.Console; /// /// Represents a renderable canvas. /// public sealed class Canvas : Renderable { private readonly Color?[,] _pixels; private const string Transparent = " "; private const string DoubleTransparent = " "; private const string UpperHalfBlock = "▀"; private const string LowerHalfBlock = "▄"; /// /// Gets the width of the canvas. /// public int Width { get; } /// /// Gets the height of the canvas. /// public int Height { get; } /// /// Gets or sets the render width of the canvas. /// public int? MaxWidth { get; set; } /// /// Gets or sets a value indicating whether or not /// to scale the canvas when rendering. /// public bool Scale { get; set; } = true; /// /// Gets or sets the pixel width. /// [Obsolete("Not used anymore. Will be removed in future update.")] public int PixelWidth { get; set; } = 2; /// /// Initializes a new instance of the class. /// /// The canvas width. /// The canvas height. public Canvas(int width, int height) { if (width < 1) { throw new ArgumentException("Must be > 1", nameof(width)); } if (height < 1) { throw new ArgumentException("Must be > 1", nameof(height)); } Width = width; Height = height; _pixels = new Color?[Width, Height]; } /// /// Sets a pixel with the specified color in the canvas at the specified location. /// /// The X coordinate for the pixel. /// The Y coordinate for the pixel. /// The pixel color. /// The same instance so that multiple calls can be chained. public Canvas SetPixel(int x, int y, Color color) { _pixels[x, y] = color; return this; } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { var pixelWidth = options.Unicode ? 1 : 2; var width = MaxWidth ?? Width; return maxWidth < width * pixelWidth ? new Measurement(maxWidth, maxWidth) : new Measurement(width * pixelWidth, width * pixelWidth); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { return options.Unicode ? RenderUnicode(maxWidth) : RenderNonUnicode(maxWidth); } private IEnumerable RenderUnicode(int maxWidth) { var pixels = _pixels; var width = Width; var height = Height; // Got a max width? if (MaxWidth != null) { height = (int)(height * ((float)MaxWidth.Value) / Width); width = MaxWidth.Value; } // Exceed the max width when we take pixel width into account? if (width > maxWidth) { height = (int)(height * (maxWidth / (float)(width))); width = maxWidth; if (height == 0) { // If it's not possible to scale the canvas sufficiently, it's too small to render. yield break; } } // Need to rescale the pixel buffer? if (Scale && (width != Width || height != Height)) { pixels = ScaleDown(width, height); } for (var y = 0; y < height; y += 2) { for (var x = 0; x < width; x++) { var upper = pixels[x, y]; var lower = y < height - 1 ? pixels[x, y + 1] : null; if (upper == null && lower == null) { // None visible yield return new Segment(Transparent); } else if (upper != null && lower != null) { // Both pixels visible yield return new Segment( UpperHalfBlock, new Style( foreground: upper, background: lower)); } else if (upper != null) { // Upper visible yield return new Segment( UpperHalfBlock, new Style( foreground: upper)); } else if (lower != null) { // Lower visible yield return new Segment( LowerHalfBlock, new Style( foreground: lower)); } } yield return Segment.LineBreak; } } private IEnumerable RenderNonUnicode(int maxWidth) { var pixels = _pixels; var width = Width; var height = Height; // Got a max width? if (MaxWidth != null) { height = (int)(height * ((float)MaxWidth.Value) / Width); width = MaxWidth.Value; } // Exceed the max width when we take pixel width into account? if (width * 2 > maxWidth) { height = (int)(height * (maxWidth / (float)(width * 2))); width = maxWidth / 2; if (height == 0) { // If it's not possible to scale the canvas sufficiently, it's too small to render. yield break; } } // Need to rescale the pixel buffer? if (Scale && (width != Width || height != Height)) { pixels = ScaleDown(width, height); } for (var y = 0; y < height; y++) { for (var x = 0; x < width; x++) { var color = pixels[x, y]; if (color != null) { yield return new Segment(DoubleTransparent, new Style(background: color)); } else { yield return new Segment(DoubleTransparent); } } yield return Segment.LineBreak; } } private Color?[,] ScaleDown(int newWidth, int newHeight) { var buffer = new Color?[newWidth, newHeight]; var xRatio = ((Width << 16) / newWidth) + 1; var yRatio = ((Height << 16) / newHeight) + 1; for (var i = 0; i < newHeight; i++) { for (var j = 0; j < newWidth; j++) { buffer[j, i] = _pixels[(j * xRatio) >> 16, (i * yRatio) >> 16]; } } return buffer; } } ================================================ FILE: src/Spectre.Console/Widgets/Charts/BarChart.cs ================================================ namespace Spectre.Console; /// /// A renderable (horizontal) bar chart. /// public sealed class BarChart : Renderable, IHasCulture { /// /// Gets the bar chart data. /// public List Data { get; } /// /// Gets or sets the width of the bar chart. /// public int? Width { get; set; } /// /// Gets or sets the bar chart label. /// public string? Label { get; set; } /// /// Gets or sets the bar chart label alignment. /// public Justify? LabelAlignment { get; set; } = Justify.Center; /// /// Gets or sets a value indicating whether or not /// values should be shown next to each bar. /// public bool ShowValues { get; set; } = true; /// /// Gets or sets the culture that's used to format values. /// /// Defaults to invariant culture. public CultureInfo? Culture { get; set; } /// /// Gets or sets the fixed max value for a bar chart. /// /// Defaults to null, which corresponds to largest value in chart. public double? MaxValue { get; set; } /// /// Gets or sets the function used to format the values of the bar chart. /// public Func? ValueFormatter { get; set; } /// /// Initializes a new instance of the class. /// public BarChart() { Data = []; } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); return new Measurement(width, width); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); var maxValue = Math.Max(MaxValue ?? 0d, Data.Max(item => item.Value)); var grid = new Grid(); grid.Collapse(); grid.AddColumn(new GridColumn().PadRight(2).RightAligned()); grid.AddColumn(new GridColumn().PadLeft(0)); grid.Width = width; if (!string.IsNullOrWhiteSpace(Label)) { grid.AddRow(Text.Empty, new Markup(Label).Justify(LabelAlignment)); } foreach (var item in Data) { grid.AddRow( new Markup(item.Label), new ProgressBar() { Value = item.Value, MaxValue = maxValue, ShowRemaining = false, CompletedStyle = new Style().Foreground(item.Color ?? Color.Default), FinishedStyle = new Style().Foreground(item.Color ?? Color.Default), UnicodeBar = '█', AsciiBar = '█', ShowValue = ShowValues, Culture = Culture, ValueFormatter = ValueFormatter, }); } return ((IRenderable)grid).Render(options, width); } } /// /// Contains extension methods for . /// public static class BarChartExtensions { /// /// Adds an item to the bar chart. /// /// The bar chart. /// The item label. /// The item value. /// The item color. /// The same instance so that multiple calls can be chained. public static BarChart AddItem(this BarChart chart, string label, double value, Color? color = null) { ArgumentNullException.ThrowIfNull(chart); chart.Data.Add(new BarChartItem(label, value, color)); return chart; } /// /// Adds an item to the bar chart. /// /// A type that implements . /// The bar chart. /// The item. /// The same instance so that multiple calls can be chained. public static BarChart AddItem(this BarChart chart, T item) where T : IBarChartItem { ArgumentNullException.ThrowIfNull(chart); if (item is BarChartItem barChartItem) { chart.Data.Add(barChartItem); } else { chart.Data.Add( new BarChartItem( item.Label, item.Value, item.Color)); } return chart; } /// /// Adds multiple items to the bar chart. /// /// A type that implements . /// The bar chart. /// The items. /// The same instance so that multiple calls can be chained. public static BarChart AddItems(this BarChart chart, IEnumerable items) where T : IBarChartItem { ArgumentNullException.ThrowIfNull(chart); ArgumentNullException.ThrowIfNull(items); foreach (var item in items) { AddItem(chart, item); } return chart; } /// /// Adds multiple items to the bar chart. /// /// A type that implements . /// The bar chart. /// The items. /// The converter that converts instances of T to . /// The same instance so that multiple calls can be chained. public static BarChart AddItems(this BarChart chart, IEnumerable items, Func converter) { ArgumentNullException.ThrowIfNull(chart); ArgumentNullException.ThrowIfNull(items); ArgumentNullException.ThrowIfNull(converter); foreach (var item in items) { chart.Data.Add(converter(item)); } return chart; } /// /// Sets the value formatter for the bar chart using culture info. /// /// The bar chart. /// The value formatter function with culture info. /// The same instance so that multiple calls can be chained. public static BarChart UseValueFormatter(this BarChart chart, Func? func) { ArgumentNullException.ThrowIfNull(chart); chart.ValueFormatter = func; return chart; } /// /// Sets the value formatter for the bar chart. /// /// The bar chart. /// The value formatter to use. /// The same instance so that multiple calls can be chained. public static BarChart UseValueFormatter(this BarChart chart, Func? func) { ArgumentNullException.ThrowIfNull(chart); chart.ValueFormatter = func != null ? (value, _) => func(value) : null; return chart; } /// /// Sets the width of the bar chart. /// /// The bar chart. /// The bar chart width. /// The same instance so that multiple calls can be chained. public static BarChart Width(this BarChart chart, int? width) { ArgumentNullException.ThrowIfNull(chart); chart.Width = width; return chart; } /// /// Sets the label of the bar chart. /// /// The bar chart. /// The bar chart label. /// The same instance so that multiple calls can be chained. public static BarChart Label(this BarChart chart, string? label) { ArgumentNullException.ThrowIfNull(chart); chart.Label = label; return chart; } /// /// Shows values next to each bar in the bar chart. /// /// The bar chart. /// The same instance so that multiple calls can be chained. public static BarChart ShowValues(this BarChart chart) { return ShowValues(chart, true); } /// /// Hides values next to each bar in the bar chart. /// /// The bar chart. /// The same instance so that multiple calls can be chained. public static BarChart HideValues(this BarChart chart) { return ShowValues(chart, false); } /// /// Sets whether or not values should be shown /// next to each bar. /// /// The bar chart. /// Whether or not values should be shown next to each bar. /// The same instance so that multiple calls can be chained. public static BarChart ShowValues(this BarChart chart, bool show) { ArgumentNullException.ThrowIfNull(chart); chart.ShowValues = show; return chart; } /// /// Aligns the label to the left. /// /// The bar chart. /// The same instance so that multiple calls can be chained. public static BarChart LeftAlignLabel(this BarChart chart) { ArgumentNullException.ThrowIfNull(chart); chart.LabelAlignment = Justify.Left; return chart; } /// /// Centers the label. /// /// The bar chart. /// The same instance so that multiple calls can be chained. public static BarChart CenterLabel(this BarChart chart) { ArgumentNullException.ThrowIfNull(chart); chart.LabelAlignment = Justify.Center; return chart; } /// /// Aligns the label to the right. /// /// The bar chart. /// The same instance so that multiple calls can be chained. public static BarChart RightAlignLabel(this BarChart chart) { ArgumentNullException.ThrowIfNull(chart); chart.LabelAlignment = Justify.Right; return chart; } /// /// Sets the max fixed value for the chart. /// /// The bar chart. /// Max value for the chart. /// The same instance so that multiple calls can be chained. public static BarChart WithMaxValue(this BarChart chart, double maxValue) { ArgumentNullException.ThrowIfNull(chart); chart.MaxValue = maxValue; return chart; } } ================================================ FILE: src/Spectre.Console/Widgets/Charts/BarChartItem.cs ================================================ namespace Spectre.Console; /// /// An item that's shown in a bar chart. /// public sealed class BarChartItem : IBarChartItem { /// /// Gets the item label. /// public string Label { get; } /// /// Gets the item value. /// public double Value { get; } /// /// Gets the item color. /// public Color? Color { get; } /// /// Initializes a new instance of the class. /// /// The item label. /// The item value. /// The item color. public BarChartItem(string label, double value, Color? color = null) { Label = label ?? throw new ArgumentNullException(nameof(label)); Value = value; Color = color; } } ================================================ FILE: src/Spectre.Console/Widgets/Charts/BreakdownBar.cs ================================================ namespace Spectre.Console; internal sealed class BreakdownBar : Renderable { private readonly List _data; public int? Width { get; set; } public BreakdownBar(List data) { _data = data ?? throw new ArgumentNullException(nameof(data)); } protected override Measurement Measure(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); return new Measurement(width, width); } protected override IEnumerable Render(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); // Chart var maxValue = _data.Sum(i => i.Value); var items = _data.ToArray(); var bars = Ratio.Distribute(width, items.Select(i => Math.Max(0, (int)(width * (i.Value / maxValue)))).ToArray()); for (var index = 0; index < items.Length; index++) { yield return new Segment(new string('█', bars[index]), new Style(items[index].Color)); } yield return Segment.LineBreak; } } ================================================ FILE: src/Spectre.Console/Widgets/Charts/BreakdownChart.cs ================================================ namespace Spectre.Console; /// /// A renderable breakdown chart. /// public sealed class BreakdownChart : Renderable, IHasCulture, IExpandable { /// /// Gets the breakdown chart data. /// public List Data { get; } /// /// Gets or sets the width of the breakdown chart. /// public int? Width { get; set; } /// /// Gets or sets a value indicating whether or not to show tags. /// public bool ShowTags { get; set; } = true; /// /// Gets or sets a value indicating whether or not to show tag values. /// public bool ShowTagValues { get; set; } = true; /// /// Gets or sets the tag value formatter. /// public Func? ValueFormatter { get; set; } /// /// Gets or sets the Color in which the values will be shown. /// public Color ValueColor { get; set; } = Color.Grey; /// /// Gets or sets a value indicating whether or not the /// chart and tags should be rendered in compact mode. /// public bool Compact { get; set; } = true; /// /// Gets or sets the to use /// when rendering values. /// /// Defaults to invariant culture. public CultureInfo? Culture { get; set; } /// /// Gets or sets a value indicating whether or not the object should /// expand to the available space. If false, the object's /// width will be auto calculated. /// public bool Expand { get; set; } = true; /// /// Initializes a new instance of the class. /// public BreakdownChart() { Data = []; Culture = CultureInfo.InvariantCulture; } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); return new Measurement(width, width); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); var grid = new Grid().Width(width); grid.AddColumn(new GridColumn().NoWrap()); // Bar grid.AddRow(new BreakdownBar(Data) { Width = width, }); if (ShowTags) { if (!Compact) { grid.AddEmptyRow(); } // Tags grid.AddRow(new BreakdownTags(Data) { Width = width, Culture = Culture, ShowTagValues = ShowTagValues, ValueFormatter = ValueFormatter, ValueColor = ValueColor, }); } if (!Expand) { grid.Collapse(); } return ((IRenderable)grid).Render(options, width); } } /// /// Contains extension methods for . /// public static class BreakdownChartExtensions { /// /// Adds an item to the breakdown chart. /// /// The breakdown chart. /// The item label. /// The item value. /// The item color. /// The same instance so that multiple calls can be chained. public static BreakdownChart AddItem(this BreakdownChart chart, string label, double value, Color color) { ArgumentNullException.ThrowIfNull(chart); chart.Data.Add(new BreakdownChartItem(label, value, color)); return chart; } /// /// Adds an item to the breakdown chart. /// /// A type that implements . /// The breakdown chart. /// The item. /// The same instance so that multiple calls can be chained. public static BreakdownChart AddItem(this BreakdownChart chart, T item) where T : IBreakdownChartItem { ArgumentNullException.ThrowIfNull(chart); if (item is BreakdownChartItem chartItem) { chart.Data.Add(chartItem); } else { chart.Data.Add( new BreakdownChartItem( item.Label, item.Value, item.Color)); } return chart; } /// /// Adds multiple items to the breakdown chart. /// /// A type that implements . /// The breakdown chart. /// The items. /// The same instance so that multiple calls can be chained. public static BreakdownChart AddItems(this BreakdownChart chart, IEnumerable items) where T : IBreakdownChartItem { ArgumentNullException.ThrowIfNull(chart); ArgumentNullException.ThrowIfNull(items); foreach (var item in items) { AddItem(chart, item); } return chart; } /// /// Adds multiple items to the breakdown chart. /// /// A type that implements . /// The breakdown chart. /// The items. /// The converter that converts instances of T to . /// The same instance so that multiple calls can be chained. public static BreakdownChart AddItems(this BreakdownChart chart, IEnumerable items, Func converter) { ArgumentNullException.ThrowIfNull(chart); ArgumentNullException.ThrowIfNull(items); ArgumentNullException.ThrowIfNull(converter); foreach (var item in items) { chart.Data.Add(converter(item)); } return chart; } /// /// Sets the width of the breakdown chart. /// /// The breakdown chart. /// The breakdown chart width. /// The same instance so that multiple calls can be chained. public static BreakdownChart Width(this BreakdownChart chart, int? width) { ArgumentNullException.ThrowIfNull(chart); chart.Width = width; return chart; } /// /// Tags will be shown. /// /// The breakdown chart. /// The value formatter to use. /// The same instance so that multiple calls can be chained. public static BreakdownChart UseValueFormatter(this BreakdownChart chart, Func? func) { ArgumentNullException.ThrowIfNull(chart); chart.ValueFormatter = func; return chart; } /// /// Tags will be shown. /// /// The breakdown chart. /// The value formatter to use. /// The same instance so that multiple calls can be chained. public static BreakdownChart UseValueFormatter(this BreakdownChart chart, Func? func) { ArgumentNullException.ThrowIfNull(chart); chart.ValueFormatter = func != null ? (value, _) => func(value) : null; return chart; } /// /// Tags will be shown. /// /// The breakdown chart. /// The same instance so that multiple calls can be chained. public static BreakdownChart ShowPercentage(this BreakdownChart chart) { ArgumentNullException.ThrowIfNull(chart); chart.ValueFormatter = (value, culture) => string.Format(culture, "{0}%", value); return chart; } /// /// Tags will be shown. /// /// The breakdown chart. /// The same instance so that multiple calls can be chained. public static BreakdownChart ShowTags(this BreakdownChart chart) { return ShowTags(chart, true); } /// /// Tags will be not be shown. /// /// The breakdown chart. /// The same instance so that multiple calls can be chained. public static BreakdownChart HideTags(this BreakdownChart chart) { return ShowTags(chart, false); } /// /// Sets whether or not tags will be shown. /// /// The breakdown chart. /// Whether or not tags will be shown. /// The same instance so that multiple calls can be chained. public static BreakdownChart ShowTags(this BreakdownChart chart, bool show) { ArgumentNullException.ThrowIfNull(chart); chart.ShowTags = show; return chart; } /// /// Tag values will be shown. /// /// The breakdown chart. /// The same instance so that multiple calls can be chained. public static BreakdownChart ShowTagValues(this BreakdownChart chart) { return ShowTagValues(chart, true); } /// /// Tag values will be not be shown. /// /// The breakdown chart. /// The same instance so that multiple calls can be chained. public static BreakdownChart HideTagValues(this BreakdownChart chart) { return ShowTagValues(chart, false); } /// /// Sets whether or not tag values will be shown. /// /// The breakdown chart. /// Whether or not tag values will be shown. /// The same instance so that multiple calls can be chained. public static BreakdownChart ShowTagValues(this BreakdownChart chart, bool show) { ArgumentNullException.ThrowIfNull(chart); chart.ShowTagValues = show; return chart; } /// /// Chart and tags is rendered in compact mode. /// /// The breakdown chart. /// The same instance so that multiple calls can be chained. public static BreakdownChart Compact(this BreakdownChart chart) { return Compact(chart, true); } /// /// Chart and tags is rendered in full size mode. /// /// The breakdown chart. /// The same instance so that multiple calls can be chained. public static BreakdownChart FullSize(this BreakdownChart chart) { return Compact(chart, false); } /// /// Sets whether or not the chart and tags should be rendered in compact mode. /// /// The breakdown chart. /// Whether or not the chart and tags should be rendered in compact mode. /// The same instance so that multiple calls can be chained. public static BreakdownChart Compact(this BreakdownChart chart, bool compact) { ArgumentNullException.ThrowIfNull(chart); chart.Compact = compact; return chart; } /// /// Sets the . /// /// The breakdown chart. /// The to set. /// The same instance so that multiple calls can be chained. public static BreakdownChart WithValueColor(this BreakdownChart chart, Color color) { ArgumentNullException.ThrowIfNull(chart); chart.ValueColor = color; return chart; } } ================================================ FILE: src/Spectre.Console/Widgets/Charts/BreakdownChartItem.cs ================================================ namespace Spectre.Console; /// /// An item that's shown in a breakdown chart. /// public sealed class BreakdownChartItem : IBreakdownChartItem { /// /// Gets the item label. /// public string Label { get; } /// /// Gets the item value. /// public double Value { get; } /// /// Gets the item color. /// public Color Color { get; } /// /// Initializes a new instance of the class. /// /// The item label. /// The item value. /// The item color. public BreakdownChartItem(string label, double value, Color color) { Label = label ?? throw new ArgumentNullException(nameof(label)); Value = value; Color = color; } } ================================================ FILE: src/Spectre.Console/Widgets/Charts/BreakdownTags.cs ================================================ namespace Spectre.Console; internal sealed class BreakdownTags : Renderable { private readonly List _data; public int? Width { get; set; } public CultureInfo? Culture { get; set; } public bool ShowTagValues { get; set; } = true; public Func? ValueFormatter { get; set; } public Color ValueColor { get; set; } = Color.Grey; public BreakdownTags(List data) { _data = data ?? throw new ArgumentNullException(nameof(data)); } protected override Measurement Measure(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); return new Measurement(width, width); } protected override IEnumerable Render(RenderOptions options, int maxWidth) { var culture = Culture ?? CultureInfo.InvariantCulture; var panels = new List(); foreach (var item in _data) { var panel = new Panel(GetTag(item, culture)); panel.Inline = true; panel.Padding = new Padding(0, 0, 2, 0); panel.NoBorder(); panels.Add(panel); } foreach (var segment in ((IRenderable)new Columns(panels).Padding(0, 0)).Render(options, maxWidth)) { yield return segment; } } private string GetTag(IBreakdownChartItem item, CultureInfo culture) { return string.Format( culture, "[{0}]■[/] {1}", item.Color.ToMarkup() ?? "default", FormatValue(item, culture)).Trim(); } private string FormatValue(IBreakdownChartItem item, CultureInfo culture) { var formatter = ValueFormatter ?? DefaultFormatter; if (ShowTagValues) { return string.Format(culture, "{0} [{1}]{2}[/]", item.Label.EscapeMarkup(), ValueColor.ToMarkup(), formatter(item.Value, culture)); } return item.Label.EscapeMarkup(); } private static string DefaultFormatter(double value, CultureInfo culture) { return value.ToString(culture); } } ================================================ FILE: src/Spectre.Console/Widgets/Charts/IBarChartItem.cs ================================================ namespace Spectre.Console; /// /// Represents a bar chart item. /// public interface IBarChartItem { /// /// Gets the item label. /// string Label { get; } /// /// Gets the item value. /// double Value { get; } /// /// Gets the item color. /// Color? Color { get; } } ================================================ FILE: src/Spectre.Console/Widgets/Charts/IBreakdownChartItem.cs ================================================ namespace Spectre.Console; /// /// Represents a breakdown chart item. /// public interface IBreakdownChartItem { /// /// Gets the item label. /// string Label { get; } /// /// Gets the item value. /// double Value { get; } /// /// Gets the item color. /// Color Color { get; } } ================================================ FILE: src/Spectre.Console/Widgets/CircularTreeException.cs ================================================ namespace Spectre.Console; /// /// Indicates that the tree being rendered includes a cycle, and cannot be rendered. /// public sealed class CircularTreeException : Exception { internal CircularTreeException(string message) : base(message) { } } ================================================ FILE: src/Spectre.Console/Widgets/Columns.cs ================================================ namespace Spectre.Console; /// /// Renders things in columns. /// public sealed class Columns : Renderable, IPaddable, IExpandable { private readonly List _items; /// public Padding? Padding { get; set; } = new Padding(0, 0, 1, 0); /// /// Gets or sets a value indicating whether or not the columns should /// expand to the available space. If false, the column /// width will be auto calculated. Defaults to true. /// public bool Expand { get; set; } = true; /// /// Initializes a new instance of the class. /// /// The items to render as columns. public Columns(params IRenderable[] items) : this((IEnumerable)items) { } /// /// Initializes a new instance of the class. /// /// The items to render as columns. public Columns(IEnumerable items) { ArgumentNullException.ThrowIfNull(items); _items = new List(items); } /// /// Initializes a new instance of the class. /// /// The items to render. public Columns(IEnumerable items) { ArgumentNullException.ThrowIfNull(items); _items = new List(items.Select(item => new Markup(item))); } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { var maxPadding = Math.Max(Padding.GetLeftSafe(), Padding.GetRightSafe()); var itemWidths = _items.Select(item => item.Measure(options, maxWidth).Max).ToArray(); var columnCount = CalculateColumnCount(maxWidth, itemWidths, _items.Count, maxPadding); if (columnCount == 0) { // Temporary work around for extremely small consoles return new Measurement(maxWidth, maxWidth); } var rows = _items.Count / Math.Max(columnCount, 1); var greatestWidth = 0; for (var row = 0; row < rows; row += Math.Max(1, columnCount)) { var widths = itemWidths.Skip(row * columnCount).Take(columnCount).ToList(); var totalWidth = widths.Sum() + (maxPadding * (widths.Count - 1)); if (totalWidth > greatestWidth) { greatestWidth = totalWidth; } } return new Measurement(greatestWidth, greatestWidth); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var maxPadding = Math.Max(Padding.GetLeftSafe(), Padding.GetRightSafe()); var itemWidths = _items.Select(item => item.Measure(options, maxWidth).Max).ToArray(); var columnCount = CalculateColumnCount(maxWidth, itemWidths, _items.Count, maxPadding); if (columnCount == 0) { // Temporary work around for extremely small consoles columnCount = 1; } var table = new Table(); table.NoBorder(); table.HideHeaders(); table.PadRightCell = false; if (Expand) { table.Expand(); } // Add columns for (var index = 0; index < columnCount; index++) { table.AddColumn(new TableColumn(string.Empty) { Padding = Padding, NoWrap = true, }); } // Add rows for (var start = 0; start < _items.Count; start += columnCount) { table.AddRow(_items.Skip(start).Take(columnCount).ToArray()); } return ((IRenderable)table).Render(options, maxWidth); } // Algorithm borrowed from https://github.com/willmcgugan/rich/blob/master/rich/columns.py private int CalculateColumnCount(int maxWidth, int[] itemWidths, int columnCount, int padding) { var widths = new Dictionary(); while (columnCount > 1) { var columnIndex = 0; widths.Clear(); var exceededTotalWidth = false; foreach (var renderableWidth in IterateWidths(itemWidths, columnCount)) { widths[columnIndex] = Math.Max(widths.GetValueOrDefault(columnIndex, 0), renderableWidth); var totalWidth = widths.Values.Sum() + (padding * (widths.Count - 1)); if (totalWidth > maxWidth) { columnCount = widths.Count - 1; exceededTotalWidth = true; break; } else { columnIndex = (columnIndex + 1) % columnCount; } } if (!exceededTotalWidth) { break; } } return columnCount; } private IEnumerable IterateWidths(int[] itemWidths, int columnCount) { foreach (var width in itemWidths) { yield return width; } if (_items.Count % columnCount != 0) { for (var i = 0; i < columnCount - (_items.Count % columnCount) - 1; i++) { yield return 0; } } } } ================================================ FILE: src/Spectre.Console/Widgets/ControlCode.cs ================================================ namespace Spectre.Console; /// /// A control code. /// public sealed class ControlCode : Renderable { private readonly Segment _segment; internal static ControlCode Empty { get; } = new(string.Empty); /// /// Initializes a new instance of the class. /// /// The control code. public ControlCode(string control) { _segment = Segment.Control(control); } /// /// Creates a new using a . /// /// The capabilities. /// The action. /// A new instance. public static ControlCode Create( IReadOnlyCapabilities capabilities, Action action) { ArgumentNullException.ThrowIfNull(capabilities); ArgumentNullException.ThrowIfNull(action); return new ControlCode( AnsiStringWriter.Shared.Write( capabilities, action)); } /// /// Creates a new using a . /// /// The console. /// The action. /// A new instance. public static ControlCode Create( IAnsiConsole console, Action action) { ArgumentNullException.ThrowIfNull(console); ArgumentNullException.ThrowIfNull(action); return new ControlCode( AnsiStringWriter.Shared.Write( console.Profile.Capabilities, action)); } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { return new Measurement(0, 0); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { if (options.Ansi) { yield return _segment; } } } ================================================ FILE: src/Spectre.Console/Widgets/Exceptions/ExceptionFormat.cs ================================================ namespace Spectre.Console; /// /// Represents how an exception is formatted. /// [Flags] public enum ExceptionFormats { /// /// The default formatting. /// Default = 0, /// /// Whether or not paths should be shortened. /// ShortenPaths = 1, /// /// Whether or not types should be shortened. /// ShortenTypes = 2, /// /// Whether or not methods should be shortened. /// ShortenMethods = 4, /// /// Whether or not to show paths as links in the terminal. /// ShowLinks = 8, /// /// Shortens everything that can be shortened. /// ShortenEverything = ShortenMethods | ShortenTypes | ShortenPaths, /// /// Whether or not to show the exception stack trace. /// NoStackTrace = 16, } ================================================ FILE: src/Spectre.Console/Widgets/Exceptions/ExceptionFormatter.cs ================================================ namespace Spectre.Console; // ExceptionFormatter relies heavily on reflection of types unknown until runtime. [UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2026:RequiresUnreferencedCode")] [UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2070:RequiresUnreferencedCode")] [UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2075:RequiresUnreferencedCode")] [UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL3050:RequiresUnreferencedCode")] internal static class ExceptionFormatter { public const string AotWarning = "ExceptionFormatter is currently not supported for AOT."; public static IRenderable Format(Exception exception, ExceptionSettings settings) { ArgumentNullException.ThrowIfNull(exception); return GetException(exception, settings); } private static IRenderable GetException(Exception exception, ExceptionSettings settings) { ArgumentNullException.ThrowIfNull(exception); return new Rows(GetMessage(exception, settings), GetStackFrames(exception, settings)).Expand(); } private static Markup GetMessage(Exception ex, ExceptionSettings settings) { var shortenTypes = (settings.Format & ExceptionFormats.ShortenTypes) != 0; var exceptionType = ex.GetType(); var exceptionTypeName = TypeNameHelper.GetTypeDisplayName(exceptionType, fullName: !shortenTypes, includeSystemNamespace: true); var type = new StringBuilder(); Emphasize(type, exceptionTypeName, ['.'], settings.Style.Exception, shortenTypes, settings, limit: '<'); var message = $"[{settings.Style.Message.ToMarkup()}]{ex.Message.EscapeMarkup()}[/]"; return new Markup($"{type}: {message}"); } private static Grid GetStackFrames(Exception ex, ExceptionSettings settings) { var styles = settings.Style; var grid = new Grid(); grid.AddColumn(new GridColumn().PadLeft(2).PadRight(0).NoWrap()); grid.AddColumn(new GridColumn().PadLeft(1).PadRight(0)); // Inner if (ex.InnerException != null) { grid.AddRow( Text.Empty, GetException(ex.InnerException, settings)); } // Stack frames if ((settings.Format & ExceptionFormats.NoStackTrace) != 0) { return grid; } var stackTrace = new StackTrace(ex, fNeedFileInfo: true); var allFrames = stackTrace.GetFrames(); if (allFrames.Length > 0 && allFrames[0]?.GetMethod() == null) { // if we can't easily get the method for the frame, then we are in AOT // fallback to using ToString method of each frame. WriteAotFrames(grid, stackTrace.GetFrames(), styles); return grid; } var frames = allFrames .FilterStackFrames() .ToList(); foreach (var frame in frames) { var builder = new StringBuilder(); // Method var shortenMethods = (settings.Format & ExceptionFormats.ShortenMethods) != 0; var method = frame.GetMethod(); if (method == null) { continue; } var methodName = GetMethodName(ref method, out var isAsync); if (isAsync) { builder.Append("async "); } if (method is MethodInfo mi) { var returnParameter = mi.ReturnParameter; builder.AppendWithStyle(styles.ParameterType, GetParameterName(returnParameter).EscapeMarkup()); builder.Append(' '); } Emphasize(builder, methodName, ['.'], styles.Method, shortenMethods, settings); builder.AppendWithStyle(styles.Parenthesis, "("); AppendParameters(builder, method, settings); builder.AppendWithStyle(styles.Parenthesis, ")"); var path = frame.GetFileName(); if (path != null) { builder.Append(' '); builder.AppendWithStyle(styles.Dimmed, "in"); builder.Append(' '); // Path AppendPath(builder, path, settings); // Line number var lineNumber = frame.GetFileLineNumber(); if (lineNumber != 0) { builder.AppendWithStyle(styles.Dimmed, ":"); builder.AppendWithStyle(styles.LineNumber, lineNumber); } } grid.AddRow( $"[{styles.Dimmed.ToMarkup()}]at[/]", builder.ToString()); } return grid; } private static void WriteAotFrames(Grid grid, StackFrame?[] frames, ExceptionStyle styles) { foreach (var stackFrame in frames) { if (stackFrame == null) { continue; } var s = stackFrame.ToString(); s = s.Replace(" in file:line:column :0:0", string.Empty).TrimEnd(); grid.AddRow( $"[{styles.Dimmed.ToMarkup()}]at[/]", s.EscapeMarkup()); } } private static void AppendParameters(StringBuilder builder, MethodBase? method, ExceptionSettings settings) { var typeColor = settings.Style.ParameterType.ToMarkup(); var nameColor = settings.Style.ParameterName.ToMarkup(); var parameters = method?.GetParameters() .Select(x => $"[{typeColor}]{GetParameterName(x).EscapeMarkup()}[/] [{nameColor}]{x.Name?.EscapeMarkup()}[/]"); if (parameters != null) { builder.Append(string.Join(", ", parameters)); } } private static void AppendPath(StringBuilder builder, string path, ExceptionSettings settings) { void AppendPath() { var shortenPaths = (settings.Format & ExceptionFormats.ShortenPaths) != 0; Emphasize(builder, path, ['/', '\\'], settings.Style.Path, shortenPaths, settings); } if ((settings.Format & ExceptionFormats.ShowLinks) != 0) { var hasLink = path.TryGetUri(out var uri); if (hasLink && uri != null) { builder.Append("[link=").Append(uri.AbsoluteUri).Append(']'); } AppendPath(); if (hasLink && uri != null) { builder.Append("[/]"); } } else { AppendPath(); } } private static void Emphasize(StringBuilder builder, string input, char[] separators, Style color, bool compact, ExceptionSettings settings, char? limit = null) { var limitIndex = limit.HasValue ? input.IndexOf(limit.Value) : -1; var index = limitIndex != -1 ? input[..limitIndex].LastIndexOfAny(separators) : input.LastIndexOfAny(separators); if (index != -1) { if (!compact) { builder.AppendWithStyle(settings.Style.NonEmphasized, input[..(index + 1)]); } builder.AppendWithStyle(color, input[(index + 1)..]); } else { builder.AppendWithStyle(color, input); } } private static bool ShowInStackTrace(StackFrame frame) { // NET 6 has an attribute of StackTraceHiddenAttribute that we can use to clean up the stack trace // cleanly. If the user is on an older version we'll fall back to all the stack frames being included. #if NET6_0_OR_GREATER var mb = frame.GetMethod(); if (mb == null) { return false; } if ((mb.MethodImplementationFlags & MethodImplAttributes.AggressiveInlining) != 0) { return false; } try { if (mb.IsDefined(typeof(StackTraceHiddenAttribute), false)) { return false; } var declaringType = mb.DeclaringType; if (declaringType?.IsDefined(typeof(StackTraceHiddenAttribute), false) == true) { return false; } } catch { // if we can't get the attributes then fall back to including it. } #endif return true; } private static IEnumerable FilterStackFrames(this IEnumerable? frames) { var allFrames = frames?.ToArray() ?? []; var numberOfFrames = allFrames.Length; for (var i = 0; i < numberOfFrames; i++) { var thisFrame = allFrames[i]; if (thisFrame == null) { continue; } // always include the last frame if (i == numberOfFrames - 1) { yield return thisFrame; } else if (ShowInStackTrace(thisFrame)) { yield return thisFrame; } } } private static string GetPrefix(ParameterInfo parameter) { if (Attribute.IsDefined(parameter, typeof(ParamArrayAttribute), false)) { return "params"; } if (parameter.IsOut) { return "out"; } if (parameter.IsIn) { return "in"; } if (parameter.ParameterType.IsByRef) { return "ref"; } return string.Empty; } private static string GetParameterName(ParameterInfo parameter) { var prefix = GetPrefix(parameter); var parameterType = parameter.ParameterType; string typeName; if (parameterType.IsGenericType && TryGetTupleName(parameter, parameterType, out var s)) { typeName = s; } else { if (parameterType.IsByRef && parameterType.GetElementType() is { } elementType) { parameterType = elementType; } typeName = TypeNameHelper.GetTypeDisplayName(parameterType); } return string.IsNullOrWhiteSpace(prefix) ? typeName : $"{prefix} {typeName}"; } private static bool TryGetTupleName(ParameterInfo parameter, Type parameterType, [NotNullWhen(true)] out string? tupleName) { var customAttribs = parameter.GetCustomAttributes(inherit: false); var tupleNameAttribute = customAttribs .OfType() .FirstOrDefault(a => { var attributeType = a.GetType(); return attributeType.Namespace == "System.Runtime.CompilerServices" && attributeType.Name == "TupleElementNamesAttribute"; }); if (tupleNameAttribute != null) { var propertyInfo = tupleNameAttribute.GetType() .GetProperty("TransformNames", BindingFlags.Instance | BindingFlags.Public)!; var tupleNames = propertyInfo.GetValue(tupleNameAttribute) as IList; if (tupleNames?.Count > 0) { var args = parameterType.GetGenericArguments(); var sb = new StringBuilder(); sb.Append('('); for (var i = 0; i < args.Length; i++) { if (i > 0) { sb.Append(", "); } sb.Append(TypeNameHelper.GetTypeDisplayName(args[i])); if (i >= tupleNames.Count) { continue; } var argName = tupleNames[i]; sb.Append(' '); sb.Append(argName); } sb.Append(')'); tupleName = sb.ToString(); return true; } } else if (parameterType.Namespace == "System" && parameterType.Name.Contains("ValueTuple`")) { var args = parameterType.GetGenericArguments().Select(i => TypeNameHelper.GetTypeDisplayName(i)); tupleName = $"({string.Join(", ", args)})"; return true; } tupleName = null; return false; } private static string GetMethodName(ref MethodBase method, out bool isAsync) { var declaringType = method.DeclaringType; if (declaringType?.IsDefined(typeof(CompilerGeneratedAttribute), false) == true) { isAsync = typeof(IAsyncStateMachine).IsAssignableFrom(declaringType); if (isAsync || typeof(IEnumerator).IsAssignableFrom(declaringType)) { TryResolveStateMachineMethod(ref method, out declaringType); } } else { isAsync = false; } var builder = new StringBuilder(256); var fullName = method.DeclaringType?.FullName; if (fullName != null) { // See https://github.com/dotnet/runtime/blob/v6.0.0/src/libraries/System.Private.CoreLib/src/System/Diagnostics/StackTrace.cs#L247-L253 builder.Append(fullName.Replace('+', '.')); builder.Append('.'); } builder.Append(method.Name); if (method.IsGenericMethod) { builder.Append('<'); builder.Append(string.Join(",", method.GetGenericArguments().Select(t => t.Name))); builder.Append('>'); } return builder.ToString(); } [RequiresDynamicCode(ExceptionFormatter.AotWarning)] private static bool TryResolveStateMachineMethod(ref MethodBase method, out Type declaringType) { // https://github.com/dotnet/runtime/blob/v6.0.0/src/libraries/System.Private.CoreLib/src/System/Diagnostics/StackTrace.cs#L400-L455 declaringType = method.DeclaringType ?? throw new ArgumentException("Method must have a declaring type.", nameof(method)); var parentType = declaringType.DeclaringType; if (parentType == null) { return false; } static IEnumerable GetDeclaredMethods(IReflect type) => type.GetMethods( BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly); var methods = GetDeclaredMethods(parentType); foreach (var candidateMethod in methods) { var attributes = candidateMethod.GetCustomAttributes(false); bool foundAttribute = false, foundIteratorAttribute = false; foreach (var asma in attributes) { if (asma.StateMachineType != declaringType) { continue; } foundAttribute = true; #if NET6_0_OR_GREATER foundIteratorAttribute |= asma is IteratorStateMachineAttribute or AsyncIteratorStateMachineAttribute; #else foundIteratorAttribute |= asma is IteratorStateMachineAttribute; #endif } if (!foundAttribute) { continue; } method = candidateMethod; declaringType = candidateMethod.DeclaringType!; return foundIteratorAttribute; } return false; } } ================================================ FILE: src/Spectre.Console/Widgets/Exceptions/ExceptionSettings.cs ================================================ namespace Spectre.Console; /// /// Exception settings. /// public sealed class ExceptionSettings { /// /// Gets or sets the exception format. /// public ExceptionFormats Format { get; set; } /// /// Gets or sets the exception style. /// public ExceptionStyle Style { get; set; } /// /// Initializes a new instance of the class. /// public ExceptionSettings() { Format = ExceptionFormats.Default; Style = new ExceptionStyle(); } } ================================================ FILE: src/Spectre.Console/Widgets/Exceptions/ExceptionStyle.cs ================================================ namespace Spectre.Console; /// /// Represent an exception style. /// public sealed class ExceptionStyle { /// /// Gets or sets the message color. /// public Style Message { get; set; } = new Style(Color.Red, Color.Default, Decoration.Bold); /// /// Gets or sets the exception color. /// public Style Exception { get; set; } = Color.White; /// /// Gets or sets the method color. /// public Style Method { get; set; } = Color.Yellow; /// /// Gets or sets the parameter type color. /// public Style ParameterType { get; set; } = Color.Blue; /// /// Gets or sets the parameter name color. /// public Style ParameterName { get; set; } = Color.Silver; /// /// Gets or sets the parenthesis color. /// public Style Parenthesis { get; set; } = Color.Silver; /// /// Gets or sets the path color. /// public Style Path { get; set; } = new Style(Color.Yellow, Color.Default, Decoration.Bold); /// /// Gets or sets the line number color. /// public Style LineNumber { get; set; } = Color.Blue; /// /// Gets or sets the color for dimmed text such as "at" or "in". /// public Style Dimmed { get; set; } = Color.Grey; /// /// Gets or sets the color for non emphasized items. /// public Style NonEmphasized { get; set; } = Color.Silver; } ================================================ FILE: src/Spectre.Console/Widgets/Exceptions/StringUriExtensions.cs ================================================ namespace Spectre.Console; internal static class StringUriExtensions { public static bool TryGetUri(this string path, [NotNullWhen(true)] out Uri? result) { try { if (!Uri.TryCreate(path, UriKind.Absolute, out var uri)) { result = null; return false; } if (uri.Scheme == "file") { // For local files, we need to append // the host name. Otherwise the terminal // will most probably not allow it. var builder = new UriBuilder(uri) { Host = Dns.GetHostName(), }; uri = builder.Uri; } result = uri; return true; } catch { result = null; return false; } } } ================================================ FILE: src/Spectre.Console/Widgets/Exceptions/TypeNameHelper.cs ================================================ namespace Spectre.Console; internal static class TypeNameHelper { // from https://github.com/benaadams/Ben.Demystifier/blob/main/src/Ben.Demystifier/TypeNameHelper.cs // which was adapted from https://github.com/aspnet/Common/blob/dev/shared/Microsoft.Extensions.TypeNameHelper.Sources/TypeNameHelper.cs public static readonly Dictionary BuiltInTypeNames = new Dictionary { { typeof(void), "void" }, { typeof(bool), "bool" }, { typeof(byte), "byte" }, { typeof(char), "char" }, { typeof(decimal), "decimal" }, { typeof(double), "double" }, { typeof(float), "float" }, { typeof(int), "int" }, { typeof(long), "long" }, { typeof(object), "object" }, { typeof(sbyte), "sbyte" }, { typeof(short), "short" }, { typeof(string), "string" }, { typeof(uint), "uint" }, { typeof(ulong), "ulong" }, { typeof(ushort), "ushort" }, }; public static readonly Dictionary FSharpTypeNames = new Dictionary { { "Unit", "void" }, { "FSharpOption", "Option" }, { "FSharpAsync", "Async" }, { "FSharpOption`1", "Option" }, { "FSharpAsync`1", "Async" }, }; /// /// Pretty print a type name. /// /// The . /// true to print a fully qualified name. /// true to include generic parameter names. /// true to include the System namespace. /// The pretty printed type name. public static string GetTypeDisplayName(Type type, bool fullName = false, bool includeGenericParameterNames = true, bool includeSystemNamespace = false) { var builder = new StringBuilder(); ProcessType(builder, type, new DisplayNameOptions(fullName, includeGenericParameterNames, includeSystemNamespace)); return builder.ToString(); } private static void ProcessType(StringBuilder builder, Type type, DisplayNameOptions options) { if (type.IsGenericType) { var underlyingType = Nullable.GetUnderlyingType(type); if (underlyingType != null) { ProcessType(builder, underlyingType, options); builder.Append('?'); } else { var genericArguments = type.GetGenericArguments(); ProcessGenericType(builder, type, genericArguments, genericArguments.Length, options); } } else if (type.IsArray) { ProcessArrayType(builder, type, options); } else if (BuiltInTypeNames.TryGetValue(type, out var builtInName)) { builder.Append(builtInName); } else if (type.Namespace == nameof(System) && !options.IncludeSystemNamespace) { builder.Append(type.Name); } else if (type.Assembly.GetName().Name == "FSharp.Core.dll" && FSharpTypeNames.TryGetValue(type.Name, out builtInName)) { builder.Append(builtInName); } else if (type.IsGenericParameter) { if (options.IncludeGenericParameterNames) { builder.Append(type.Name); } } else { builder.Append(options.FullName ? type.FullName ?? type.Name : type.Name); } } private static void ProcessArrayType(StringBuilder builder, Type type, DisplayNameOptions options) { var innerType = type; while (innerType.IsArray) { if (innerType.GetElementType() is { } inner) { innerType = inner; } } ProcessType(builder, innerType, options); while (type.IsArray) { builder.Append('['); builder.Append(',', type.GetArrayRank() - 1); builder.Append(']'); if (type.GetElementType() is not { } elementType) { break; } type = elementType; } } private static void ProcessGenericType(StringBuilder builder, Type type, Type[] genericArguments, int length, DisplayNameOptions options) { var offset = 0; if (type.IsNested && type.DeclaringType is not null) { offset = type.DeclaringType.GetGenericArguments().Length; } if (options.FullName) { if (type.IsNested && type.DeclaringType is not null) { ProcessGenericType(builder, type.DeclaringType, genericArguments, offset, options); builder.Append('+'); } else if (!string.IsNullOrEmpty(type.Namespace)) { builder.Append(type.Namespace); builder.Append('.'); } } var genericPartIndex = type.Name.IndexOf('`'); if (genericPartIndex <= 0) { builder.Append(type.Name); return; } if (type.Assembly.GetName().Name == "FSharp.Core.dll" && FSharpTypeNames.TryGetValue(type.Name, out var builtInName)) { builder.Append(builtInName); } else { builder.Append(type.Name, 0, genericPartIndex); } builder.Append('<'); for (var i = offset; i < length; i++) { ProcessType(builder, genericArguments[i], options); if (i + 1 == length) { continue; } builder.Append(','); if (options.IncludeGenericParameterNames || !genericArguments[i + 1].IsGenericParameter) { builder.Append(' '); } } builder.Append('>'); } private readonly struct DisplayNameOptions { public bool FullName { get; } public bool IncludeGenericParameterNames { get; } public bool IncludeSystemNamespace { get; } public DisplayNameOptions(bool fullName, bool includeGenericParameterNames, bool includeSystemNamespace) { FullName = fullName; IncludeGenericParameterNames = includeGenericParameterNames; IncludeSystemNamespace = includeSystemNamespace; } } } ================================================ FILE: src/Spectre.Console/Widgets/Figlet/FigletCharacter.cs ================================================ namespace Spectre.Console; internal sealed class FigletCharacter { public int Code { get; } public int Width { get; } public int Height { get; } public IReadOnlyList Lines { get; } public FigletCharacter(int code, IEnumerable lines) { Code = code; Lines = new List(lines ?? throw new ArgumentNullException(nameof(lines))); var min = Lines.Min(x => x.Length); var max = Lines.Max(x => x.Length); if (min != max) { throw new InvalidOperationException($"Figlet character #{code} has varying width"); } Width = max; Height = Lines.Count; } } ================================================ FILE: src/Spectre.Console/Widgets/Figlet/FigletFont.cs ================================================ namespace Spectre.Console; /// /// Represents a FIGlet font. /// public sealed class FigletFont { private const string StandardFont = "Spectre.Console/Widgets/Figlet/Fonts/Standard.flf"; private readonly Dictionary _characters; private static readonly Lazy _standard; /// /// Gets the number of characters in the font. /// public int Count => _characters.Count; /// /// Gets the height of the font. /// public int Height { get; } /// /// Gets the font's baseline. /// public int Baseline { get; } /// /// Gets the font's maximum width. /// public int MaxWidth { get; } /// /// Gets the default FIGlet font. /// public static FigletFont Default => _standard.Value; static FigletFont() { _standard = new Lazy(() => Parse( ResourceReader.ReadManifestData(StandardFont))); } internal FigletFont(IEnumerable characters, FigletHeader header) { _characters = new Dictionary(); foreach (var character in characters) { if (!_characters.TryAdd(character.Code, character)) { throw new InvalidOperationException("Character already exist"); } } Height = header.Height; Baseline = header.Baseline; MaxWidth = header.MaxLength; } /// /// Loads a FIGlet font from the specified stream. /// /// The stream to load the FIGlet font from. /// The loaded FIGlet font. public static FigletFont Load(Stream stream) { using (var reader = new StreamReader(stream)) { return Parse(reader.ReadToEnd()); } } /// /// Loads a FIGlet font from disk. /// /// The path of the FIGlet font to load. /// The loaded FIGlet font. public static FigletFont Load(string path) { return Parse(File.ReadAllText(path)); } /// /// Parses a FIGlet font from the specified . /// /// The FIGlet font source. /// The parsed FIGlet font. public static FigletFont Parse(string source) { return FigletFontParser.Parse(source); } internal int GetWidth(string text) { var width = 0; foreach (var character in text) { width += GetCharacter(character)?.Width ?? 0; } return width; } internal FigletCharacter? GetCharacter(char character) { _characters.TryGetValue(character, out var result); return result; } internal IEnumerable GetCharacters(string text) { ArgumentNullException.ThrowIfNull(text); var result = new List(); foreach (var character in text) { if (_characters.TryGetValue(character, out var figletCharacter)) { result.Add(figletCharacter); } } return result; } } ================================================ FILE: src/Spectre.Console/Widgets/Figlet/FigletFontParser.cs ================================================ namespace Spectre.Console; internal static class FigletFontParser { public static FigletFont Parse(string source) { var lines = source.SplitLines(); var headerLine = lines.FirstOrDefault(); if (headerLine == null) { throw new InvalidOperationException("Could not read header line"); } var header = ParseHeader(headerLine); var index = 32; var indexOverridden = false; var hasOverriddenIndex = false; var buffer = new List(); var characters = new List(); foreach (var line in lines.Skip(header.CommentLines + 1)) { if (!line.EndsWith("@", StringComparison.Ordinal)) { var words = line.SplitWords(); if (words.Length > 0 && TryParseIndex(words[0], out var newIndex)) { index = newIndex; indexOverridden = true; hasOverriddenIndex = true; continue; } continue; } if (hasOverriddenIndex && !indexOverridden) { throw new InvalidOperationException("Unknown index for FIGlet character"); } buffer.Add(line.Replace(header.Hardblank, ' ').TrimEnd('@')); if (line.EndsWith("@@", StringComparison.Ordinal)) { characters.Add(new FigletCharacter(index, buffer)); buffer.Clear(); if (!hasOverriddenIndex) { index++; } // Reset the flag so we know if we're trying to parse // a character that wasn't prefixed with an ASCII index. indexOverridden = false; } } return new FigletFont(characters, header); } private static bool TryParseIndex(string index, out int result) { var style = NumberStyles.Integer; if (index.StartsWith("0x", StringComparison.OrdinalIgnoreCase)) { // TODO: ReplaceExact should not be used index = index.ReplaceExact("0x", string.Empty).ReplaceExact("0x", string.Empty); style = NumberStyles.HexNumber; } return int.TryParse(index, style, CultureInfo.InvariantCulture, out result); } private static FigletHeader ParseHeader(string text) { if (string.IsNullOrWhiteSpace(text)) { throw new InvalidOperationException("Invalid Figlet font"); } var parts = text.SplitWords(StringSplitOptions.RemoveEmptyEntries); if (parts.Length < 6) { throw new InvalidOperationException("Invalid Figlet font header"); } if (!IsValidSignature(parts[0])) { throw new InvalidOperationException("Invalid Figlet font header signature"); } return new FigletHeader { Hardblank = parts[0][5], Height = int.Parse(parts[1], CultureInfo.InvariantCulture), Baseline = int.Parse(parts[2], CultureInfo.InvariantCulture), MaxLength = int.Parse(parts[3], CultureInfo.InvariantCulture), OldLayout = int.Parse(parts[4], CultureInfo.InvariantCulture), CommentLines = int.Parse(parts[5], CultureInfo.InvariantCulture), }; } private static bool IsValidSignature(string signature) { return signature.Length == 6 && signature[0] == 'f' && signature[1] == 'l' && signature[2] == 'f' && signature[3] == '2' && signature[4] == 'a'; } } ================================================ FILE: src/Spectre.Console/Widgets/Figlet/FigletHeader.cs ================================================ namespace Spectre.Console; internal sealed class FigletHeader { public char Hardblank { get; set; } public int Height { get; set; } public int Baseline { get; set; } public int MaxLength { get; set; } public int OldLayout { get; set; } public int CommentLines { get; set; } } ================================================ FILE: src/Spectre.Console/Widgets/Figlet/FigletText.cs ================================================ namespace Spectre.Console; /// /// Represents text rendered with a FIGlet font. /// public sealed class FigletText : Renderable, IHasJustification { private readonly FigletFont _font; private readonly string _text; /// /// Gets or sets the color of the text. /// public Color? Color { get; set; } /// public Justify? Justification { get; set; } /// /// Gets or sets a value indicating whether or not /// the right side should be padded. /// /// Defaults to false. public bool Pad { get; set; } /// /// Initializes a new instance of the class. /// /// The text. public FigletText(string text) : this(FigletFont.Default, text) { } /// /// Initializes a new instance of the class. /// /// The FIGlet font to use. /// The text. public FigletText(FigletFont font, string text) { _font = font ?? throw new ArgumentNullException(nameof(font)); _text = text ?? throw new ArgumentNullException(nameof(text)); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var style = new Style(Color ?? Console.Color.Default); var alignment = Justification ?? Console.Justify.Left; foreach (var row in GetRows(maxWidth)) { for (var index = 0; index < _font.Height; index++) { var line = new Segment(string.Concat(row.Select(x => x.Lines[index])), style); var lineWidth = line.CellCount(); if (alignment == Console.Justify.Left) { yield return line; if (lineWidth < maxWidth && Pad) { yield return Segment.Padding(maxWidth - lineWidth); } } else if (alignment == Console.Justify.Center) { var left = Math.Max(0, maxWidth - lineWidth) / 2; var right = left + (Math.Max(0, maxWidth - lineWidth) % 2); yield return Segment.Padding(left); yield return line; if (Pad) { yield return Segment.Padding(right); } } else if (alignment == Console.Justify.Right) { if (lineWidth < maxWidth) { yield return Segment.Padding(maxWidth - lineWidth); } yield return line; } yield return Segment.LineBreak; } } } private List> GetRows(int maxWidth) { var result = new List>(); var words = _text.SplitWords(StringSplitOptions.None); var totalWidth = 0; var line = new List(); foreach (var word in words) { // Does the whole word fit? var width = _font.GetWidth(word); if (width + totalWidth < maxWidth) { // Add it to the line line.AddRange(_font.GetCharacters(word)); totalWidth += width; } else { // Does it fit on its own line? if (width < maxWidth) { // Flush the line result.Add(line); line = []; totalWidth = 0; line.AddRange(_font.GetCharacters(word)); totalWidth += width; } else { // We need to split it up. var queue = new Queue(_font.GetCharacters(word)); while (queue.Count > 0) { var current = queue.Dequeue(); if (totalWidth + current.Width > maxWidth) { // Flush the line result.Add(line); line = []; totalWidth = 0; } line.Add(current); totalWidth += current.Width; } } } } if (line.Count > 0) { result.Add(line); } return result; } } /// /// Contains extension methods for . /// public static class FigletTextExtensions { /// /// Sets the color of the FIGlet text. /// /// The text. /// The color. /// The same instance so that multiple calls can be chained. public static FigletText Color(this FigletText text, Color? color) { ArgumentNullException.ThrowIfNull(text); text.Color = color ?? Console.Color.Default; return text; } } ================================================ FILE: src/Spectre.Console/Widgets/Figlet/Fonts/Standard.flf ================================================ flf2a$ 6 5 16 15 11 0 24463 Standard by Glenn Chappell & Ian Chai 3/93 -- based on Frank's .sig Includes ISO Latin-1 figlet release 2.1 -- 12 Aug 1994 Modified for figlet 2.2 by John Cowan to add Latin-{2,3,4,5} support (Unicode U+0100-017F). Permission is hereby given to modify this font, as long as the modifier's name is placed on a comment line. Modified by Paul Burton 12/96 to include new parameter supported by FIGlet and FIGWin. May also be slightly modified for better use of new full-width/kern/smush alternatives, but default output is NOT changed. $@ $@ $@ $@ $@ $@@ _ @ | |@ | |@ |_|@ (_)@ @@ _ _ @ ( | )@ V V @ $ @ $ @ @@ _ _ @ _| || |_ @ |_ .. _|@ |_ _|@ |_||_| @ @@ _ @ | | @ / __)@ \__ \@ ( /@ |_| @@ _ __@ (_)/ /@ / / @ / /_ @ /_/(_)@ @@ ___ @ ( _ ) @ / _ \/\@ | (_> <@ \___/\/@ @@ _ @ ( )@ |/ @ $ @ $ @ @@ __@ / /@ | | @ | | @ | | @ \_\@@ __ @ \ \ @ | |@ | |@ | |@ /_/ @@ @ __/\__@ \ /@ /_ _\@ \/ @ @@ @ _ @ _| |_ @ |_ _|@ |_| @ @@ @ @ @ _ @ ( )@ |/ @@ @ @ _____ @ |_____|@ $ @ @@ @ @ @ _ @ (_)@ @@ __@ / /@ / / @ / / @ /_/ @ @@ ___ @ / _ \ @ | | | |@ | |_| |@ \___/ @ @@ _ @ / |@ | |@ | |@ |_|@ @@ ____ @ |___ \ @ __) |@ / __/ @ |_____|@ @@ _____ @ |___ / @ |_ \ @ ___) |@ |____/ @ @@ _ _ @ | || | @ | || |_ @ |__ _|@ |_| @ @@ ____ @ | ___| @ |___ \ @ ___) |@ |____/ @ @@ __ @ / /_ @ | '_ \ @ | (_) |@ \___/ @ @@ _____ @ |___ |@ / / @ / / @ /_/ @ @@ ___ @ ( _ ) @ / _ \ @ | (_) |@ \___/ @ @@ ___ @ / _ \ @ | (_) |@ \__, |@ /_/ @ @@ @ _ @ (_)@ _ @ (_)@ @@ @ _ @ (_)@ _ @ ( )@ |/ @@ __@ / /@ / / @ \ \ @ \_\@ @@ @ _____ @ |_____|@ |_____|@ $ @ @@ __ @ \ \ @ \ \@ / /@ /_/ @ @@ ___ @ |__ \@ / /@ |_| @ (_) @ @@ ____ @ / __ \ @ / / _` |@ | | (_| |@ \ \__,_|@ \____/ @@ _ @ / \ @ / _ \ @ / ___ \ @ /_/ \_\@ @@ ____ @ | __ ) @ | _ \ @ | |_) |@ |____/ @ @@ ____ @ / ___|@ | | @ | |___ @ \____|@ @@ ____ @ | _ \ @ | | | |@ | |_| |@ |____/ @ @@ _____ @ | ____|@ | _| @ | |___ @ |_____|@ @@ _____ @ | ___|@ | |_ @ | _| @ |_| @ @@ ____ @ / ___|@ | | _ @ | |_| |@ \____|@ @@ _ _ @ | | | |@ | |_| |@ | _ |@ |_| |_|@ @@ ___ @ |_ _|@ | | @ | | @ |___|@ @@ _ @ | |@ _ | |@ | |_| |@ \___/ @ @@ _ __@ | |/ /@ | ' / @ | . \ @ |_|\_\@ @@ _ @ | | @ | | @ | |___ @ |_____|@ @@ __ __ @ | \/ |@ | |\/| |@ | | | |@ |_| |_|@ @@ _ _ @ | \ | |@ | \| |@ | |\ |@ |_| \_|@ @@ ___ @ / _ \ @ | | | |@ | |_| |@ \___/ @ @@ ____ @ | _ \ @ | |_) |@ | __/ @ |_| @ @@ ___ @ / _ \ @ | | | |@ | |_| |@ \__\_\@ @@ ____ @ | _ \ @ | |_) |@ | _ < @ |_| \_\@ @@ ____ @ / ___| @ \___ \ @ ___) |@ |____/ @ @@ _____ @ |_ _|@ | | @ | | @ |_| @ @@ _ _ @ | | | |@ | | | |@ | |_| |@ \___/ @ @@ __ __@ \ \ / /@ \ \ / / @ \ V / @ \_/ @ @@ __ __@ \ \ / /@ \ \ /\ / / @ \ V V / @ \_/\_/ @ @@ __ __@ \ \/ /@ \ / @ / \ @ /_/\_\@ @@ __ __@ \ \ / /@ \ V / @ | | @ |_| @ @@ _____@ |__ /@ / / @ / /_ @ /____|@ @@ __ @ | _|@ | | @ | | @ | | @ |__|@@ __ @ \ \ @ \ \ @ \ \ @ \_\@ @@ __ @ |_ |@ | |@ | |@ | |@ |__|@@ /\ @ |/\|@ $ @ $ @ $ @ @@ @ @ @ @ _____ @ |_____|@@ _ @ ( )@ \|@ $ @ $ @ @@ @ __ _ @ / _` |@ | (_| |@ \__,_|@ @@ _ @ | |__ @ | '_ \ @ | |_) |@ |_.__/ @ @@ @ ___ @ / __|@ | (__ @ \___|@ @@ _ @ __| |@ / _` |@ | (_| |@ \__,_|@ @@ @ ___ @ / _ \@ | __/@ \___|@ @@ __ @ / _|@ | |_ @ | _|@ |_| @ @@ @ __ _ @ / _` |@ | (_| |@ \__, |@ |___/ @@ _ @ | |__ @ | '_ \ @ | | | |@ |_| |_|@ @@ _ @ (_)@ | |@ | |@ |_|@ @@ _ @ (_)@ | |@ | |@ _/ |@ |__/ @@ _ @ | | __@ | |/ /@ | < @ |_|\_\@ @@ _ @ | |@ | |@ | |@ |_|@ @@ @ _ __ ___ @ | '_ ` _ \ @ | | | | | |@ |_| |_| |_|@ @@ @ _ __ @ | '_ \ @ | | | |@ |_| |_|@ @@ @ ___ @ / _ \ @ | (_) |@ \___/ @ @@ @ _ __ @ | '_ \ @ | |_) |@ | .__/ @ |_| @@ @ __ _ @ / _` |@ | (_| |@ \__, |@ |_|@@ @ _ __ @ | '__|@ | | @ |_| @ @@ @ ___ @ / __|@ \__ \@ |___/@ @@ _ @ | |_ @ | __|@ | |_ @ \__|@ @@ @ _ _ @ | | | |@ | |_| |@ \__,_|@ @@ @ __ __@ \ \ / /@ \ V / @ \_/ @ @@ @ __ __@ \ \ /\ / /@ \ V V / @ \_/\_/ @ @@ @ __ __@ \ \/ /@ > < @ /_/\_\@ @@ @ _ _ @ | | | |@ | |_| |@ \__, |@ |___/ @@ @ ____@ |_ /@ / / @ /___|@ @@ __@ / /@ | | @ < < @ | | @ \_\@@ _ @ | |@ | |@ | |@ | |@ |_|@@ __ @ \ \ @ | | @ > >@ | | @ /_/ @@ /\/|@ |/\/ @ $ @ $ @ $ @ @@ _ _ @ (_)_(_)@ /_\ @ / _ \ @ /_/ \_\@ @@ _ _ @ (_)_(_)@ / _ \ @ | |_| |@ \___/ @ @@ _ _ @ (_) (_)@ | | | |@ | |_| |@ \___/ @ @@ _ _ @ (_)_(_)@ / _` |@ | (_| |@ \__,_|@ @@ _ _ @ (_)_(_)@ / _ \ @ | (_) |@ \___/ @ @@ _ _ @ (_) (_)@ | | | |@ | |_| |@ \__,_|@ @@ ___ @ / _ \@ | |/ /@ | |\ \@ | ||_/@ |_| @@ 160 NO-BREAK SPACE $@ $@ $@ $@ $@ $@@ 161 INVERTED EXCLAMATION MARK _ @ (_)@ | |@ | |@ |_|@ @@ 162 CENT SIGN _ @ | | @ / __)@ | (__ @ \ )@ |_| @@ 163 POUND SIGN ___ @ / ,_\ @ _| |_ @ | |___ @ (_,____|@ @@ 164 CURRENCY SIGN /\___/\@ \ _ /@ | (_) |@ / ___ \@ \/ \/@ @@ 165 YEN SIGN __ __ @ \ V / @ |__ __|@ |__ __|@ |_| @ @@ 166 BROKEN BAR _ @ | |@ |_|@ _ @ | |@ |_|@@ 167 SECTION SIGN __ @ _/ _)@ / \ \ @ \ \\ \@ \ \_/@ (__/ @@ 168 DIAERESIS _ _ @ (_) (_)@ $ $ @ $ $ @ $ $ @ @@ 169 COPYRIGHT SIGN _____ @ / ___ \ @ / / __| \ @ | | (__ |@ \ \___| / @ \_____/ @@ 170 FEMININE ORDINAL INDICATOR __ _ @ / _` |@ \__,_|@ |____|@ $ @ @@ 171 LEFT-POINTING DOUBLE ANGLE QUOTATION MARK ____@ / / /@ / / / @ \ \ \ @ \_\_\@ @@ 172 NOT SIGN @ _____ @ |___ |@ |_|@ $ @ @@ 173 SOFT HYPHEN @ @ ____ @ |____|@ $ @ @@ 174 REGISTERED SIGN _____ @ / ___ \ @ / | _ \ \ @ | | / |@ \ |_|_\ / @ \_____/ @@ 175 MACRON _____ @ |_____|@ $ @ $ @ $ @ @@ 176 DEGREE SIGN __ @ / \ @ | () |@ \__/ @ $ @ @@ 177 PLUS-MINUS SIGN _ @ _| |_ @ |_ _|@ _|_|_ @ |_____|@ @@ 178 SUPERSCRIPT TWO ___ @ |_ )@ / / @ /___|@ $ @ @@ 179 SUPERSCRIPT THREE ____@ |__ /@ |_ \@ |___/@ $ @ @@ 180 ACUTE ACCENT __@ /_/@ $ @ $ @ $ @ @@ 181 MICRO SIGN @ _ _ @ | | | |@ | |_| |@ | ._,_|@ |_| @@ 182 PILCROW SIGN _____ @ / |@ | (| | |@ \__ | |@ |_|_|@ @@ 183 MIDDLE DOT @ _ @ (_)@ $ @ $ @ @@ 184 CEDILLA @ @ @ @ _ @ )_)@@ 185 SUPERSCRIPT ONE _ @ / |@ | |@ |_|@ $ @ @@ 186 MASCULINE ORDINAL INDICATOR ___ @ / _ \@ \___/@ |___|@ $ @ @@ 187 RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK ____ @ \ \ \ @ \ \ \@ / / /@ /_/_/ @ @@ 188 VULGAR FRACTION ONE QUARTER _ __ @ / | / / _ @ | |/ / | | @ |_/ /|_ _|@ /_/ |_| @ @@ 189 VULGAR FRACTION ONE HALF _ __ @ / | / /__ @ | |/ /_ )@ |_/ / / / @ /_/ /___|@ @@ 190 VULGAR FRACTION THREE QUARTERS ____ __ @ |__ / / / _ @ |_ \/ / | | @ |___/ /|_ _|@ /_/ |_| @ @@ 191 INVERTED QUESTION MARK _ @ (_) @ | | @ / /_ @ \___|@ @@ 192 LATIN CAPITAL LETTER A WITH GRAVE __ @ \_\ @ /_\ @ / _ \ @ /_/ \_\@ @@ 193 LATIN CAPITAL LETTER A WITH ACUTE __ @ /_/ @ /_\ @ / _ \ @ /_/ \_\@ @@ 194 LATIN CAPITAL LETTER A WITH CIRCUMFLEX //\ @ |/_\| @ /_\ @ / _ \ @ /_/ \_\@ @@ 195 LATIN CAPITAL LETTER A WITH TILDE /\/| @ |/\/ @ /_\ @ / _ \ @ /_/ \_\@ @@ 196 LATIN CAPITAL LETTER A WITH DIAERESIS _ _ @ (_)_(_)@ /_\ @ / _ \ @ /_/ \_\@ @@ 197 LATIN CAPITAL LETTER A WITH RING ABOVE _ @ (o) @ /_\ @ / _ \ @ /_/ \_\@ @@ 198 LATIN CAPITAL LETTER AE ______ @ / ____|@ / _ _| @ / __ |___ @ /_/ |_____|@ @@ 199 LATIN CAPITAL LETTER C WITH CEDILLA ____ @ / ___|@ | | @ | |___ @ \____|@ )_) @@ 200 LATIN CAPITAL LETTER E WITH GRAVE __ @ _\_\_ @ | ____|@ | _|_ @ |_____|@ @@ 201 LATIN CAPITAL LETTER E WITH ACUTE __ @ _/_/_ @ | ____|@ | _|_ @ |_____|@ @@ 202 LATIN CAPITAL LETTER E WITH CIRCUMFLEX //\ @ |/_\| @ | ____|@ | _|_ @ |_____|@ @@ 203 LATIN CAPITAL LETTER E WITH DIAERESIS _ _ @ (_)_(_)@ | ____|@ | _|_ @ |_____|@ @@ 204 LATIN CAPITAL LETTER I WITH GRAVE __ @ \_\ @ |_ _|@ | | @ |___|@ @@ 205 LATIN CAPITAL LETTER I WITH ACUTE __ @ /_/ @ |_ _|@ | | @ |___|@ @@ 206 LATIN CAPITAL LETTER I WITH CIRCUMFLEX //\ @ |/_\|@ |_ _|@ | | @ |___|@ @@ 207 LATIN CAPITAL LETTER I WITH DIAERESIS _ _ @ (_)_(_)@ |_ _| @ | | @ |___| @ @@ 208 LATIN CAPITAL LETTER ETH ____ @ | _ \ @ _| |_| |@ |__ __| |@ |____/ @ @@ 209 LATIN CAPITAL LETTER N WITH TILDE /\/|@ |/\/ @ | \| |@ | .` |@ |_|\_|@ @@ 210 LATIN CAPITAL LETTER O WITH GRAVE __ @ \_\ @ / _ \ @ | |_| |@ \___/ @ @@ 211 LATIN CAPITAL LETTER O WITH ACUTE __ @ /_/ @ / _ \ @ | |_| |@ \___/ @ @@ 212 LATIN CAPITAL LETTER O WITH CIRCUMFLEX //\ @ |/_\| @ / _ \ @ | |_| |@ \___/ @ @@ 213 LATIN CAPITAL LETTER O WITH TILDE /\/| @ |/\/ @ / _ \ @ | |_| |@ \___/ @ @@ 214 LATIN CAPITAL LETTER O WITH DIAERESIS _ _ @ (_)_(_)@ / _ \ @ | |_| |@ \___/ @ @@ 215 MULTIPLICATION SIGN @ @ /\/\@ > <@ \/\/@ @@ 216 LATIN CAPITAL LETTER O WITH STROKE ____ @ / _// @ | |// |@ | //| |@ //__/ @ @@ 217 LATIN CAPITAL LETTER U WITH GRAVE __ @ _\_\_ @ | | | |@ | |_| |@ \___/ @ @@ 218 LATIN CAPITAL LETTER U WITH ACUTE __ @ _/_/_ @ | | | |@ | |_| |@ \___/ @ @@ 219 LATIN CAPITAL LETTER U WITH CIRCUMFLEX //\ @ |/ \| @ | | | |@ | |_| |@ \___/ @ @@ 220 LATIN CAPITAL LETTER U WITH DIAERESIS _ _ @ (_) (_)@ | | | |@ | |_| |@ \___/ @ @@ 221 LATIN CAPITAL LETTER Y WITH ACUTE __ @ __/_/__@ \ \ / /@ \ V / @ |_| @ @@ 222 LATIN CAPITAL LETTER THORN _ @ | |___ @ | __ \@ | ___/@ |_| @ @@ 223 LATIN SMALL LETTER SHARP S ___ @ / _ \@ | |/ /@ | |\ \@ | ||_/@ |_| @@ 224 LATIN SMALL LETTER A WITH GRAVE __ @ \_\_ @ / _` |@ | (_| |@ \__,_|@ @@ 225 LATIN SMALL LETTER A WITH ACUTE __ @ /_/_ @ / _` |@ | (_| |@ \__,_|@ @@ 226 LATIN SMALL LETTER A WITH CIRCUMFLEX //\ @ |/_\| @ / _` |@ | (_| |@ \__,_|@ @@ 227 LATIN SMALL LETTER A WITH TILDE /\/| @ |/\/_ @ / _` |@ | (_| |@ \__,_|@ @@ 228 LATIN SMALL LETTER A WITH DIAERESIS _ _ @ (_)_(_)@ / _` |@ | (_| |@ \__,_|@ @@ 229 LATIN SMALL LETTER A WITH RING ABOVE __ @ (()) @ / _ '|@ | (_| |@ \__,_|@ @@ 230 LATIN SMALL LETTER AE @ __ ____ @ / _` _ \@ | (_| __/@ \__,____|@ @@ 231 LATIN SMALL LETTER C WITH CEDILLA @ ___ @ / __|@ | (__ @ \___|@ )_) @@ 232 LATIN SMALL LETTER E WITH GRAVE __ @ \_\ @ / _ \@ | __/@ \___|@ @@ 233 LATIN SMALL LETTER E WITH ACUTE __ @ /_/ @ / _ \@ | __/@ \___|@ @@ 234 LATIN SMALL LETTER E WITH CIRCUMFLEX //\ @ |/_\|@ / _ \@ | __/@ \___|@ @@ 235 LATIN SMALL LETTER E WITH DIAERESIS _ _ @ (_)_(_)@ / _ \ @ | __/ @ \___| @ @@ 236 LATIN SMALL LETTER I WITH GRAVE __ @ \_\@ | |@ | |@ |_|@ @@ 237 LATIN SMALL LETTER I WITH ACUTE __@ /_/@ | |@ | |@ |_|@ @@ 238 LATIN SMALL LETTER I WITH CIRCUMFLEX //\ @ |/_\|@ | | @ | | @ |_| @ @@ 239 LATIN SMALL LETTER I WITH DIAERESIS _ _ @ (_)_(_)@ | | @ | | @ |_| @ @@ 240 LATIN SMALL LETTER ETH /\/\ @ > < @ _\/\ |@ / __` |@ \____/ @ @@ 241 LATIN SMALL LETTER N WITH TILDE /\/| @ |/\/ @ | '_ \ @ | | | |@ |_| |_|@ @@ 242 LATIN SMALL LETTER O WITH GRAVE __ @ \_\ @ / _ \ @ | (_) |@ \___/ @ @@ 243 LATIN SMALL LETTER O WITH ACUTE __ @ /_/ @ / _ \ @ | (_) |@ \___/ @ @@ 244 LATIN SMALL LETTER O WITH CIRCUMFLEX //\ @ |/_\| @ / _ \ @ | (_) |@ \___/ @ @@ 245 LATIN SMALL LETTER O WITH TILDE /\/| @ |/\/ @ / _ \ @ | (_) |@ \___/ @ @@ 246 LATIN SMALL LETTER O WITH DIAERESIS _ _ @ (_)_(_)@ / _ \ @ | (_) |@ \___/ @ @@ 247 DIVISION SIGN @ _ @ _(_)_ @ |_____|@ (_) @ @@ 248 LATIN SMALL LETTER O WITH STROKE @ ____ @ / _//\ @ | (//) |@ \//__/ @ @@ 249 LATIN SMALL LETTER U WITH GRAVE __ @ _\_\_ @ | | | |@ | |_| |@ \__,_|@ @@ 250 LATIN SMALL LETTER U WITH ACUTE __ @ _/_/_ @ | | | |@ | |_| |@ \__,_|@ @@ 251 LATIN SMALL LETTER U WITH CIRCUMFLEX //\ @ |/ \| @ | | | |@ | |_| |@ \__,_|@ @@ 252 LATIN SMALL LETTER U WITH DIAERESIS _ _ @ (_) (_)@ | | | |@ | |_| |@ \__,_|@ @@ 253 LATIN SMALL LETTER Y WITH ACUTE __ @ _/_/_ @ | | | |@ | |_| |@ \__, |@ |___/ @@ 254 LATIN SMALL LETTER THORN _ @ | |__ @ | '_ \ @ | |_) |@ | .__/ @ |_| @@ 255 LATIN SMALL LETTER Y WITH DIAERESIS _ _ @ (_) (_)@ | | | |@ | |_| |@ \__, |@ |___/ @@ 0x0100 LATIN CAPITAL LETTER A WITH MACRON ____ @ /___/ @ /_\ @ / _ \ @ /_/ \_\@ @@ 0x0101 LATIN SMALL LETTER A WITH MACRON ___ @ /_ _/@ / _` |@ | (_| |@ \__,_|@ @@ 0x0102 LATIN CAPITAL LETTER A WITH BREVE _ _ @ \\_// @ /_\ @ / _ \ @ /_/ \_\@ @@ 0x0103 LATIN SMALL LETTER A WITH BREVE \_/ @ ___ @ / _` |@ | (_| |@ \__,_|@ @@ 0x0104 LATIN CAPITAL LETTER A WITH OGONEK @ _ @ /_\ @ / _ \ @ /_/ \_\@ (_(@@ 0x0105 LATIN SMALL LETTER A WITH OGONEK @ __ _ @ / _` |@ | (_| |@ \__,_|@ (_(@@ 0x0106 LATIN CAPITAL LETTER C WITH ACUTE __ @ _/_/ @ / ___|@ | |___ @ \____|@ @@ 0x0107 LATIN SMALL LETTER C WITH ACUTE __ @ /__/@ / __|@ | (__ @ \___|@ @@ 0x0108 LATIN CAPITAL LETTER C WITH CIRCUMFLEX /\ @ _//\\@ / ___|@ | |___ @ \____|@ @@ 0x0109 LATIN SMALL LETTER C WITH CIRCUMFLEX /\ @ /_\ @ / __|@ | (__ @ \___|@ @@ 0x010A LATIN CAPITAL LETTER C WITH DOT ABOVE [] @ ____ @ / ___|@ | |___ @ \____|@ @@ 0x010B LATIN SMALL LETTER C WITH DOT ABOVE [] @ ___ @ / __|@ | (__ @ \___|@ @@ 0x010C LATIN CAPITAL LETTER C WITH CARON \\// @ _\/_ @ / ___|@ | |___ @ \____|@ @@ 0x010D LATIN SMALL LETTER C WITH CARON \\//@ _\/ @ / __|@ | (__ @ \___|@ @@ 0x010E LATIN CAPITAL LETTER D WITH CARON \\// @ __\/ @ | _ \ @ | |_| |@ |____/ @ @@ 0x010F LATIN SMALL LETTER D WITH CARON \/ _ @ __| |@ / _` |@ | (_| |@ \__,_|@ @@ 0x0110 LATIN CAPITAL LETTER D WITH STROKE ____ @ |_ __ \ @ /| |/ | |@ /|_|/_| |@ |_____/ @ @@ 0x0111 LATIN SMALL LETTER D WITH STROKE ---|@ __| |@ / _` |@ | (_| |@ \__,_|@ @@ 0x0112 LATIN CAPITAL LETTER E WITH MACRON ____ @ /___/ @ | ____|@ | _|_ @ |_____|@ @@ 0x0113 LATIN SMALL LETTER E WITH MACRON ____@ /_ _/@ / _ \ @ | __/ @ \___| @ @@ 0x0114 LATIN CAPITAL LETTER E WITH BREVE _ _ @ \\_// @ | ____|@ | _|_ @ |_____|@ @@ 0x0115 LATIN SMALL LETTER E WITH BREVE \\ //@ -- @ / _ \ @ | __/ @ \___| @ @@ 0x0116 LATIN CAPITAL LETTER E WITH DOT ABOVE [] @ _____ @ | ____|@ | _|_ @ |_____|@ @@ 0x0117 LATIN SMALL LETTER E WITH DOT ABOVE [] @ __ @ / _ \@ | __/@ \___|@ @@ 0x0118 LATIN CAPITAL LETTER E WITH OGONEK @ _____ @ | ____|@ | _|_ @ |_____|@ (__(@@ 0x0119 LATIN SMALL LETTER E WITH OGONEK @ ___ @ / _ \@ | __/@ \___|@ (_(@@ 0x011A LATIN CAPITAL LETTER E WITH CARON \\// @ __\/_ @ | ____|@ | _|_ @ |_____|@ @@ 0x011B LATIN SMALL LETTER E WITH CARON \\//@ \/ @ / _ \@ | __/@ \___|@ @@ 0x011C LATIN CAPITAL LETTER G WITH CIRCUMFLEX _/\_ @ / ___|@ | | _ @ | |_| |@ \____|@ @@ 0x011D LATIN SMALL LETTER G WITH CIRCUMFLEX /\ @ _/_ \@ / _` |@ | (_| |@ \__, |@ |___/ @@ 0x011E LATIN CAPITAL LETTER G WITH BREVE _\/_ @ / ___|@ | | _ @ | |_| |@ \____|@ @@ 0x011F LATIN SMALL LETTER G WITH BREVE \___/ @ __ _ @ / _` |@ | (_| |@ \__, |@ |___/ @@ 0x0120 LATIN CAPITAL LETTER G WITH DOT ABOVE _[]_ @ / ___|@ | | _ @ | |_| |@ \____|@ @@ 0x0121 LATIN SMALL LETTER G WITH DOT ABOVE [] @ __ _ @ / _` |@ | (_| |@ \__, |@ |___/ @@ 0x0122 LATIN CAPITAL LETTER G WITH CEDILLA ____ @ / ___|@ | | _ @ | |_| |@ \____|@ )__) @@ 0x0123 LATIN SMALL LETTER G WITH CEDILLA @ __ _ @ / _` |@ | (_| |@ \__, |@ |_))))@@ 0x0124 LATIN CAPITAL LETTER H WITH CIRCUMFLEX _/ \_ @ | / \ |@ | |_| |@ | _ |@ |_| |_|@ @@ 0x0125 LATIN SMALL LETTER H WITH CIRCUMFLEX _ /\ @ | |//\ @ | '_ \ @ | | | |@ |_| |_|@ @@ 0x0126 LATIN CAPITAL LETTER H WITH STROKE _ _ @ | |=| |@ | |_| |@ | _ |@ |_| |_|@ @@ 0x0127 LATIN SMALL LETTER H WITH STROKE _ @ |=|__ @ | '_ \ @ | | | |@ |_| |_|@ @@ 0x0128 LATIN CAPITAL LETTER I WITH TILDE /\//@ |_ _|@ | | @ | | @ |___|@ @@ 0x0129 LATIN SMALL LETTER I WITH TILDE @ /\/@ | |@ | |@ |_|@ @@ 0x012A LATIN CAPITAL LETTER I WITH MACRON /___/@ |_ _|@ | | @ | | @ |___|@ @@ 0x012B LATIN SMALL LETTER I WITH MACRON ____@ /___/@ | | @ | | @ |_| @ @@ 0x012C LATIN CAPITAL LETTER I WITH BREVE \__/@ |_ _|@ | | @ | | @ |___|@ @@ 0x012D LATIN SMALL LETTER I WITH BREVE @ \_/@ | |@ | |@ |_|@ @@ 0x012E LATIN CAPITAL LETTER I WITH OGONEK ___ @ |_ _|@ | | @ | | @ |___|@ (__(@@ 0x012F LATIN SMALL LETTER I WITH OGONEK _ @ (_) @ | | @ | | @ |_|_@ (_(@@ 0x0130 LATIN CAPITAL LETTER I WITH DOT ABOVE _[] @ |_ _|@ | | @ | | @ |___|@ @@ 0x0131 LATIN SMALL LETTER DOTLESS I @ _ @ | |@ | |@ |_|@ @@ 0x0132 LATIN CAPITAL LIGATURE IJ ___ _ @ |_ _|| |@ | | | |@ | |_| |@ |__|__/ @ @@ 0x0133 LATIN SMALL LIGATURE IJ _ _ @ (_) (_)@ | | | |@ | | | |@ |_|_/ |@ |__/ @@ 0x0134 LATIN CAPITAL LETTER J WITH CIRCUMFLEX /\ @ /_\|@ _ | | @ | |_| | @ \___/ @ @@ 0x0135 LATIN SMALL LETTER J WITH CIRCUMFLEX /\@ /_\@ | |@ | |@ _/ |@ |__/ @@ 0x0136 LATIN CAPITAL LETTER K WITH CEDILLA _ _ @ | |/ / @ | ' / @ | . \ @ |_|\_\ @ )__)@@ 0x0137 LATIN SMALL LETTER K WITH CEDILLA _ @ | | __@ | |/ /@ | < @ |_|\_\@ )_)@@ 0x0138 LATIN SMALL LETTER KRA @ _ __ @ | |/ \@ | < @ |_|\_\@ @@ 0x0139 LATIN CAPITAL LETTER L WITH ACUTE _ //@ | | // @ | | @ | |___ @ |_____|@ @@ 0x013A LATIN SMALL LETTER L WITH ACUTE //@ | |@ | |@ | |@ |_|@ @@ 0x013B LATIN CAPITAL LETTER L WITH CEDILLA _ @ | | @ | | @ | |___ @ |_____|@ )__)@@ 0x013C LATIN SMALL LETTER L WITH CEDILLA _ @ | | @ | | @ | | @ |_| @ )_)@@ 0x013D LATIN CAPITAL LETTER L WITH CARON _ \\//@ | | \/ @ | | @ | |___ @ |_____|@ @@ 0x013E LATIN SMALL LETTER L WITH CARON _ \\//@ | | \/ @ | | @ | | @ |_| @ @@ 0x013F LATIN CAPITAL LETTER L WITH MIDDLE DOT _ @ | | @ | | [] @ | |___ @ |_____|@ @@ 0x0140 LATIN SMALL LETTER L WITH MIDDLE DOT _ @ | | @ | | []@ | | @ |_| @ @@ 0x0141 LATIN CAPITAL LETTER L WITH STROKE __ @ | // @ |//| @ // |__ @ |_____|@ @@ 0x0142 LATIN SMALL LETTER L WITH STROKE _ @ | |@ |//@ //|@ |_|@ @@ 0x0143 LATIN CAPITAL LETTER N WITH ACUTE _/ /_ @ | \ | |@ | \| |@ | |\ |@ |_| \_|@ @@ 0x0144 LATIN SMALL LETTER N WITH ACUTE _ @ _ /_/ @ | '_ \ @ | | | |@ |_| |_|@ @@ 0x0145 LATIN CAPITAL LETTER N WITH CEDILLA _ _ @ | \ | |@ | \| |@ | |\ |@ |_| \_|@ )_) @@ 0x0146 LATIN SMALL LETTER N WITH CEDILLA @ _ __ @ | '_ \ @ | | | |@ |_| |_|@ )_) @@ 0x0147 LATIN CAPITAL LETTER N WITH CARON _\/ _ @ | \ | |@ | \| |@ | |\ |@ |_| \_|@ @@ 0x0148 LATIN SMALL LETTER N WITH CARON \\// @ _\/_ @ | '_ \ @ | | | |@ |_| |_|@ @@ 0x0149 LATIN SMALL LETTER N PRECEDED BY APOSTROPHE @ _ __ @ ( )| '_\ @ |/| | | |@ |_| |_|@ @@ 0x014A LATIN CAPITAL LETTER ENG _ _ @ | \ | |@ | \| |@ | |\ |@ |_| \ |@ )_)@@ 0x014B LATIN SMALL LETTER ENG _ __ @ | '_ \ @ | | | |@ |_| | |@ | |@ |__ @@ 0x014C LATIN CAPITAL LETTER O WITH MACRON ____ @ /_ _/ @ / _ \ @ | (_) |@ \___/ @ @@ 0x014D LATIN SMALL LETTER O WITH MACRON ____ @ /_ _/ @ / _ \ @ | (_) |@ \___/ @ @@ 0x014E LATIN CAPITAL LETTER O WITH BREVE \ / @ _-_ @ / _ \ @ | |_| |@ \___/ @ @@ 0x014F LATIN SMALL LETTER O WITH BREVE \ / @ _-_ @ / _ \ @ | |_| |@ \___/ @ @@ 0x0150 LATIN CAPITAL LETTER O WITH DOUBLE ACUTE ___ @ /_/_/@ / _ \ @ | |_| |@ \___/ @ @@ 0x0151 LATIN SMALL LETTER O WITH DOUBLE ACUTE ___ @ /_/_/@ / _ \ @ | |_| |@ \___/ @ @@ 0x0152 LATIN CAPITAL LIGATURE OE ___ ___ @ / _ \| __|@ | | | | | @ | |_| | |__@ \___/|____@ @@ 0x0153 LATIN SMALL LIGATURE OE @ ___ ___ @ / _ \ / _ \@ | (_) | __/@ \___/ \___|@ @@ 0x0154 LATIN CAPITAL LETTER R WITH ACUTE _/_/ @ | _ \ @ | |_) |@ | _ < @ |_| \_\@ @@ 0x0155 LATIN SMALL LETTER R WITH ACUTE __@ _ /_/@ | '__|@ | | @ |_| @ @@ 0x0156 LATIN CAPITAL LETTER R WITH CEDILLA ____ @ | _ \ @ | |_) |@ | _ < @ |_| \_\@ )_) @@ 0x0157 LATIN SMALL LETTER R WITH CEDILLA @ _ __ @ | '__|@ | | @ |_| @ )_) @@ 0x0158 LATIN CAPITAL LETTER R WITH CARON _\_/ @ | _ \ @ | |_) |@ | _ < @ |_| \_\@ @@ 0x0159 LATIN SMALL LETTER R WITH CARON \\// @ _\/_ @ | '__|@ | | @ |_| @ @@ 0x015A LATIN CAPITAL LETTER S WITH ACUTE _/_/ @ / ___| @ \___ \ @ ___) |@ |____/ @ @@ 0x015B LATIN SMALL LETTER S WITH ACUTE __@ _/_/@ / __|@ \__ \@ |___/@ @@ 0x015C LATIN CAPITAL LETTER S WITH CIRCUMFLEX _/\_ @ / ___| @ \___ \ @ ___) |@ |____/ @ @@ 0x015D LATIN SMALL LETTER S WITH CIRCUMFLEX @ /_\_@ / __|@ \__ \@ |___/@ @@ 0x015E LATIN CAPITAL LETTER S WITH CEDILLA ____ @ / ___| @ \___ \ @ ___) |@ |____/ @ )__)@@ 0x015F LATIN SMALL LETTER S WITH CEDILLA @ ___ @ / __|@ \__ \@ |___/@ )_)@@ 0x0160 LATIN CAPITAL LETTER S WITH CARON _\_/ @ / ___| @ \___ \ @ ___) |@ |____/ @ @@ 0x0161 LATIN SMALL LETTER S WITH CARON \\//@ _\/ @ / __|@ \__ \@ |___/@ @@ 0x0162 LATIN CAPITAL LETTER T WITH CEDILLA _____ @ |_ _|@ | | @ | | @ |_| @ )__)@@ 0x0163 LATIN SMALL LETTER T WITH CEDILLA _ @ | |_ @ | __|@ | |_ @ \__|@ )_)@@ 0x0164 LATIN CAPITAL LETTER T WITH CARON _____ @ |_ _|@ | | @ | | @ |_| @ @@ 0x0165 LATIN SMALL LETTER T WITH CARON \/ @ | |_ @ | __|@ | |_ @ \__|@ @@ 0x0166 LATIN CAPITAL LETTER T WITH STROKE _____ @ |_ _|@ | | @ -|-|- @ |_| @ @@ 0x0167 LATIN SMALL LETTER T WITH STROKE _ @ | |_ @ | __|@ |-|_ @ \__|@ @@ 0x0168 LATIN CAPITAL LETTER U WITH TILDE @ _/\/_ @ | | | |@ | |_| |@ \___/ @ @@ 0x0169 LATIN SMALL LETTER U WITH TILDE @ _/\/_ @ | | | |@ | |_| |@ \__,_|@ @@ 0x016A LATIN CAPITAL LETTER U WITH MACRON ____ @ /__ _/@ | | | |@ | |_| |@ \___/ @ @@ 0x016B LATIN SMALL LETTER U WITH MACRON ____ @ / _ /@ | | | |@ | |_| |@ \__,_|@ @@ 0x016C LATIN CAPITAL LETTER U WITH BREVE @ \_/_ @ | | | |@ | |_| |@ \____|@ @@ 0x016D LATIN SMALL LETTER U WITH BREVE @ \_/_ @ | | | |@ | |_| |@ \__,_|@ @@ 0x016E LATIN CAPITAL LETTER U WITH RING ABOVE O @ __ _ @ | | | |@ | |_| |@ \___/ @ @@ 0x016F LATIN SMALL LETTER U WITH RING ABOVE O @ __ __ @ | | | |@ | |_| |@ \__,_|@ @@ 0x0170 LATIN CAPITAL LETTER U WITH DOUBLE ACUTE -- --@ /_//_/@ | | | |@ | |_| |@ \___/ @ @@ 0x0171 LATIN SMALL LETTER U WITH DOUBLE ACUTE ____@ _/_/_/@ | | | |@ | |_| |@ \__,_|@ @@ 0x0172 LATIN CAPITAL LETTER U WITH OGONEK _ _ @ | | | |@ | | | |@ | |_| |@ \___/ @ (__(@@ 0x0173 LATIN SMALL LETTER U WITH OGONEK @ _ _ @ | | | |@ | |_| |@ \__,_|@ (_(@@ 0x0174 LATIN CAPITAL LETTER W WITH CIRCUMFLEX __ /\ __@ \ \ //\\/ /@ \ \ /\ / / @ \ V V / @ \_/\_/ @ @@ 0x0175 LATIN SMALL LETTER W WITH CIRCUMFLEX /\ @ __ //\\__@ \ \ /\ / /@ \ V V / @ \_/\_/ @ @@ 0x0176 LATIN CAPITAL LETTER Y WITH CIRCUMFLEX /\ @ __//\\ @ \ \ / /@ \ V / @ |_| @ @@ 0x0177 LATIN SMALL LETTER Y WITH CIRCUMFLEX /\ @ //\\ @ | | | |@ | |_| |@ \__, |@ |___/ @@ 0x0178 LATIN CAPITAL LETTER Y WITH DIAERESIS [] []@ __ _@ \ \ / /@ \ V / @ |_| @ @@ 0x0179 LATIN CAPITAL LETTER Z WITH ACUTE __/_/@ |__ /@ / / @ / /_ @ /____|@ @@ 0x017A LATIN SMALL LETTER Z WITH ACUTE _ @ _/_/@ |_ /@ / / @ /___|@ @@ 0x017B LATIN CAPITAL LETTER Z WITH DOT ABOVE __[]_@ |__ /@ / / @ / /_ @ /____|@ @@ 0x017C LATIN SMALL LETTER Z WITH DOT ABOVE [] @ ____@ |_ /@ / / @ /___|@ @@ 0x017D LATIN CAPITAL LETTER Z WITH CARON _\_/_@ |__ /@ / / @ / /_ @ /____|@ @@ 0x017E LATIN SMALL LETTER Z WITH CARON \\//@ _\/_@ |_ /@ / / @ /___|@ @@ 0x017F LATIN SMALL LETTER LONG S __ @ / _|@ |-| | @ |-| | @ |_| @ @@ 0x02C7 CARON \\//@ \/ @ $@ $@ $@ $@@ 0x02D8 BREVE \\_//@ \_/ @ $@ $@ $@ $@@ 0x02D9 DOT ABOVE []@ $@ $@ $@ $@ $@@ 0x02DB OGONEK $@ $@ $@ $@ $@ )_) @@ 0x02DD DOUBLE ACUTE ACCENT _ _ @ /_/_/@ $@ $@ $@ $@@ ================================================ FILE: src/Spectre.Console/Widgets/Grid.cs ================================================ namespace Spectre.Console; /// /// A renderable grid. /// public sealed class Grid : JustInTimeRenderable, IExpandable { private readonly ListWithCallback _columns; private readonly ListWithCallback _rows; private bool _expand; private bool _padRightCell; /// /// Gets the grid columns. /// public IReadOnlyList Columns => _columns; /// /// Gets the grid rows. /// public IReadOnlyList Rows => _rows; /// public bool Expand { get => _expand; set => MarkAsDirty(() => _expand = value); } /// /// Gets or sets the width of the grid. /// public int? Width { get; set; } /// /// Initializes a new instance of the class. /// public Grid() { _expand = false; _columns = new ListWithCallback(MarkAsDirty); _rows = new ListWithCallback(MarkAsDirty); } /// /// Adds a column to the grid. /// /// The same instance so that multiple calls can be chained. public Grid AddColumn() { AddColumn(new GridColumn()); return this; } /// /// Adds a column to the grid. /// /// The column to add. /// The same instance so that multiple calls can be chained. public Grid AddColumn(GridColumn column) { ArgumentNullException.ThrowIfNull(column); if (_rows.Count > 0) { throw new InvalidOperationException("Cannot add new columns to grid with existing rows."); } // Only pad the most right cell if we've explicitly set a padding. _padRightCell = column.HasExplicitPadding; _columns.Add(column); return this; } /// /// Adds a new row to the grid. /// /// The columns to add. /// The same instance so that multiple calls can be chained. public Grid AddRow(params IRenderable[] columns) { ArgumentNullException.ThrowIfNull(columns); if (columns.Length > _columns.Count) { throw new InvalidOperationException("The number of row columns are greater than the number of grid columns."); } _rows.Add(new GridRow(columns)); return this; } /// protected override bool HasDirtyChildren() { return _columns.Any(c => ((IHasDirtyState)c).IsDirty); } /// protected override IRenderable Build() { var table = new Table { Border = TableBorder.None, ShowHeaders = false, IsGrid = true, PadRightCell = _padRightCell, Width = Width, }; foreach (var column in _columns) { table.AddColumn(new TableColumn(string.Empty) { Width = column.Width, NoWrap = column.NoWrap, Padding = column.Padding ?? new Padding(0, 0, 2, 0), Alignment = column.Alignment, }); } foreach (var row in _rows) { table.AddRow(row); } return table; } } /// /// Contains extension methods for . /// public static class GridExtensions { /// /// Adds a column to the grid. /// /// The grid to add the column to. /// The number of columns to add. /// The same instance so that multiple calls can be chained. public static Grid AddColumns(this Grid grid, int count) { ArgumentNullException.ThrowIfNull(grid); for (var index = 0; index < count; index++) { grid.AddColumn(new GridColumn()); } return grid; } /// /// Adds a column to the grid. /// /// The grid to add the column to. /// The columns to add. /// The same instance so that multiple calls can be chained. public static Grid AddColumns(this Grid grid, params GridColumn[] columns) { ArgumentNullException.ThrowIfNull(grid); ArgumentNullException.ThrowIfNull(columns); foreach (var column in columns) { grid.AddColumn(column); } return grid; } /// /// Adds an empty row to the grid. /// /// The grid to add the row to. /// The same instance so that multiple calls can be chained. public static Grid AddEmptyRow(this Grid grid) { ArgumentNullException.ThrowIfNull(grid); var columns = new IRenderable[grid.Columns.Count]; Enumerable.Range(0, grid.Columns.Count).ForEach(index => columns[index] = Text.Empty); grid.AddRow(columns); return grid; } /// /// Adds a new row to the grid. /// /// The grid to add the row to. /// The columns to add. /// The same instance so that multiple calls can be chained. public static Grid AddRow(this Grid grid, params string[] columns) { ArgumentNullException.ThrowIfNull(grid); ArgumentNullException.ThrowIfNull(columns); grid.AddRow(columns.Select(column => new Markup(column)).ToArray()); return grid; } /// /// Sets the grid width. /// /// The grid. /// The width. /// The same instance so that multiple calls can be chained. public static Grid Width(this Grid grid, int? width) { ArgumentNullException.ThrowIfNull(grid); grid.Width = width; return grid; } } ================================================ FILE: src/Spectre.Console/Widgets/GridColumn.cs ================================================ namespace Spectre.Console; /// /// Represents a grid column. /// public sealed class GridColumn : IColumn, IHasDirtyState { private bool _isDirty; private int? _width; private bool _noWrap; private Padding? _padding; private Justify? _alignment; /// bool IHasDirtyState.IsDirty => _isDirty; /// /// Gets or sets the width of the column. /// If null, the column will adapt to its contents. /// public int? Width { get => _width; set => MarkAsDirty(() => _width = value); } /// /// Gets or sets a value indicating whether wrapping of /// text within the column should be prevented. /// public bool NoWrap { get => _noWrap; set => MarkAsDirty(() => _noWrap = value); } /// /// Gets or sets the padding of the column. /// Vertical padding (top and bottom) is ignored. /// public Padding? Padding { get => _padding; set => MarkAsDirty(() => _padding = value); } /// /// Gets or sets the alignment of the column. /// public Justify? Alignment { get => _alignment; set => MarkAsDirty(() => _alignment = value); } /// /// Gets a value indicating whether the user /// has set an explicit padding for this column. /// internal bool HasExplicitPadding => Padding != null; private void MarkAsDirty(Action action) { action(); _isDirty = true; } } ================================================ FILE: src/Spectre.Console/Widgets/GridRow.cs ================================================ namespace Spectre.Console; /// /// Represents a grid row. /// public sealed class GridRow : IEnumerable { private readonly List _items; /// /// Gets a row item at the specified grid column index. /// /// The grid column index. /// The row item at the specified grid column index. public IRenderable this[int index] { get => _items[index]; } /// /// Initializes a new instance of the class. /// /// The row items. public GridRow(IEnumerable items) { _items = new List(items ?? []); } internal void Add(IRenderable item) { ArgumentNullException.ThrowIfNull(item); _items.Add(item); } /// public IEnumerator GetEnumerator() { return _items.GetEnumerator(); } /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } ================================================ FILE: src/Spectre.Console/Widgets/Layout/Layout.cs ================================================ namespace Spectre.Console; /// /// Represents a renderable to divide a fixed height into rows or columns. /// public sealed class Layout : Renderable, IRatioResolvable, IHasVisibility { private LayoutSplitter _splitter; private Layout[] _children; private IRenderable _renderable; private int _ratio; private int _minimumSize; private int? _size; /// /// Gets or sets the name. /// public string? Name { get; set; } /// /// Gets or sets the ratio. /// /// /// Defaults to 1. /// Must be greater than 0. /// public int Ratio { get => _ratio; set { if (value < 1) { throw new InvalidOperationException("Ratio must be equal to or greater than 1"); } _ratio = value; } } /// /// Gets or sets the minimum width. /// /// /// Defaults to 1. /// Must be greater than 0. /// public int MinimumSize { get => _minimumSize; set { if (value < 1) { throw new InvalidOperationException("Minimum size must be equal to or greater than 1"); } _minimumSize = value; } } /// /// Gets or sets the width. /// /// /// Defaults to null. /// Must be greater than 0. /// public int? Size { get => _size; set { if (value < 1) { throw new InvalidOperationException("Size must be equal to or greater than 1"); } _size = value; } } /// /// Gets or sets a value indicating whether or not the layout should /// be visible or not. /// /// Defaults to true. public bool IsVisible { get; set; } = true; /// /// Gets the splitter used for this layout. /// internal LayoutSplitter Splitter => _splitter; /// /// Gets the associated with this layout. /// internal IRenderable Renderable => _renderable; /// /// Gets a child layout by it's name. /// /// The layout name. /// The specified child . public Layout this[string name] { get => GetLayout(name); } /// /// Initializes a new instance of the class. /// /// The layout name. public Layout(string name) : this(name, null) { } /// /// Initializes a new instance of the class. /// /// The renderable. public Layout(IRenderable renderable) : this(null, renderable) { } /// /// Initializes a new instance of the class. /// /// The layout name. /// The renderable. public Layout(string? name = null, IRenderable? renderable = null) { _splitter = LayoutSplitter.Null; _children = []; _renderable = renderable ?? new LayoutPlaceholder(this); _ratio = 1; _size = null; Name = name; } /// /// Gets a child layout by it's name. /// /// The layout name. /// The specified child . public Layout GetLayout(string name) { if (string.IsNullOrEmpty(name)) { throw new ArgumentException($"'{nameof(name)}' cannot be null or empty.", nameof(name)); } var stack = new Stack(); stack.Push(this); while (stack.Count > 0) { var current = stack.Pop(); if (name.Equals(current.Name, StringComparison.OrdinalIgnoreCase)) { return current; } foreach (var layout in current.GetChildren()) { stack.Push(layout); } } throw new InvalidOperationException($"Could not find layout '{name}'"); } /// /// Splits the layout into rows. /// /// The layout to split into rows. /// The same instance so that multiple calls can be chained. public Layout SplitRows(params Layout[] children) { Split(LayoutSplitter.Row, children); return this; } /// /// Splits the layout into columns. /// /// The layout to split into columns. /// The same instance so that multiple calls can be chained. public Layout SplitColumns(params Layout[] children) { Split(LayoutSplitter.Column, children); return this; } /// /// Updates the containing . /// /// The renderable to use for this layout. /// /// The same instance so that multiple calls can be chained. public Layout Update(IRenderable renderable) { _renderable = renderable ?? new LayoutPlaceholder(this); return this; } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var height = options.Height ?? options.ConsoleSize.Height; var map = MakeRenderMap(options, maxWidth); var layoutLines = new List(); layoutLines.AddRange(Enumerable.Range(0, height).Select(x => new SegmentLine())); foreach (var (region, lines) in map.Values.Select(x => (x.Region, x.Render))) { foreach (var line in layoutLines .Skip(region.Y) .Take(region.Y + region.Height) .Enumerate().Select(x => (Index: x.Index + region.Y, Line: x.Item)) .Zip(lines, (first, second) => (first.Index, Line: second))) { layoutLines[line.Index].AddRange(line.Line); } } // Return all the segments in all the lines foreach (var (_, _, last, line) in layoutLines.Enumerate()) { foreach (var segment in line) { yield return segment; } if (!last) { yield return Segment.LineBreak; } } } private IEnumerable GetChildren(bool visibleOnly = false) { return visibleOnly ? _children.Where(c => c.IsVisible) : _children; } private bool HasChildren(bool visibleOnly = false) { return visibleOnly ? _children.Any(c => c.IsVisible) : _children.Any(); } private void Split(LayoutSplitter splitter, Layout[] layouts) { if (_children.Length > 0) { throw new InvalidOperationException("Cannot split the same layout twice"); } _splitter = splitter ?? throw new ArgumentNullException(nameof(splitter)); _children = layouts ?? throw new ArgumentNullException(nameof(layouts)); } private Dictionary MakeRenderMap(RenderOptions options, int maxWidth) { var result = new Dictionary(); var renderWidth = maxWidth; var renderHeight = options.Height ?? options.ConsoleSize.Height; var regionMap = MakeRegionMap(maxWidth, renderHeight); foreach (var (layout, region) in regionMap.Where(x => !x.Layout.HasChildren(visibleOnly: true))) { var segments = layout.Renderable.Render(options with { Height = region.Height }, region.Width); var lines = Segment.SplitLines(segments, region.Width, region.Height); lines = Segment.MakeWidth(region.Width, lines); result[layout] = new LayoutRender(region, lines); } return result; } private IEnumerable<(Layout Layout, Region Region)> MakeRegionMap(int width, int height) { var stack = new Stack<(Layout Layout, Region Region)>(); stack.Push((this, new Region(0, 0, width, height))); var result = new List<(Layout Layout, Region Region)>(); while (stack.Count > 0) { var current = stack.Pop(); result.Add(current); if (current.Layout.HasChildren(visibleOnly: true)) { foreach (var childAndRegion in current.Layout.Splitter .Divide(current.Region, current.Layout.GetChildren(visibleOnly: true))) { stack.Push(childAndRegion); } } } return result.ReverseEnumerable(); } } /// /// Contains extension methods for . /// public static class LayoutExtensions { /// /// Sets the ratio of the layout. /// /// The layout. /// The ratio. /// The same instance so that multiple calls can be chained. public static Layout Ratio(this Layout layout, int ratio) { ArgumentNullException.ThrowIfNull(layout); layout.Ratio = ratio; return layout; } /// /// Sets the size of the layout. /// /// The layout. /// The size. /// The same instance so that multiple calls can be chained. public static Layout Size(this Layout layout, int size) { ArgumentNullException.ThrowIfNull(layout); layout.Size = size; return layout; } /// /// Sets the minimum width of the layout. /// /// The layout. /// The size. /// The same instance so that multiple calls can be chained. public static Layout MinimumSize(this Layout layout, int size) { ArgumentNullException.ThrowIfNull(layout); layout.MinimumSize = size; return layout; } } ================================================ FILE: src/Spectre.Console/Widgets/Layout/LayoutPlaceholder.cs ================================================ namespace Spectre.Console; internal sealed class LayoutPlaceholder : Renderable { public Layout Layout { get; } public LayoutPlaceholder(Layout layout) { Layout = layout ?? throw new ArgumentNullException(nameof(layout)); } protected override IEnumerable Render(RenderOptions options, int maxWidth) { var width = maxWidth; var height = options.Height ?? options.ConsoleSize.Height; var title = Layout.Name != null ? $"{Layout.Name} ({width} x {height})" : $"{width} x {height}"; var panel = new Panel( Align.Center(new Text("Placeholder"), VerticalAlignment.Middle)) { Width = maxWidth, Height = options.Height ?? options.ConsoleSize.Height, Header = new PanelHeader(title), Border = BoxBorder.Rounded, }; return ((IRenderable)panel).Render(options, maxWidth); } } ================================================ FILE: src/Spectre.Console/Widgets/Layout/LayoutRender.cs ================================================ namespace Spectre.Console; [DebuggerDisplay("{Region,nq}")] internal sealed class LayoutRender { public Region Region { get; } public List Render { get; } public LayoutRender(Region region, List render) { Region = region; Render = render ?? throw new ArgumentNullException(nameof(render)); } } ================================================ FILE: src/Spectre.Console/Widgets/Layout/LayoutSplitter.cs ================================================ namespace Spectre.Console; internal abstract class LayoutSplitter { public static LayoutSplitter Column { get; } = new ColumnSplitter(); public static LayoutSplitter Row { get; } = new RowSplitter(); public static LayoutSplitter Null { get; } = new NullSplitter(); public abstract IEnumerable<(Layout Child, Region Region)> Divide(Region region, IEnumerable layouts); private sealed class NullSplitter : LayoutSplitter { public override IEnumerable<(Layout Child, Region Region)> Divide(Region region, IEnumerable layouts) { yield break; } } private sealed class ColumnSplitter : LayoutSplitter { public override IEnumerable<(Layout Child, Region Region)> Divide(Region region, IEnumerable children) { var widths = Ratio.Resolve(region.Width, children); var offset = 0; foreach (var (child, childWidth) in children.Zip(widths, (child, width) => (child, width))) { yield return (child, new Region(region.X + offset, region.Y, childWidth, region.Height)); offset += childWidth; } } } private sealed class RowSplitter : LayoutSplitter { public override IEnumerable<(Layout Child, Region Region)> Divide(Region region, IEnumerable children) { var heights = Ratio.Resolve(region.Height, children); var offset = 0; foreach (var (child, childHeight) in children.Zip(heights, (child, height) => (child, height))) { yield return (child, new Region(region.X, region.Y + offset, region.Width, childHeight)); offset += childHeight; } } } } ================================================ FILE: src/Spectre.Console/Widgets/Markup.cs ================================================ namespace Spectre.Console; /// /// A renderable piece of markup text. /// [SuppressMessage("Naming", "CA1724:Type names should not match namespaces")] public sealed class Markup : Renderable, IHasJustification, IOverflowable { private readonly Paragraph _paragraph; /// public Justify? Justification { get => _paragraph.Justification; set => _paragraph.Justification = value; } /// public Overflow? Overflow { get => _paragraph.Overflow; set => _paragraph.Overflow = value; } /// /// Gets the character count. /// public int Length => _paragraph.Length; /// /// Gets the number of lines. /// public int Lines => _paragraph.Lines; /// /// Initializes a new instance of the class. /// /// The markup text. /// The style of the text. public Markup(string text, Style? style = null) { _paragraph = new Paragraph(); foreach (var segment in AnsiMarkup.Parse(text, style)) { _paragraph.Append(Emoji.Replace(segment.Text), segment.Style, segment.Link); } } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { return ((IRenderable)_paragraph).Measure(options, maxWidth); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { return ((IRenderable)_paragraph).Render(options, maxWidth); } /// /// Returns a new instance of a Markup widget from an interpolated string. /// /// The interpolated string value to write. /// The style of the text. /// A new markup instance. public static Markup FromInterpolated(FormattableString value, Style? style = null) { return FromInterpolated(CultureInfo.CurrentCulture, value, style); } /// /// Returns a new instance of a Markup widget from an interpolated string. /// /// The format provider to use. /// The interpolated string value to write. /// The style of the text. /// A new markup instance. public static Markup FromInterpolated(IFormatProvider provider, FormattableString value, Style? style = null) { return new Markup(EscapeInterpolated(provider, value), style); } /// /// Escapes text so that it won’t be interpreted as markup. /// /// The text to escape. /// A string that is safe to use in markup. public static string Escape(string text) { ArgumentNullException.ThrowIfNull(text); return text.EscapeMarkup(); } /// /// Removes markup from the specified string. /// /// The text to remove markup from. /// A string that does not have any markup. public static string Remove(string text) { ArgumentNullException.ThrowIfNull(text); return text.RemoveMarkup(); } internal static string EscapeInterpolated(IFormatProvider provider, FormattableString value) { object?[] args = value.GetArguments().Select(arg => arg is string s ? s.EscapeMarkup() : arg).ToArray(); return string.Format(provider, value.Format, args); } } ================================================ FILE: src/Spectre.Console/Widgets/Padder.cs ================================================ namespace Spectre.Console; /// /// Represents padding around a object. /// public sealed class Padder : Renderable, IPaddable, IExpandable { private readonly IRenderable _child; /// public Padding? Padding { get; set; } = new Padding(1, 1, 1, 1); /// /// Gets or sets a value indicating whether or not the padding should /// fit the available space. If false, the padding width will be /// auto calculated. Defaults to false. /// public bool Expand { get; set; } /// /// Initializes a new instance of the class. /// /// The thing to pad. /// The padding. Defaults to 1,1,1,1 if null. public Padder(IRenderable child, Padding? padding = null) { _child = child; Padding = padding ?? Padding; } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { var paddingWidth = Padding?.GetWidth() ?? 0; var measurement = _child.Measure(options, maxWidth - paddingWidth); return new Measurement( measurement.Min + paddingWidth, measurement.Max + paddingWidth); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var paddingWidth = Padding?.GetWidth() ?? 0; var childWidth = maxWidth - paddingWidth; if (!Expand) { var measurement = _child.Measure(options, maxWidth - paddingWidth); childWidth = measurement.Max; } var width = childWidth + paddingWidth; var result = new List(); if (width > maxWidth) { width = maxWidth; } // Top padding for (var i = 0; i < Padding.GetTopSafe(); i++) { result.Add(Segment.Padding(width)); result.Add(Segment.LineBreak); } var child = _child.Render(options, maxWidth - paddingWidth); foreach (var line in Segment.SplitLines(child)) { // Left padding if (Padding.GetLeftSafe() != 0) { result.Add(Segment.Padding(Padding.GetLeftSafe())); } result.AddRange(line); // Right padding if (Padding.GetRightSafe() != 0) { result.Add(Segment.Padding(Padding.GetRightSafe())); } // Missing space on right side? var lineWidth = line.CellCount(); var diff = width - lineWidth - Padding.GetLeftSafe() - Padding.GetRightSafe(); if (diff > 0) { result.Add(Segment.Padding(diff)); } result.Add(Segment.LineBreak); } // Bottom padding for (var i = 0; i < Padding.GetBottomSafe(); i++) { result.Add(Segment.Padding(width)); result.Add(Segment.LineBreak); } return result; } } ================================================ FILE: src/Spectre.Console/Widgets/Panel.cs ================================================ namespace Spectre.Console; /// /// A renderable panel. /// public sealed class Panel : Renderable, IHasBoxBorder, IHasBorder, IExpandable, IPaddable { private const int EdgeWidth = 2; private readonly IRenderable _child; /// public BoxBorder Border { get; set; } = BoxBorder.Square; /// public bool UseSafeBorder { get; set; } = true; /// public Style? BorderStyle { get; set; } /// /// Gets or sets a value indicating whether or not the panel should /// fit the available space. If false, the panel width will be /// auto calculated. Defaults to false. /// public bool Expand { get; set; } /// /// Gets or sets the padding. /// public Padding? Padding { get; set; } = new Padding(1, 0, 1, 0); /// /// Gets or sets the header. /// public PanelHeader? Header { get; set; } /// /// Gets or sets the width of the panel. /// public int? Width { get; set; } /// /// Gets or sets the height of the panel. /// public int? Height { get; set; } /// /// Gets or sets a value indicating whether or not the panel is inlined. /// internal bool Inline { get; set; } /// /// Initializes a new instance of the class. /// /// The panel content. public Panel(string text) : this(new Markup(text)) { } /// /// Initializes a new instance of the class. /// /// The panel content. public Panel(IRenderable content) { _child = content ?? throw new ArgumentNullException(nameof(content)); } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { var child = new Padder(_child, Padding); return Measure(options, maxWidth, child); } private Measurement Measure(RenderOptions options, int maxWidth, IRenderable child) { var edgeWidth = (options.GetSafeBorder(this) is not NoBoxBorder) ? EdgeWidth : 0; var childWidth = child.Measure(options, maxWidth - edgeWidth); if (Width != null) { var width = Width.Value - edgeWidth; // If Width is specified, constrain or expand the measurement // to exactly the specified width (clamped by maxWidth) var constrainedWidth = Math.Min(width, maxWidth - edgeWidth); childWidth = new Measurement( Math.Min(childWidth.Min, constrainedWidth), constrainedWidth); } return new Measurement( childWidth.Min + edgeWidth, childWidth.Max + edgeWidth); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var border = options.GetSafeBorder(this); var borderStyle = BorderStyle ?? Style.Plain; var showBorder = border is not NoBoxBorder; var edgeWidth = showBorder ? EdgeWidth : 0; var child = new Padder(_child, Padding); var width = Measure(options, maxWidth, child); var panelWidth = Math.Min(!Expand ? width.Max : maxWidth, maxWidth); var innerWidth = panelWidth - edgeWidth; var height = Height != null ? Height - 2 : options.Height != null ? options.Height - 2 : null; if (!Expand) { // Set the height to the explicit height (or null) // if the panel isn't expandable. height = Height != null ? Height - 2 : null; } // Start building the panel var result = new List(); // Panel top if (showBorder) { AddTopBorder(result, options, border, borderStyle, panelWidth); } else { // Not showing border, but we have a header text? // Use a invisible border to draw the top border if (Header?.Text != null) { AddTopBorder(result, options, BoxBorder.None, borderStyle, panelWidth); } } // Split the child segments into lines. var childSegments = ((IRenderable)child).Render(options with { Height = height }, innerWidth); foreach (var (_, _, last, line) in Segment.SplitLines(childSegments, innerWidth, height).Enumerate()) { if (line.Count == 1 && line[0].IsWhiteSpace) { // NOTE: This check might impact other things. // Hopefully not, but there is a chance. continue; } if (showBorder) { result.Add(new Segment(border.GetPart(BoxBorderPart.Left), borderStyle)); } var content = new List(); content.AddRange(line); // Do we need to pad the panel? var length = line.Sum(segment => segment.CellCount()); if (length < innerWidth) { var diff = innerWidth - length; content.Add(Segment.Padding(diff)); } result.AddRange(content); if (showBorder) { result.Add(new Segment(border.GetPart(BoxBorderPart.Right), borderStyle)); } // Don't emit a line break if this is the last // line, we're not showing the border, and we're // not rendering this inline. var emitLinebreak = !(last && !showBorder && !Inline); if (!emitLinebreak) { continue; } result.Add(Segment.LineBreak); } // Panel bottom if (showBorder) { result.Add(new Segment(border.GetPart(BoxBorderPart.BottomLeft), borderStyle)); result.Add(new Segment(border.GetPart(BoxBorderPart.Bottom).Repeat(panelWidth - EdgeWidth), borderStyle)); result.Add(new Segment(border.GetPart(BoxBorderPart.BottomRight), borderStyle)); } // TODO: Need a better name for this? // If we're rendering this as part of an inline parent renderable, // such as columns, we should not emit the last line break. if (!Inline) { result.Add(Segment.LineBreak); } return result; } private void AddTopBorder( List result, RenderOptions options, BoxBorder border, Style borderStyle, int panelWidth) { var rule = new Rule { Style = borderStyle, Border = border, TitlePadding = 1, TitleSpacing = 0, Title = Header?.Text, Justification = Header?.Justification ?? Justify.Left, }; // Top left border result.Add(new Segment(border.GetPart(BoxBorderPart.TopLeft), borderStyle)); // Top border (and header text if specified) result.AddRange(((IRenderable)rule).Render(options, panelWidth - 2).Where(x => !x.IsLineBreak)); // Top right border result.Add(new Segment(border.GetPart(BoxBorderPart.TopRight), borderStyle)); result.Add(Segment.LineBreak); } } /// /// Contains extension methods for . /// public static class PanelExtensions { /// /// Sets the panel header. /// /// The panel. /// The header text. /// The header alignment. /// The same instance so that multiple calls can be chained. public static Panel Header(this Panel panel, string text, Justify? alignment = null) { ArgumentNullException.ThrowIfNull(panel); ArgumentNullException.ThrowIfNull(text); alignment ??= panel.Header?.Justification; return Header(panel, new PanelHeader(text, alignment)); } /// /// Sets the panel header alignment. /// /// The panel. /// The header alignment. /// The same instance so that multiple calls can be chained. public static Panel HeaderAlignment(this Panel panel, Justify alignment) { ArgumentNullException.ThrowIfNull(panel); if (panel.Header != null) { // Update existing style panel.Header.Justification = alignment; } else { // Create header Header(panel, string.Empty, alignment); } return panel; } /// /// Sets the panel header. /// /// The panel. /// The header to use. /// The same instance so that multiple calls can be chained. public static Panel Header(this Panel panel, PanelHeader header) { ArgumentNullException.ThrowIfNull(panel); panel.Header = header; return panel; } } ================================================ FILE: src/Spectre.Console/Widgets/PanelHeader.cs ================================================ namespace Spectre.Console; /// /// Represents a panel header. /// public sealed class PanelHeader : IHasJustification { /// /// Gets the panel header text. /// public string Text { get; } /// /// Gets or sets the panel header alignment. /// public Justify? Justification { get; set; } /// /// Initializes a new instance of the class. /// /// The panel header text. /// The panel header alignment. public PanelHeader(string text, Justify? alignment = null) { Text = text ?? throw new ArgumentNullException(nameof(text)); Justification = alignment; } /// /// Sets the panel header style. /// /// The panel header style. /// The same instance so that multiple calls can be chained. [Obsolete("Use markup instead.")] [EditorBrowsable(EditorBrowsableState.Never)] public PanelHeader SetStyle(Style? style) { return this; } /// /// Sets the panel header style. /// /// The panel header style. /// The same instance so that multiple calls can be chained. [Obsolete("Use markup instead.")] [EditorBrowsable(EditorBrowsableState.Never)] public PanelHeader SetStyle(string style) { return this; } /// /// Sets the panel header alignment. /// /// The panel header alignment. /// The same instance so that multiple calls can be chained. public PanelHeader SetAlignment(Justify alignment) { Justification = alignment; return this; } } ================================================ FILE: src/Spectre.Console/Widgets/Paragraph.cs ================================================ namespace Spectre.Console; /// /// A paragraph of text where different parts /// of the paragraph can have individual styling. /// public sealed class Paragraph : Renderable, IHasJustification, IOverflowable { private readonly List _lines; /// /// Gets or sets the alignment of the whole paragraph. /// public Justify? Justification { get; set; } /// /// Gets or sets the text overflow strategy. /// public Overflow? Overflow { get; set; } /// /// Gets the character count of the paragraph. /// public int Length => _lines.Sum(line => line.Length) + Math.Max(0, Lines - 1); /// /// Gets the number of lines in the paragraph. /// public int Lines => _lines.Count; /// /// Initializes a new instance of the class. /// public Paragraph() { _lines = []; } /// /// Initializes a new instance of the class. /// /// The text. /// The style of the text or if . /// The link of the text. public Paragraph(string text, Style? style = null, Link? link = null) : this() { ArgumentNullException.ThrowIfNull(text); Append(text, style, link); } /// /// Appends some text to this paragraph. /// /// The text to append. /// The style of the appended text or if . /// The link that the appended text points at. /// The same instance so that multiple calls can be chained. public Paragraph Append(string text, Style? style = null, Link? link = null) { ArgumentNullException.ThrowIfNull(text); style ??= Style.Plain; var first = true; var span = text.AsSpan(); foreach (var lineSpan in span.EnumerateLines()) { SegmentLine line; if (!first || _lines.Count == 0) { line = []; _lines.Add(line); } else { line = _lines[^1]; } first = false; if (lineSpan.IsEmpty) { line.Add(Segment.Empty); } else { foreach (var part in new WhiteSpaceSegmentEnumerator(lineSpan)) { line.Add(new Segment(part.ToString(), style.Value, link)); } } } return this; } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { if (_lines.Count == 0) { return new Measurement(0, 0); } var min = _lines.Max(line => line.Max(segment => segment.CellCount())); var max = _lines.Max(x => x.CellCount()); return new Measurement(min, Math.Min(max, maxWidth)); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { ArgumentNullException.ThrowIfNull(options); if (_lines.Count == 0) { return []; } var lines = options.SingleLine ? [.. _lines] : SplitLines(maxWidth); // Justify lines var justification = options.Justification ?? Justification ?? Console.Justify.Left; if (justification != Console.Justify.Left) { foreach (var line in lines) { Aligner.Align(line, justification, maxWidth); } } if (options.SingleLine) { // Return the first line return lines[0].Where(segment => !segment.IsLineBreak); } return new SegmentLineEnumerator(lines); } private List Clone() { var result = new List(); foreach (var line in _lines) { var newLine = new SegmentLine(); foreach (var segment in line) { newLine.Add(segment); } result.Add(newLine); } return result; } private List SplitLines(int maxWidth) { if (maxWidth <= 0) { // Nothing fits, so return an empty line. return []; } if (_lines.Max(x => x.CellCount()) <= maxWidth) { return Clone(); } var lines = new List(); var line = new SegmentLine(); using var iterator = new SegmentLineIterator(_lines); var queue = new Queue(); while (true) { Segment? current; if (queue.Count == 0) { if (!iterator.MoveNext()) { break; } current = iterator.Current; } else { current = queue.Dequeue(); } if (current == null) { throw new InvalidOperationException("Iterator returned empty segment."); } var newLine = false; if (current.IsLineBreak) { lines.Add(line); line = []; continue; } var length = current.CellCount(); if (length > maxWidth) { // The current segment is longer than the width of the console, // so we will need to crop it up, into new segments. var segments = Segment.SplitOverflow(current, Overflow, maxWidth); if (segments.Count > 0) { if (line.CellCount() + segments[0].CellCount() > maxWidth) { lines.Add(line); line = []; segments.ForEach(s => queue.Enqueue(s)); continue; } else { // Add the segment and push the rest of them to the queue. line.Add(segments[0]); segments.Skip(1).ForEach(s => queue.Enqueue(s)); continue; } } } else { if (line.CellCount() + length > maxWidth) { line.Add(Segment.Empty); lines.Add(line); line = []; newLine = true; } } if (newLine && current.IsWhiteSpace) { continue; } line.Add(current); } // Flush remaining. if (line.Count > 0) { lines.Add(line); } return lines; } } ================================================ FILE: src/Spectre.Console/Widgets/ProgressBar.cs ================================================ namespace Spectre.Console; internal sealed class ProgressBar : Renderable, IHasCulture { private const int PULSESIZE = 20; private const int PULSESPEED = 15; public double Value { get; set; } public double MaxValue { get; set; } = 100; public int? Width { get; set; } public bool ShowRemaining { get; set; } = true; public char UnicodeBar { get; set; } = '━'; public char AsciiBar { get; set; } = '-'; public bool ShowValue { get; set; } public bool IsIndeterminate { get; set; } public CultureInfo? Culture { get; set; } public Func? ValueFormatter { get; set; } public Style CompletedStyle { get; set; } = Color.Yellow; public Style FinishedStyle { get; set; } = Color.Green; public Style RemainingStyle { get; set; } = Color.Grey; public Style IndeterminateStyle { get; set; } = DefaultPulseStyle; internal static Style DefaultPulseStyle { get; } = new Style(foreground: Color.DodgerBlue1, background: Color.Grey23); protected override Measurement Measure(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); return new Measurement(4, width); } protected override IEnumerable Render(RenderOptions options, int maxWidth) { var width = Math.Min(Width ?? maxWidth, maxWidth); var completedBarCount = Math.Min(MaxValue, Math.Max(0, Value)); var isCompleted = completedBarCount >= MaxValue; if (IsIndeterminate && !isCompleted) { foreach (var segment in RenderIndeterminate(options, width)) { yield return segment; } yield break; } var bar = !options.Unicode ? AsciiBar : UnicodeBar; var style = isCompleted ? FinishedStyle : CompletedStyle; var barCount = Math.Max(0, (int)(width * (completedBarCount / MaxValue))); // Show value? var value = ValueFormatter != null ? ValueFormatter(completedBarCount, Culture ?? CultureInfo.InvariantCulture) : completedBarCount.ToString(Culture ?? CultureInfo.InvariantCulture); if (ShowValue) { barCount = barCount - value.Length - 1; barCount = Math.Max(0, barCount); } yield return new Segment(new string(bar, barCount), style); if (ShowValue) { yield return barCount == 0 ? new Segment(value, style) : new Segment(" " + value, style); } // More space available? if (barCount < width) { var diff = width - barCount; if (ShowValue) { diff = diff - value.Length - 1; if (diff <= 0) { yield break; } } var legacy = options.ColorSystem == ColorSystem.NoColors || options.ColorSystem == ColorSystem.Legacy; var remainingToken = ShowRemaining && !legacy ? bar : ' '; yield return new Segment(new string(remainingToken, diff), RemainingStyle); } } private IEnumerable RenderIndeterminate(RenderOptions options, int width) { var bar = options.Unicode ? UnicodeBar.ToString() : AsciiBar.ToString(); var style = IndeterminateStyle; IEnumerable GetPulseSegments() { // For 1-bit and 3-bit colors, fall back to // a simpler versions with only two colors. if (options.ColorSystem is ColorSystem.NoColors or ColorSystem.Legacy) { // First half of the pulse var segments = Enumerable.Repeat(new Segment(bar, new Style(style.Foreground)), PULSESIZE / 2); // Second half of the pulse var legacy = options.ColorSystem is ColorSystem.NoColors or ColorSystem.Legacy; var bar2 = legacy ? " " : bar; segments = segments.Concat(Enumerable.Repeat(new Segment(bar2, new Style(style.Background)), PULSESIZE - (PULSESIZE / 2))); foreach (var segment in segments) { yield return segment; } yield break; } for (var index = 0; index < PULSESIZE; index++) { var position = index / (float)PULSESIZE; var fade = 0.5f + ((float)Math.Cos(position * Math.PI * 2) / 2.0f); var color = style.Foreground.Blend(style.Background, fade); yield return new Segment(bar, new Style(foreground: color)); } } // Get the pulse segments var pulseSegments = GetPulseSegments(); pulseSegments = pulseSegments.Repeat((width / PULSESIZE) + 2); // Repeat the pulse segments var currentTime = (DateTime.Now - DateTime.Today).TotalSeconds; var offset = (int)(currentTime * PULSESPEED) % PULSESIZE; return pulseSegments.Skip(offset).Take(width); } } ================================================ FILE: src/Spectre.Console/Widgets/Rows.cs ================================================ namespace Spectre.Console; /// /// Renders things in rows. /// public sealed class Rows : Renderable, IExpandable { private readonly List _children; /// public bool Expand { get; set; } /// /// Initializes a new instance of the class. /// /// The items to render as rows. public Rows(params IRenderable[] items) : this((IEnumerable)items) { } /// /// Initializes a new instance of the class. /// /// The items to render as rows. public Rows(IEnumerable children) { _children = new List(children ?? throw new ArgumentNullException(nameof(children))); } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { if (Expand) { return new Measurement(maxWidth, maxWidth); } else { var measurements = _children.Select(c => c.Measure(options, maxWidth)).ToArray(); if (measurements.Length > 0) { return new Measurement( measurements.Max(c => c.Min), measurements.Max(c => c.Max)); } return new Measurement(0, 0); } } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var result = new List(); foreach (var child in _children) { var segments = child.Render(options, maxWidth); foreach (var (_, _, last, segment) in segments.Enumerate()) { result.Add(segment); if (last) { if (!segment.IsLineBreak && child is not ControlCode) { result.Add(Segment.LineBreak); } } } } return result; } } ================================================ FILE: src/Spectre.Console/Widgets/Rule.cs ================================================ namespace Spectre.Console; /// /// A renderable horizontal rule. /// public sealed class Rule : Renderable, IHasJustification, IHasBoxBorder { /// /// Gets or sets the rule title markup text. /// public string? Title { get; set; } /// /// Gets or sets the rule style. /// public Style? Style { get; set; } /// /// Gets or sets the rule's title justification. /// public Justify? Justification { get; set; } /// public BoxBorder Border { get; set; } = BoxBorder.Square; internal int TitlePadding { get; set; } = 2; internal int TitleSpacing { get; set; } = 1; /// /// Initializes a new instance of the class. /// public Rule() { } /// /// Initializes a new instance of the class. /// /// The rule title markup text. public Rule(string title) { Title = title ?? throw new ArgumentNullException(nameof(title)); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var extraLength = (2 * TitlePadding) + (2 * TitleSpacing); if (Title == null || maxWidth <= extraLength) { return GetLineWithoutTitle(options, maxWidth); } // Get the title and make sure it fits. var title = GetTitleSegments(options, Title, maxWidth - extraLength); if (Segment.CellCount(title) > maxWidth - extraLength) { // Truncate the title title = Segment.TruncateWithEllipsis(title, maxWidth - extraLength); if (!title.Any()) { // We couldn't fit the title at all. return GetLineWithoutTitle(options, maxWidth); } } var (left, right) = GetLineSegments(options, maxWidth, title); var segments = new List(); segments.Add(left); segments.AddRange(title); segments.Add(right); segments.Add(Segment.LineBreak); return segments; } private IEnumerable GetLineWithoutTitle(RenderOptions options, int maxWidth) { var border = Border.GetSafeBorder(safe: !options.Unicode); var text = border.GetPart(BoxBorderPart.Top).Repeat(maxWidth); return [ new Segment(text, Style ?? Spectre.Console.Style.Plain), Segment.LineBreak ]; } private IEnumerable GetTitleSegments(RenderOptions options, string title, int width) { title = title.NormalizeNewLines().ReplaceExact("\n", " ").Trim(); var markup = new Markup(title, Style); return ((IRenderable)markup).Render(options with { SingleLine = true }, width); } private (Segment Left, Segment Right) GetLineSegments(RenderOptions options, int width, IEnumerable title) { var titleLength = Segment.CellCount(title); var border = Border.GetSafeBorder(safe: !options.Unicode); var borderPart = border.GetPart(BoxBorderPart.Top); var alignment = Justification ?? Justify.Center; if (alignment == Justify.Left) { var left = new Segment(borderPart.Repeat(TitlePadding) + new string(' ', TitleSpacing), Style ?? Spectre.Console.Style.Plain); var rightLength = width - titleLength - left.CellCount() - TitleSpacing; var right = new Segment(new string(' ', TitleSpacing) + borderPart.Repeat(rightLength), Style ?? Spectre.Console.Style.Plain); return (left, right); } else if (alignment == Justify.Center) { var leftLength = ((width - titleLength) / 2) - TitleSpacing; var left = new Segment(borderPart.Repeat(leftLength) + new string(' ', TitleSpacing), Style ?? Spectre.Console.Style.Plain); var rightLength = width - titleLength - left.CellCount() - TitleSpacing; var right = new Segment(new string(' ', TitleSpacing) + borderPart.Repeat(rightLength), Style ?? Spectre.Console.Style.Plain); return (left, right); } else if (alignment == Justify.Right) { var right = new Segment(new string(' ', TitleSpacing) + borderPart.Repeat(TitlePadding), Style ?? Spectre.Console.Style.Plain); var leftLength = width - titleLength - right.CellCount() - TitleSpacing; var left = new Segment(borderPart.Repeat(leftLength) + new string(' ', TitleSpacing), Style ?? Spectre.Console.Style.Plain); return (left, right); } throw new NotSupportedException("Unsupported alignment."); } } /// /// Contains extension methods for . /// public static class RuleExtensions { /// /// Sets the rule title. /// /// The rule. /// The title. /// The same instance so that multiple calls can be chained. public static Rule RuleTitle(this Rule rule, string title) { ArgumentNullException.ThrowIfNull(rule); ArgumentNullException.ThrowIfNull(title); rule.Title = title; return rule; } /// /// Sets the rule style. /// /// The rule. /// The rule style. /// The same instance so that multiple calls can be chained. public static Rule RuleStyle(this Rule rule, Style style) { ArgumentNullException.ThrowIfNull(rule); rule.Style = style; return rule; } } ================================================ FILE: src/Spectre.Console/Widgets/Table/Table.cs ================================================ namespace Spectre.Console; /// /// A renderable table. /// public sealed class Table : Renderable, IHasTableBorder, IExpandable { private readonly List _columns; /// /// Gets the table columns. /// public IReadOnlyList Columns => _columns; /// /// Gets the table rows. /// public TableRowCollection Rows { get; } /// public TableBorder Border { get; set; } = TableBorder.Square; /// public Style? BorderStyle { get; set; } /// public bool UseSafeBorder { get; set; } = true; /// /// Gets or sets a value indicating whether or not table headers should be shown. /// public bool ShowHeaders { get; set; } = true; /// /// Gets or sets a value indicating whether or not row separators should be shown. /// public bool ShowRowSeparators { get; set; } /// /// Gets or sets a value indicating whether or not table footers should be shown. /// public bool ShowFooters { get; set; } = true; /// /// Gets or sets a value indicating whether or not the table should /// fit the available space. If false, the table width will be /// auto calculated. Defaults to false. /// public bool Expand { get; set; } /// /// Gets or sets the width of the table. /// public int? Width { get; set; } /// /// Gets or sets the table title. /// public TableTitle? Title { get; set; } /// /// Gets or sets the table footnote. /// public TableTitle? Caption { get; set; } // Whether this is a grid or not. internal bool IsGrid { get; set; } // Whether or not the most right cell should be padded. // This is almost always the case, unless we're rendering // a grid without explicit padding in the last cell. internal bool PadRightCell { get; set; } = true; /// /// Initializes a new instance of the class. /// public Table() { _columns = []; Rows = new TableRowCollection(this); } /// /// Adds a column to the table. /// /// The column to add. /// The same instance so that multiple calls can be chained. public Table AddColumn(TableColumn column) { ArgumentNullException.ThrowIfNull(column); if (Rows.Count > 0) { throw new InvalidOperationException("Cannot add new columns to table with existing rows."); } _columns.Add(column); return this; } /// protected override Measurement Measure(RenderOptions options, int maxWidth) { ArgumentNullException.ThrowIfNull(options); var measurer = new TableMeasurer(this, options); // Calculate the total cell width var totalCellWidth = measurer.CalculateTotalCellWidth(maxWidth); // Calculate the minimum and maximum table width var measurements = _columns.Select(column => measurer.MeasureColumn(column, totalCellWidth)); var minTableWidth = measurements.Sum(x => x.Min) + measurer.GetNonColumnWidth(); var maxTableWidth = Width ?? measurements.Sum(x => x.Max) + measurer.GetNonColumnWidth(); return new Measurement(minTableWidth, maxTableWidth); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { ArgumentNullException.ThrowIfNull(options); var measurer = new TableMeasurer(this, options); // Calculate the column and table width var totalCellWidth = measurer.CalculateTotalCellWidth(maxWidth); var columnWidths = measurer.CalculateColumnWidths(totalCellWidth); var tableWidth = columnWidths.Sum() + measurer.GetNonColumnWidth(); // Get the rows to render var rows = GetRenderableRows(); // Render the table return TableRenderer.Render( new TableRendererContext(this, options, rows, tableWidth, maxWidth), columnWidths); } private List GetRenderableRows() { var rows = new List(); // Show headers? if (ShowHeaders) { rows.Add(TableRow.Header(_columns.Select(c => c.Header))); } // Add rows rows.AddRange(Rows); // Show footers? if (ShowFooters && _columns.Any(c => c.Footer != null)) { rows.Add(TableRow.Footer(_columns.Select(c => c.Footer ?? Text.Empty))); } return rows; } } /// /// Contains extension methods for . /// public static class TableExtensions { /// /// Adds multiple columns to the table. /// /// The table to add the column to. /// The columns to add. /// The same instance so that multiple calls can be chained. public static Table AddColumns(this Table table, params TableColumn[] columns) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(columns); foreach (var column in columns) { table.AddColumn(column); } return table; } /// /// Adds a row to the table. /// /// The table to add the row to. /// The row columns to add. /// The same instance so that multiple calls can be chained. public static Table AddRow(this Table table, IEnumerable columns) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(columns); table.Rows.Add(new TableRow(columns)); return table; } /// /// Adds a row to the table. /// /// The table to add the row to. /// The row columns to add. /// The same instance so that multiple calls can be chained. public static Table AddRow(this Table table, params IRenderable[] columns) { ArgumentNullException.ThrowIfNull(table); return table.AddRow((IEnumerable)columns); } /// /// Adds an empty row to the table. /// /// The table to add the row to. /// The same instance so that multiple calls can be chained. public static Table AddEmptyRow(this Table table) { ArgumentNullException.ThrowIfNull(table); var columns = new IRenderable[table.Columns.Count]; Enumerable.Range(0, table.Columns.Count).ForEach(index => columns[index] = Text.Empty); table.AddRow(columns); return table; } /// /// Adds a column to the table. /// /// The table to add the column to. /// The column to add. /// Delegate that can be used to configure the added column. /// The same instance so that multiple calls can be chained. public static Table AddColumn(this Table table, string column, Action? configure = null) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(column); var tableColumn = new TableColumn(column); configure?.Invoke(tableColumn); table.AddColumn(tableColumn); return table; } /// /// Adds multiple columns to the table. /// /// The table to add the columns to. /// The columns to add. /// The same instance so that multiple calls can be chained. public static Table AddColumns(this Table table, params string[] columns) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(columns); foreach (var column in columns) { AddColumn(table, column); } return table; } /// /// Adds a row to the table. /// /// The table to add the row to. /// The row columns to add. /// The same instance so that multiple calls can be chained. public static Table AddRow(this Table table, params string[] columns) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(columns); table.AddRow(columns.Select(column => new Markup(column)).ToArray()); return table; } /// /// Inserts a row in the table at the specified index. /// /// The table to add the row to. /// The index to insert the row at. /// The row columns to add. /// The same instance so that multiple calls can be chained. public static Table InsertRow(this Table table, int index, IEnumerable columns) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(columns); table.Rows.Insert(index, new TableRow(columns)); return table; } /// /// Updates a tables cell. /// /// The table to update. /// The index of row to update. /// The index of column to update. /// New cell data. /// The same instance so that multiple calls can be chained. public static Table UpdateCell(this Table table, int rowIndex, int columnIndex, IRenderable cellData) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(cellData); table.Rows.Update(rowIndex, columnIndex, cellData); return table; } /// /// Updates a tables cell. /// /// The table to update. /// The index of row to update. /// The index of column to update. /// New cell data. /// The same instance so that multiple calls can be chained. public static Table UpdateCell(this Table table, int rowIndex, int columnIndex, string cellData) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(cellData); table.Rows.Update(rowIndex, columnIndex, new Markup(cellData)); return table; } /// /// Inserts a row in the table at the specified index. /// /// The table to add the row to. /// The index to insert the row at. /// The row columns to add. /// The same instance so that multiple calls can be chained. public static Table InsertRow(this Table table, int index, params IRenderable[] columns) { ArgumentNullException.ThrowIfNull(table); return InsertRow(table, index, (IEnumerable)columns); } /// /// Inserts a row in the table at the specified index. /// /// The table to add the row to. /// The index to insert the row at. /// The row columns to add. /// The same instance so that multiple calls can be chained. public static Table InsertRow(this Table table, int index, params string[] columns) { ArgumentNullException.ThrowIfNull(table); return InsertRow(table, index, columns.Select(column => new Markup(column))); } /// /// Removes a row from the table with the specified index. /// /// The table to add the row to. /// The index to remove the row at. /// The same instance so that multiple calls can be chained. public static Table RemoveRow(this Table table, int index) { ArgumentNullException.ThrowIfNull(table); table.Rows.RemoveAt(index); return table; } /// /// Sets the table width. /// /// The table. /// The width. /// The same instance so that multiple calls can be chained. public static Table Width(this Table table, int? width) { ArgumentNullException.ThrowIfNull(table); table.Width = width; return table; } /// /// Shows table headers. /// /// The table. /// The same instance so that multiple calls can be chained. public static Table ShowHeaders(this Table table) { ArgumentNullException.ThrowIfNull(table); table.ShowHeaders = true; return table; } /// /// Hides table headers. /// /// The table. /// The same instance so that multiple calls can be chained. public static Table HideHeaders(this Table table) { ArgumentNullException.ThrowIfNull(table); table.ShowHeaders = false; return table; } /// /// Shows row separators. /// /// The table. /// The same instance so that multiple calls can be chained. public static Table ShowRowSeparators(this Table table) { ArgumentNullException.ThrowIfNull(table); table.ShowRowSeparators = true; return table; } /// /// Hides row separators. /// /// The table. /// The same instance so that multiple calls can be chained. public static Table HideRowSeparators(this Table table) { ArgumentNullException.ThrowIfNull(table); table.ShowRowSeparators = false; return table; } /// /// Shows table footers. /// /// The table. /// The same instance so that multiple calls can be chained. public static Table ShowFooters(this Table table) { ArgumentNullException.ThrowIfNull(table); table.ShowFooters = true; return table; } /// /// Hides table footers. /// /// The table. /// The same instance so that multiple calls can be chained. public static Table HideFooters(this Table table) { ArgumentNullException.ThrowIfNull(table); table.ShowFooters = false; return table; } /// /// Sets the table title. /// /// The table. /// The table title markup text. /// The table title style. /// The same instance so that multiple calls can be chained. public static Table Title(this Table table, string text, Style? style = null) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(text); return Title(table, new TableTitle(text, style)); } /// /// Sets the table title. /// /// The table. /// The table title. /// The same instance so that multiple calls can be chained. public static Table Title(this Table table, TableTitle title) { ArgumentNullException.ThrowIfNull(table); table.Title = title; return table; } /// /// Sets the table caption. /// /// The table. /// The caption markup text. /// The style. /// The same instance so that multiple calls can be chained. public static Table Caption(this Table table, string text, Style? style = null) { ArgumentNullException.ThrowIfNull(table); ArgumentNullException.ThrowIfNull(text); return Caption(table, new TableTitle(text, style)); } /// /// Sets the table caption. /// /// The table. /// The caption. /// The same instance so that multiple calls can be chained. public static Table Caption(this Table table, TableTitle caption) { ArgumentNullException.ThrowIfNull(table); table.Caption = caption; return table; } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableAccessor.cs ================================================ namespace Spectre.Console; internal abstract class TableAccessor { private readonly Table _table; public RenderOptions Options { get; } public IReadOnlyList Columns => _table.Columns; public virtual IReadOnlyList Rows => _table.Rows; public bool Expand => _table.Expand || _table.Width != null; protected TableAccessor(Table table, RenderOptions options) { _table = table ?? throw new ArgumentNullException(nameof(table)); Options = options ?? throw new ArgumentNullException(nameof(options)); } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableCell.cs ================================================ namespace Spectre.Console; /// /// Represents a table cell that can span multiple columns. /// public sealed class TableCell : IRenderable { /// /// Gets the cell content. /// public IRenderable Content { get; } /// /// Gets the number of columns this cell spans. /// public int ColumnSpan { get; set; } /// /// Initializes a new instance of the class. /// /// The cell content. public TableCell(IRenderable content) { Content = content ?? throw new ArgumentNullException(nameof(content)); ColumnSpan = 1; } /// /// Initializes a new instance of the class. /// /// Markup text. public TableCell(string markup) : this(new Markup(markup ?? string.Empty)) { } /// /// Sets the number of columns this cell should span. /// /// The number of columns to span. /// The same instance so that multiple calls can be chained. public TableCell Span(int span) { if (span < 1) { throw new ArgumentException("Column span must be at least 1.", nameof(span)); } ColumnSpan = span; return this; } /// /// Implicitly converts a to a . /// /// The markup text to convert. public static implicit operator TableCell(string markup) { return new TableCell(markup); } /// Measurement IRenderable.Measure(RenderOptions options, int maxWidth) { return Content.Measure(options, maxWidth); } /// IEnumerable IRenderable.Render(RenderOptions options, int maxWidth) { return Content.Render(options, maxWidth); } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableColumn.cs ================================================ namespace Spectre.Console; /// /// Represents a table column. /// public sealed class TableColumn : IColumn { private IRenderable _header = null!; private IRenderable? _footer; /// /// Gets or sets the column header. /// public IRenderable Header { get => _header; set { if (value is TableCell cell && cell.ColumnSpan > 1) { throw new InvalidOperationException("Column spanning is not supported in table header rows."); } _header = value ?? throw new ArgumentNullException(nameof(value)); } } /// /// Gets or sets the column footer. /// public IRenderable? Footer { get => _footer; set { if (value is TableCell cell && cell.ColumnSpan > 1) { throw new InvalidOperationException("Column spanning is not supported in table footer rows."); } _footer = value; } } /// /// Gets or sets the width of the column. /// If null, the column will adapt to its contents. /// public int? Width { get; set; } /// /// Gets or sets the padding of the column. /// Vertical padding (top and bottom) is ignored. /// public Padding? Padding { get; set; } /// /// Gets or sets a value indicating whether wrapping of /// text within the column should be prevented. /// public bool NoWrap { get; set; } /// /// Gets or sets the alignment of the column. /// public Justify? Alignment { get; set; } /// /// Initializes a new instance of the class. /// /// The table column header. public TableColumn(string header) : this(new Markup(header).Overflow(Overflow.Ellipsis)) { } /// /// Initializes a new instance of the class. /// /// The instance to use as the table column header. public TableColumn(IRenderable header) { Header = header ?? throw new ArgumentNullException(nameof(header)); Width = null; Padding = new Padding(1, 0, 1, 0); NoWrap = false; Alignment = null; } } /// /// Contains extension methods for . /// public static class TableColumnExtensions { /// /// Sets the table column header. /// /// The table column. /// The table column header markup text. /// The same instance so that multiple calls can be chained. public static TableColumn Header(this TableColumn column, string header) { ArgumentNullException.ThrowIfNull(column); ArgumentNullException.ThrowIfNull(header); column.Header = new Markup(header); return column; } /// /// Sets the table column header. /// /// The table column. /// The table column header. /// The same instance so that multiple calls can be chained. public static TableColumn Header(this TableColumn column, IRenderable header) { ArgumentNullException.ThrowIfNull(column); ArgumentNullException.ThrowIfNull(header); column.Header = header; return column; } /// /// Sets the table column footer. /// /// The table column. /// The table column footer markup text. /// The same instance so that multiple calls can be chained. public static TableColumn Footer(this TableColumn column, string footer) { ArgumentNullException.ThrowIfNull(column); ArgumentNullException.ThrowIfNull(footer); column.Footer = new Markup(footer); return column; } /// /// Sets the table column footer. /// /// The table column. /// The table column footer. /// The same instance so that multiple calls can be chained. public static TableColumn Footer(this TableColumn column, IRenderable footer) { ArgumentNullException.ThrowIfNull(column); ArgumentNullException.ThrowIfNull(footer); column.Footer = footer; return column; } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableMeasurer.cs ================================================ namespace Spectre.Console; internal sealed class TableMeasurer : TableAccessor { private const int EdgeCount = 2; private readonly int? _explicitWidth; private readonly TableBorder _border; private readonly bool _padRightCell; public TableMeasurer(Table table, RenderOptions options) : base(table, options) { _explicitWidth = table.Width; _border = table.Border; _padRightCell = table.PadRightCell; } public int CalculateTotalCellWidth(int maxWidth) { var totalCellWidth = maxWidth; if (_explicitWidth != null) { totalCellWidth = Math.Min(_explicitWidth.Value, maxWidth); } return totalCellWidth - GetNonColumnWidth(); } /// /// Gets the width of everything that's not a cell. /// That means separators, edges and padding. /// /// The width of everything that's not a cell. public int GetNonColumnWidth() { var hideBorder = !_border.Visible; var usePadding = _border.UsePadding; var separators = hideBorder ? 0 : Columns.Count - 1; var edges = hideBorder || !usePadding ? 0 : EdgeCount; var padding = !usePadding ? 0 : Columns.Select(x => x.Padding?.GetWidth() ?? 0).Sum(); if (usePadding && !_padRightCell) { padding -= Columns.Last().Padding.GetRightSafe(); } return separators + edges + padding; } /// /// Calculates the width of all columns minus any padding. /// /// The maximum width that the columns may occupy. /// A list of column widths. public List CalculateColumnWidths(int maxWidth) { var width_ranges = Columns.Select(column => MeasureColumn(column, maxWidth)).ToArray(); var widths = width_ranges.Select(range => range.Max).ToList(); var tableWidth = widths.Sum(); if (tableWidth > maxWidth) { var wrappable = Columns.Select(c => !c.NoWrap).ToList(); widths = CollapseWidths(widths, wrappable, maxWidth); tableWidth = widths.Sum(); // last resort, reduce columns evenly if (tableWidth > maxWidth) { var excessWidth = tableWidth - maxWidth; widths = Ratio.Reduce(excessWidth, widths.Select(_ => 1).ToList(), widths, widths); tableWidth = widths.Sum(); } } if (tableWidth < maxWidth && Expand) { var flexibleColumns = Columns.Select(column => column.Width == null).ToList(); if (flexibleColumns.Any(isFlexible => isFlexible)) { var ratios = widths.Select((width, index) => flexibleColumns[index] ? Math.Max(width, 1) : 0).ToList(); var padWidths = Ratio.Distribute(maxWidth - tableWidth, ratios); widths = widths.Zip(padWidths, (a, b) => (a, b)).Select(f => f.a + f.b).ToList(); } } return widths; } public Measurement MeasureColumn(TableColumn column, int maxWidth) { // Predetermined width? if (column.Width != null) { return new Measurement(column.Width.Value, column.Width.Value); } var columnIndex = Columns.IndexOf(column); var minWidths = new List(); var maxWidths = new List(); // Include columns (both header and footer) in measurement var headerMeasure = column.Header.Measure(Options, maxWidth); var footerMeasure = column.Footer?.Measure(Options, maxWidth) ?? headerMeasure; minWidths.Add(Math.Min(headerMeasure.Min, footerMeasure.Min)); maxWidths.Add(Math.Max(headerMeasure.Max, footerMeasure.Max)); // Measure rows, accounting for column spanning foreach (var row in Rows) { var currentColumnIndex = 0; foreach (var item in row) { if (currentColumnIndex == columnIndex) { // This cell starts at the column we're measuring if (item is TableCell tableCell) { // For spanning cells, distribute the measurement across spanned columns var cellMeasure = tableCell.Content.Measure(Options, maxWidth); if (tableCell.ColumnSpan > 1) { // Distribute the measurement evenly across spanned columns var minPerColumn = cellMeasure.Min / tableCell.ColumnSpan; var maxPerColumn = cellMeasure.Max / tableCell.ColumnSpan; minWidths.Add(minPerColumn); maxWidths.Add(maxPerColumn); } else { minWidths.Add(cellMeasure.Min); maxWidths.Add(cellMeasure.Max); } } else { var rowMeasure = item.Measure(Options, maxWidth); minWidths.Add(rowMeasure.Min); maxWidths.Add(rowMeasure.Max); } break; // Found the cell for this column, move to next row } else if (item is TableCell tableCell && currentColumnIndex + tableCell.ColumnSpan > columnIndex) { // This column is covered by a spanning cell that started earlier // Contribute a portion of the spanning cell's measurement var cellMeasure = tableCell.Content.Measure(Options, maxWidth); var minPerColumn = cellMeasure.Min / tableCell.ColumnSpan; var maxPerColumn = cellMeasure.Max / tableCell.ColumnSpan; minWidths.Add(minPerColumn); maxWidths.Add(maxPerColumn); break; } // Advance column index currentColumnIndex += item is TableCell tc ? tc.ColumnSpan : 1; } } var padding = column.Padding?.GetWidth() ?? 0; return new Measurement( minWidths.Count > 0 ? minWidths.Max() : padding, maxWidths.Count > 0 ? maxWidths.Max() : maxWidth); } // Reduce widths so that the total is less or equal to the max width. // Ported from Rich by Will McGugan, licensed under MIT. // https://github.com/willmcgugan/rich/blob/527475837ebbfc427530b3ee0d4d0741d2d0fc6d/rich/table.py#L442 private static List CollapseWidths(List widths, List wrappable, int maxWidth) { var totalWidth = widths.Sum(); var excessWidth = totalWidth - maxWidth; if (wrappable.AnyTrue()) { while (totalWidth != 0 && excessWidth > 0) { var maxColumn = widths.Zip(wrappable, (first, second) => (width: first, allowWrap: second)) .Where(x => x.allowWrap) .Max(x => x.width); var secondMaxColumn = widths.Zip(wrappable, (width, allowWrap) => allowWrap && width != maxColumn ? width : 1).Max(); var columnDifference = maxColumn - secondMaxColumn; var ratios = widths.Zip(wrappable, (width, allowWrap) => width == maxColumn && allowWrap ? 1 : 0).ToList(); if (!ratios.Any(x => x != 0) || columnDifference == 0) { break; } var maxReduce = widths.Select(_ => Math.Min(excessWidth, columnDifference)).ToList(); widths = Ratio.Reduce(excessWidth, ratios, maxReduce, widths); totalWidth = widths.Sum(); excessWidth = totalWidth - maxWidth; } } return widths; } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableRenderer.cs ================================================ namespace Spectre.Console; internal static class TableRenderer { private static readonly Style _defaultHeadingStyle = Color.Silver; private static readonly Style _defaultCaptionStyle = Color.Grey; public static List Render(TableRendererContext context, List columnWidths) { // Can't render the table? if (context.TableWidth <= 0 || context.TableWidth > context.MaxWidth || columnWidths.Any(c => c < 0)) { return [ ..new[] { new Segment("…", context.BorderStyle) } ]; } var result = new List(); result.AddRange(RenderAnnotation(context, context.Title, _defaultHeadingStyle)); // Iterate all rows foreach (var (index, isFirstRow, isLastRow, row) in context.Rows.Enumerate()) { var cellHeight = 1; // Get the list of cells for the row and calculate the cell height // Store rendered lines, calculated width, column index, and span for each cell var cells = new List<(List? Lines, int Width, int ColumnIndex, int Span)>(); var columnIndex = 0; foreach (var item in row) { var cell = item; var span = 1; // Check if this is a spanning cell if (item is TableCell tableCell) { cell = tableCell.Content; span = tableCell.ColumnSpan; } // Calculate the total width for this cell (including spanned columns) var cellWidth = columnWidths[columnIndex]; if (span > 1) { // Add widths of spanned columns plus separator widths for (var i = 1; i < span; i++) { if (columnIndex + i < columnWidths.Count) { // Add separator width (assuming 1 character separator) if (context.ShowBorder) { cellWidth += 1; } cellWidth += columnWidths[columnIndex + i]; // Add padding from intermediate columns if ((context.ShowBorder && context.Border.UsePadding) || context.IsGrid) { cellWidth += context.Columns[columnIndex + i].Padding.GetLeftSafe(); cellWidth += context.Columns[columnIndex + i].Padding.GetRightSafe(); } } } } var justification = context.Columns[columnIndex].Alignment; var childContext = context.Options with { Justification = justification }; var lines = Segment.SplitLines(cell.Render(childContext, cellWidth)); cellHeight = Math.Max(cellHeight, lines.Count); cells.Add((lines, cellWidth, columnIndex, span)); // Add null placeholders for spanned columns for (var i = 1; i < span; i++) { cells.Add((null, 0, columnIndex + i, 0)); } columnIndex += span; } // Show top of header? if (isFirstRow && context.ShowBorder) { var separator = context.Border.GetColumnRow(TablePart.Top, columnWidths, context.Columns); if (!string.IsNullOrEmpty(separator)) { result.Add(new Segment(separator, context.BorderStyle)); result.Add(Segment.LineBreak); } } // Show footer separator? if (context.ShowFooters && isLastRow && context.ShowBorder && context.HasFooters) { var textBorder = context.Border.GetColumnRow(TablePart.FooterSeparator, columnWidths, context.Columns); if (!string.IsNullOrEmpty(textBorder)) { result.Add(new Segment(textBorder, context.BorderStyle)); result.Add(Segment.LineBreak); } } // Make cells the same shape (skip null placeholders for spanning) for (var i = 0; i < cells.Count; i++) { if (cells[i].Lines != null && cells[i].Lines?.Count < cellHeight) { var lines = cells[i].Lines; while (lines?.Count < cellHeight) { lines.Add(new SegmentLine()); } } } // Determine the indices of the first and last non-null cells // to correctly apply border edges when spanning cells create trailing nulls. var firstNonNullIndex = cells.FindIndex(c => c.Lines != null); var lastNonNullIndex = cells.FindLastIndex(c => c.Lines != null); // Iterate through each cell row foreach (var cellRowIndex in Enumerable.Range(0, cellHeight)) { var rowResult = new List(); foreach (var (cellIndex, _, _, cellData) in cells.Enumerate()) { // Skip cells that are part of a span from a previous cell if (cellData.Lines == null) { continue; } var isFirstCell = cellIndex == firstNonNullIndex; var isLastCell = cellIndex == lastNonNullIndex; var actualColumnIndex = cellData.ColumnIndex; var cell = cellData.Lines; var cellWidth = cellData.Width; var cellSpan = cellData.Span; if (isFirstCell && context.ShowBorder) { // Show left column edge var part = isFirstRow && context.ShowHeaders ? TableBorderPart.HeaderLeft : TableBorderPart.CellLeft; rowResult.Add(new Segment(context.Border.GetPart(part), context.BorderStyle)); } // Pad column on left side. if ((context.ShowBorder && context.Border.UsePadding) || context.IsGrid) { var leftPadding = context.Columns[actualColumnIndex].Padding.GetLeftSafe(); if (leftPadding > 0) { rowResult.Add(new Segment(new string(' ', leftPadding))); } } // Add content rowResult.AddRange(cell[cellRowIndex]); // Pad cell content right var length = cell[cellRowIndex].Sum(segment => segment.CellCount()); if (length < cellWidth) { rowResult.Add(new Segment(new string(' ', cellWidth - length))); } // Pad column on the right side (use the LAST column in the span) var rightColumnIndex = actualColumnIndex + cellSpan - 1; if ((context.ShowBorder && context.Border.UsePadding) || (context.HideBorder && !isLastCell) || (context.HideBorder && isLastCell && context.IsGrid && context.PadRightCell)) { var rightPadding = context.Columns[rightColumnIndex].Padding.GetRightSafe(); if (rightPadding > 0) { rowResult.Add(new Segment(new string(' ', rightPadding))); } } if (isLastCell && context.ShowBorder) { // Add right column edge var part = isFirstRow && context.ShowHeaders ? TableBorderPart.HeaderRight : TableBorderPart.CellRight; rowResult.Add(new Segment(context.Border.GetPart(part), context.BorderStyle)); } else if (context.ShowBorder) { // Add column separator // We should ALWAYS add separator after a cell, unless this is the last cell var part = isFirstRow && context.ShowHeaders ? TableBorderPart.HeaderSeparator : TableBorderPart.CellSeparator; rowResult.Add(new Segment(context.Border.GetPart(part), context.BorderStyle)); } } // Is the row larger than the allowed max width? if (Segment.CellCount(rowResult) > context.MaxWidth) { result.AddRange(Segment.Truncate(rowResult, context.MaxWidth)); } else { result.AddRange(rowResult); } result.Add(Segment.LineBreak); } // Show header separator? if (isFirstRow && context.ShowBorder && context.ShowHeaders && context.HasRows) { var separator = context.Border.GetColumnRow(TablePart.HeaderSeparator, columnWidths, context.Columns); result.Add(new Segment(separator, context.BorderStyle)); result.Add(Segment.LineBreak); } // Show row separator, if headers are hidden show separator after the first row if (context.Border.SupportsRowSeparator && context.ShowRowSeparators && (!isFirstRow || (isFirstRow && !context.ShowHeaders)) && !isLastRow) { var hasVisibleFootes = context is { ShowFooters: true, HasFooters: true }; var isNextLastLine = index == context.Rows.Count - 2; var isRenderingFooter = hasVisibleFootes && isNextLastLine; if (!isRenderingFooter) { var separator = context.Border.GetColumnRow(TablePart.RowSeparator, columnWidths, context.Columns); result.Add(new Segment(separator, context.BorderStyle)); result.Add(Segment.LineBreak); } } // Show bottom of footer? if (isLastRow && context.ShowBorder) { var separator = context.Border.GetColumnRow(TablePart.Bottom, columnWidths, context.Columns); if (!string.IsNullOrEmpty(separator)) { result.Add(new Segment(separator, context.BorderStyle)); result.Add(Segment.LineBreak); } } } result.AddRange(RenderAnnotation(context, context.Caption, _defaultCaptionStyle)); return result; } private static IEnumerable RenderAnnotation(TableRendererContext context, TableTitle? header, Style defaultStyle) { if (header == null) { return []; } var paragraph = new Markup(header.Text, header.Style ?? defaultStyle) .Justify(Justify.Center) .Overflow(Overflow.Ellipsis); // Render the paragraphs var segments = new List(); segments.AddRange(((IRenderable)paragraph).Render(context.Options, context.TableWidth)); segments.Add(Segment.LineBreak); return segments; } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableRendererContext.cs ================================================ namespace Spectre.Console; internal sealed class TableRendererContext : TableAccessor { private readonly Table _table; private readonly List _rows; public override IReadOnlyList Rows => _rows; public TableBorder Border { get; } public Style BorderStyle { get; } public bool ShowBorder { get; } public bool ShowRowSeparators { get; } public bool HasRows { get; } public bool HasFooters { get; } /// /// Gets the max width of the destination area. /// The table might take up less than this. /// public int MaxWidth { get; } /// /// Gets the width of the table. /// public int TableWidth { get; } public bool HideBorder => !ShowBorder; public bool ShowHeaders => _table.ShowHeaders; public bool ShowFooters => _table.ShowFooters; public bool IsGrid => _table.IsGrid; public bool PadRightCell => _table.PadRightCell; public TableTitle? Title => _table.Title; public TableTitle? Caption => _table.Caption; public TableRendererContext(Table table, RenderOptions options, IEnumerable rows, int tableWidth, int maxWidth) : base(table, options) { _table = table ?? throw new ArgumentNullException(nameof(table)); _rows = new List(rows ?? []); ShowBorder = _table.Border.Visible; HasRows = Rows.Any(row => !row.IsHeader && !row.IsFooter); HasFooters = Rows.Any(column => column.IsFooter); Border = table.Border.GetSafeBorder(!options.Unicode && table.UseSafeBorder); BorderStyle = table.BorderStyle ?? Style.Plain; ShowRowSeparators = table.ShowRowSeparators; TableWidth = tableWidth; MaxWidth = maxWidth; } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableRow.cs ================================================ namespace Spectre.Console; /// /// Represents a table row. /// public sealed class TableRow : IEnumerable { private readonly List _items; /// /// Gets the number of columns in the row. /// public int Count => _items.Count; internal bool IsHeader { get; } internal bool IsFooter { get; } /// /// Gets a row item at the specified table column index. /// /// The table column index. /// The row item at the specified table column index. public IRenderable this[int index] { get => _items[index]; } /// /// Initializes a new instance of the class. /// /// The row items. public TableRow(IEnumerable items) : this(items, false, false) { } private TableRow(IEnumerable items, bool isHeader, bool isFooter) { _items = new List(items ?? []); // Reject column spanning in header or footer rows if ((isHeader || isFooter) && _items.OfType().Any(cell => cell.ColumnSpan > 1)) { var rowType = isHeader ? "header" : "footer"; throw new InvalidOperationException($"Column spanning is not supported in table {rowType} rows."); } IsHeader = isHeader; IsFooter = isFooter; } internal static TableRow Header(IEnumerable items) { return new TableRow(items, true, false); } internal static TableRow Footer(IEnumerable items) { return new TableRow(items, false, true); } internal void Add(IRenderable item) { ArgumentNullException.ThrowIfNull(item); _items.Add(item); } /// public IEnumerator GetEnumerator() { return _items.GetEnumerator(); } /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableRowCollection.cs ================================================ namespace Spectre.Console; /// /// Represents a collection holding table rows. /// public sealed class TableRowCollection : IReadOnlyList { private readonly Table _table; private readonly IList _list; private readonly Lock _lock; /// TableRow IReadOnlyList.this[int index] { get { lock (_lock) { return _list[index]; } } } /// /// Gets the number of rows in the collection. /// public int Count { get { lock (_lock) { return _list.Count; } } } internal TableRowCollection(Table table) { _table = table ?? throw new ArgumentNullException(nameof(table)); _list = new List(); _lock = LockFactory.Create(); } /// /// Adds a new row. /// /// The columns that are part of the row to add. /// The index of the added item. public int Add(IEnumerable columns) { ArgumentNullException.ThrowIfNull(columns); lock (_lock) { var row = CreateRow(columns); _list.Add(row); return _list.Count - 1; } } /// /// Inserts a new row at the specified index. /// /// The index to insert the row at. /// The columns that are part of the row to insert. /// The index of the inserted item. public int Insert(int index, IEnumerable columns) { ArgumentNullException.ThrowIfNull(columns); lock (_lock) { var row = CreateRow(columns); _list.Insert(index, row); return _list.IndexOf(row); } } /// /// Update a table cell at the specified index. /// /// Index of cell row. /// index of cell column. /// The new cells details. public void Update(int row, int column, IRenderable cellData) { ArgumentNullException.ThrowIfNull(cellData); lock (_lock) { if (row < 0) { throw new IndexOutOfRangeException("Table row index cannot be negative."); } else if (row >= _list.Count) { throw new IndexOutOfRangeException("Table row index cannot exceed the number of rows in the table."); } var tableRow = _list.ElementAt(row); var currentRenderables = tableRow.ToList(); if (column < 0) { throw new IndexOutOfRangeException("Table column index cannot be negative."); } else if (column >= currentRenderables.Count) { throw new IndexOutOfRangeException("Table column index cannot exceed the number of rows in the table."); } currentRenderables.RemoveAt(column); currentRenderables.Insert(column, cellData); var newTableRow = new TableRow(currentRenderables); _list.RemoveAt(row); _list.Insert(row, newTableRow); } } /// /// Removes a row at the specified index. /// /// The index to remove a row at. public void RemoveAt(int index) { lock (_lock) { if (index < 0) { throw new IndexOutOfRangeException("Table row index cannot be negative."); } else if (index >= _list.Count) { throw new IndexOutOfRangeException("Table row index cannot exceed the number of rows in the table."); } _list.RemoveAt(index); } } /// /// Clears all rows. /// public void Clear() { lock (_lock) { _list.Clear(); } } /// public IEnumerator GetEnumerator() { lock (_lock) { var items = new TableRow[_list.Count]; _list.CopyTo(items, 0); return new TableRowEnumerator(items); } } /// IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); } private TableRow CreateRow(IEnumerable columns) { var row = new TableRow(columns); // Calculate total span considering TableCell instances var totalSpan = 0; for (var i = 0; i < row.Count; i++) { var cell = row[i]; if (cell is TableCell tableCell) { totalSpan += tableCell.ColumnSpan; } else { totalSpan++; } } if (totalSpan > _table.Columns.Count) { throw new InvalidOperationException($"The number of row columns (including spans) are greater than the number of table columns. Expected {_table.Columns.Count} but got {totalSpan}."); } // Need to add missing columns if (totalSpan < _table.Columns.Count) { var diff = _table.Columns.Count - totalSpan; Enumerable.Range(0, diff).ForEach(_ => row.Add(Text.Empty)); } return row; } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableRowEnumerator.cs ================================================ namespace Spectre.Console; internal sealed class TableRowEnumerator : IEnumerator { private readonly TableRow[] _items; private int _index; public TableRow Current => _items[_index]; object? IEnumerator.Current => _items[_index]; public TableRowEnumerator(TableRow[] items) { _items = items ?? throw new ArgumentNullException(nameof(items)); _index = -1; } public void Dispose() { } public bool MoveNext() { _index++; return _index < _items.Length; } public void Reset() { _index = -1; } } ================================================ FILE: src/Spectre.Console/Widgets/Table/TableTitle.cs ================================================ namespace Spectre.Console; /// /// Represents a table title such as a heading or footnote. /// public sealed class TableTitle { /// /// Gets the title text. /// public string Text { get; } /// /// Gets or sets the title style. /// public Style? Style { get; set; } /// /// Initializes a new instance of the class. /// /// The title text. /// The title style. public TableTitle(string text, Style? style = null) { Text = text ?? throw new ArgumentNullException(nameof(text)); Style = style; } /// /// Sets the title style. /// /// The title style. /// The same instance so that multiple calls can be chained. public TableTitle SetStyle(Style? style) { Style = style ?? Spectre.Console.Style.Plain; return this; } /// /// Sets the title style. /// /// The title style. /// The same instance so that multiple calls can be chained. public TableTitle SetStyle(string style) { ArgumentNullException.ThrowIfNull(style); Style = Spectre.Console.Style.Parse(style); return this; } } ================================================ FILE: src/Spectre.Console/Widgets/Text.cs ================================================ namespace Spectre.Console; /// /// A renderable piece of text. /// [DebuggerDisplay("{_text,nq}")] [SuppressMessage("Naming", "CA1724:Type names should not match namespaces")] public sealed class Text : Renderable, IHasJustification, IOverflowable { private readonly Paragraph _paragraph; /// /// Gets an empty instance. /// public static Text Empty { get; } = new Text(string.Empty); /// /// Gets an instance of containing a new line. /// public static Text NewLine { get; } = new Text(Environment.NewLine, Style.Plain); /// /// Initializes a new instance of the class. /// /// The text. /// The style of the text or if . public Text(string text, Style? style = null) { _paragraph = new Paragraph(text, style); } /// /// Gets or sets the text alignment. /// public Justify? Justification { get => _paragraph.Justification; set => _paragraph.Justification = value; } /// /// Gets or sets the text overflow strategy. /// public Overflow? Overflow { get => _paragraph.Overflow; set => _paragraph.Overflow = value; } /// /// Gets the character count. /// public int Length => _paragraph.Length; /// /// Gets the number of lines in the text. /// public int Lines => _paragraph.Lines; /// protected override Measurement Measure(RenderOptions options, int maxWidth) { return ((IRenderable)_paragraph).Measure(options, maxWidth); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { return ((IRenderable)_paragraph).Render(options, maxWidth); } } ================================================ FILE: src/Spectre.Console/Widgets/TextPath.cs ================================================ namespace Spectre.Console; /// /// Representation of a file system path. /// public sealed class TextPath : IRenderable, IHasJustification { private const string Ellipsis = "..."; private const string UnicodeEllipsis = "…"; private readonly string[] _parts; private readonly bool _rooted; private readonly bool _windows; /// /// Gets or sets the root style. /// public Style? RootStyle { get; set; } /// /// Gets or sets the separator style. /// public Style? SeparatorStyle { get; set; } /// /// Gets or sets the stem style. /// public Style? StemStyle { get; set; } /// /// Gets or sets the leaf style. /// public Style? LeafStyle { get; set; } /// /// Gets or sets the alignment. /// public Justify? Justification { get; set; } /// /// Initializes a new instance of the class. /// /// The path to render. public TextPath(string path) { // Normalize the path path ??= string.Empty; path = path.Replace('\\', '/'); path = path.TrimEnd('/').Trim(); // Get the distinct parts _parts = path.Split(['/'], StringSplitOptions.RemoveEmptyEntries); // Rooted Unix path? if (path.StartsWith("/", StringComparison.Ordinal)) { _rooted = true; _parts = new[] { "/" }.Concat(_parts).ToArray(); } else if (_parts.Length > 0 && _parts[0].EndsWith(":", StringComparison.Ordinal)) { // Rooted Windows path _rooted = true; _windows = true; } } /// public Measurement Measure(RenderOptions options, int maxWidth) { var fitted = Fit(options, maxWidth); var separatorCount = fitted.Length - 1; var length = fitted.Sum(f => f.Length) + separatorCount; return new Measurement( Math.Min(length, maxWidth), Math.Min(length, maxWidth)); } /// public IEnumerable Render(RenderOptions options, int maxWidth) { var rootStyle = RootStyle ?? Style.Plain; var separatorStyle = SeparatorStyle ?? Style.Plain; var stemStyle = StemStyle ?? Style.Plain; var leafStyle = LeafStyle ?? Style.Plain; var fitted = Fit(options, maxWidth); var parts = new List(); foreach (var (_, first, last, item) in fitted.Enumerate()) { // Leaf? if (last) { parts.Add(new Segment(item, leafStyle)); } else { if (first && _rooted) { // Root parts.Add(new Segment(item, rootStyle)); if (_windows) { // Windows root has a slash parts.Add(new Segment("/", separatorStyle)); } } else { // Normal path segment parts.Add(new Segment(item, stemStyle)); parts.Add(new Segment("/", separatorStyle)); } } } // Align the result Aligner.Align(parts, Justification, maxWidth); return parts; } private string[] Fit(RenderOptions options, int maxWidth) { // No parts? if (_parts.Length == 0) { return _parts; } // Will it fit as is? if (_parts.Sum(Cell.GetCellLength) + (_parts.Length - 1) <= maxWidth) { return _parts; } var ellipsis = options.Unicode ? UnicodeEllipsis : Ellipsis; var ellipsisLength = Cell.GetCellLength(ellipsis); if (_parts.Length >= 2) { var skip = _rooted ? 1 : 0; var separatorCount = _rooted ? 2 : 1; var rootLength = _rooted ? Cell.GetCellLength(_parts[0]) : 0; // Try popping parts until it fits var queue = new Queue(_parts.Skip(skip).Take(_parts.Length - separatorCount)); while (queue.Count > 0) { // Remove the first item queue.Dequeue(); // Get the current queue width in cells var queueWidth = rootLength // Root (if rooted) + ellipsisLength // Ellipsis + queue.Sum(Cell.GetCellLength) // Middle + Cell.GetCellLength(_parts.Last()) // Last + queue.Count + separatorCount; // Separators // Will it fit? if (maxWidth >= queueWidth) { var result = new List(); if (_rooted) { // Add the root result.Add(_parts[0]); } result.Add(ellipsis); result.AddRange(queue); result.Add(_parts.Last()); return result.ToArray(); } } } // Just trim the last part so it fits var last = _parts.Last(); var take = Math.Min(last.Length, Math.Max(0, maxWidth - ellipsisLength)); var start = Math.Max(0, last.Length - take); return [string.Concat(ellipsis, last.Substring(start, take))]; } } /// /// Contains extension methods for . /// public static class TextPathExtensions { /// /// Sets the separator style. /// /// The path. /// The separator style to set. /// The same instance so that multiple calls can be chained. public static TextPath SeparatorStyle(this TextPath obj, Style style) { ArgumentNullException.ThrowIfNull(obj); obj.SeparatorStyle = style; return obj; } /// /// Sets the separator color. /// /// The path. /// The separator color. /// The same instance so that multiple calls can be chained. public static TextPath SeparatorColor(this TextPath obj, Color color) { return SeparatorStyle(obj, new Style(foreground: color)); } /// /// Sets the root style. /// /// The path. /// The root style to set. /// The same instance so that multiple calls can be chained. public static TextPath RootStyle(this TextPath obj, Style style) { ArgumentNullException.ThrowIfNull(obj); obj.RootStyle = style; return obj; } /// /// Sets the root color. /// /// The path. /// The root color. /// The same instance so that multiple calls can be chained. public static TextPath RootColor(this TextPath obj, Color color) { return RootStyle(obj, new Style(foreground: color)); } /// /// Sets the stem style. /// /// The path. /// The stem style to set. /// The same instance so that multiple calls can be chained. public static TextPath StemStyle(this TextPath obj, Style style) { ArgumentNullException.ThrowIfNull(obj); obj.StemStyle = style; return obj; } /// /// Sets the stem color. /// /// The path. /// The stem color. /// The same instance so that multiple calls can be chained. public static TextPath StemColor(this TextPath obj, Color color) { return StemStyle(obj, new Style(foreground: color)); } /// /// Sets the leaf style. /// /// The path. /// The stem leaf to set. /// The same instance so that multiple calls can be chained. public static TextPath LeafStyle(this TextPath obj, Style style) { ArgumentNullException.ThrowIfNull(obj); obj.LeafStyle = style; return obj; } /// /// Sets the leaf color. /// /// The path. /// The leaf color. /// The same instance so that multiple calls can be chained. public static TextPath LeafColor(this TextPath obj, Color color) { return LeafStyle(obj, new Style(foreground: color)); } } ================================================ FILE: src/Spectre.Console/Widgets/Tree.cs ================================================ namespace Spectre.Console; /// /// Representation of non-circular tree data. /// Each node added to the tree may only be present in it a single time, in order to facilitate cycle detection. /// public sealed class Tree : Renderable, IHasTreeNodes { private readonly TreeNode _root; private bool _expanded = true; /// /// Gets or sets the tree style. /// public Style? Style { get; set; } /// /// Gets or sets the tree guide lines. /// public TreeGuide Guide { get; set; } = TreeGuide.Line; /// /// Gets the tree's child nodes. /// public List Nodes => _root.Nodes; /// /// Gets or sets a value indicating whether or not the tree is expanded or not. /// public bool Expanded { get => _expanded; set { _expanded = value; _root.Expand(value); } } /// /// Initializes a new instance of the class. /// /// The tree label. public Tree(IRenderable renderable) { _root = new TreeNode(renderable); } /// /// Initializes a new instance of the class. /// /// The tree label. public Tree(string label) { _root = new TreeNode(new Markup(label)); } /// protected override IEnumerable Render(RenderOptions options, int maxWidth) { var result = new List(); var visitedNodes = new HashSet(); var stack = new Stack>(); stack.Push(new Queue([_root])); var levels = new List(); levels.Add(GetGuide(options, TreeGuidePart.Continue)); while (stack.Count > 0) { var stackNode = stack.Pop(); if (stackNode.Count == 0) { levels.RemoveLast(); if (levels.Count > 0) { levels.AddOrReplaceLast(GetGuide(options, TreeGuidePart.Fork)); } continue; } var isLastChild = stackNode.Count == 1; var current = stackNode.Dequeue(); if (!visitedNodes.Add(current)) { throw new CircularTreeException("Cycle detected in tree - unable to render."); } stack.Push(stackNode); if (isLastChild) { levels.AddOrReplaceLast(GetGuide(options, TreeGuidePart.End)); } var prefix = levels.Skip(1).ToList(); var renderableLines = Segment.SplitLines(current.Renderable.Render(options, maxWidth - Segment.CellCount(prefix))); foreach (var (_, isFirstLine, _, line) in renderableLines.Enumerate()) { if (prefix.Count > 0) { result.AddRange(prefix.ToList()); } result.AddRange(line); result.Add(Segment.LineBreak); if (isFirstLine && prefix.Count > 0) { var part = isLastChild ? TreeGuidePart.Space : TreeGuidePart.Continue; prefix.AddOrReplaceLast(GetGuide(options, part)); } } if (current.Expanded && current.Nodes.Count > 0) { levels.AddOrReplaceLast(GetGuide(options, isLastChild ? TreeGuidePart.Space : TreeGuidePart.Continue)); levels.Add(GetGuide(options, current.Nodes.Count == 1 ? TreeGuidePart.End : TreeGuidePart.Fork)); stack.Push(new Queue(current.Nodes)); } } return result; } private Segment GetGuide(RenderOptions options, TreeGuidePart part) { var guide = Guide.GetSafeTreeGuide(safe: !options.Unicode); return new Segment(guide.GetPart(part), Style ?? Spectre.Console.Style.Plain); } } /// /// Contains extension methods for . /// public static class TreeExtensions { /// /// Sets the tree style. /// /// The tree. /// The tree style. /// The same instance so that multiple calls can be chained. public static Tree Style(this Tree tree, Style? style) { ArgumentNullException.ThrowIfNull(tree); tree.Style = style; return tree; } /// /// Sets the tree guide line appearance. /// /// The tree. /// The tree guide lines to use. /// The same instance so that multiple calls can be chained. public static Tree Guide(this Tree tree, TreeGuide guide) { ArgumentNullException.ThrowIfNull(tree); tree.Guide = guide; return tree; } } ================================================ FILE: src/Spectre.Console/Widgets/TreeNode.cs ================================================ namespace Spectre.Console; /// /// Represents a tree node. /// public sealed class TreeNode : IHasTreeNodes { internal IRenderable Renderable { get; } /// /// Gets the tree node's child nodes. /// public List Nodes { get; } = []; /// /// Gets or sets a value indicating whether or not the tree node is expanded or not. /// public bool Expanded { get; set; } = true; /// /// Initializes a new instance of the class. /// /// The tree node label. public TreeNode(IRenderable renderable) { Renderable = renderable; } } /// /// Contains extension methods for . /// public static class TreeNodeExtensions { /// /// Expands the tree. /// /// The tree node. /// The same instance so that multiple calls can be chained. public static TreeNode Expand(this TreeNode node) { return Expand(node, true); } /// /// Collapses the tree. /// /// The tree node. /// The same instance so that multiple calls can be chained. public static TreeNode Collapse(this TreeNode node) { return Expand(node, false); } /// /// Sets whether or not the tree node should be expanded. /// /// The tree node. /// Whether or not the tree node should be expanded. /// The same instance so that multiple calls can be chained. public static TreeNode Expand(this TreeNode node, bool expand) { ArgumentNullException.ThrowIfNull(node); node.Expanded = expand; return node; } } ================================================ FILE: src/Spectre.Console.Ansi/AnsiCapabilities.cs ================================================ namespace Spectre.Console; /// /// Represents ANSI capabilities. /// public class AnsiCapabilities : IReadOnlyAnsiCapabilities { /// /// Gets or sets the color system. /// public ColorSystem ColorSystem { get; set; } /// /// Gets or sets a value indicating whether or not /// the console supports VT/ANSI control codes. /// public bool Ansi { get; set; } /// /// Gets or sets a value indicating whether or not /// the console support links. /// public bool Links { get; set; } /// /// Gets or sets a value indicating whether /// or not the console supports alternate buffers. /// public bool AlternateBuffer { get; set; } /// /// Creates a instance from the provided arguments. /// /// The text writer to use. /// A instance. public static AnsiCapabilities Create(TextWriter writer) { return Create(writer, new AnsiWriterSettings()); } /// /// Creates a instance from the provided arguments. /// /// The text writer to use. /// The settings to use. /// A instance. public static AnsiCapabilities Create(TextWriter writer, AnsiWriterSettings settings) { ArgumentNullException.ThrowIfNull(writer); // Detect if the terminal support ANSI or not var (supportsAnsi, legacyConsole) = AnsiDetector.Detect(writer, settings.Ansi); // Get the color system var colorSystem = settings.ColorSystem == ColorSystemSupport.Detect ? ColorSystemDetector.Detect(supportsAnsi) : (ColorSystem)settings.ColorSystem; return new AnsiCapabilities { ColorSystem = colorSystem, Ansi = supportsAnsi, Links = supportsAnsi && !legacyConsole, AlternateBuffer = supportsAnsi && !legacyConsole, }; } } /// /// Represents read-only ANSI capabilities. /// public interface IReadOnlyAnsiCapabilities { /// /// Gets or sets the color system. /// public ColorSystem ColorSystem { get; } /// /// Gets or sets a value indicating whether or not /// the console supports VT/ANSI control codes. /// public bool Ansi { get; } /// /// Gets or sets a value indicating whether or not /// the console support links. /// public bool Links { get; } /// /// Gets or sets a value indicating whether /// or not the console supports alternate buffers. /// public bool AlternateBuffer { get; } } ================================================ FILE: src/Spectre.Console.Ansi/AnsiDetector.cs ================================================ using System.Text.RegularExpressions; namespace Spectre.Console; internal static class AnsiDetector { private static readonly Regex[] _regexes = [ new("^xterm"), // xterm, PuTTY, Mintty new("^rxvt"), // RXVT new("^eterm"), // Eterm new("^screen"), // GNU screen, tmux new("tmux"), // tmux new("^vt100"), // DEC VT series new("^vt102"), // DEC VT series new("^vt220"), // DEC VT series new("^vt320"), // DEC VT series new("ansi"), // ANSI new("scoansi"), // SCO ANSI new("cygwin"), // Cygwin, MinGW new("linux"), // Linux console new("konsole"), // Konsole new("bvterm"), // Bitvise SSH Client new("^st-256color"), // Suckless Simple Terminal, st new("alacritty") // Alacritty ]; public static (bool Ansi, bool Legacy) Detect(TextWriter buffer, AnsiSupport ansi) { return Detect( buffer, ansi, System.Console.IsOutputRedirected, System.Console.IsErrorRedirected); } internal static (bool Ansi, bool Legacy) Detect( TextWriter buffer, AnsiSupport ansi, bool isOutputRedirected, bool isErrorRedirected) { var supportsAnsi = ansi == AnsiSupport.Yes; var legacyConsole = false; if (ansi == AnsiSupport.Detect) { if (buffer.IsStandardOut() && isOutputRedirected) { return (false, false); } if (buffer.IsStandardError() && isErrorRedirected) { return (false, false); } (supportsAnsi, legacyConsole) = AnsiDetector.Detect(buffer.IsStandardError(), true); return (supportsAnsi, legacyConsole); } if (buffer.IsStandardOut() || buffer.IsStandardError()) { // Are we running on Windows? if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // Try detecting whether or not this is a legacy console (_, legacyConsole) = AnsiDetector.Detect(buffer.IsStandardError(), false); } } return (supportsAnsi, legacyConsole); } private static (bool SupportsAnsi, bool LegacyConsole) Detect(bool stdError, bool upgrade) { // Running on Windows? if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // Running under ConEmu? var conEmu = Environment.GetEnvironmentVariable("ConEmuANSI"); if (!string.IsNullOrEmpty(conEmu) && conEmu.Equals("On", StringComparison.OrdinalIgnoreCase)) { return (true, false); } var supportsAnsi = Windows.SupportsAnsi(upgrade, stdError, out var legacyConsole); return (supportsAnsi, legacyConsole); } return DetectFromTerm(); } private static (bool SupportsAnsi, bool LegacyConsole) DetectFromTerm() { // Check if the terminal is of type ANSI/VT100/xterm compatible. var term = Environment.GetEnvironmentVariable("TERM"); if (!string.IsNullOrWhiteSpace(term)) { if (_regexes.Any(regex => regex.IsMatch(term))) { return (true, false); } } return (false, true); } private static class Windows { [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1310:Field names should not contain underscore")] private const int STD_OUTPUT_HANDLE = -11; [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1310:Field names should not contain underscore")] private const int STD_ERROR_HANDLE = -12; [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1310:Field names should not contain underscore")] private const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 0x0004; [SuppressMessage("StyleCop.CSharp.NamingRules", "SA1310:Field names should not contain underscore")] private const uint DISABLE_NEWLINE_AUTO_RETURN = 0x0008; [DllImport("kernel32.dll")] private static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); [DllImport("kernel32.dll")] private static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); [DllImport("kernel32.dll", SetLastError = true)] private static extern IntPtr GetStdHandle(int nStdHandle); [DllImport("kernel32.dll")] public static extern uint GetLastError(); public static bool SupportsAnsi(bool upgrade, bool stdError, out bool isLegacy) { isLegacy = false; try { var @out = GetStdHandle(stdError ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE); if (!GetConsoleMode(@out, out var mode)) { // Could not get console mode, try TERM (set in cygwin, WSL-Shell). var (ansiFromTerm, legacyFromTerm) = DetectFromTerm(); isLegacy = ansiFromTerm ? legacyFromTerm : isLegacy; return ansiFromTerm; } if ((mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING) == 0) { isLegacy = true; if (!upgrade) { return false; } // Try enable ANSI support. mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING | DISABLE_NEWLINE_AUTO_RETURN; if (!SetConsoleMode(@out, mode)) { // Enabling failed. return false; } isLegacy = false; } return true; } catch { // All we know here is that we don't support ANSI. return false; } } } } ================================================ FILE: src/Spectre.Console.Ansi/AnsiMarkup.cs ================================================ namespace Spectre.Console; /// /// Utility used for working with markup text. /// public sealed class AnsiMarkup { private readonly AnsiWriter _writer; /// /// Initializes a new instance of the class. /// /// The ANSI writer to use for writing. public AnsiMarkup(AnsiWriter writer) { _writer = writer ?? throw new ArgumentNullException(nameof(writer)); } /// /// Outputs the specified markup. /// /// The markup to write. /// The base style to use during parsing. public void Write(string markup, Style? style = null) { foreach (var segment in Parse(markup, style)) { _writer.Write(segment.Text, segment.Style, segment.Link); } } /// /// Outputs the specified markup, followed by the current line terminator /// /// The markup to write. public void WriteLine(string markup) { Write(markup); _writer.WriteLine(); } /// /// Parses the specified markup text into segments that can be processed. /// /// The markup to parse. /// The base style to use when parsing. /// One or more segments that represents the parsed markup. public static IEnumerable Parse(string markup, Style? style = null) { ArgumentNullException.ThrowIfNull(markup); style ??= Style.Plain; using var tokenizer = new MarkupTokenizer(markup); var result = new List(); var stack = new Stack