Compare commits

...

475 Commits
0.39.0 ... main

Author SHA1 Message Date
nsnail
a46321c06b Support command description localization
eg.
 [CommandOption("-a|--args")]
 [Description(nameof(Str.GitArgs))]
 [Localization(typeof(Str))]
 public string Args { get; set; }

The program will go to the autogenerated class "Str.designer.cs" of the Resx file,  to looking for local value of the the resource symbol "GitArgs" , instead of displaying the original: "GitArgs"
2024-11-29 14:52:42 +08:00
Tom Deseyn
29ab313bb9
Async overloads for AnsiConsole Prompt/Ask/Confirm. (#1194)
* Add async overloads for Prompt/Ask/Confirm.

* Added unit test coverage - AskAsync, ConfirmAsync

* Reordered methods to group non-async/async of the same tests together

---------

Co-authored-by: Frank Ray <52075808+FrankRay78@users.noreply.github.com>
2024-11-28 10:56:19 +00:00
Phil Scott
92daeb739d Update Docs SDK version to 9.0.100, disable NuGetAudit temporarily, and upgrade Scriban to version 5.12.0 for generator 2024-11-23 21:05:36 +01:00
Phil Scott
43e9669395 Update documentation packages to latest versions
* HighlightService was modified to support GetClassifiedSpansAsync method
* Updated Program.cs to pull in the proper location of the Json and ImageSharp extension projects
* Statiq must have changed how they are doing xrefs, so I adjusted those to be more specific with a few links
2024-11-23 14:48:46 +01:00
Phil Scott
ab8384acf6 Update PolySharp to version 1.15.0 and remove Nullable package references 2024-11-23 14:47:01 +01:00
Phil Scott
b2689be3ed Enhance ExceptionFormatter for AOT compatibility by adding fallback handling for stack frames. 2024-11-22 22:55:01 +01:00
Phil Scott
835143d95f Add Native AOT support documentation and update project files for AOT compatibility 2024-11-22 22:55:01 +01:00
Phil Scott
8f2a859087 Fallback to using GetConverter if GetIntrinsicConverter doesn't find one. 2024-11-22 22:55:01 +01:00
Phil Scott
2be8e8da4e Adds fallback for ExceptionFormatter in AOT 2024-11-22 22:55:01 +01:00
Phil Scott
2a8810affd Explicitly marks Spectre.Console.Cli as not trimmable and not appropriate for AOT scenarios. Additionally adds a warning to CommandApp for users who may try it. 2024-11-22 22:55:01 +01:00
Phil Scott
e1d21e7e61 Adding polysharp properly 2024-11-22 22:55:01 +01:00
Phil Scott
c7c3ebdf57 Fix assembly name retrieval for FSharp.Core in TypeNameHelper to work better in AOT scenarios 2024-11-22 22:55:01 +01:00
Phil Scott
b67af32423 Add RequiresDynamicCode attribute to exception formatter to indicate incompatability with AOT 2024-11-22 22:55:01 +01:00
Phil Scott
10773a5625 Refactor enum value retrieval to use EnumUtils for better compatibility with NetStandard 2.0 and AOT 2024-11-22 22:55:01 +01:00
Phil Scott
4802751357 Add AOT compatibility and PolySharp package support 2024-11-22 22:55:01 +01:00
Frank Ray
4515d89705
ProgressTask.GetPercentage() returns 100 when max value is 0 (#1694) 2024-11-22 12:44:00 +01:00
Patrik Svensson
be45494d6e
Merge pull request #1691 from phil-scott-78/emoji-perf 2024-11-21 00:30:24 +01:00
Phil Scott
69689d2ba1 Changes Emoji dictionary to OrdinalIgnoreCase for performance
This code is ran on startup, and instantiating a new InvariantCultureIgnoreCase was taking up 11ms, which was half the time in AOT.
2024-11-20 17:55:33 -05:00
Tim Pilius
aa9e5c48c6
Adding TransferSpeedColumn configuration to display bits/bytes + binary/decimal prefixes (#904)
* Adding configuration to TransferSpeedColumn to be able to display in both bytes/bits, as well as using binary/decimal prefix definitions.

---------

Co-authored-by: Frank Ray <52075808+FrankRay78@users.noreply.github.com>
2024-11-19 15:41:49 +00:00
PascalSenn
8d06daf355
Fixed typo in Segment description (#1687) 2024-11-19 06:09:22 +01:00
Mattias Karlsson
cecfdc386c
Fix typos (#1684) 2024-11-13 15:00:21 +01:00
Patrik Svensson
375a708c43
Add net9.0 support, remove legacy TFM:s (#1682)
* Update .NET SDK to 9.0.100
* Remove net6.0
* Remove net7.0
* Update dependencies
* Install correct .NET SDK:s in GitHub Actions
2024-11-13 14:54:01 +01:00
Jonathan Sheely
574ead6d46
Added hex color conversion (#1432)
* Added hex color conversion

---------

Co-authored-by: Frank Ray <52075808+FrankRay78@users.noreply.github.com>
Co-authored-by: Nils Andresen <nils@nils-andresen.de>
2024-11-13 13:35:26 +01:00
BlazeFace
a87277e859
Adding Enricher for Azure Pipelines (#1675) 2024-11-04 16:30:35 +01:00
Patrik Svensson
fdc03f2081
Merge pull request #1514 from BlazeFace/blz/issues/1390 2024-10-30 01:36:05 +01:00
BlazeFace
3eb620a44e Fix typo 2024-10-26 07:27:31 -07:00
BlazeFace
bc88da8056 Added last file and used fluent style, relocated test 2024-10-26 07:25:38 -07:00
BlazeFace
00b9aecb4f Add new test files 2024-10-26 07:18:52 -07:00
BlazeFace
444dbed259 Merge remote-tracking branch 'upstream/main' into blz/issues/1390
# Conflicts:
#	src/Tests/Spectre.Console.Tests/Expectations/Widgets/Layout/Render_Layout_With_Three_And_One_Columns.Output.verified.txt
2024-10-25 17:47:02 -07:00
Arman Ossi Loko
a32dc8030b Fixed docs examples URLs redirecting to the examples repository 2024-10-18 11:33:23 +02:00
renovate[bot]
75547b2436 chore: Update dependency Verify.Xunit to 26.4.5 2024-09-14 14:47:38 +02:00
renovate[bot]
22d1cbe01f chore: Update dependency Roslynator.Analyzers to 4.12.5 2024-09-14 14:36:40 +02:00
Patrik Svensson
7f8ed509bb Fix strange sentence in docs 2024-09-14 14:15:32 +02:00
Cédric Luthi
c70a8b8fc5 Improve exception if a (multi)selection prompt is used incorrectly
Before this commit, the selection prompt would throw an `InvalidOperationException` (Sequence contains no elements) and the multi selection prompt would throw an `ArgumentOutOfRangeException` (Index was out of range. Must be non-negative and less than the size of the collection.)

Both would occur because the prompts were never meant to be empty.
2024-09-11 10:16:21 +02:00
renovate[bot]
b470af11f7
chore: Update dependency Microsoft.NET.Test.Sdk to 17.11.1 (#1630)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 09:00:27 +02:00
renovate[bot]
23b160a3f5
chore: Update dependency Verify.Xunit to 26.4.4 (#1624)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 08:57:27 +02:00
renovate[bot]
1345a6347a
chore: Update dependency MinVer to v6 (#1629)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-09-11 08:52:25 +02:00
Davide Piccinini
78f3f80b17
Update documentation: add example for the Text Prompt usage (#1636) 2024-09-10 09:03:20 +02:00
Davide Piccinini
a55b80220d
Enhance the style of the checkboxes for multi-selection (#1244)
* Enhance the checkboxes' style for multi-selection by applying the selected style, if available, to the checkboxes currently selected.
2024-09-09 16:35:01 +02:00
Davide Piccinini
f8a4b2271d Add unit test to ensure code coverage 2024-09-09 14:28:13 +02:00
Davide Piccinini
dba7ad0875 Fix SA1513 line 38 Tree.cs 2024-09-09 14:28:13 +02:00
Davide Piccinini
322ed2efbb Fix error SA1300 in full property creation 2024-09-09 14:28:13 +02:00
Davide Piccinini
156d254208 Fix issue 1153 on expanded tree 2024-09-09 14:28:13 +02:00
d.piccinini
3437130bf0 Removed blank line 2024-09-09 10:21:00 +02:00
d.piccinini
32384f7b8d Add custom highligh style for single calendar event 2024-09-09 10:21:00 +02:00
Cédric Luthi
32361d3f15
Cleanup prompt tests (#1635)
* Move Should_Search_In_Remapped_Result into the SelectionPromptTests class where it belongs
* Use file sealed class for CustomItem, like it's done with CustomSelectionItem in the selection prompt tests
2024-09-07 15:19:55 +01:00
Daniel Cazzulino
b9d2d2df6d Add spanish translation for help strings 2024-09-06 20:36:30 +02:00
Daniel Cazzulino
8e44a83737 Simplify InternalsVisibleTo
If the $(PublicKey) property is used, the SDK targets will automatically use it for the assembly attributes.

See https://github.com/dotnet/sdk/pull/3439

Simplifies https://github.com/spectreconsole/spectre.console/pull/1623
2024-09-06 20:31:18 +02:00
Patrik Svensson
fd69ad0b01 Fix search bug in prompt related to custom item types
Closes #1626
2024-09-03 00:46:18 +02:00
Kirill Osenkov
753894de94 Bump Spectre.Verify.Extensions to strong-named version
Remove NoWarn now that Spectre.Verify.Extensions is strong-named
2024-09-02 02:49:21 +02:00
renovate[bot]
dc2cb40b79 chore: Update rickstaa/top-issues-action action to v1.3.101 2024-08-30 09:40:24 +02:00
renovate[bot]
511f798f0f chore: Update dependency Microsoft.NET.Test.Sdk to 17.11.0 2024-08-30 09:34:15 +02:00
renovate[bot]
2081c0fd9a chore: Update dependency dotnet-sdk to v8.0.401 2024-08-30 09:30:53 +02:00
Patrik Svensson
96512f353f Fix regression in Razor syntax 2024-08-30 09:18:07 +02:00
Patrik Svensson
56feea11a1 Fix the workflow. Third time the charm? 2024-08-30 09:01:52 +02:00
Patrik Svensson
45c24055fa (Hopefully) fix workflow 2024-08-30 09:01:03 +02:00
Patrik Svensson
d56139756c Lock SDK for documentation for now 2024-08-30 08:59:15 +02:00
Patrik Svensson
7af1eedca7
Merge pull request #1623 from KirillOsenkov/dev/kirillo/snk 2024-08-30 07:45:19 +02:00
Kirill Osenkov
6116af3844 Strong name the assemblies 2024-08-29 16:52:55 -07:00
Patrik Svensson
2cc6c457ad
Merge pull request #1603 from spectreconsole/renovate/verify.xunit-26.x
chore: Update dependency Verify.Xunit to v26.2.0
2024-08-10 13:07:40 +02:00
renovate[bot]
f02b46107e
chore: Update dependency Verify.Xunit to v26.2.0 2024-08-10 10:41:25 +00:00
Patrik Svensson
42fd801876 Preparations for the 1.0 release
* Less cluttered solution layout.
* Move examples to a repository of its own.
* Move Roslyn analyzer to a repository of its own.
* Enable central package management.
* Clean up csproj files.
* Add README file to NuGet packages.
2024-08-06 15:38:28 +02:00
tonwin618
bb72b44d60 Delete based on character width when pressing Backspace. 2024-08-01 11:07:16 +02:00
ymqn
d79e6adc5f Updated test expectations to match changes in HtmlEncoder 2024-07-25 23:13:06 +02:00
ymqn
64b9ef582d Fixed incorrect decoration check from Bold to Italic in HtmlEncoder.BuildCss 2024-07-25 23:13:06 +02:00
renovate[bot]
a19c84e25a chore: Update dependency SixLabors.ImageSharp to v3.1.5 [SECURITY] 2024-07-22 19:50:33 +02:00
Jan Klass
b61fff042b Make method reference to Markup.Escape more obvious
best-practices refers and links to the `Markup.Escape` method but labeled it `EscapeMarkup`.

I got quite confused trying to find EscapeMarkup. Using the typical *class dot method* pattern seems preferable. It also matches what you write in code.
2024-06-23 14:29:25 +02:00
Jan Klass
ca441dbe7a Fix outdated issue label reference 'up for grabs' -> 'good first issue' 2024-06-23 14:28:52 +02:00
Jan Klass
f6bcf67cbe Update MSDN link to learn.microsoft.com 2024-06-23 14:27:33 +02:00
Daniel Cazzulino
5c87d7fa04 Allow using -? as a shorthand for -h
Given that it's quite a common switch and extremely unlikely to be already in use for something else, we can just consider it to be the same as having entered `-h` as an arg.

This adds the `?` as a valid option character name.

Fixes #1547
2024-05-29 08:38:55 +02:00
renovate[bot]
0e2ed511a5 chore: Update dependency Microsoft.NET.Test.Sdk to v17.10.0 2024-05-22 18:18:50 +02:00
Mattias Karlsson
7b13148773 Trim trailing comma in settings 2024-05-17 16:51:45 +02:00
renovate[bot]
e5a6459c52 chore: Update rickstaa/top-issues-action action to v1.3.100 2024-04-27 16:43:19 +02:00
renovate[bot]
68b28b57f2 chore: Update dependency Roslynator.Analyzers to v4.12.2 2024-04-27 16:42:58 +02:00
renovate[bot]
43b5ac99f9 chore: Update dependency dotnet-sdk to v8.0.204 2024-04-27 11:34:51 +02:00
Sean Fausett
b1b50a21f7 Remove redundant explain settings ctor 2024-04-27 07:41:08 +02:00
Patrik Svensson
5d4b2c88e5 Add extension method to use automatic application version 2024-04-25 20:28:13 +02:00
Patrik Svensson
3acc90e47c Make -v|--version opt-in
We added an automatic version option in 0.49. We did this with good
intentions, but forgot that people might already use --version
as an option for a root command.

This commit makes -v|--version completely opt-in.
2024-04-25 20:28:13 +02:00
Patrik Svensson
88515b7d7f Add Verify.Tool dotnet tool 2024-04-25 20:28:13 +02:00
Patrik Svensson
c5e11626b5 Add blog post for 0.49 release 2024-04-23 15:18:52 +02:00
Patrik Svensson
2ead177404 Update social card to show .NET 8.0 2024-04-23 15:18:42 +02:00
Patrik Svensson
71f762f646 Add token representation to remaining arguments
Before, when adding parsed information to the IRemainingArguments.Parsed,
we used the name of the parsed option ('foo') instead of it's
representation ('--foo'). This commit fixes that.
2024-04-23 14:10:04 +02:00
Patrik Svensson
95bff47b85 Expose raw arguments on the command context 2024-04-20 22:17:31 +02:00
renovate[bot]
de04619f88 chore: Update dependency Roslynator.Analyzers to v4.12.1 2024-04-17 09:53:53 +02:00
Frank Ray
ecdfdd4b85
Please upvote 👍 if you are interested in it (#1491) 2024-04-16 08:43:29 +01:00
Frank Ray
a893a9601e
Top Issues GitHub Action (#1488) 2024-04-14 12:47:55 +01:00
BlazeFace
d52d14e848 Undo debug change and add method group 2024-04-13 17:23:26 -07:00
BlazeFace
a62e79992b Undo debug changes 2024-04-13 17:20:12 -07:00
BlazeFace
4f22f5b7c3 Add Reference File 2024-04-13 17:19:19 -07:00
BlazeFace
ff7282ecb8 Adding test and update render to fix issue with rendering separator when headers are hidden fixing issue 1391. 2024-04-14 02:05:13 +02:00
BlazeFace
eb38f76a6a
Fixing #1507 AddDelegate uses an abstract type when used in a branch (#1509) 2024-04-13 13:40:12 +01:00
BlazeFace
20a2f727f7 Updating test and Ratio calculation 2024-04-09 06:03:45 -07:00
Phil Scott
fc0b553a4a Revert "Fixed render issue where writeline inside status caused corrupt output #415 #694"
This reverts commit 71a5d830671220e601e4e6ab4d4c352ae0e0a64a.

The commit introduced major flickering when working with LiveRenderables

Fixes #1466
2024-04-01 19:47:20 +02:00
Yennefer
1a3249cdae
Improve XmlDoc output (#1503)
* Add command description and examples in XML Output

Closes #1115
2024-03-29 20:30:59 +01:00
Frank Ray
43f9ae92ad Pipe character for listing options - Fully implemented and tested. 2024-03-18 16:31:55 +01:00
Gerardo Grignoli
e66d3aab2e
Added NoStackTrace to ExceptionFormats (#1489) 2024-03-08 15:26:45 +00:00
Tom Longhurst
d921ac6f02
Positioned Progress Tasks - Before or After Other Tasks (#1250) 2024-03-07 08:38:59 +00:00
renovate[bot]
5acd83a3ef chore: Update dependency SixLabors.ImageSharp to v3.1.3 2024-03-05 08:05:38 +01:00
Stuart Lang
397b742bec
Add selection orompt Search (#1289)
* Add selection prompt search as you type

* Fix small bug

* Simplify

* Simplify

* Remove spacebar as a selection prompt submit key

* Trigger CI

* Update src/Spectre.Console/Prompts/SelectionPrompt.cs

Co-authored-by: Martin Costello <martin@martincostello.com>

* Simplifty Mask method

* Handle multi-selection prompt better

* Update API naming

* Address feedback

* Add some tests

* Remove whitespace

* Improve search and highlighting

* Add test case for previous issue

* Add extra test case

* Make prompt searchable

---------

Co-authored-by: Martin Costello <martin@martincostello.com>
Co-authored-by: Patrik Svensson <patrik@patriksvensson.se>
2024-02-25 12:57:27 +01:00
Martin Costello
d30b08201d Remove [DebuggerDisplay] from Paragraph
The `_text` field no longer exists, so hovering over instances in the debugger just shows an error message.
2024-02-23 14:25:32 +01:00
renovate[bot]
8da05bcc17 chore: Update dependency Roslynator.Analyzers to v4.11.0 2024-02-19 18:31:54 +01:00
renovate[bot]
badcd642ec chore: Update dependency dotnet-example to v3.1.0 2024-02-18 21:20:34 +01:00
Patrik Svensson
fde9ee04cf Automatically register command settings
Closes #428
2024-02-15 21:33:51 +01:00
renovate[bot]
b6e0b2389a chore: Update dependency Verify.Xunit to v23.2.0 2024-02-15 07:45:54 +01:00
renovate[bot]
3f5e8aabf5 chore: Update dependency dotnet-sdk to v8.0.200 2024-02-14 10:54:08 +01:00
renovate[bot]
ead874e6b2 chore: Update dependency dotnet-example to v3 2024-02-13 10:07:55 +01:00
Patrik Svensson
e13410861d Update dependencies to latest version 2024-02-13 09:34:00 +01:00
Daniel Weber
bf3b91a535 Don't erase the prompt text when backspacing on a secret prompt with a null mask. 2024-02-13 09:01:24 +01:00
Daniel Weber
72704529c5 Delete [UsesVerify] which has become obsolete through the latest update. 2024-02-13 08:53:16 +01:00
Patrik Svensson
b21e07ea94 Update dependencies
* Add support for C# 12
* Run all tests on all major .NET SDKs
* Only build on Ubuntu
* Do not build docs for pull requests
* Add Cédric Luthi, and Frank Ray to authors
* Drop netstandard2.0 for ImageSharp plugin
2024-01-31 20:51:49 +01:00
Jonathan Sheely
703d653ec5
Adds ValueFormatter to ProgressBar 2024-01-31 17:37:05 +01:00
Caelan Sayler
71631b248a
Fix potential deadlock when cancelling prompts (#1439) 2024-01-31 12:02:01 +01:00
Tony Knight
63c22575ea
Direct contributors to the current CONTRIBUTING.md (#1435) 2024-01-22 23:15:04 +01:00
Frank Ray
9cc888e5ad
Make HelpProvider colors configurable (#1408) 2024-01-18 15:31:28 +01:00
Frank Ray
d5b4621233 Fully addresses review comments 2024-01-15 19:22:34 +01:00
Frank Ray
cee97821d6 Fix stylecop warning 2024-01-15 19:22:34 +01:00
Frank Ray
55c763a5c2 Completed 2024-01-15 19:22:34 +01:00
Frank Ray
d03c10623c Unit test to reproduce the -v/--version bug 2024-01-15 19:22:34 +01:00
Donovan Brown
5a52c1f277 Updated typo in commandApp.md
There was a sentence where the word `commits` should have been `commands`.
2024-01-13 18:58:32 +01:00
Nils Andresen
544e6a92df
Added the ITypeResolver to the ExceptionHandler (#1411) 2024-01-06 23:34:02 +00:00
Nils Andresen
a94bc15746
Add the possibility to register multiple interceptors (#1412)
Having the interceptors registered with the ITypeRegistrar also enables the usage of ITypeResolver in interceptors.
2024-01-06 22:28:20 +00:00
Chet Husk
e7ce6a69b7 Allow specifying a property to ignore the use of build-time packages for versioning and analysis 2024-01-03 21:45:16 +01:00
Patrik Svensson
7cf7e84dd8 Remove mandelbrot example due to conflicting license
Closes #1423
Closes #1424
2024-01-03 21:31:16 +01:00
Nils Andresen
6f1f29967d (#1363) fix rendering of ListPrompt for odd pageSizes 2024-01-01 10:19:09 +01:00
Nils Andresen
006da0f9ea (#971) added spectre.console.cli to quick-start. 2024-01-01 10:17:59 +01:00
Nils Andresen
c62f79eded Bump CodeAnalyses references
So we can benefit from roslyn issue 69309
and have consistent EOL sequences, even on
auto-generated using statements.
2023-11-28 00:14:54 +01:00
Nils Andresen
1d19079913 add last commit to .git-blame-ignore-revs 2023-11-28 00:14:54 +01:00
Nils Andresen
44300c871f fixed line-endings 2023-11-28 00:14:54 +01:00
Nils Andresen
989c0b9904 added a .gitattributes file
to force lf checkouts on windows
2023-11-28 00:14:54 +01:00
Patrik Svensson
cb52eb63ce Add blog post for 0.48 2023-11-22 22:13:48 +01:00
Patrik Svensson
7397169a27 Update Cake to 4.0.0 2023-11-20 13:14:40 +01:00
Patrik Svensson
ffdb47d77f Build generator as part of build 2023-11-20 13:14:40 +01:00
Patrik Svensson
383bee0e3e Do not push packages to GitHub 2023-11-19 12:18:22 +01:00
Patrik Svensson
4d6541dd14 Add back net7.0 TFM for tests 2023-11-19 12:18:22 +01:00
Patrik Svensson
b1e0896a0d Add net8.0 support 2023-11-14 22:24:53 +01:00
Will Baldoumas
e07ccd9f66
Allow Confirmation Prompt Styling (#1210)
* Allow Confirmation Prompt Styling

* Remove style null check

Co-authored-by: Cédric Luthi <cedric.luthi@gmail.com>

* Remove style null coalesce

Co-authored-by: Cédric Luthi <cedric.luthi@gmail.com>

* Update comment

Co-authored-by: Cédric Luthi <cedric.luthi@gmail.com>

* Remove style null check

Co-authored-by: Cédric Luthi <cedric.luthi@gmail.com>

* Update comment

Co-authored-by: Cédric Luthi <cedric.luthi@gmail.com>

* Remove style null coalesce

Co-authored-by: Cédric Luthi <cedric.luthi@gmail.com>

---------

Co-authored-by: Cédric Luthi <cedric.luthi@gmail.com>
2023-11-13 18:23:09 +01:00
Frank Ray
250b1f4c9c
Add localization support to help provider (#1349)
Closes #1349
2023-11-11 00:22:52 +01:00
Nils Andresen
023c77ff09 fixed the build-errors
All of which I introduced earlier.
2023-11-11 00:09:08 +01:00
Nils Andresen
dc402220f2 (#1313) fixed errors in FakeTypeRegistrar and FakeTypeResolver
to make the unit tests pass.
2023-11-11 00:09:08 +01:00
Nils Andresen
c448d0d5f6 (#1313) Add TypeRegistrarBaseTests for the FakeTypeRegistrar
So it also works according to our assumptions.
2023-11-11 00:09:08 +01:00
Nils Andresen
3da367f29f (#1313) fix mixing of Registrations
i.e. combining Register, RegisterInstance and RegisterLazy
2023-11-11 00:09:08 +01:00
Nils Andresen
ead7115cbe (#1313) Add new test to TypeRegistrarBaseTests
to assert the assumptions we're making in the code.
2023-11-11 00:09:08 +01:00
Nils Andresen
1fd028942f (#1313) removed the default registration of the IHelpProvider 2023-11-11 00:09:08 +01:00
Cédric Luthi
4219bbbf61 Allow passing a nullable style in DefaultValueStyle() and ChoicesStyle()
This will allow to slightly simplify the implementation of #1210

See also related discussion on https://github.com/spectreconsole/spectre.console/pull/1349#discussion_r1388385384
2023-11-10 08:01:18 +01:00
Cédric Luthi
29a43686d4 Fix AnsiConsoleOutput safe height
The safe height (introduced in 3e2eea730bf0f6fe4a5e336faa312b526d351079) would be 80 (the value of the safe width) instead of 24.

Removing the explicit `defaultValue` parameter ensures that the correct constants are used, i.e. Constants.DefaultTerminalWidth and Constants.DefaultTerminalHeight.
2023-11-09 12:11:56 +01:00
Patrik Svensson
63b940cf0e
Merge pull request #1338 from nils-a/feature/GH-1188 2023-10-19 11:12:09 +02:00
Nils Andresen
bbf58ee814
(#1188) Rows measure greedy 2023-10-19 07:46:12 +02:00
Patrik Svensson
e2a674815d
Merge pull request #1318 from nils-a/feature/GH-1317 2023-09-27 08:57:52 +02:00
Nils Andresen
343b98944d
added a minimal PR template 2023-09-27 08:28:08 +02:00
Andrew Rathbun
2bbb7c1ab6
Update Showcase.csproj - minor typo (#1315) 2023-09-23 15:55:56 +02:00
Cédric Luthi
5296e56b1c
Fix DefaultValue for FileInfo and DirectoryInfo (#1238)
Commit d3f4f5f208ee76a22ff39c13df4d150712685f5f introduced automatic conversion to FileInfo and DirectoryInfo but failed to properly handle the conversion if the value comes from the [DefaultValue] attribute.

Using both `var (converter, stringConstructor) = GetConverter(...)` and `var (converter, _) = GetConverter(...)` should have been a red flag!
2023-09-21 12:05:42 +01:00
Patrik Svensson
943c045fab
Fixes TextPath rendering bugs (#1308)
* Do not emit line break when rendering
* Don't be greedy when measuring.
* Fix a condition that decides if the path fits in the allotted space.

Closes #1307
2023-09-18 08:04:57 +02:00
Fraser Waters
2af3f7faeb
Add an example showing the decorations off (#1191) 2023-09-16 23:08:52 +02:00
Phil Scott
ed9e198d60
Progress bar header and footer (#1262) 2023-09-16 22:39:43 +02:00
Patrik Svensson
3bee7212b7
Merge pull request #1303 from nils-a/feature/GH-684 2023-09-16 19:37:00 +02:00
Patrik Svensson
c82d8c4523
Add option to show separator between table rows (#1304)
* Add option to show separator between table rows
* Panels should show header if borders are not shown

Closes #835
2023-09-16 18:49:12 +02:00
Nils Andresen
bef21e8a21
(#684) Enable setting the color of the values in a BreakdownChart 2023-09-15 20:12:06 +02:00
Ola Bäcker
037e109699
Fix figlet centering possibly throwing due to negative size (#1302) 2023-09-14 19:50:12 +02:00
Nils Andresen
f7befacd79
(#644) Specified settings for the argument vector (#1301) 2023-09-13 09:06:25 +02:00
Fraser Waters
cec5fb4595
Render tables with zero-width columns (#1197)
Fixes https://github.com/spectreconsole/spectre.console/issues/361
2023-09-12 15:46:25 +02:00
Nils Andresen
9c86391fb6
(#1297) change all SetErrorHandler to SetExceptionHandler (#1298) 2023-09-12 13:57:02 +02:00
Nils Andresen
a3dcb31729
Update ColumnsSample to showcase nicer data (#1295)
Also, I switched the base width of the AsciiCast back
to 82 (from 120) so newly created casts are no longer
overflowing the display with on the pages.

Re-created the Panel and BreakdownChart casts, as
they were currently overflowing due to the 120 chars
width of the cast.
2023-09-12 12:58:18 +02:00
Patrik Svensson
1002c6fe27
Merge pull request #1294 from nils-a/feature/GH-1279 2023-09-11 23:45:39 +02:00
Nils Andresen
c64797d681
(#1279) added the missing columns-cast 2023-09-11 23:26:54 +02:00
Frank Ray
131b37fff8
Allow custom help providers (#1259)
Allow custom help providers

* Version option will show in help even with a default command

* Reserve `-v` and `--version` as special Spectre.Console command line arguments (nb. breaking change for Spectre.Console users who have a default command with a settings class that uses either of these switches).

* Help writer correctly determines if trailing commands exist and whether to display them as optional or mandatory in the usage statement.

* Ability to control the number of indirect commands to display in the help text when the command itself doesn't have any examples of its own. Defaults to 5 (for backward compatibility) but can be set to any integer or zero to disable completely.

* Significant increase in unit test coverage for the help writer.

* Minor grammatical improvements to website documentation.
2023-09-08 09:51:33 +02:00
Tomasz Prasołek
813a53cdfa Fix Rule widget docs 2023-07-16 12:29:04 +02:00
Cédric Luthi
2af901a814 Remove unnecessary [NotNull] attributes
When subclassing `Command<TSettings>` which has the [NotNull] attributes, Rider/ReSharper gives this warning:
> Nullability of type of parameter 'context' in method does not match overridden member `int Spectre.Console.Cli.Command<TSettings>.Execute(CommandContext, TSettings)` (possibly because of nullability attributes)

When subclassing `Command<TSettings>` which does not have the [NotNull] attributes, Rider/ReSharper gives this warning:
> The nullability attribute has no effect and can be safely removed

The solution is simply to remove the [NotNull] attributes.

Since `<Nullable>enable</Nullable>` is set in the project, they are actually not necessary. By the way, the non-generic `Command` class does not have the [NotNull] attributes.
2023-07-12 15:26:12 +02:00
Cédric Luthi
83afa97017 Set end_of_line to LF instead of CRLF
This matches the actual content of the repository (except for a few files which have CRLF instead of LF)

The motivation behind this change is that Rider observes the .editorconfig rules and changes the line ending to CRLF on save. When submitting pull requests the diff is full of changes because all the end of lines were changed from LF to CRLF. By setting `end_of_line` to `LF` the end of lines are not changed on save and the diffs are clean when submitting pull requests.
2023-07-12 15:25:52 +02:00
Jeppe Roi Kristensen
e0ded712e8 Add fix to avoid exception on Rows with no children 2023-06-13 00:36:06 +02:00
Cédric Luthi
d484e832f5 Relax the SDK requirements by rolling forward to the latest feature
This was initially introduced in 3c5b98123b4c9cd50a37da25ca9a3fd34ac7f479 by Daniel Cazzulino, then reverted in 82de4a55c48e269225ff2b137850a303b3776879 by Patrick Svensson because of a bug in the .NET 6.0.401 SDK.
2023-06-07 13:41:09 +02:00
fredrikbentzen
71a5d83067 Fixed render issue where writeline inside status caused corrupt output #415 #694 2023-06-04 20:31:12 +02:00
Ignacio Calvo
35ce60b596
Implemented AddAsyncDelegate (#766) 2023-05-25 11:31:01 +01:00
Frank Ray
0ec70a44db
Async command unit tests 2023-05-19 17:19:17 +01:00
Patrik Svensson
1ee2653cf8
Merge pull request #1231 from FrankRay78/Blog-post-for-0.47.0
Blog post for 0.47.0 (updated)
2023-05-19 18:05:06 +02:00
Frank Ray
4c0178cf9a
Merge branch 'main' into Blog-post-for-0.47.0 2023-05-19 16:50:48 +01:00
Frank Ray
296bc61837 Updated links and github usernames to markdown url format so they render as native html links 2023-05-19 16:48:48 +01:00
Frank Ray
766ccb1f1b Minor grammatical update 2023-05-19 16:40:57 +02:00
Frank Ray
f7314dc2e8 Blog post for 0.47.0 2023-05-19 16:40:57 +02:00
Frank Ray
f453890d13 Minor grammatical update 2023-05-19 12:26:35 +01:00
Frank Ray
2c8f459806 Blog post for 0.47.0 2023-05-19 12:22:28 +01:00
Elisha Aguilera
018f4ebd17
Minor refactors (#1081) 2023-05-14 15:30:27 +01:00
Andrii Rublov
404b052a5f
Add ability to pass example args using params syntax (#1166) 2023-05-12 12:08:42 +01:00
Cédric Luthi
dac2097321
Add support for arrays in [DefaultValue] attributes (#1164)
Fixes #1163
2023-05-11 14:26:53 +01:00
Cédric Luthi
6acf9b8c63
Add an implicit operator to convert from Color to Style (#1160) 2023-05-10 14:20:12 +01:00
Patrik Svensson
3ec0fee795
Merge pull request #1218 from phillip-haydon/patch-1 2023-04-24 08:56:25 +02:00
Phillip Haydon
5843a4545e
Fix coconut spelling 2023-04-24 14:37:06 +08:00
Patrik Svensson
d64d3ec770
Merge pull request #1211 from MaxAtoms/main 2023-04-03 16:32:18 +02:00
Thomas M. Schöller
4dcbd30285
Merge branch 'spectreconsole:main' into main 2023-04-03 12:45:34 +02:00
MaxAtoms
1334319dd1
Add Alacritty as supported Ansi console 2023-04-03 12:42:24 +02:00
Frank Ray
714cf179cb
Command line improvements (#1103)
Closes #187
Closes #203
Closes #1059
2023-04-02 22:43:21 +02:00
Patrik Svensson
70da3f40ff
Merge pull request #1161 from MartinZikmund/dev/mazi/stringcomparer-confirmation 2023-03-16 09:57:15 +01:00
Martin Zikmund
5075732564 Adjustments based on code review 2023-03-16 09:45:42 +01:00
Gérald Barré
10467a2912 Do not register analyzers if SpectreConsole is not available in the current compilation 2023-03-13 20:07:41 -04:00
Gérald Barré
a7ab1b690e Use SymbolEqualityComparer.Default when possible 2023-03-13 20:03:12 -04:00
Gérald Barré
142942b8a2 Simplify access to the SemanticModel in analyzers 2023-03-13 19:58:40 -04:00
Gérald Barré
0bab835293 Forward CancellationToken to GetOperation 2023-03-13 19:57:08 -04:00
Patrik Svensson
a6af9a6842
Merge pull request #1183 from Frassle/promptExampleTypo 2023-03-01 18:43:46 +01:00
Cédric Luthi
d3f4f5f208
Add support for converting command parameters into FileInfo and DirectoryInfo (#1145)
Add support for converting command parameters that doesn't have a built-in TypeConverter but has a constructor that takes a string. For CLI apps, FileInfo and DirectoryInfo will likely be the most useful ones, but there may be others.
2023-03-01 12:02:43 +00:00
Fraser Waters
cbbdb3369c Fix minor typo in Prompt example 2023-02-26 22:22:31 +00:00
Gérald Barré
6740f0b02b Add support for static lambda and delegate 2023-02-24 19:04:01 -05:00
Gérald Barré
f7f99ec899 Simplify and make the code fix more robust 2023-02-24 19:04:01 -05:00
Gérald Barré
955fe07bac Allow to apply code fix in top-level statements 2023-02-24 19:04:01 -05:00
Patrik Svensson
819b948e78
Merge pull request #1174 from meziantou/missing-stringcomparison 2023-02-22 16:03:29 +01:00
Gérald Barré
baa8220a52
Use StringComparison.Ordinal instead of culture-sensitive comparisons 2023-02-20 20:23:06 -05:00
Martin Zikmund
9cd7b24e65 Allow configuration of confirmation prompt comparison via StringComparer 2023-02-11 17:09:16 +01:00
Ilya Hryapko
04610cf492
Alias for command branches (#411) 2023-02-09 14:26:06 +00:00
Patrik Svensson
f4183e0462
Merge pull request #1152 from MartinZikmund/dev/mazi/confirmation-insensitive 2023-02-04 20:44:34 +01:00
Martin Zikmund
29846ba505 Ensure correct comparer is used for TextPrompt 2023-02-04 19:56:37 +01:00
Patrik Svensson
92318ce1fb
Merge pull request #1151 from MartinZikmund/dev/mazi/confirmation-insensitive 2023-02-04 13:41:14 +01:00
Martin Zikmund
720db951f3 feat: Allow case-insensitive confirmation prompt 2023-02-04 13:24:11 +01:00
Patrik Svensson
e042fe15e4
Merge pull request #1143 from wbaldoumas/alignment-vs-justification-docs-fixes 2023-01-26 03:38:25 +01:00
Will Baldoumas
62b30d6072 Alignment => Justification Docs Fixes 2023-01-25 17:45:30 -08:00
Patrik Svensson
beca0b2419
Merge pull request #1141 from 0xced/better-conversion-errors 2023-01-24 20:15:02 +01:00
Cédric Luthi
de847b90e4 Improve conversion error messages
When a conversion to an enum fails, list all the valid enum values in the error message.

Message before this commit:
> Error: heimday is not a valid value for DayOfWeek.

Message after this commit:
> Error: Failed to convert 'heimday' to DayOfWeek. Valid values are 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'
2023-01-24 19:40:11 +01:00
Cédric Luthi
7b9553dd22
Add possibility to set description and/or data for the default command (#1091) 2023-01-12 12:12:27 +00:00
Patrik Svensson
f223f6061c Add blog post for 0.46 release 2023-01-10 04:00:15 +01:00
Patrik Svensson
eba2a8cc76 Add layout documentation 2023-01-10 00:17:11 +01:00
Patrik Svensson
bc6ba26840 Fix title of JSON docs 2023-01-10 00:17:11 +01:00
Patrik Svensson
54be64ec84
Add JSON text renderer (#1086)
* Add JsonText widget to render highlighted JSON

Closes #1051
2022-12-31 18:17:15 +00:00
Cédric Luthi
3e6e0990c5
Automatically display default values of options in the help page (#1032)
Fixes #973
2022-12-28 20:28:41 +00:00
krisrok
4a8a4ab048
Show help for default command (#953)
Shows help if the default command was called without any arguments but has required arguments.
This way it does not hinder execution of a default command without any required arguments.

When called without args:
- Default command with required params -> Show help
- Default command with required params and additional commands -> Show help including additional commands
- Default command without required params -> Execute command
2022-12-14 17:19:12 +00:00
Frank Ray
b793482ebb
Command line argument parsing improvements (#1048)
* Support negative numbers as command option values
* Support command line options before arguments
* POSIX-compliant handling of quotes (double and single, terminated and unterminated), whitespace, hyphens, and special characters (e.g. emojis)
2022-12-05 01:07:53 +01:00
Nils Andresen
f895bb175d modified tokenizer to not break on on ]]] at the end of a style 2022-12-01 22:32:32 +01:00
Jaime Finat Sáez
4258cbfb85
Performance issue solved (#1096) 2022-11-30 18:13:31 +01:00
Arve Systad
83982347f6 Inline CommandArgument required/optional style in template parameter docs 2022-11-25 09:27:18 +01:00
Tom Kerkhove
879dd9fbb1 docs: Update Sponsors 2022-11-24 14:02:59 +01:00
Frank Ray
c1e9c1a99f
Clarified the license for SixLabors.ImageSharp (#1073)
* Clarified the license for SixLabors.ImageSharp

* Updated after review by @JimBobSquarePants
2022-11-17 15:21:01 +01:00
Brandon Wood
a9b97fa4dc fixed panel/table copypasta 2022-11-16 00:07:49 +01:00
Patrik Svensson
55c3f3b7a8 Figlet text should not pad on right side automatically 2022-11-15 12:36:49 +01:00
Patrik Svensson
02ff3fc910 Fix alignment bug 2022-11-15 12:36:49 +01:00
Patrik Svensson
c3ec6a7363
Add Layout widget (#1041)
* Add width to panels
* Add height to panels
* Replace RenderContext with RenderOptions
* Remove exclusivity from alternative buffer
* Add Layout widget
* Add Align widget
2022-11-15 10:12:17 +01:00
Patrik Svensson
9ce3b99cd6 Remove integration tests 2022-11-10 12:01:13 +01:00
Patrik Svensson
a70cc90797 Fix issues with nullability and netstandard2.0 2022-11-10 12:01:13 +01:00
Patrik Svensson
7dce4af552 Add support for .NET 7.0 2022-11-10 12:01:13 +01:00
Steve Smith
02f9d26473 Update README.md
Add docs link above the fold.
2022-11-04 09:25:35 +01:00
Setenay
995ef10b8b
Created a Columns widget documentation (#1044) 2022-11-04 09:21:18 +01:00
Elisha Aguilera
4ea64ccb9c
Added documentation guide for the Padder Widget (#1046) 2022-11-04 09:20:38 +01:00
Elisha Aguilera
a755cc5d9c
Added documentation guide for Grid Widget (#1043) 2022-11-02 12:59:41 +01:00
Elisha Aguilera
2a493cfee9 Added documentation for Rows widget 2022-11-01 09:48:38 +01:00
Steve Smith
9df6ed213c Minor typo fixes
Hope this is helpful, cheers!
2022-10-19 20:13:07 +02:00
Łukasz Sowa
6a4d8c8f30
Add culture option to TypeConverterHelper, TextPrompt and AnsiConsole (#1014)
* Add culture option to TypeConverterHelper, TextPrompt and AnsiConsole

* Add IHasCulture interface
2022-10-15 11:19:06 +02:00
Patrick
5f1121e8e1 Create panel documentation 2022-10-15 06:44:48 +02:00
renovate[bot]
d7babcc6e4 chore: Update dependency cake.tool to v2.3.0 2022-10-14 19:10:01 +02:00
picture-vision
f085da76c1 Added Suckless Simple Terminal (st) to list of ansi terminals 2022-10-13 22:32:11 +02:00
nilaoda
8fa53f8fb1 Allow PACKET key on MultiSelectionPrompt 2022-10-13 20:43:03 +02:00
Benjamin Michaelis
f6a7c96413 Create Test, allow for conditional trim 2022-10-13 20:42:23 +02:00
Benjamin Michaelis
a91a3c12ad Remove trimming 2022-10-13 20:42:23 +02:00
Patrik Svensson
82de4a55c4 Pin SDK due to bug in .NET 6.0.401
Restoring tools seems to fail due to an AbandonedMutexException.
Pinning the SDK to a previous version should work.
2022-10-13 14:35:57 +02:00
Benjamin Michaelis
db095217b7
Add documentation for Breakdown Chart (#1000)
* Begin breakdown chart documentation
* Fix generator build failure
* Add in breakdown chart graphics
* Add breakdown chart documentation and move cast files
2022-10-06 22:02:25 +02:00
Patrik Svensson
7b23456d3e Add 'need triage' label to new issues 2022-10-04 22:38:52 +02:00
Patrik Svensson
cbfcc37a46 Add new and transferred issues to project
When a new issue is created or an issue is transferred
from another project, we add the issue to the Spectre.Console project
(https://github.com/orgs/spectreconsole/projects/1).
2022-10-04 22:38:52 +02:00
Salvage
999c59909b Fix @ being used in figlet font 2022-10-01 17:12:11 +02:00
renovate[bot]
fd8d271a10 chore: Update dependency Microsoft.NET.Test.Sdk to v17.3.2 2022-10-01 17:10:10 +02:00
Johan Lindfors
8b5836f4e4 Adding value: a single semi-colon! 2022-10-01 15:38:55 +02:00
renovate[bot]
5581ad2f05 chore: Update actions/setup-dotnet action to v3 2022-09-30 13:38:16 +02:00
Patrik Svensson
d339442df8
Join .NET Foundation (#978) 2022-09-27 08:36:07 +02:00
Salvage
422012c994 Make documentation consistent 2022-09-26 23:32:57 -04:00
Salvage
4f0ec87522 Allow selections to wrap around 2022-09-26 23:32:57 -04:00
Gary McDougall
eb02c3d534
Custom mask for secret (#970)
* Masking Character added, not yet used.

* Setting the masking character can be chained with other extensions.

* Added string extension for masking, and replaced hardcoded asterisks.

* Check if mask is null first.

* Fixed Typo in previous test and added new test for custom masks.

* Added tests for masking with null character

* Added docs and example.

* Adjusted extensions so that Mask is integrated into Secret extension. Updated Exampls and Tests accordingly
2022-09-26 20:34:41 +02:00
nkochnev
088db165ed Added tests on backward direction of autocomplete 2022-09-19 08:58:45 +02:00
nkochnev
1082ac1efc Backward direction of autocomplete with Tab + Shift 2022-09-19 08:58:45 +02:00
Eduardo Cáceres
a60910c15f Update .NET 5 -> .NET 6 in docs 2022-09-19 08:47:23 +02:00
renovate[bot]
73ab977f26 chore: Update dependency Wcwidth.Sources to v1 2022-09-17 13:52:22 +02:00
Phil Scott
79913ab238 being explicit about date formats for blog posts 2022-09-12 04:41:22 +02:00
Phil Scott
9a7ac7b5b2 updating social card image to .NET 6 2022-09-12 04:41:22 +02:00
Gary McDougall
9cbfda9e4a Added details for using links within markup. 2022-09-10 21:51:03 -04:00
Patrik Svensson
bb013dcc52 Add blog post for 0.45 2022-09-10 12:06:32 -04:00
lonix1
af9f5ea97d
[docs] fixed typo (#956) 2022-09-09 13:33:06 +02:00
Cédric Luthi
e96a821ead Set the DevelopmentDependency flag on the Spectre.Console.Analyzer project
It was applied by mistake on Spectre.Console in #938.
2022-09-06 19:03:22 +02:00
lonix1
506253bc34 build: set nuget package as dev dependency
Docs: https://github.com/NuGet/Home/wiki/DevelopmentDependency-support-for-PackageReference
2022-08-29 10:20:32 +02:00
Bastian Eicher
90c2d988ab Detect non-interactive console via System.Console.IsInputRedirected instead of Environment.UserInteractive 2022-08-29 08:57:53 +02:00
Nils Andresen
2bd1383cbe Fixed punctuation 2022-08-29 08:54:30 +02:00
Nils Andresen
00a9ba325e restructured MarkupTokenizer a bit. 2022-08-29 08:54:30 +02:00
Nils Andresen
540bc1307c fixed warning 2022-08-29 08:54:30 +02:00
Nils Andresen
a6618f762c Modified MarkupTokenizer
So escaped markup in markup is valid.
2022-08-29 08:54:30 +02:00
Nils Andresen
638149f44b fixed punctuation in exception 2022-08-29 08:54:30 +02:00
Nils Andresen
0d72b94f9c added some breaking unit tests 2022-08-29 08:54:30 +02:00
Nils Andresen
0d19ccd8a6 (#916) fixed missing call to Validate when using CommandConstructorBinder 2022-08-18 12:03:11 +02:00
nkochnev
78d841e3dc
Added command description to command help message (#920) 2022-08-17 16:59:08 +02:00
Nils Andresen
d94dc2fcb2 fixed build error
error NU1504: Duplicate 'PackageReference' items
found. Remove the duplicate items or use the Update
functionality to ensure a consistent restore behavior. The duplicate
'PackageReference' items are: System.Memory 4.5.5, System.Memory 4.5.5.
2022-08-17 16:03:44 +02:00
Nils Andresen
9d985f0f0a (#922) fixed ArgumentNullException on .NET Framework
It seems, when Spectre.Console is compiled for
netstandard2.0, StackTrace.GetFrames() returns null
instead of an empty array.
2022-08-17 16:03:44 +02:00
renovate[bot]
3a7b8aa1d2 chore: Update dependency xunit to v2.4.2 2022-08-03 15:04:26 +02:00
Patrik Svensson
dc93edef15 Remove the 'net50' TFM
Also updates all dependencies to the latest version.

Closes #829
2022-07-02 11:18:34 +02:00
renovate[bot]
b4cf7a76d3 chore: Update actions/upload-artifact action to v3 2022-07-01 12:45:58 +02:00
Patrik Svensson
45a051150f Fix for 'chore:' CI criteria 2022-07-01 12:42:24 +02:00
Patrik Svensson
47ef9a685e Do not run CI for commits starting with 'chore' 2022-07-01 12:36:48 +02:00
renovate[bot]
8ca602b986 chore: Update actions/setup-node action to v3 2022-07-01 12:08:53 +02:00
renovate[bot]
a11ae6a93d chore: Update actions/setup-dotnet action to v2 2022-07-01 12:08:37 +02:00
renovate[bot]
b13ff8ebcc chore: Update actions/checkout action to v3 2022-07-01 12:08:25 +02:00
renovate[bot]
90e6a1aa21 chore: Update actions/cache action to v3 2022-07-01 12:08:01 +02:00
Daniel Chalmers
f3a82073d9 Check for null argument in TextPrompt 2022-06-30 20:08:04 +02:00
dependabot[bot]
ff8fd9ed2a Bump Newtonsoft.Json from 12.0.3 to 13.0.1 in /examples/Console/Columns
Bumps [Newtonsoft.Json](https://github.com/JamesNK/Newtonsoft.Json) from 12.0.3 to 13.0.1.
- [Release notes](https://github.com/JamesNK/Newtonsoft.Json/releases)
- [Commits](https://github.com/JamesNK/Newtonsoft.Json/compare/12.0.3...13.0.1)

---
updated-dependencies:
- dependency-name: Newtonsoft.Json
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-30 14:32:43 +02:00
Patrik Svensson
1eeb32c704 Ignore the docs project 2022-06-30 14:24:03 +02:00
Cédric Luthi
c32decfa55 Fix the "Escaping Interpolated Strings" documentation
* `MarkupLineInterpolated` instead of `MarkupInterpolated`
* Use an actual interpolated string in sample code to make it valid
2022-06-30 13:55:52 +02:00
ivml
564c7b8f4e fix: API reference pages for Spectre.Console.Cli
This commit fixes #833.

`Spectre.Console.Cli` was moved into its own project, and the path to the new project was not added to the list of source files when building the documentation.
2022-05-17 17:46:50 +02:00
Patrik Svensson
5b2b4375a4 Update build script to package Spectre.Console.Cli 2022-05-15 00:09:52 +02:00
Patrik Svensson
70bbc24911 Update Cake to 2.2.0 2022-05-15 00:09:52 +02:00
Patrik Svensson
36ca22ffac Move Spectre.Console.Cli to it's own package 2022-05-15 00:09:52 +02:00
老大哥
b600832e00 add cross platform 2022-04-27 15:12:51 +02:00
Patrik Svensson
da1c471c18 Give GH Actions jobs a more suitable name 2022-04-15 10:44:14 +02:00
Patrik Svensson
b6b963c03c Update GPR dependency 2022-04-15 10:43:52 +02:00
Patrik Svensson
7e1fb43f21 Install .NET SDK 6.0.101 2022-04-15 10:28:49 +02:00
renovate[bot]
47fde1875b
chore: Update dependency MinVer to v2.5.0 (#803)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-04-07 23:47:08 +02:00
renovate[bot]
eb85f5860e
chore: Update dependency cake.tool to v2.1.0 (#809)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-04-07 23:46:15 +02:00
Nils Andresen
25a61bea91 Renovate: Ignore all updates to resources/scripts
those are used only during development, hence there
is no need to auto-update them.
2022-04-07 10:27:02 +02:00
renovate[bot]
bad6672d76
chore: Update dependency Microsoft.SourceLink.GitHub to v1.1.1 (#801)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-04-05 08:46:35 +02:00
Patrik Svensson
f614032c82
Fix documentation workflow (#799)
Only publish documentation when we publish artifacts.
2022-04-05 08:40:30 +02:00
Leonardo Costa
585f010b26
Upgrade dotnet example tool to 1.6.0 (#782) 2022-04-04 16:20:25 +02:00
renovate[bot]
90b917c38c
Configure Renovate (#785)
* Add renovate.json

* Added a bit more configuration

also moved the config into .github subfolder so not to clutter
the root folder.

* ignore npm updates in docs

Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: Nils Andresen <nils@nils-andresen.de>
2022-04-03 22:16:48 +02:00
Drew Noakes
edbe9d6ebc
Change section heading (#781)
This appears to have been copy/pasted from progress.md, which has a similar structure.
2022-03-31 14:18:24 +02:00
Patrik Svensson
90de1847d8 Add blog post for 0.44 2022-03-27 22:46:17 +02:00
Andreas Grünwald
38d9386e00
Add option to configure the style of the choices list and the default value in TextPrompt (#681)
* Allow setting the style of the default value in TextPrompt

Add property "DefaultValueStyle" to TextPrompt which allows setting the style in which the default value is rendered.
When no style is set, the value is displayed as green text, keeping the existing behavior.

* Allow setting the style in which a TextPrompt's choices are displayed

Add property "ChoicesStyle" to TextPrompt which allows setting the style in the prompt's choices are rendered.
When no style is set, choices are displayed as blue text, keeping the existing behavior.
2022-03-27 19:38:01 +02:00
Cédric Luthi
7998ece6b6
Obsolete the AnsiConsoleFactory class (#585)
`AnsiConsoleFactory` should be an internal static class. Creating an `IAnsiConsole` can be achieved through `Spectre.Console.AnsiConsole.Create(AnsiConsoleSettings)`

Since `AnsiConsoleFactory` is public, it can't be changed from a non static class to a static class so obsoleting it is the second best thing to do.

Eventually, when `AnsiConsoleFactory` becomes internal and static, `AnsiConsole.Create` can be simplified to this (and the private static field `_factory` can be removed)

```
public static IAnsiConsole Create(AnsiConsoleSettings settings)
{
    return AnsiConsoleFactory.Create(settings);
}
```
2022-03-22 22:36:04 +01:00
Phil Scott
1d8154f9b0
Introduce MarkupInterpolated and MarkupLineInterpolated extensions (#761)
* Introduce MarkupInterpolated and MarkupLineInterpolated extensions

These new methods enable easily writing markup with a nice and intuitive syntax without having to worry about escaping the markup.

```csharp
string input = args[0];
string output = Process(input);
AnsiConsole.MarkupLineInterpolated($"[blue]{input}[/] -> [green]{output}[/]");

```

The `Interpolated` suffix was inspired by the Entity Framework Core [FromSqlInterpolated][1] method.

[1]: https://docs.microsoft.com/en-us/ef/core/querying/raw-sql#passing-parameters

* Fixing whitespace to match file scoped namespaces

* Adding FromInterpolated helper to Markup widget

Allows automatic handling of interpolated strings to be used on the Markup widget. This would be helpful for people working with Tables and the Tree control who would not be using the MarkupInterpolated methods.

* Documentation for markup interpolated methods.

Co-authored-by: Cédric Luthi <cedric.luthi@gmail.com>
2022-03-22 22:34:25 +01:00
Phil Scott
1f2629e2e1 Adding a short template file for new documentation. 2022-03-05 22:51:01 +01:00
Patrik Svensson
a6364e066b
Fix path and description for TextPath docs (#758) 2022-03-02 10:24:33 +01:00
Patrik Svensson
fbe1d0b6f2
Add documentation for TextPath widget (#757) 2022-03-01 20:56:58 +01:00
Patrik Svensson
eb4a7d3bf4 Add support for alignment 2022-02-23 09:06:51 -05:00
Patrik Svensson
5e41a2f505 Add support for styling segments 2022-02-23 09:06:51 -05:00
Andrew Armstrong
921d595269 Update SixLabors.ImageSharp reference to 2.0.0 2022-02-23 09:29:35 +01:00
Phil Scott
899dd20b65 Optimizing build
* Upgrades Statiq.Web to which contains analyzer perf improvements
* Dropping script front matter when not needed from blog archives
* Trimming down the number of files tailwind examines when building the css file to only a subset of the docs.
* Updates Playwright to latest version
* Updates tailwind and asciienma to latest
* Removes npm packages that are no longer required
2022-02-22 08:56:27 +01:00
Andrew Rublyov
8ae3d258e4 Add another missing nullables 2022-02-20 23:57:06 -05:00
Andrew Rublyov
974aa1afda Fix inheritance and nullables in settings.md 2022-02-20 23:57:06 -05:00
Patrik Svensson
66fc949e2a Initial work on TextPath widget 2022-02-20 23:26:04 -05:00
Phil Scott
d6cdd1fbda Adding a best practices guide. 2022-02-20 17:10:03 +01:00
Patrik Svensson
bec3315d91 skip-ci: Fix typo 2022-02-16 01:40:47 +01:00
Patrik Svensson
d465d93a9b Add Netlify badge 2022-02-16 00:44:52 +01:00
Patrik Svensson
782a99d726 Add Netlify attribution to footer 2022-02-16 00:36:01 +01:00
Patrik Svensson
b6be693007 Update copyright 2022-02-16 00:35:10 +01:00
Patrik Svensson
f9a85e017a Only build docs once :) 2022-02-15 18:02:25 +01:00
Phil Scott
36e5350968 Tweaking font-size and line-height for smaller screens 2022-02-15 17:28:27 +01:00
Phil Scott
3ac63d2670 Configures deployment to netlify 2022-02-14 21:09:38 +01:00
Phil Scott
c2da268129
Docs redesign (#728)
* Adding a dark mode
* Adding reference for types to summary pages
* Adding API Reference
* Adding modifiers to methods/fields/etc
* Minimizing files input
* Caching a lot of the output pages
* Cache only for each execution
* Adding API references to existing docs
2022-02-14 18:44:25 +01:00
Phil Scott
74a2e10ff0 Making tuples pretty too 2022-02-04 10:30:09 +01:00
Phil Scott
e8eb5b85b9 Updating documentation output to match new Exception rendering. 2022-02-04 10:30:09 +01:00
Phil Scott
78958aae27 Adding better type names for return types and parameters
Uses the typenamehelper from Ben.Demystifer to help break down things like generic lists into their actual type display name.
2022-02-04 10:30:09 +01:00
Phil Scott
a0e20f299c Improves exception rendering for async methods 2022-02-03 17:10:30 +01:00
Cédric Luthi
ff4215f431 Simplify exception formatting
Now that exceptions are not _parsed_ anymore (#513 and #637), keeping the `ExceptionInfo` and `StackFrameInfo` internal classes doesn't make much sense anymore. The `Exception` and `StackFrame` types can be used by the `ExceptionFormatter` class directly, without conversion.
2022-02-03 10:02:32 -05:00
Steven
f221c1f25c
add overload taking params array (#682) 2022-01-15 19:51:17 +01:00
Jouni Heikniemi
0b988ff65c
Fix WithExample call on the CommandApp doc page to match reality (#689) 2022-01-13 21:43:31 +01:00
Nils Andresen
9a6d8d92b4 (#674) changed TypeResolver in Cli/logging
to adhere to the specifications set in #620
2022-01-02 10:26:04 +01:00
Patrik Svensson
52c1d9122b
Add global usings (#668)
* Use global usings

* Fix namespace declarations for test projects
2021-12-23 16:50:31 +01:00
Patrik Svensson
eb6a9d8d04 Add .git-blame-ignore-revs 2021-12-22 08:51:17 -05:00
Patrik Svensson
ec1188b837 Use file scoped namespace declarations 2021-12-22 08:51:17 -05:00
Patrik Svensson
1dbaf50935 Add release notes for 0.43.0 2021-12-22 08:50:31 -05:00
Phil Scott
523adc6c49 Including dotnet tools restore into ci build 2021-12-21 19:44:16 +01:00
Phil Scott
bba5f0c5dc Trying to rework dotnet tools for docs and playwright 2021-12-21 19:44:16 +01:00
Patrik Svensson
19ff48f4b8 Clean up .NET SDK installation 2021-12-15 22:54:27 +01:00
Patrik Svensson
8fcd2e59d6 Install .NET 5 as part of build 2021-12-15 22:47:05 +01:00
Patrik Svensson
8ce40bac3c Fix documentation build 2021-12-15 22:43:03 +01:00
Cédric Luthi
8e762e4618 Simplify stack frame parsing
This is the natural extension of #513 which already removed a lot of regex parsing. 

The `ExceptionParser` class is renamed into `ExceptionConverter` because there is no more string parsing performed at all. `Exception` is converted into `ExceptionInfo` and `StackFrame` is converted into `StackFrameInfo`.
2021-12-15 22:24:34 +01:00
zameer fouzan
37f661a963
fix: table title's first letter is getting capitalized by default (#652)
fix for #638
2021-12-07 13:03:30 +01:00
Nils Andresen
55633b59fa (#645) Ordered CommandArguments by position
in CommandModelValidator
2021-12-02 11:15:25 +01:00
Phil Scott
3f561e0902 Update Roslynator.Analyzers to version 3.3
I kept running into https://github.com/JosefPihrt/Roslynator/issues/833 when using Rider, but it seems this was fixed in version 3.2 thanks to a fix in how they are doing assemblies. Looks like this would also include benefits for people using VS2022 too
2021-12-02 11:10:49 +01:00
Phil Scott
461348f2fb
Update asciinema (#648)
* Updating doc build dependencies

Updates playwright to latest version. This requires an update in how it is ran as part of the statiq build set up to ensure dependencies exist for the run.

Also brings misc packages up to date to fix vulnerabilities.

* Updates CI to use node v16 and dotnet 5

Playwright CLI currently needs net5 to execute. There is a PR in the works to get it running on net6 but until then the recommended steps it to have both installed.
2021-12-01 13:40:51 +01:00
Patrik Svensson
fd4b96944e Add support for alternate screen buffers
Closes #250
2021-11-30 12:13:14 -05:00
Tim Waalewijn
2e5d18fa78
Added the ability to hide CommandOptions. (#642)
CommandOptions now has an IsHidden property that, when set to true, will cause the option to be hidden from the following cases:

- Help text using `-h|--help`
- Xml representations generated with the `cli xml` command
- Diagnostics displayed with the `cli explain` command

Hidden options can still be outputted with `cli explain` using the `--hidden` option that is also used to display hidden commands.

Fixes #631
2021-11-29 23:16:54 +01:00
Cédric Luthi
168f35202d
Fix exception formatting for generic methods (#639)
The generic parameters were double escaped and would display as `[[T0,T1,TRet]]` instead of `[T0,T1,TRet]`. This is because the `builder.AppendWithStyle` method already escapes its value so the caller must not escape the passed value.
2021-11-26 10:23:20 +01:00
Patrik Svensson
225305f90e Update examples to net6.0
Closes #604
2021-11-23 22:30:45 -05:00
Cédric Luthi
8fed3bc575
Fix type conversion in the default pair deconstructor implementation (#618)
The code using the TypeConverter was written backwards (using `ConvertTo` instead of `ConvertFrom` and would thus throw an exception.
2021-11-22 15:07:58 +01:00
Cédric Luthi
19eb273813 Fix typo in PairDeconstructor class name
PairDeconstuctor → PairDeconstructor (was missing an 'r')

Keeping `PairDeconstuctor` and marking it as obsolete since it's a public type.
2021-11-14 10:36:16 +01:00
Nils Andresen
48df9cf68b (#555) added TypeRegistrarBaseTests
as a very simple test harness to test implementations of
ITypeRegistrar / ITypeResolver
2021-11-14 01:19:27 +01:00
Nils Andresen
2f6b4f53c4 (#555) Clarify ITypeResolver returns null
and does not throw on unresolvable types.
Also changed the TypeResolverAdapter to adhere
to those expectations and removed the now no longer
needed try-catch from CommandPropertyBinder.
2021-11-14 01:19:27 +01:00
Patrik Svensson
21ac952307
Remove Render from docs in favor of Write (#613)
The `Render` method has been obsoleted.
2021-11-09 21:22:18 +01:00
Patrik Svensson
e86f9d3c5a Allow color numbers in markup expressions
Closes #614
2021-11-09 09:32:50 -05:00
Patrik Svensson
9c9eb04f91
Upgrade .NET SDK to 6.0.100 (#616)
* Update to .NET 6.0.100

* Update Cake to 2.0.0-rc0001
2021-11-09 08:19:36 +01:00
Nils Andresen
ba4b7b97f8 Escape any Markup when displaying selected prompt items
If the item contained escaped markup, after the call to RemoveMarkup
the string will contain unescaped markup (that the user explicitly had
escaped before) for those cases we need to escape all remaining markup.
2021-11-02 22:56:54 +01:00
Patrik Svensson
b738187b28 Fix publish workflow error 2021-10-30 01:52:25 +02:00
Nils Andresen
b3ef7d4fa6 fixed documentation for selection and multiselection (#499) 2021-10-30 01:50:18 +02:00
Nils Andresen
c5c1852fc3 (#606) added ExceptionHandler to ICommandAppSettings
So exceptions can be handled in Spectre.Console.Cli.
Also, some documentation was added.
2021-10-30 01:41:29 +02:00
Nils Andresen
045d0922c8 fixed spelling in Exception 2021-10-30 00:05:16 +02:00
Nils Andresen
949f35defd (#502) Added GetParent and GetParents to MultiSelectionPrompt
So it it possible to find the parent(s) of a given item.
2021-10-30 00:05:16 +02:00
GitHubPang
f5a2735501
Fix a typo in code comment (#579) 2021-10-29 21:12:01 +02:00
Patrik Svensson
d02c9e552e
Add net6.0 TFM (#603)
Closes #602
2021-10-29 21:05:17 +02:00
Antonio Valentini
a4ae36738b typos 2021-10-23 16:05:56 -04:00
Patrik Svensson
35d2750b68 Internalizes the WcWidth package
This way, there is no need to download the WcWidth package,
and it also becomes easier to debug issues related to
Unicode cell widths.
2021-10-18 15:09:54 -04:00
Phil Scott
4d2d927caa Upgrades Statiq and re-enables docs publishing
Previous versions of Statiq had a bug with .NET 6 RC1. The latest has a workaround that allows publishing
2021-10-15 20:31:57 +02:00
Magnus Lindhe
174d285035 Update sponsors.md
Fixing a typo in October. I should be ashamed :)
2021-10-10 09:40:09 +02:00
Patrik Svensson
e8e92e7f44 Remove path criteria for publish workflow 2021-10-05 17:57:25 +02:00
Patrik Svensson
3718502eee Update workflow 2021-10-05 17:55:08 +02:00
Patrik Svensson
39cfc7a62f Allow workflows to run for workflow changes 2021-10-05 17:54:02 +02:00
Patrik Svensson
2e90ef28e4 Allow workflows to run for test and example changes 2021-10-05 17:52:30 +02:00
Patrik Svensson
2a3763cdc7 Prove that remaining args works in strict mode
Closes #496
2021-10-05 09:34:08 -04:00
Patrik Svensson
e0395dfa2b Add AnsiConsole.Write method
This commit also obsoletes the `AnsiConsole.Render` method.

Closes #576
2021-10-05 09:33:33 -04:00
Cédric Luthi
ca2e6ce0ad Improve the error message when acquiring the interactive semaphore fails
Using the same error message as in the sync version of the `Run` method which is indeed much better than "Could not aquire the interactive semaphore".
2021-10-05 00:51:54 +02:00
rifatx
fa15389158
Add support custom max value for barcharts (#545) 2021-10-05 00:49:09 +02:00
Cédric Luthi
a5716a35e2 Future-proof conditional compilation
* Invert `#if NET5_0` conditions so that when adding net6.0 target framework, the _new_ APIs are used.
* Use `NET5_0_OR_GREATER` instead of `NET5_0` to ensure consistent behaviour on future target frameworks.
2021-09-29 10:01:31 +02:00
GitHubPang
644fb76d61 Fix a typo for Spectre1021 2021-09-27 20:50:51 -04:00
Christopher Rollings
e3dfe23b59
Work done to allow user to update table cell. (#546) 2021-09-27 13:03:45 +02:00
Phil Scott
ad23855b0a Adds a segment builder for merging multiple segments
When merging a large amount of segments together we were doing a tremendous amount of allocation especially related to strings due to concatination.

This adds an internal SegmentBuilder that uses a stringbuilder for building up the text rather than creating a new instance and doing a concat operation for each segment.
2021-09-27 10:49:44 +02:00
GitHubPang
64f444114a Fix typos 2021-09-23 19:08:03 -04:00
Patrik Svensson
b058c54f3c Disable GH Action workflow for docs 2021-09-23 23:26:31 +02:00
Patrik Svensson
8cfe06e77a Expose extension method that gets the cell width of text 2021-09-18 23:20:28 +02:00
Patrik Svensson
48d49d6e18 Add extension method to get the cell width of a character 2021-09-18 23:20:28 +02:00
Nils Andresen
49e8a980a7 Removed the additional registration of ICommand 2021-09-18 23:19:34 +02:00
GitHubPang
d34012cad0 Fix typos in code comments 2021-09-13 22:58:52 -04:00
Nils Andresen
c3510f3036 fixed 404 in documentation
links were pointing to ./commandApp, however
the generated page is ./commandapp
2021-09-08 12:02:01 +02:00
Cédric Luthi
786b7670da Fix the style parameter nullable annotation on AnsiConsoleExtensions
The style parameter is actually nullable. Also, the documentation of the style parameter has been made explicit that `Style.Plain` is used when a `null` style is passed.
2021-08-31 18:52:34 +02:00
Cédric Luthi
ffd24ec451 Fix intermittent test failure
When running on .NET Framework, the `Should_Report_Max_Remaining_Time_For_Extremely_Small_Progress` would intermittently fail with the following error:
```
task.RemainingTime
    should be
10675199.02:48:05.4775807
    but was
null
```

This is because it's possible that the two increment share the same timestamp thus making the `RemainingTime` null. To ensure the two increments don't share the same timestamp, we sleep for one millisecond.

Although I have only observed this issue on .NET Framework it would be possible that it occasionally also occur on .NET Core.
2021-08-30 11:08:24 +02:00
Cédric Luthi
e081593012 Fix parsing of exceptions on .NET Framework
On .NET Framework, `exception.ToString()` uses a slightly different format than on .NET Core.

So in order to properly transform an `Exception` into an `ExceptionInfo` on both .NET Core and .NET Framework we use `exception.StackTrace` + `exception.InnerException`. As an added benefit, it greatly simplifies the implementation of the `ExceptionParser` class.
2021-08-30 11:08:24 +02:00
Cédric Luthi
bf95564ebb Make tests run on .NET Framework 4.8
Since Spectre.Console targets .NET Standard 2.0 it makes sense to also run tests on .NET Framework (Windows only)

This makes two tests fail: `Should_Write_Exception_With_Inner_Exception` and `Should_Write_Exceptions_With_Generic_Type_Parameters_In_Callsite_As_Expected`.

Received (inner exception not handled):
```
System.InvalidOperationException: Something threw!System.InvalidOperationException: Throwing!
  at Spectre.Console.Tests.Data.TestExceptions.MethodThatThrows(Nullable`1 number) in /xyz/Exceptions.cs:nn
  at Spectre.Console.Tests.Data.TestExceptions.ThrowWithInnerException() in /xyz/Exceptions.cs:nn
```

Verified:
```
System.InvalidOperationException: Something threw!
     System.InvalidOperationException: Throwing!
       at Spectre.Console.Tests.Data.TestExceptions.MethodThatThrows(Nullable`1 number) in /xyz/Exceptions.cs:nn
       at Spectre.Console.Tests.Data.TestExceptions.ThrowWithInnerException() in /xyz/Exceptions.cs:nn
  at Spectre.Console.Tests.Data.TestExceptions.ThrowWithInnerException() in /xyz/Exceptions.cs:nn
  at Spectre.Console.Tests.Unit.ExceptionTests.<>c.<Should_Write_Exception_With_Inner_Exception>b__3_0() in /xyz/ExceptionTests.cs:nn
  at Spectre.Console.Tests.Unit.ExceptionTests.GetException(Action action) in /xyz/ExceptionTests.cs:nn
```
2021-08-30 11:08:24 +02:00
Daniel Cazzulino
3c5b98123b Make building more flexible by allowing feature bands
Currently, the latest stable .NET5 is version 5.0.400, which 
fails with `latestPatch` but works with `latestFeature`. 

Given that the project doesn't appear to depend on any low
level primitives or behaviors that might break from .NET 
feature band upgrades, it's far more convenient for contributors 
to have a more flexible requirement.
2021-08-24 17:18:03 +02:00
Liam Sho
7276e11ecc Add a test for rendering table with EA characters
Test rending a table with East Asia characters (Chinese, Japanese, Korean).

The verified text file may look weird, but it looks normal and correctly in Console (tested in Windows Terminal, Terminal.app in macOS Monterey)
2021-08-24 16:45:30 +02:00
Liam Sho
d306ad82d1 Fix ArgumentOutOfRangeException when rendering a table
When rendering a table with East Asia characters (take 2 English alphabets width) will throw ArgumentOutOfRangeException.
2021-08-24 16:45:30 +02:00
Patrik Svensson
d96817dc9c Do not share semaphore between consoles
Closes #494
2021-08-14 23:43:09 +02:00
Patrik Svensson
e169df6303 Add support for manipulating individual table rows
Closes #500
2021-08-14 23:35:07 +02:00
Patrik Svensson
57731c0d55 Add release notes for version 0.41 2021-07-19 23:12:38 +02:00
Phil Scott
170901f584 Adds additional check that analyzer is within a method
Resolve #487
2021-07-19 22:31:25 +02:00
Phil Scott
c2b25eea8a Using browser context for social cards
Scott Hanselman recommended using the context instead of the browser object. Browser object creates a new context on each call which is a new process. Obviously we don't want that. 

Also added an extra check for a load based on network idle. This will not only ensure things are loaded, but there is a built in 500ms timeout looking for inactivity which will let the font rendering process do it's thing which seems to lag a tad with Chromium.

And while we are at it, preloading the font can't hurt.
2021-07-18 11:23:23 +02:00
Phil Scott
223642b797
Add blog to docs (#484)
* Adding social card infrastructure
* Upgrades doc project to .NET 6
* Adds Playwright
* Changes the console to a web project for Playwright
* Adds social card template
* Added blog content
* Parallelized social image processing
* Updating CI to use .NET 6 for docs build
2021-07-15 19:53:01 +02:00
Nils Andresen
32d7ea15bd
Change LogCommandSettings to CommandSettings in example
Instead of `LogCommandSettings` for the `Settings` of the `HelloCommand`
2021-07-15 09:39:25 +02:00
Patrik Svensson
fa5a1e88ec Clean up Widgets
* Move /Widgets/Live/* to /Live/*
* Move /Widgets/Prompt/* to /Prompts/*
* Move tests and expectations to match the new locations
2021-07-14 08:38:44 -04:00
Antonio Valentini
d532e1011f
Add default value parameter to Confirm extension
Closes #482
2021-07-12 08:47:36 +02:00
Patrik Svensson
5f97f2300c Support cancellation of prompts
Closes #417
2021-07-11 23:10:17 -04:00
Patrik Svensson
884cb8ddd4 Install correct .NET Core SDK 2021-07-11 22:59:02 -04:00
Patrik Svensson
314e50b531 Move analyzer to own solution 2021-07-11 22:59:02 -04:00
Patrik Svensson
d9f06413d0 Remove examples from main solution 2021-07-11 22:59:02 -04:00
Patrik Svensson
6e2ca8449e Add solution for examples 2021-07-11 22:59:02 -04:00
Patrik Svensson
58eff30787 LineTreeGuide should not fall back to ASCII
If the user's environment didn't support unicode, we used
to fall back to using the AsciiTreeGuide if LineTreeGuide
was being used (which it is by default). This commit removes
that fallback since the characters used in LineTreeGuide is
covered by extended ASCII, which SHOULD be fine in almost all
scenarios.

Closes #324
2021-07-10 18:01:17 -04:00
Patrik Svensson
aa59f6cd55 Update .NET Core SDK to 5.0.301 2021-07-05 09:15:54 +02:00
Patrik Svensson
2011cb2eff Do not append suffix to text prompt
Do not append suffix to text prompt unless
there are choices or a default value specified.

Closes #413
2021-07-05 09:15:54 +02:00
Patrik Svensson
865552c3f2 Add support for selecting prompt items
Closes #447
2021-06-28 08:41:24 -04:00
Phil Scott
fa553fd72e Adds documentation for analyzers 2021-06-25 09:56:20 +02:00
Patrik Svensson
a186fd94ac Preserve whitespace trivia when applying code fix 2021-06-23 23:04:37 -04:00
Nils Andresen
6b5b31957c Added a TypeRegistrar to CommandAppTester
exposed as a public property.
For convenience, and to keep the similarity to the real CommandApp
it is also available in the ctor of CommandAppTester.
2021-06-24 01:42:29 +02:00
Nils Andresen
b92827ce3d (#460) added an overload to AnsiConsole.Ask
that takes an additional default value.
2021-06-23 23:47:12 +02:00
Patrik Svensson
c9b178ac96 Moved analyzer tests to its own project
Also moves tests to `./test` which makes it possible
for all test projects to share the same .editorconfig
files and similar.
2021-06-23 22:47:12 +02:00
Phil Scott
721d73e9eb Renames BaseAnalyzer to SpectreAnalyzer 2021-06-23 16:36:48 +02:00
Phil Scott
8b058d6342 Renaming analyzer test project to sandbox 2021-06-23 16:36:48 +02:00
Phil Scott
d1048260cc Making the project ready for deployment
Analyzer package needs all the dependencies to be private assets, and it's output pushed to teh analyzers/dotnet/cs folder. 

We don't want anything in the lib folder, so it also disables the auto build output and warnings that there are no files for the target framework in the lib folder
2021-06-23 16:36:48 +02:00
Phil Scott
bdcc01ea68 Adding analyzers for common mistakes with live renderables 2021-06-23 16:36:48 +02:00
Phil Scott
4f293d887d Adding analyzer project
Contains two analyzers with fixes

* Use AnsiConsole over System.Console
* Favor local instance over static implementation
2021-06-23 16:36:48 +02:00
GianHodgson
d015a4966f Hardblank 2021-06-21 01:23:18 +02:00
18-F-cali
5cbe9d40b0 Removed extra line from example code. 2021-06-19 02:38:01 +02:00
Chris Missal
5faa61fa64 Correct documentation comment text 2021-06-09 23:56:30 +02:00
C. Augusto Proiete
087f216bcf Add README translation to Brazilian Portuguese (pt-BR) 2021-06-09 23:44:45 +02:00
Ahmed Şeref
ebd7bb5949 Update canvas.md 2021-06-09 23:43:55 +02:00
Phil Scott
0bf97cb666 Adding additional tests for property binding with value types 2021-06-08 21:21:35 +02:00
Phil Scott
ebb1076dd0 Check for default value before writing property values
Previous version was overwriting values that might have been set via a property initializer.

Closes #422
2021-06-08 21:21:35 +02:00
Phil Scott
21f731ebd5 Using Statiq processes for tailwind commands
Tweaks tailwind to use jit mode and misc content tweaks


Changes point in which tailwind is built
2021-05-28 14:31:57 +02:00
Patrik Svensson
397860e42e Revert PR #436
Using Statiq processes for tailwind commands

This reverts commit adb600c4301db4c0d9ce52cb6a4fe410db2baa17.
This reverts commit ab83e41051d198b550898ff5be30062214779308.
2021-05-26 13:41:49 +02:00
Phil Scott
adb600c430 Tweaks tailwind to use jit mode and misc content tweaks 2021-05-26 10:31:15 +02:00
Dave Glick
ab83e41051 Using Statiq processes for tailwind commands 2021-05-26 10:31:15 +02:00
Phil Scott
0d2a75aeee Add Cascadia Code as a webfont for fallback
This is only for Android (hopefully) which has a system font that doesn't have standard width box drawing characters. 

Other systems should still use their defaults.
2021-05-24 15:42:12 +02:00
Cédric Luthi
bfdaef95d6
Fix OverflowException when estimating the progress remaining time (#404)
Fix OverflowException when estimating the progress remaining time
2021-05-24 09:56:29 +02:00
Phil Scott
cb8dc97847 Removes inline-block from console output in docs
This was causing the output to wrap in chrome on ipad and only the ipad. Not quite sure why it was needed in the first place so it's gone.
2021-05-24 09:44:27 +02:00
Patrik Svensson
450d87f5d3 Add support for fake input in asciicast recordings
* Fixes a bug with `SelectionPrompt` and page size.
* Allow `IAnsiConsoleInput` to return `null`.
2021-05-23 22:22:44 -04:00
Phil Scott
46abadaccb Add AsciiCast demos for docs 2021-05-23 23:30:14 +02:00
Phil Scott
69fdae70c0 Fixes non-interactive progress bars from rendering little info
If any task was not-started or finishes then everything stops rendering. I suspect this worked ok but wasn't noticed until we introduced the indeterminate progress task that starts off not-started which caused everything to bail early in the demos.
2021-05-22 09:17:34 +02:00
Patrik Svensson
91a0be86a3 Remove empty solution folder 2021-05-21 11:14:18 +02:00
Patrik Svensson
ab09a30bc7 Update dotnet example 2021-05-21 11:14:18 +02:00
Patrik Svensson
a2ed88e2eb Remove some Star Wars movies
Closes #424
2021-05-21 11:14:18 +02:00
Patrik Svensson
3dea412785 Add live display support
This commit also adds functionality to LiveRenderable that should
fix some problems related to vertical overflow.

Closes #316
Closes #415
2021-05-20 19:41:10 -04:00
Johan Lindfors
5d68020abb Wrong method in code example
Wrong method called in the documentation for the Calendar widget.
2021-05-19 13:46:39 +02:00
Patrik Svensson
315a52f3e9 Add support for hierarchical list prompts
Closes #412
2021-05-18 11:34:16 -04:00
Ion Dormenco
c147929f16
Add color aliases 2021-05-12 23:44:11 +02:00
Patrik Svensson
6549436356 Fix line break regression
In commit d1d94cd, we accidentally introduced a regression
since conhost requires all line breaks to be `\r\n`.
2021-05-10 17:42:49 -04:00
Sean Fausett
1dfc6bdadc Fix async race condition 2021-05-10 09:18:58 +02:00
Sean Fausett
2ba06577ef
Improve CommandApp error message rendering
* Move line break to end of error message
* Move line break to start of each help section

Closes #392
2021-05-10 09:17:20 +02:00
Crypto Compress
ea5b7338ad renamed *`1.cs to *OfT.cs 2021-05-09 08:35:10 -05:00
Patrik Svensson
4d88a6ab69 Play nice with type converters 2021-05-09 08:26:08 -05:00
Patrik Svensson
1dd1945297 Add parameter value provider support
Adds support for parameter value providers which makes it
possible to set custom values for parameters.
2021-05-09 08:26:08 -05:00
Patrik Svensson
d1d94cdebe Add Length and Lines properties to Paragraph
* Adds Length and Lines to `Paragraph`, `Markup` and `Text`.
* Do not use Environment.NewLine
2021-05-03 17:24:44 +02:00
Patrik Svensson
e48ae9600a Revert shrinking of example.png 2021-04-29 17:17:02 -05:00
chenxuuu
d63255aa5f update to the latest version 2021-04-29 18:05:30 +02:00
Phil Scott
9a68b27b31 Shrinks PNGs and converts large gif to webm
PNGs were ran through TinyPng. Table.gif was weighing in at over 1.7mb
on my machine. Converted to webm and it's down to 80kb which is pretty
nice for something on the home page. Other gifs didn't have that much of
an improvement so I just left them as GIFs.
2021-04-25 02:52:36 +02:00
Phil Scott
2a9fbb1ee9
New doc theme (#387) 2021-04-24 22:20:59 +02:00
Sean Fausett
b568098d5e Fix required vs optional argument denotation 2021-04-23 23:34:33 -04:00
Patrik Svensson
cba02070f9 Add method to get VT/ANSI codes for renderables 2021-04-23 13:09:44 -04:00
Phil Scott
01f707c78d Exposes Pretty property of CommandAppException
If a user is propagating the exceptions we aren't going to automatically display them. They might still want to get this exception message and use it, so we'll make it publicly available.
2021-04-23 16:44:41 +02:00
Phil Scott
8d67c0a6b4 Removes printing of error messages when propagating 2021-04-23 16:44:41 +02:00
Patrik Svensson
3463dde543 Add method to write VT/ANSI control codes
Adds a new extension method IAnsiConsole.WriteAnsi that writes
VT/ANSI control codes to the console. If VT/ANSI control codes are
not supported, nothing will be written.
2021-04-22 22:16:10 -04:00
Fraser Waters
91f910326c Fix maxWidth bug in Panel
Panel could pass a maxWidth to the child Render function that was greater than the maxWidth that was passed to the Panel render function.
I noticed this when trying to nest a table in a panel and the word wrapping was being disabled.

N.B It might be that Table.Measure ought to not return a measurment larger than maxWidth, but this Panel change seems defensivly sensible regardless.
2021-04-22 22:14:49 +02:00
Phil Scott
79af013bf2 Expanding CLI docs
Adding new pages for commandApp, commands and settings.
2021-04-21 17:51:59 +02:00
Patrik Svensson
04efd1719c Add new test framework for consoles 2021-04-19 20:39:45 -04:00
1782 changed files with 69195 additions and 50585 deletions

View File

@ -2,7 +2,7 @@ root = true
[*]
charset = utf-8
end_of_line = CRLF
end_of_line = LF
indent_style = space
indent_size = 4
insert_final_newline = false
@ -26,10 +26,10 @@ indent_size = 2
[*.md]
trim_trailing_whitespace = false
[*.sh]
end_of_line = lf
[*.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

5
.git-blame-ignore-revs Normal file
View File

@ -0,0 +1,5 @@
# Use file scoped namespace declarations
7b2da0a4f63bf3ceab99d2c88535e74155f2b99c
# fix line-endings
e2ad4b1ea5555e701cda4fd400bb6592e318e1ff

4
.gitattributes vendored Normal file
View File

@ -0,0 +1,4 @@
* text=auto
*.cs text eol=lf
*.md text eol=lf

View File

@ -2,7 +2,7 @@
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug
labels: ["bug", "needs triage"]
assignees: ''
---
@ -26,3 +26,6 @@ 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.

View File

@ -2,7 +2,7 @@
name: Feature request
about: Suggest an idea for this project
title: ''
labels: enhancement
labels: ["feature", "needs triage"]
assignees: ''
---
@ -18,3 +18,6 @@ A clear and concise description of any alternative solutions or features you've
**Additional context**
Add any other context or screenshots about the feature request here.
---
Please upvote :+1: this issue if you are interested in it.

22
.github/pull_request_template.md vendored Normal file
View File

@ -0,0 +1,22 @@
<!--
Do NOT open a PR without discussing the changes on an open issue, first.
Add the issue number here. e.g. #123
-->
fixes #
<!-- formalities. These are not optional. -->
- [ ] I have read the [Contribution Guidelines](https://github.com/spectreconsole/spectre.console/blob/main/CONTRIBUTING.md)
- [ ] I have commented on the issue above and discussed the intended changes
- [ ] A maintainer has signed off on the changes and the issue was assigned to me
- [ ] All newly added code is adequately covered by tests
- [ ] All existing tests are still running without errors
- [ ] The documentation was modified to reflect the changes _OR_ no documentation changes are required.
## Changes
<!-- describe the changes you made. -->
---
Please upvote :+1: this pull request if you are interested in it.

20
.github/renovate.json vendored Normal file
View File

@ -0,0 +1,20 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:base"
],
"dependencyDashboard": false,
"commitMessagePrefix": "chore:",
"labels": ["dependencies"],
"npm": {
"ignorePaths": [
"**/node_modules/**",
"**/bower_components/**",
"docs/**"
]
},
"ignorePaths": [
"resources/scripts/**",
"docs/**"
]
}

18
.github/workflows/backlog.yaml vendored Normal file
View File

@ -0,0 +1,18 @@
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
name: Add issues/PRs to backlog automatically
on:
issues:
types:
- opened
- transferred
jobs:
add-to-project:
name: Add issue to backlog
runs-on: ubuntu-latest
steps:
- uses: actions/add-to-project@main
with:
project-url: https://github.com/orgs/spectreconsole/projects/1
github-token: ${{ secrets.PROJECT_TOKEN }}

View File

@ -1,4 +1,5 @@
name: Continuous Integration
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
name: Pull Request
on: pull_request
env:
@ -7,30 +8,6 @@ env:
jobs:
###################################################
# DOCS
###################################################
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.202
- name: Build
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cd docs
dotnet run --configuration Release
###################################################
# BUILD
###################################################
@ -38,48 +15,29 @@ jobs:
build:
name: Build
if: "!contains(github.event.head_commit.message, 'skip-ci')"
strategy:
matrix:
kind: ['linux', 'windows', 'macOS']
include:
- kind: linux
os: ubuntu-latest
- kind: windows
os: windows-latest
- kind: macOS
os: macos-latest
runs-on: ${{ matrix.os }}
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup dotnet 3.1.402
uses: actions/setup-dotnet@v1
- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: 3.1.402
- name: Setup dotnet 5.0.100
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.202
- name: Integration Tests
shell: bash
run: |
dotnet tool restore
dotnet example --all
dotnet-version: |
8.0.x
9.0.x
- name: Build
shell: bash
run: |
dotnet tool restore
dotnet cake
- name: Upload Verify Test Results
if: failure()
uses: actions/upload-artifact@v2
uses: actions/upload-artifact@v4
with:
name: verify-test-results
path: |

View File

@ -1,35 +0,0 @@
name: Deploy Documentation
on:
workflow_dispatch:
push:
paths:
- 'docs/**'
- 'src/**'
jobs:
###################################################
# DOCS
###################################################
build:
name: Deploy
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.202
- name: Publish
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cd docs
dotnet run --configuration Release -- deploy

View File

@ -1,3 +1,4 @@
# yaml-language-server: $schema=https://json.schemastore.org/github-workflow.json
name: Publish
on:
@ -6,8 +7,6 @@ on:
- '*'
branches:
- main
paths:
- 'src/**'
env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true
@ -15,95 +14,26 @@ env:
jobs:
###################################################
# DOCS
###################################################
docs:
name: Documentation
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@master
- name: Setup dotnet
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.202
- name: Build
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
cd docs
dotnet run --configuration Release
###################################################
# BUILD
###################################################
build:
name: Build
needs: [docs]
if: "!contains(github.event.head_commit.message, 'skip-ci') || startsWith(github.ref, 'refs/tags/')"
strategy:
matrix:
kind: ['linux', 'windows', 'macOS']
include:
- kind: linux
os: ubuntu-latest
- kind: windows
os: windows-latest
- kind: macOS
os: macos-latest
runs-on: ${{ matrix.os }}
steps:
- name: Checkout
uses: actions/checkout@v2
with:
fetch-depth: 0
- name: Setup dotnet 3.1.402
uses: actions/setup-dotnet@v1
with:
dotnet-version: 3.1.402
- name: Setup dotnet 5.0.100
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.202
- name: Build
shell: bash
run: |
dotnet tool restore
dotnet cake
###################################################
# PUBLISH
###################################################
publish:
name: Publish
needs: [build]
build:
name: Publish NuGet Packages
if: "!contains(github.event.head_commit.message, 'skip-ci') || startsWith(github.ref, 'refs/tags/')"
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup dotnet 3.1.402
uses: actions/setup-dotnet@v1
- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
with:
dotnet-version: 3.1.402
- name: Setup dotnet 5.0.100
uses: actions/setup-dotnet@v1
with:
dotnet-version: 5.0.202
dotnet-version: |
8.0.x
9.0.x
- name: Publish
shell: bash
@ -111,4 +41,44 @@ jobs:
dotnet tool restore
dotnet cake --target="publish" \
--nuget-key="${{secrets.NUGET_API_KEY}}" \
--github-key="${{secrets.GITHUB_TOKEN}}"
--github-key="${{secrets.GITHUB_TOKEN}}"
###################################################
# DOCS
###################################################
documentation:
name: Publish Documentation
needs: [build]
runs-on: windows-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: Setup .NET SDK
uses: actions/setup-dotnet@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '16'
- name: Cache dependencies
uses: actions/cache@v4
with:
path: ~/.npm
key: npm-${{ hashFiles('package-lock.json') }}
restore-keys: npm-
- name: Publish Documentation
shell: bash
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
NETLIFY_ACCESS_TOKEN: ${{ secrets.NETLIFY_ACCESS_TOKEN }}
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }}
run: |
cd docs
dotnet tool restore
dotnet run --configuration Release -- deploy

View File

@ -0,0 +1,24 @@
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

4
.gitignore vendored
View File

@ -88,4 +88,6 @@ packages
# Windows
Thumbs.db
*.received.*
*.received.*
node_modules

View File

@ -2,45 +2,131 @@
## Our Pledge
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
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 creating a positive environment include:
Examples of behavior that contributes to a positive environment for our
community include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
* 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 by participants include:
Examples of unacceptable behavior include:
* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* 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 electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting
* 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
## Our Responsibilities
## Enforcement Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
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.
Project maintainers 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, or to ban temporarily or permanently any contributor for other behaviors 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 both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
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 by contacting the project team at hello@spectresystems.se. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
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.
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
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 1.4, available at [http://contributor-covenant.org/version/1/4][version]
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].
[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/
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

View File

@ -39,7 +39,7 @@ What is generally considered trivial:
### Code style
Normal .NET coding guidelines apply.
See the [Framework Design Guidelines](https://msdn.microsoft.com/en-us/library/ms229042%28v=vs.110%29.aspx) for more information.
See the [Framework Design Guidelines](https://learn.microsoft.com/en-us/dotnet/standard/design-guidelines/) for more information.
### Dependencies
@ -59,7 +59,7 @@ Any new code should also have reasonable unit test coverage.
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
[Up For Grabs](https://github.com/spectreconsole/spectre.console/labels/up-for-grabs) label,
[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.
@ -158,4 +158,4 @@ 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.
with permission and was edited to follow Spectre.Console's conventions and processes.

View File

@ -1,6 +1,6 @@
MIT License
Copyright (c) 2020 Patrik Svensson, Phil Scott
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

View File

@ -4,7 +4,7 @@ _[![Spectre.Console NuGet Version](https://img.shields.io/nuget/v/spectre.consol
<div dir="rtl">
یک کتابخانه NET Standard 2.0/.NET 5. که ایجاد Console Applicationهای زیبا و cross platform را آسان‌تر می‌کند.
یک کتابخانه .NET. که ایجاد Console Applicationهای زیبا و cross platform را آسان‌تر می‌کند.
از کتابخانه عالی [Rich](https://github.com/willmcgugan/rich) برای پایتون، بسیار الهام گرفته شده است.
## فهرست
@ -44,30 +44,13 @@ https://spectreconsole.net/
<h2 id="examples">مثال‌ها</h2>
برای بررسی `Spectre.Console` در عمل، ابزار سراسری
[dotnet-example](https://github.com/patriksvensson/dotnet-example)
را نصب کنید.
<pre dir="ltr">
> dotnet tool restore
</pre>
حالا شما می‌توانید مثال‌های موجود در این مخزن را لیست کنید:
<pre dir="ltr">
> dotnet example
</pre>
و برای اجرای مثال:
<pre dir="ltr">
> dotnet example tables
</pre>
To see `Spectre.Console` in action, please see the
[examples repository](https://github.com/spectreconsole/examples).
<h2 id="license">مجوز</h2>
<div dir="ltr">
Copyright © Patrik Svensson, Phil Scott
Copyright © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
</div>
همانطور که Spectre.Console تحت مجوز MIT ارائه شده است؛ برای کسب اطلاعات بیشتر به مجوز مراجعه کنید.

View File

@ -2,7 +2,7 @@
_[![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 Standard 2.0ライブラリです。
綺麗なコンソールアプリケーションを簡単に作成するための.NETライブラリです。
Python用の素晴らしい[Rich ライブラリ](https://github.com/willmcgugan/rich)に強く影響を受けています。
## 目次

View File

@ -1,34 +1,39 @@
# `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 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 CLI NuGet Version](https://img.shields.io/nuget/v/spectre.console.cli.svg?style=flat&label=NuGet%3A%20Spectre.Console.Cli)](https://www.nuget.org/packages/spectre.console.cli)_ [![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 5/.NET Standard 2.0 library that makes it easier to create beautiful, cross platform, console applications.
It is heavily inspired by the excellent [Rich library](https://github.com/willmcgugan/rich)
for Python.
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)
2. [Installing](#installing)
3. [Documentation](#documentation)
4. [Examples](#examples)
5. [Sponsors](#sponsors)
5. [License](#license)
1. [Installing](#installing)
1. [Documentation](#documentation)
1. [Examples](#examples)
1. [Sponsors](#sponsors)
1. [Code of Conduct](#code-of-conduct)
1. [.NET Foundation](#net-foundation)
1. [License](#license)
## Features
* Written with unit testing in mind.
* Supports tables, grids, panels, and a [rich](https://github.com/willmcgugan/rich) inspired markup language.
* Supports tables, grids, panels, and a [Rich](https://github.com/willmcgugan/rich) inspired markup language.
* Supports the most common SRG 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.
and downgrade colors as needed.
* Written with unit testing in mind.
![Example](docs/input/assets/images/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.
@ -40,53 +45,46 @@ dotnet add package Spectre.Console
## Documentation
The documentation for `Spectre.Console` can be found at
https://spectreconsole.net/
https://spectreconsole.net
## Examples
To see `Spectre.Console` in action, install the
[dotnet-example](https://github.com/patriksvensson/dotnet-example)
global tool.
```
> dotnet tool restore
```
Now you can list available examples in this repository:
```
> dotnet example
```
And to run an example:
```
> dotnet example tables
```
To see `Spectre.Console` in action, please see the
[examples repository](https://github.com/spectreconsole/examples).
## Sponsors
The following people are [sponsoring](https://github.com/sponsors/patriksvensson)
Spectre.Console to show their support and to ensure the longevity of the project.
`Spectre.Console` to show their support and to ensure the longevity of the project.
* [Rodney Littles II](https://github.com/RLittlesII)
* [Martin Björkström](https://github.com/bjorkstromm)
* [Dave Glick](https://github.com/daveaglick)
* [Kim Gunanrsson](https://github.com/kimgunnarsson)
* [Kim Gunnarsson](https://github.com/kimgunnarsson)
* [Andrew McClenaghan](https://github.com/andymac4182)
* [C. Augusto Proiete](https://github.com/augustoproiete)
* [Viktor Elofsson](https://github.com/vktr)
* [Steven Knox](https://github.com/stevenknox)
* [David Pendray](https://github.com/dpen2000)
* [Elmah.io](https://github.com/elmahio)
* [Tom Kerkhove](https://github.com/tomkerkhove)
I really appreciate it.
We really appreciate it.
**Thank you very much!**
## 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
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.
`Spectre.Console` is provided as-is under the MIT license. For more information see LICENSE.
* For SixLabors.ImageSharp, see https://github.com/SixLabors/ImageSharp/blob/master/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

74
README.pt-BR.md Normal file
View File

@ -0,0 +1,74 @@
# `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)
2. [Instalação](#instalação)
3. [Documentação](#documentação)
4. [Exemplos](#exemplos)
5. [Patrocinadores](#patrocinadores)
5. [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 SRG 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](docs/input/assets/images/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).
## Patrocinadores
As seguintes pessoas estão [patrocinando](https://github.com/sponsors/patriksvensson)
o Spectre.Console para mostrar o seu apoio e garantir a longevidade do projeto.
* [Rodney Littles II](https://github.com/RLittlesII)
* [Martin Björkström](https://github.com/bjorkstromm)
* [Dave Glick](https://github.com/daveaglick)
* [Kim Gunanrsson](https://github.com/kimgunnarsson)
* [Andrew McClenaghan](https://github.com/andymac4182)
* [C. Augusto Proiete](https://github.com/augustoproiete)
* [Viktor Elofsson](https://github.com/vktr)
* [Steven Knox](https://github.com/stevenknox)
* [David Pendray](https://github.com/dpen2000)
* [Elmah.io](https://github.com/elmahio)
Eu estou muito agradecido.
**Muito obrigado!**
## 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

View File

@ -2,17 +2,18 @@
_[![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 5/.NET Standard 2.0 的库,能让您在终端里更方便地生成精美的界面
`Spectre.Console`是一个 .NET 的库,可以更轻松地创建美观的跨平台控制台应用程序
深受 [Rich](https://github.com/willmcgugan/rich) 这个优秀库的启发。
深受 [Rich](https://github.com/willmcgugan/rich) 这个Python优秀库的启发。
## 目录
1. [功能](#features)
2. [安装](#installing)
3. [文档](#documentation)
4. [例子](#examples)
5. [License](#license)
1. [功能](#功能)
2. [安装](#安装)
3. [文档](#文档)
4. [例子](#例子)
5. [Sponsors](#Sponsors)
6. [开源许可](#开源许可)
## 功能
@ -21,11 +22,11 @@ _[![Spectre.Console NuGet Version](https://img.shields.io/nuget/v/spectre.consol
* 支持大部分的 SRG 参数,包括粗体、暗淡字、斜体、下划线、删除线和闪烁文本。
* 支持终端显示 3/4/8/24 位色。自动检测终端类型,自适应颜色范围。
![例子](resources/gfx/screenshots/example.png)
![例子](docs/input/assets/images/example.png)
## 安装
最快的安装方式就是用NuGet包管理直接安装Spectre.Console。
最快的安装方式就是用NuGet包管理直接安装`Spectre.Console`
```csharp
dotnet add package Spectre.Console
@ -38,27 +39,30 @@ https://spectreconsole.net/
## 例子
如果想直接运行`Spectre.Console`的例子,则需要安装[dotnet-example](https://github.com/patriksvensson/dotnet-example)工具。
To see `Spectre.Console` in action, please see the
[examples repository](https://github.com/spectreconsole/examples).
```
> dotnet tool restore
```
## Sponsors
然后你可以列出仓库里的所有例子:
下面这些用户正在[sponsor](https://github.com/sponsors/patriksvensson)上支持着Spectre.Console确保这个项目的持续维护。
```
> dotnet example
```
* [Rodney Littles II](https://github.com/RLittlesII)
* [Martin Björkström](https://github.com/bjorkstromm)
* [Dave Glick](https://github.com/daveaglick)
* [Kim Gunanrsson](https://github.com/kimgunnarsson)
* [Andrew McClenaghan](https://github.com/andymac4182)
* [C. Augusto Proiete](https://github.com/augustoproiete)
* [Viktor Elofsson](https://github.com/vktr)
* [Steven Knox](https://github.com/stevenknox)
* [David Pendray](https://github.com/dpen2000)
* [Elmah.io](https://github.com/elmahio)
跑一个看看效果:
我对此表示十分感激
**非常感谢各位!**
```
> dotnet example tables
```
## 开源许可
## License
版权所有 © Patrik Svensson, Phil Scott
版权所有 © Patrik Svensson, Phil Scott, Nils Andresen, Cédric Luthi, Frank Ray
Spectre.Console 基于 MIT 协议提供。查看 LICENSE 文件了解更多信息。

View File

@ -4,13 +4,33 @@ var configuration = Argument("configuration", "Release");
////////////////////////////////////////////////////////////////
// Tasks
Task("Clean")
.Does(context =>
{
context.CleanDirectory("./.artifacts");
});
Task("Build")
.IsDependentOn("Clean")
.Does(context =>
{
DotNetCoreBuild("./src/Spectre.Console.sln", new DotNetCoreBuildSettings {
Information("Compiling generator...");
DotNetBuild("./resources/scripts/Generator/Generator.sln", new DotNetBuildSettings {
Configuration = configuration,
Verbosity = DotNetVerbosity.Minimal,
NoLogo = true,
NoIncremental = context.HasArgument("rebuild"),
MSBuildSettings = new DotNetCoreMSBuildSettings()
MSBuildSettings = new DotNetMSBuildSettings()
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
});
Information("\nCompiling Spectre.Console...");
DotNetBuild("./src/Spectre.Console.sln", new DotNetBuildSettings {
Configuration = configuration,
Verbosity = DotNetVerbosity.Minimal,
NoLogo = true,
NoIncremental = context.HasArgument("rebuild"),
MSBuildSettings = new DotNetMSBuildSettings()
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
});
});
@ -19,63 +39,41 @@ Task("Test")
.IsDependentOn("Build")
.Does(context =>
{
DotNetCoreTest("./src/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetCoreTestSettings {
DotNetTest("./src/Tests/Spectre.Console.Tests/Spectre.Console.Tests.csproj", new DotNetTestSettings {
Configuration = configuration,
Verbosity = DotNetVerbosity.Minimal,
NoLogo = true,
NoRestore = true,
NoBuild = true,
});
DotNetTest("./src/Tests/Spectre.Console.Cli.Tests/Spectre.Console.Cli.Tests.csproj", new DotNetTestSettings {
Configuration = configuration,
Verbosity = DotNetVerbosity.Minimal,
NoLogo = true,
NoRestore = true,
NoBuild = true,
});
});
Task("Package")
.IsDependentOn("Test")
//.IsDependentOn("Test")
.Does(context =>
{
context.CleanDirectory("./.artifacts");
context.DotNetCorePack($"./src/Spectre.Console.sln", new DotNetCorePackSettings {
context.DotNetPack($"./src/Spectre.Console.sln", new DotNetPackSettings {
Configuration = configuration,
NoRestore = true,
NoBuild = true,
Verbosity = DotNetVerbosity.Minimal,
NoLogo = true,
NoRestore = false,
NoBuild = false,
OutputDirectory = "./.artifacts",
MSBuildSettings = new DotNetCoreMSBuildSettings()
MSBuildSettings = new DotNetMSBuildSettings()
.TreatAllWarningsAs(MSBuildTreatAllWarningsAs.Error)
});
});
Task("Publish-GitHub")
.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
.IsDependentOn("Package")
.Does(context =>
{
var apiKey = Argument<string>("github-key", null);
if(string.IsNullOrWhiteSpace(apiKey)) {
throw new CakeException("No GitHub API key was provided.");
}
// Publish to GitHub Packages
var exitCode = 0;
foreach(var file in context.GetFiles("./.artifacts/*.nupkg"))
{
context.Information("Publishing {0}...", file.GetFilename().FullPath);
exitCode += StartProcess("dotnet",
new ProcessSettings {
Arguments = new ProcessArgumentBuilder()
.Append("gpr")
.Append("push")
.AppendQuoted(file.FullPath)
.AppendSwitchSecret("-k", " ", apiKey)
}
);
}
if(exitCode != 0)
{
throw new CakeException("Could not push GitHub packages.");
}
});
Task("Publish-NuGet")
.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
//.WithCriteria(ctx => BuildSystem.IsRunningOnGitHubActions, "Not running on GitHub Actions")
.IsDependentOn("Package")
.Does(context =>
{
@ -88,10 +86,11 @@ Task("Publish-NuGet")
foreach(var file in context.GetFiles("./.artifacts/*.nupkg"))
{
context.Information("Publishing {0}...", file.GetFilename().FullPath);
DotNetCoreNuGetPush(file.FullPath, new DotNetCoreNuGetPushSettings
DotNetNuGetPush(file.FullPath, new DotNetNuGetPushSettings
{
Source = "https://api.nuget.org/v3/index.json",
ApiKey = apiKey,
SkipDuplicate = true
});
}
});
@ -100,7 +99,6 @@ Task("Publish-NuGet")
// Targets
Task("Publish")
.IsDependentOn("Publish-GitHub")
.IsDependentOn("Publish-NuGet");
Task("Default")

1
docs/.gitignore vendored
View File

@ -7,6 +7,7 @@
[Tt]ools/
![Tt]ools/packages.config
[Oo]utput/
[Cc]ache/
![Ii]nput/
nuget.exe
*.com

View File

@ -1,16 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<TargetFramework>net8.0</TargetFramework>
<RunWorkingDirectory>$(MSBuildProjectDirectory)</RunWorkingDirectory>
<DefaultItemExcludes>$(DefaultItemExcludes);output\**;.gitignore</DefaultItemExcludes>
<MinVerSkip Condition="'$(Configuration)' == 'Debug'">true</MinVerSkip>
<NoWarn>MVC1000</NoWarn>
<MinVerSkip>true</MinVerSkip>
<!--
Disable NuGetAudit for now, there is an in progress PR with Statiq regarding these packages,
but since since this is just a generator we are safe to ignore this for now.
-->
<NuGetAudit>false</NuGetAudit>
</PropertyGroup>
<ItemGroup>
<Compile Remove="input\**" />
<Compile Remove="sass\**" />
<Compile Include="input\api\Sections\_ConstantValue.cshtml.cs" />
</ItemGroup>
<ItemGroup>
@ -31,8 +38,13 @@
</ItemGroup>
<ItemGroup>
<PackageReference Include="Statiq.Web" Version="1.0.0-beta.13" />
<PackageReference Include="MinVer" PrivateAssets="All" Version="2.3.1" />
<PackageReference Include="Microsoft.Playwright" Version="1.49.0" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Statiq.CodeAnalysis" Version="1.0.0-beta.72" />
<PackageReference Include="Statiq.Common" Version="1.0.0-beta.72" />
<PackageReference Include="Statiq.Web" Version="1.0.0-beta.60" />
<PackageReference Include="MinVer" PrivateAssets="All" Version="6.0.0" />
<PackageReference Include="Statiq.Web.Netlify" Version="1.0.0-beta.60" />
</ItemGroup>
<ItemGroup>

0
docs/Preview.ps1 Normal file → Executable file
View File

View File

@ -1,7 +1,12 @@
using System.Collections.Generic;
using System.Threading.Tasks;
using Docs.Extensions;
using Docs.Shortcodes;
using Docs.Utilities;
using Microsoft.Extensions.DependencyInjection;
using Statiq.App;
using Statiq.Common;
using Statiq.Core;
using Statiq.Web;
namespace Docs
@ -14,12 +19,47 @@ namespace Docs
.AddSetting(Keys.Host, "spectreconsole.net")
.AddSetting(Keys.LinksUseHttps, true)
.AddSetting(Constants.EditLink, ConfigureEditLink())
.AddSetting(Constants.SourceFiles, new List<string>
{
"../../src/Spectre.Console/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
"../../src/Spectre.Console.Cli/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
"../../src/Extensions/Spectre.Console.ImageSharp/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
"../../src/Extensions/Spectre.Console.Json/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs"
})
.AddSetting(Constants.ExampleSourceFiles, new List<string>
{
"../../examples/**/{!bin,!obj,!packages,!*.Tests,}/**/*.cs",
}
)
.ConfigureServices(i =>
{
i.AddSingleton(new TypeNameLinks());
})
.ConfigureSite("spectreconsole", "spectre.console", "main")
.ConfigureDeployment(deployBranch: "docs")
.AddShortcode("Children", typeof(ChildrenShortcode))
.AddShortcode("ColorTable", typeof(ColorTableShortcode))
.AddShortcode("EmojiTable", typeof(EmojiTableShortcode))
.AddShortcode("Alert", typeof(AlertShortcode))
.AddShortcode("Info", typeof(InfoShortcode))
.AddShortcode("AsciiCast", typeof(AsciiCastShortcode))
.AddShortcode("Example", typeof(ExampleSnippet))
.AddPipelines()
.BuildPipeline(
"Bootstrap",
builder => builder
.WithInputReadFiles("../node_modules/asciinema-player/dist/bundle/asciinema-player.js")
.WithProcessModules(new SetDestination(Config.FromDocument(doc => new NormalizedPath($"./assets/{doc.Source.FileName}")), true))
.WithOutputWriteFiles()
)
.AddProcess(ProcessTiming.Initialization, _ => new ProcessLauncher("npm", "install --audit false --fund false --progress false")
{
LogErrors = false
})
.AddProcess(ProcessTiming.Initialization, _ => new ProcessLauncher("dotnet", "playwright install chromium"))
.AddProcess(ProcessTiming.BeforeDeployment, _ => new ProcessLauncher("npm", "run build:tailwind")
{
LogErrors = false
})
.RunAsync();
private static Config<string> ConfigureEditLink()

View File

@ -1,6 +1,6 @@
# Documentation
To start contributing to the [Spectre.Console](https://github.com/spectreconsole/spectre.console) documentation, you will need the [.NET Core SDK](https://dot.net) 3.1 or higher.
To start contributing to the [Spectre.Console](https://github.com/spectreconsole/spectre.console) documentation, you will need the [.NET Core SDK](https://dot.net) 7.0.100 or higher (as defined in the repository root `global.json` file).
## Running Preview Site
@ -10,9 +10,11 @@ The documentation site uses [Statiq](https://statiq.dev), a static site generato
> Preview.ps1
```
After the build is complete, you can navigate to [http://localhost:5080/spectre.console](http://localhost:5080/spectre.console).
After the build is complete, you can navigate to [http://localhost:5080](http://localhost:5080).
**Note that the site runs under a virtual directory.**
## Npm
The site uses some tools from the JavaScript ecosystem including npm. While Statiq will execute `npm install` and other commands as needed, you need to have [npm installed](https://www.npmjs.com/get-npm) before running a site build.
## Editing Content
@ -21,7 +23,7 @@ The documentation is written using [Markdown](https://www.markdownguide.org/basi
Markdown files can be found under the following directories:
- [/input](./input)
- [/appendix](./input/appendix)
- [/appendix](./input/appendix)
## Editing Layout
@ -35,7 +37,7 @@ The documentation site has custom enhancements to Statiq located under the [./sr
MIT License
Copyright (c) 2020 Patrik Svensson, Phil Scott
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:

12
docs/dotnet-tools.json Normal file
View File

@ -0,0 +1,12 @@
{
"version": 1,
"isRoot": true,
"tools": {
"microsoft.playwright.cli": {
"version": "1.2.3",
"commands": [
"playwright"
]
}
}
}

6
docs/global.json Normal file
View File

@ -0,0 +1,6 @@
{
"sdk": {
"version": "9.0.100",
"rollForward": "latestFeature"
}
}

View File

@ -0,0 +1,72 @@
Title: Short title of the Widget being documented. Typically the class name
Order: 99999
Description: Description of the widget. This will be displayed on social card
Highlights:
- List features.
- These will be used for the social card.
- Keep to three items.
Reference:
- T:Spectre.Console.BarChart
Hidden: true
---
<!---
Documentation steps
1. Edit front matter. Change all fields. Order dictates how it is sorted in the sidebar. Remove hidden attributes.
Make sure to reference the appropriate XMLDOC page. You can find this by looking in the generated HTML
of the API reference section. You can reference multiple items e.g. types, methods, etc that are related to the Widget.
2. Remove comments as you edit the fields.
3. All widgets should have at minimum description and a usage section.
-->
<!---
Short description of the widget. Can be the same as the description above
-->
<!---
Optional: Embed an asciicast. The cast parameter should be the base name of the cast. There are two files,
one suffixed with -rich.cast and a second named -plain.cast. The cast attribute should be the name without
the suffix.
To generate a new cast file, open the \resources\scripts\Generator\Generator.sln project and add a new sample in the
Commands/AsciiCast/Samples/ folder. If the widget is static such as a tree or a table, try and animate the widget
using the Live widget to change the content or styling.
Running the generator project with by executing
dotnet run -- samples -l
and pick your sample. This will generate a new asciicast in the docs/input/assets/casts folder which can then be referenced via:
<?# AsciiCast cast="sample-name" /?>
-->
## Usage
### Basic usage
<!---
Code sample for a default output of the widget. Code Samples can be embedded with a markdown code block or
linked to via the Example snipped. The example snippet takes the XMLDOC reference of the snippet from the Examples
project that you want to reference.
If linking to a method it will, by default, only include the method body. Include BodyOnly="false" to include
the entire method including the declaration.
<?# Example symbol="M:Prompt.Program.AskConfirmation" /?>
-->
### Additional Styling
<!---
Include additional examples of styling or functionality
-->
### More styling and functions
<!---
Include additional examples of styling or functionality
-->

View File

@ -0,0 +1,3 @@
@{
Layout = @"_layout.cshtml";
}

View File

@ -1,256 +1,308 @@
@using Docs.Extensions
@using Statiq.CodeAnalysis
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link href="@Context.GetLink("/assets/bootstrap/bootstrap.css")" rel="stylesheet" />
<link href="@Context.GetLink("/assets/css/styles.css")" rel="stylesheet" />
<link href="https://fonts.googleapis.com/css2?family=Roboto+Mono:wght@400;700&family=Roboto+Slab:wght@400;700&family=Roboto:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" rel="stylesheet" data-no-mirror>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/prismjs@1.19.0/themes/prism.css">
<link href="@Context.GetLink("/assets/styles.css")" rel="stylesheet"/>
<link rel="preconnect" href="https://fonts.gstatic.com"/>
<link href="https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;700&display=swap" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
<script src="https://cdn.jsdelivr.net/npm/popper.js@1.16.0/dist/umd/popper.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
<script src="https://kit.fontawesome.com/a1cad7ed9a.js" crossorigin="anonymous" data-no-mirror></script>
<script src="https://cdn.jsdelivr.net/npm/mermaid@8.4.8/dist/mermaid.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/svg-pan-zoom@3.6.1/dist/svg-pan-zoom.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.19.0/components/prism-core.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/prismjs@1.19.0/plugins/autoloader/prism-autoloader.min.js" data-no-mirror></script>
<link rel="apple-touch-icon" sizes="180x180" href="@Context.GetLink("/assets/favicons/apple-touch-icon.png")">
<link rel="icon" type="image/png" sizes="32x32" href="@Context.GetLink("/assets/favicons/favicon-32x32.png")">
<link rel="icon" type="image/png" sizes="16x16" href="@Context.GetLink("/assets/favicons/favicon-16x16.png")">
@{
string title = @Document.ContainsKey(Keys.Title) ? $"Spectre.Console - {Document.GetString(Keys.Title)}" : "Spectre.Console";
@{
string title = Document.ContainsKey(Keys.Title) ? $"Spectre.Console - {Document.GetString(Keys.Title)}" : "Spectre.Console";
string description = Document.ContainsKey(Constants.Description) ? Document.GetString(Constants.Description) : "Spectre.Console is a .NET library that makes it easier to create beautiful console applications";
var card = Context.FindCard(Model.Id);
var urlBase = $"https://{Document.GetString(Keys.Host)}/";
}
<title>@title</title>
<meta name="description" content="@description"/>
<meta name="xref" content="@HtmlEncoder.Encode(Document.GetString(WebKeys.Xref))" />
@if (card != null)
{
<meta name="twitter:card" content="summary_large_image"/>
<meta name="og:title" content="@title"/>
<meta name="og:description" content="@description"/>
<meta name="og:image" content="@(urlBase + card)"/>
}
<script>
if (localStorage.theme === 'dark' || (!('theme' in localStorage) && window.matchMedia('(prefers-color-scheme: dark)').matches)) {
document.documentElement.classList.add('dark');
} else {
document.documentElement.classList.remove('dark');
}
<title>@title</title>
</head>
<body class="d-flex flex-column">
<div class="flex-grow-1 d-flex flex-column">
</script>
<nav id="topnav" class="navbar navbar-expand-lg navbar-light">
<div class="container py-3">
<a class="navbar-brand" href="@Context.GetLink("/")"><img id="logo" src="@Context.GetLink("/assets/logo.svg")" alt="Spectre.Console"> Spectre.Console</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</head>
<body class="antialiased text-slate-800 dark:text-slate-200 bg-slate-100 dark:bg-slate-800 transition-colors min-h-full flex flex-col">
<header class="flex-none sticky top-0 z-40 text-sm font-medium bg-slate-200 backdrop-blur dark:bg-slate-800 ring-1 ring-slate-900 dark:ring-slate-700 ring-opacity-5 shadow-lg py-2 md:py-4">
<nav class="flex flex-row container mx-auto items-center">
<a class="flex flex-row items-center" href="@Context.GetLink("/")">
<svg xmlns="http://www.w3.org/2000/svg"
id="logo" class="w-auto h-10 md:h-12 fill-slate-700 dark:fill-slate-400 dark:stroke-slate-900" height="48" width="48" viewBox="0 0 1270.000000 1270.000000"
preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.16, written by Peter Selinger 2001-2019
</metadata>
<g transform="translate(0.000000,1270.000000) scale(0.100000,-0.100000)">
<path d="M799 10610 c-199 -48 -354 -191 -414 -383 l-25 -78 0 -3084 0 -3084
25 -79 c45 -141 155 -270 289 -335 124 -61 -80 -57 2819 -57 l2646 0 5 -43 c3
-23 8 -71 11 -105 13 -137 88 -334 179 -471 57 -85 187 -219 247 -254 25 -15
76 -34 112 -43 87 -22 163 -7 246 46 120 78 195 211 234 411 l23 124 14 -55
c63 -263 172 -511 326 -741 94 -142 229 -291 313 -348 272 -185 583 -197 750
-30 66 67 84 109 89 215 4 90 4 91 -51 230 -108 276 -137 477 -122 868 l7 196
77 0 c55 0 118 -11 229 -39 l154 -38 50 -84 c103 -172 221 -427 277 -599 38
-120 70 -274 86 -412 8 -75 21 -155 29 -178 37 -106 117 -199 220 -253 51 -26
202 -35 283 -17 83 18 193 97 268 192 157 199 256 485 286 825 11 122 6 524
-7 583 -5 24 -1 26 62 43 64 16 67 16 80 0 39 -50 109 -215 149 -351 25 -85
55 -174 67 -199 73 -156 261 -206 441 -117 65 32 110 70 159 135 128 169 178
414 157 764 -8 143 -38 350 -55 376 -2 4 7 25 22 46 77 112 168 344 200 504
l16 86 87 28 c188 60 391 170 498 269 132 122 183 230 183 383 0 71 -5 98 -24
138 -24 52 -82 112 -138 141 -52 28 -205 30 -378 5 -80 -11 -179 -23 -220 -27
l-75 -6 -29 56 c-33 65 -137 182 -211 236 -75 55 -156 94 -382 181 -110 43
-221 87 -245 100 -54 27 -92 69 -125 138 -25 52 -26 59 -20 180 4 69 16 200
26 291 52 430 53 809 5 1170 -54 405 -249 740 -569 979 -136 102 -297 190
-419 231 l-36 12 0 433 c0 433 0 434 -25 512 -52 167 -171 292 -341 360 l-69
28 -4215 2 c-2318 0 -4231 -3 -4251 -7z m8363 -1476 c417 -53 735 -193 962
-423 98 -98 155 -175 210 -282 84 -160 117 -292 141 -559 28 -313 17 -684 -30
-1025 -9 -60 -18 -164 -22 -230 -10 -208 22 -314 136 -452 76 -91 124 -118
391 -218 307 -116 377 -155 450 -249 23 -31 41 -58 39 -60 -2 -2 -47 8 -99 21
-131 35 -268 36 -360 3 -132 -47 -248 -116 -364 -218 -163 -143 -516 -488
-703 -687 -350 -372 -504 -514 -701 -644 -348 -231 -878 -408 -1322 -442 -409
-31 -796 45 -1059 208 -111 69 -249 210 -292 298 -32 65 -34 76 -33 165 1 104
23 178 85 287 75 131 137 194 430 441 181 152 251 295 250 511 -1 152 -16 223
-117 560 -35 117 -61 217 -58 222 3 5 20 9 38 9 55 0 217 31 261 50 53 23 103
73 132 131 43 88 56 187 59 437 2 266 -1 258 91 292 108 40 254 21 330 -45 35
-30 35 -32 53 -170 41 -311 106 -484 206 -546 48 -29 168 -48 381 -59 188 -10
432 -1 548 20 76 14 206 56 266 86 64 32 122 101 144 170 15 49 17 82 12 253
-5 198 -27 398 -52 482 -42 146 -125 221 -290 265 -57 15 -108 19 -268 19
l-197 0 0 45 c0 120 -37 255 -82 300 -76 77 -210 5 -291 -157 -31 -60 -67
-184 -67 -229 0 -27 -6 -34 -41 -50 -65 -29 -159 -98 -195 -144 -34 -43 -67
-119 -79 -181 l-6 -35 -57 28 c-114 57 -270 58 -379 2 -61 -31 -70 -21 -49 54
33 118 16 442 -29 536 -38 79 -114 84 -188 12 -68 -66 -136 -230 -137 -330 l0
-29 -61 7 c-34 3 -93 6 -131 6 l-69 0 6 48 c14 97 56 282 84 368 155 475 486
821 963 1008 108 42 308 94 430 110 62 9 124 17 138 20 76 11 479 5 592 -10z
m-7029 -78 c18 -8 261 -243 569 -552 582 -584 560 -559 543 -651 -6 -33 -69
-101 -523 -557 -553 -554 -564 -564 -644 -551 -89 15 -151 110 -128 198 10 37
65 95 463 495 l452 452 -472 473 c-414 414 -472 477 -478 510 -25 132 98 235
218 183z m7169 -1405 c164 -57 201 -136 234 -502 37 -414 9 -486 -212 -558
-155 -50 -298 -64 -579 -57 -249 6 -398 23 -439 50 -95 62 -177 346 -180 621
-1 135 0 142 28 203 50 109 148 179 304 218 149 37 329 53 567 50 191 -2 216
-4 277 -25z m-2002 -174 c95 -34 118 -52 152 -114 52 -94 63 -159 62 -368 -1
-358 -44 -479 -187 -520 -146 -42 -612 -65 -727 -36 -153 38 -196 98 -226 316
-16 120 -31 487 -21 527 9 35 89 121 140 151 99 58 228 76 522 73 200 -2 214
-3 285 -29z m-1604 -443 c45 -33 67 -70 71 -121 5 -59 -25 -117 -77 -147 -35
-21 -47 -21 -980 -24 -520 -2 -964 0 -988 3 -57 8 -116 60 -130 115 -19 75 12
146 78 182 34 17 75 18 1017 16 974 -3 982 -3 1009 -24z m5329 -2140 c66 -7
173 -14 237 -14 103 0 146 5 247 26 24 5 24 5 18 -64 -15 -159 -89 -371 -180
-515 l-43 -68 -57 113 c-72 145 -160 261 -318 422 l-126 128 51 -7 c28 -3 105
-13 171 -21z m-812 -652 c53 -41 140 -115 193 -165 96 -91 224 -231 224 -245
0 -5 -30 -18 -67 -30 -79 -25 -305 -84 -308 -80 -1 2 -12 53 -24 113 -28 135
-70 268 -127 402 -24 57 -44 106 -44 109 0 9 43 -20 153 -104z m-1173 -560
c-9 -4 -271 61 -315 78 -29 11 -28 12 79 55 59 24 111 46 114 49 3 3 33 -36
67 -87 34 -50 59 -93 55 -95z"/>
</g>
</svg>
<span class="text-lg md:text-2xl font-light ml-2 lg:ml-4 font-mono tracking-tighter">Spectre.Console</span>
</a>
<div class="ml-auto">
<ul class="flex flex-row">
<li>
<button aria-label="Toggle Dark Mode" class="mr-4 dark:text-yellow-300 stroke-1 opacity-80" onclick="swapTheme()">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9.663 17h4.673M12 3v1m6.364 1.636l-.707.707M21 12h-1M4 12H3m3.343-5.657l-.707-.707m2.828 9.9a5 5 0 117.072 0l-.548.547A3.374 3.374 0 0014 18.469V19a2 2 0 11-4 0v-.531c0-.895-.356-1.754-.988-2.386l-.548-.547z"/>
</svg>
</button>
<div class="collapse navbar-collapse" id="navbarText">
<ul class="navbar-nav mr-auto">
</ul>
<ul class="navbar-nav">
<li class="nav-item">
<a class="nav-link font-weight-light font-size-lg text-red" href="https://github.com/sponsors/patriksvensson"><i class="far fa-heart"></i> Sponsor</a>
</li>
<li class="nav-item">
<a class="nav-link font-weight-light font-size-lg" href="https://github.com/spectreconsole/spectre.console"><i class="fab fa-github"></i> GitHub</a>
</li>
</ul>
</div>
</div>
</nav>
</li>
<li>
<a class="flex flex-row items-center text-rose-700 dark:text-rose-500" href="https://github.com/sponsors/patriksvensson">
<svg xmlns="http://www.w3.org/2000/svg" class="h-6 w-6 mr-1" fill="none" viewBox="0 0 24 24" stroke="currentColor">
<title>Sponsor</title>
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4.318 6.318a4.5 4.5 0 000 6.364L12 20.364l7.682-7.682a4.5 4.5 0 00-6.364-6.364L12 7.636l-1.318-1.318a4.5 4.5 0 00-6.364 0z"/>
</svg>
<span class="hidden sm:block">Sponsor</span>
</a>
</li>
<li class="ml-4">
<a class="flex flex-row items-center text-gray-600 fill-slate-200 stroke-slate-800 fill-slate-900 dark:stroke-slate-500 dark:fill-slate-300 dark:text-slate-300" href="https://github.com/spectreconsole/spectre.console">
<svg role="img" class="h-6 w-6 mr-1" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<title>GitHub icon</title>
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/>
</svg>
<span class="hidden sm:block">GitHub</span>
</a>
</li>
@if (IsSectionDefined(Constants.Sections.Splash))
{
@RenderSection(Constants.Sections.Splash, false)
}
</ul>
</div>
</nav>
</header>
<main class="container mx-auto pt-8 w-full">
<div class="flex flex-col-reverse lg:flex-row">
<nav class="flex-none font-light text-sm xl:text-base sm:mr-16 mt-8 pt-6 lg:mt-0 lg:pt-0 lg:pb-10 border-t border-gray-300 lg:border-t-0">
@{
string section = "docs";
}
<div class="flex-grow-1 d-flex bg-body flex-column @(section != null ? "section-" + section : null)">
@if(section != null)
{
<div id="titlebar" class="py-4">
<div class="container">
<div class="row">
@{
string titleBarClasses = Document.GetBool(Constants.NoSidebar) ? string.Empty : "offset-md-3 offset-lg-2";
}
<div class="@titleBarClasses px-3 px-md-0">
<div class="section text-uppercase">Spectre.Console</div>
<div class="text-white m-0 title">@(Document.GetString(Keys.Title) ?? Document.GetTitle())</div>
@if (IsSectionDefined(Constants.Sections.Subtitle))
{
@RenderSection(Constants.Sections.Subtitle, false)
}
</div>
</div>
</div>
</div>
<div id="undertitle">
<div class="container bg-body">
<div class="row">
@if (Document.GetBool(Constants.NoSidebar))
{
<div class="col">
</div>
}
else
{
<div class="col-md-3 col-lg-2 bg-body">
</div>
<div class="col-md-9 col-lg-8 bg-white">
</div>
}
<div class="col-lg-2 d-none d-lg-block bg-section">
</div>
</div>
</div>
</div>
}
<div class="flex-grow-1 d-flex flex-column bg-body">
@if (Document.GetBool(Constants.NoContainer))
var sidebar = Context.GetSidebar();
var root = sidebar.Node;
<div class="text-xl @(Document.IdEquals(root) ? "font-bold" : null)">
@if (sidebar.ShowLink)
{
<div class="bg-white">
@RenderBody()
</div>
@Html.DocumentLink(root)
}
else
{
<div class="container flex-grow-1 d-flex flex-column bg-white">
<div class="row flex-grow-1 align-items-stretch">
@if (Document.GetBool(Constants.NoSidebar))
{
IgnoreSection(Constants.Sections.Sidebar);
@sidebar.Title;
}
</div>
<div class="col">
@RenderBody()
</div>
@foreach (var sidebarItem in sidebar.Leafs)
{
var document = sidebarItem.Node;
if (string.IsNullOrWhiteSpace(sidebarItem.Title))
{
continue;
}
var documentChildren = sidebarItem.Leafs;
<div class="text-teal-800 font-medium dark:text-teal-400 mt-4">
@if (sidebarItem.ShowLink)
{
@Html.DocumentLink(document)
}
else
{
@sidebarItem.Title;
}
</div>
@if (documentChildren.Any())
{
<div class="ml-2 flex flex-row flex-wrap lg:flex-col border-separate">
@foreach (var childItem in documentChildren)
{
var child = childItem.Node;
<div class="mt-2 mr-4 @(Document.IdEquals(child) ? "font-bold" : null)">
@Html.DocumentLink(child)
</div>
}
</div>
}
}
}
</nav>
<article class="flex-1 min-w-0">
<header class="text-slate-900 dark:text-slate-50 mb-4">
@RenderSection("header", required: false)
@if (!IsSectionDefined("header"))
{
<h1 class="text-2xl md:text-4xl font-extrabold">@(Document.GetString(Keys.Title) ?? Document.GetTitle())</h1>
}
@RenderSection("subheading", required: false)
</header>
<div class="prose prose-sm md:prose-base prose-slate dark:prose-invert max-w-full font-light lg:leading-loose">
@RenderBody()
@{
var referenceLinks = Model.GetList<string>(Constants.ApiReference);
if (referenceLinks != null)
{
<h3>References</h3>
<ul>
@foreach (var link in referenceLinks)
{
if (Context.TryGetXrefDocument(link, out var refDoc, out string error))
{
<li>
@{
var kind = refDoc.GetString(CodeAnalysisKeys.SpecificKind);
var prefix = string.Empty;
var containingType = @refDoc.GetDocument(CodeAnalysisKeys.ContainingType);
if (containingType != null)
{
prefix = containingType.GetString(CodeAnalysisKeys.DisplayName) + ".";
}
}
@if (!string.IsNullOrWhiteSpace(prefix)){ <span class="text-slate-600 dark:text-slate-400">@prefix</span>}@Html.DocumentLink(refDoc, refDoc.GetString(CodeAnalysisKeys.DisplayName) ?? refDoc.GetTitle()) <span class="ml-4 uppercase text-xs text-slate-700 dark:text-slate-400">@kind</span>
</li>
}
else
{
<div class="sidebar col-md-3 col-lg-2 pt-2 bg-body">
@if (IsSectionDefined(Constants.Sections.Sidebar))
{
@RenderSection(Constants.Sections.Sidebar, false)
}
else
{
IDocument root = OutputPages["index.html"].First();
<div class="sidebar-nav-item @(Document.IdEquals(root) ? "active" : null)">
@if(root.ShowLink())
{
@Html.DocumentLink(root)
}
else
{
@root.GetTitle()
}
</div>
@foreach (IDocument document in OutputPages.GetChildrenOf(root).OnlyVisible())
{
if(string.IsNullOrWhiteSpace(document.GetTitle()))
{
continue;
}
DocumentList<IDocument> documentChildren = OutputPages.GetChildrenOf(document);
<div class="sidebar-nav-item @(Document.IdEquals(document) ? "active" : null) @(documentChildren.Any() ? "has-children" : null)">
@if(document.ShowLink())
{
@Html.DocumentLink(document)
}
else
{
@document.GetTitle()
}
</div>
@if (documentChildren.OnlyVisible().Any())
{
<div class="sidebar-nav-children @(Document.IdEquals(document) || documentChildren.Any(x => Document.IdEquals(x)) ? "active" : null)">
@foreach (IDocument child in documentChildren.OnlyVisible())
{
<div class="sidebar-nav-child @(Document.IdEquals(child) ? "active" : null)">
@Html.DocumentLink(child)
</div>
}
</div>
}
}
}
</div>
<div class="col-md-9 col-lg-8 pt-4 pt-md-0 pb-4 px-4">
@RenderBody()
</div>
Context.LogWarning(Model, $"Error finding xref for {link} - {error}");
}
<div class="col-lg-2 d-none d-lg-block bg-body pl-3 pt-3">
@{
IReadOnlyList<IDocument> headings = Document.GetDocumentList(Statiq.Html.HtmlKeys.Headings);
if (headings.Count > 0)
{
<div class="border-bottom mb-3">
<p class="small font-weight-bold">On This Page</p>
@foreach (IDocument heading in headings)
{
<p class="small"><a href="#@(heading.GetString(Statiq.Html.HtmlKeys.HeadingId))">@(await heading.GetContentStringAsync())</a></p>
}
</div>
}
}
@if (Document.ContainsKey("EditLink"))
{
<p class="small font-weight-bold"><a href="@Document.GetString("EditLink")"><i class="fad fa-pencil"></i> Edit This Page</a></p>
}
</div>
</div>
</div>
}
</ul>
}
</div>
}
</div>
</article>
</div>
</main>
<footer class="py-4 md:py-8 mt-8 bg-gray-100 dark:bg-slate-800 text-sm border-t border-gray-200 dark:border-slate-700">
<div class="container">
<div class="flex flex-row">
<span>© @DateTime.Today.Year Patrik Svensson, Phil Scott, Nils Andresen</span>
<span class="ml-auto">Powered by <a href="https://www.netlify.com/">Netlify</a></span>
<span class="ml-auto">Supported by the <a href="https://dotnetfoundation.org">.NET Foundation</a></span>
<span class="ml-auto">@VersionUtilities.GetVersion()</span>
</div>
<div id="footer" class="p-3 text-white font-size-sm">
<div class="container">
<div>
<span>© @DateTime.Today.Year Patrik Svensson, Phil Scott</span>
<span class="float-right" style="color: #888888;">@VersionUtilities.GetVersion()</span>
</div>
</div>
</div>
<script>
$(document).ready(function() {
mermaid.initialize(
{
flowchart:
{
useMaxWidth: false
},
startOnLoad: false,
cloneCssStyles: false
});
mermaid.init(undefined, ".mermaid");
</div>
</footer>
// Remove the max-width setting that Mermaid sets
var mermaidSvg = $('.mermaid svg');
mermaidSvg.addClass('img-responsive');
mermaidSvg.css('max-width', '');
// Make it scrollable
var target = document.querySelector(".mermaid svg");
if(target !== null)
{
var panZoom = window.panZoom = svgPanZoom(target, {
zoomEnabled: true,
controlIconsEnabled: true,
fit: true,
center: true,
maxZoom: 20,
zoomScaleSensitivity: 0.6
});
<script>
// adapted from https://www.w3schools.com/howto/howto_js_filter_table.asp
function search(input, searchTarget, columnIndex) {
// Declare variables
var filter, table, tr, td, i, txtValue;
filter = input.value.toUpperCase();
table = document.getElementById(searchTarget);
tr = table.getElementsByTagName("tr");
// Do the reset once right away to fit the diagram
panZoom.resize();
panZoom.fit();
panZoom.center();
$(window).resize(function(){
panZoom.resize();
panZoom.fit();
panZoom.center();
});
}
// Loop through all table rows, and hide those who don't match the search query
for (i = 0; i < tr.length; i++) {
td = tr[i].getElementsByTagName("td")[columnIndex];
if (td) {
txtValue = td.textContent || td.innerText;
if (txtValue.toUpperCase().indexOf(filter) > -1) {
tr[i].style.display = "";
} else {
tr[i].style.display = "none";
}
}
}
}
</script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/prism.min.js" integrity="sha512-YBk7HhgDZvBxmtOfUdvX0z8IH2d10Hp3aEygaMNhtF8fSOvBZ16D/1bXZTJV6ndk/L/DlXxYStP8jrF77v2MIg==" crossorigin="anonymous"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/prism/1.23.0/plugins/autoloader/prism-autoloader.min.js" integrity="sha512-zc7WDnCM3aom2EziyDIRAtQg1mVXLdILE09Bo+aE1xk0AM2c2cVLfSW9NrxE5tKTX44WBY0Z2HClZ05ur9vB6A==" crossorigin="anonymous"></script>
<script src="@Context.GetLink("/assets/asciinema-player.js")"></script>
<script>
document.querySelectorAll('asciinema-player').forEach(cast => {
AsciinemaPlayer.create(cast.attributes['src'].value, cast, {autoplay: true, fit: 'none', fontSize: 'inherit'});
});
</script>
</body>
<script>
function swapTheme(){
if (document.documentElement.classList.contains('dark')) {
document.documentElement.classList.remove('dark');
localStorage.theme = 'light';
} else {
document.documentElement.classList.add('dark');
localStorage.theme = 'dark';
}
}
</script>
</body>
</html>

View File

@ -1,42 +0,0 @@
<div>
@foreach (IDocument post in Document.GetChildren())
{
IDocument topicDocument = Outputs[nameof(Archives)][$"blog/topics/{post.GetString("topic")}/index.html"];
string excerpt = post.GetString(Statiq.Html.HtmlKeys.Excerpt);
<div>
<div class="p-3 mb-2 bg-light page-box">
<h5><a href="@Context.GetLink(post)">@post.GetString("Title")</a></h5>
<div class="small text-black-50">
@post.GetDateTime("Published").ToLongDateString() in
<a href="@(topicDocument.GetLink())"><span class="badge badge-light">@topicDocument.GetTitle()</span></a>
</div>
@if (!string.IsNullOrEmpty(excerpt))
{
@Html.Raw(excerpt)
<p class="small"><a href="@Context.GetLink(post)">Read more...</a></p>
}
</div>
</div>
}
@{
IDocument older = Document.GetDocument(Keys.Next);
IDocument newer = Document.GetDocument(Keys.Previous);
}
@if (older != null || newer != null)
{
<div class="d-flex flex-row justify-content-between">
<div>
@if (older != null)
{
<a class="btn btn-primary" href="@Context.GetLink(older)" role="button">Older</a>
}
</div>
<div>
@if (newer != null)
{
<a class="btn btn-primary" href="@Context.GetLink(newer)" role="button">Newer</a>
}
</div>
</div>
}
</div>

View File

@ -1,3 +0,0 @@
@{
Layout = @"/_layout.cshtml";
}

View File

@ -0,0 +1,38 @@
---
Title: SpectreXxxx
Description: Rule title
Category: Usage
Severity: Hidden, Info, Warning, or Error
Excluded: true
---
## Cause
A concise-as-possible description of when this rule is violated. If there's a lot to explain, begin with "A violation of this rule occurs when..."
## Reason for rule
Explain why the user should care about the violation.
## How to fix violations
To fix a violation of this rule, [describe how to fix a violation].
## Examples
### Violates
Example(s) of code that violates the rule.
### Does not violate
Example(s) of code that does not violate the rule.
## How to suppress violations
**If the severity of your analyzer isn't _Warning_, delete this section.**
```csharp
#pragma warning disable Spectre1000 // <Rule name>
#pragma warning restore Spectre1000 // <Rule name>
```

View File

@ -0,0 +1,56 @@
---
Title: Spectre1021
Description: Avoid prompting for input while a current renderable is running.
Category: Usage
Severity: Warning
---
## Cause
A violation of this rule occurs when an AnsiConsole prompt is called within the context of an executing renderable e.g. `Progress`, `Status` and `Live`. Concurrent LiveRenderable are not supported and will cause issues when running simultaneously.
## Reason for rule
When LiveRenderable such as `Progress`, `Status` or `Live` are running they expect to be running exclusively. They rely on ANSI sequences to draw and keep the console experience consistent. Prompts also rely on ANSI sequences for their drawing. Simultaneous running can result in corrupt output.
## How to fix violations
Redesign logic to allow one LiveRenderable to complete before using a prompt or prompt before starting the operation.
## Examples
### Violates
```csharp
AnsiConsole.Progress().Start(ctx =>
{
// code to update progress bar
var answer = AnsiConsole.Confirm("Continue?");
});
```
### Does not violate
```csharp
AnsiConsole.Progress().Start(ctx =>
{
// code to update progress bar
// persist state to restart progress after asking question
});
var answer = AnsiConsole.Confirm("Continue?");
AnsiConsole.Progress().Start(ctx =>
{
// apply persisted state
// code to update progress bar
```
## How to suppress violations
```csharp
#pragma warning disable Spectre1021 // <Rule name>
#pragma warning restore Spectre1021 // <Rule name>
```

View File

@ -0,0 +1,3 @@
@{
Layout = @"_layout.cshtml";
}

View File

@ -0,0 +1,10 @@
@inherits StatiqRazorPage<IDocument>
@{
Layout = @"../../_layout.cshtml";
}
<p>@Document.GetString("Description")</p>
@RenderBody()

View File

@ -0,0 +1,31 @@
Title: Roslyn Analyzers
Order: 20
---
<code>Spectre.Console.Analyzer</code> provides analyzers for common mistakes when using Spectre.Console. It can be installed via nuget
<pre><code>nuget install Spectre.Console.Analyzer</code></pre>
<h2>Supported Analyzers</h2>
<table>
<thead>
<tr>
<th>Analyzer</th>
<th>Description</th>
<th>Category</th>
<th>Severity</th>
</tr>
</thead>
<tbody>
@foreach (IDocument child in OutputPages.GetChildrenOf(Document))
{
<tr>
<td>@Html.DocumentLink(child)</td>
<td>@child.GetString("Description")</td>
<td>@child.GetString("Category") </td>
<td>@child.GetString("Severity") </td>
</tr>
}
</tbody>
</table>

View File

@ -0,0 +1,27 @@
---
Title: Spectre1000
Description: Use AnsiConsole instead of System.Console
Category: Usage
Severity: Warning
---
## Cause
A violation of this rule occurs when `System.Console` is used for common methods exposed by Spectre.Console.
## Reason for rule
Methods implemented in Spectre.Console should be used over direct access to `System.Console` to allow for enhancements and
features to be enabled.
## How to fix violations
To fix a violation of this rule, change from `System.Console` to `Spectre.Console.AnsiConsole`.
## How to suppress violations
```csharp
#pragma warning disable Spectre1000 // Use AnsiConsole instead of System.Console
#pragma warning restore Spectre1000 // Use AnsiConsole instead of System.Console
```

View File

@ -0,0 +1,63 @@
---
Title: Spectre1010
Description: Favor the use of the instance of AnsiConsole over the static helper
Category: Usage
Severity: Info
---
## Cause
A violation of this rule occurs when the static helper `AnsiConsole` is used when a field or method parameter of type
`IAnsiConsole` is available.
## Reason for rule
Use of `IAnsiConsole` improves testability of the code, and also allows upstream callers the ability to customize the console
capabilities and features. When a field variable or parameter is available it should be used to ensure the code takes advantage
of that configuration.
## How to fix violations
To fix a violation of this rule, change from `AnsiConsole` to the name of the local instance.
## Examples
### Violates
```csharp
class Example
{
private IAnsiConsole _ansiConsole;
public Example(IAnsiConsole ansiConsole)
{
_ansiConsole = ansiConsole;
}
public Run()
{
AnsiConsole.WriteLine("Running...");
}
}
```
### Does not violate
```csharp
class Example
{
private IAnsiConsole _ansiConsole;
public Example(IAnsiConsole ansiConsole)
{
_ansiConsole = ansiConsole;
}
public Run()
{
_ansiConsole.WriteLine("Running...");
}
}
```

View File

@ -0,0 +1,46 @@
---
Title: Spectre1020
Description: Avoid calling other live renderables while a current renderable is running.
Category: Usage
Severity: Warning
---
## Cause
A violation of this rule occurs when a child LiveRenderable i.e. `Progress`, `Status` and `Live` are called within the context of an executing renderable. Concurrent LiveRenderable are not supported and will cause issues when running simultaneously.
## Reason for rule
When LiveRenderable such as `Progress`, `Status` or `Live` are running they expect to be running exclusively. They rely on ANSI sequences to draw and keep the console experience consistent. With simultaneous calls both renderables compete with the console causing concurrent writes corrupting the output.
## How to fix violations
Redesign logic to allow one LiveRenderable to complete before starting a second renderable.
## Examples
### Violates
```csharp
AnsiConsole.Progress().Start(ctx => {
AnsiConsole.Status().Start("Running status too...", statusCtx => {});
});
```
### Does not violate
```csharp
AnsiConsole.Progress().Start(ctx => {
// run progress and complete tasks
});
AnsiConsole.Status().Start("Running status afterwards...", statusCtx => {});
```
## How to suppress violations
```csharp
#pragma warning disable Spectre1020 // <Rule name>
#pragma warning restore Spectre1020 // <Rule name>
```

View File

@ -0,0 +1,19 @@
@using Statiq.CodeAnalysis
@using Docs.Pipelines
@using Docs.Extensions
@foreach (IGrouping<string, IDocument> typeGroup
in Outputs.FromPipeline(nameof(Api))
.Where(x => x.GetBool(CodeAnalysisKeys.IsResult)
&& x.GetString(CodeAnalysisKeys.Kind) == "NamedType"
&& Document.IdEquals(x.GetDocument(CodeAnalysisKeys.ContainingAssembly)))
.GroupBy(x => x.GetString(CodeAnalysisKeys.SpecificKind))
.OrderBy(x => x.Key))
{
<h2>@typeGroup.Key</h2>
@foreach (var type in typeGroup)
{
<ul>
<li>@Context.GetTypeLink(type)</li>
</ul>
}
}

View File

@ -0,0 +1,4 @@
@await Html.PartialAsync("../Sections/_Syntax.cshtml")
@await Html.PartialAsync("../Sections/_Examples.cshtml")
@await Html.PartialAsync("../Sections/_Remarks.cshtml")
@await Html.PartialAsync("../Sections/_SeeAlso.cshtml")

View File

@ -0,0 +1,9 @@
@await Html.PartialAsync("../Sections/_Summary.cshtml")
@await Html.PartialAsync("../Sections/_Syntax.cshtml")
@await Html.PartialAsync("../Sections/_SymbolInfo.cshtml")
@await Html.PartialAsync("../Sections/_Examples.cshtml")
@await Html.PartialAsync("../Sections/_Remarks.cshtml")
@await Html.PartialAsync("../Sections/_Attributes.cshtml")
@await Html.PartialAsync("../Sections/_Parameters.cshtml")
@await Html.PartialAsync("../Sections/_Value.cshtml")
@await Html.PartialAsync("../Sections/_SeeAlso.cshtml")

View File

@ -0,0 +1,10 @@
@await Html.PartialAsync("../Sections/_Summary.cshtml")
@await Html.PartialAsync("../Sections/_Syntax.cshtml")
@await Html.PartialAsync("../Sections/_SymbolInfo.cshtml")
@await Html.PartialAsync("../Sections/_Examples.cshtml")
@await Html.PartialAsync("../Sections/_Remarks.cshtml")
@await Html.PartialAsync("../Sections/_Attributes.cshtml")
@await Html.PartialAsync("../Sections/_TypeParameters.cshtml")
@await Html.PartialAsync("../Sections/_Parameters.cshtml")
@await Html.PartialAsync("../Sections/_ReturnValue.cshtml")
@await Html.PartialAsync("../Sections/_SeeAlso.cshtml")

View File

@ -0,0 +1,15 @@
@await Html.PartialAsync("../Sections/_Summary.cshtml")
@await Html.PartialAsync("../Sections/_Syntax.cshtml")
@await Html.PartialAsync("../Sections/_SymbolInfo.cshtml")
@await Html.PartialAsync("../Sections/_Examples.cshtml")
@await Html.PartialAsync("../Sections/_Remarks.cshtml")
@await Html.PartialAsync("../Sections/_Attributes.cshtml")
@await Html.PartialAsync("../Sections/_TypeParameters.cshtml")
@await Html.PartialAsync("../Sections/_Constructors.cshtml")
@await Html.PartialAsync("../Sections/_Events.cshtml")
@await Html.PartialAsync("../Sections/_Fields.cshtml")
@await Html.PartialAsync("../Sections/_Properties.cshtml")
@await Html.PartialAsync("../Sections/_Methods.cshtml")
@await Html.PartialAsync("../Sections/_ExtensionMethods.cshtml")
@await Html.PartialAsync("../Sections/_Operators.cshtml")
@await Html.PartialAsync("../Sections/_SeeAlso.cshtml")

View File

@ -0,0 +1,25 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@await Html.PartialAsync("../Sections/_Summary.cshtml")
@{
foreach (IGrouping<string, IDocument> typeGroup
in Document.GetDocuments(CodeAnalysisKeys.MemberTypes)
.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "NamedType")
.GroupBy(x => x.GetString(CodeAnalysisKeys.SpecificKind)))
{
<h3>@typeGroup.Key</h3>
<div class="doc-summary short-term">
<div>
<dl>
@foreach (var type in typeGroup.OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName)).ToList())
{
<div>
<dt>@Context.GetTypeLink(type)</dt>
<dd>@Html.Raw(type.GetString(CodeAnalysisKeys.Summary))</dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,9 @@
@await Html.PartialAsync("../Sections/_Summary.cshtml")
@await Html.PartialAsync("../Sections/_Syntax.cshtml")
@await Html.PartialAsync("../Sections/_SymbolInfo.cshtml")
@await Html.PartialAsync("../Sections/_Examples.cshtml")
@await Html.PartialAsync("../Sections/_Remarks.cshtml")
@await Html.PartialAsync("../Sections/_Attributes.cshtml")
@await Html.PartialAsync("../Sections/_Parameters.cshtml")
@await Html.PartialAsync("../Sections/_Value.cshtml")
@await Html.PartialAsync("../Sections/_SeeAlso.cshtml")

View File

@ -0,0 +1,26 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@{
IReadOnlyList<IDocument> attributes = Document.GetDocumentList(CodeAnalysisKeys.Attributes);
if (attributes?.Count > 0)
{
<h3>Attributes</h3>
<div class="doc-summary">
<div>
<dl>
@foreach (var attribute in attributes)
{
var type = attribute.GetDocument(CodeAnalysisKeys.Type);
<div>
<dt>
@Context.GetTypeLink(type)
</dt>
<dd>@Html.Raw(type.GetString(CodeAnalysisKeys.Summary))</dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,22 @@
@using Statiq.CodeAnalysis
@using Microsoft.AspNetCore.Html
@if(Document.GetBool(CodeAnalysisKeys.HasConstantValue))
{
var constantValue = Document.Get(CodeAnalysisKeys.ConstantValue);
<h3>Constant Value</h3>
<div class="doc-summary">
<div>
<dl>
<div>
<dt>
@(new HtmlString(constantValue?.ToString() ?? "null"))
</dt>
<dd>@(new HtmlString(constantValue?.GetType().Name ?? string.Empty))</dd>
</div>
</dl>
</div>
</div>
}

View File

@ -0,0 +1,6 @@
namespace Docs.input.api.Sections;
public class _ConstantValue_cshtml
{
}

View File

@ -0,0 +1,29 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@{
var constructors = Document.GetDocumentList(CodeAnalysisKeys.Constructors)
?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult))
.OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName))
.ToList();
if (constructors?.Count > 0)
{
<h3>Constructors</h3>
<div class="doc-summary">
<div>
<dl>
@foreach (var constructor in constructors)
{
<div>
<dt>
@constructor.GetModifiers() @Context.GetTypeLink(constructor, false)
</dt>
<dd>@Html.Raw(constructor.GetString(CodeAnalysisKeys.Summary))</dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

View File

@ -0,0 +1,9 @@
@using Statiq.CodeAnalysis
@{
var examples = Document.GetString(CodeAnalysisKeys.Example);
if (!examples.IsNullOrWhiteSpace())
{
<h3>Examples</h3>
<div>@Html.Raw(examples)</div>
}
}

View File

@ -0,0 +1,40 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@using Microsoft.CodeAnalysis
@{
var modelSymbol = Document.Get<ITypeSymbol>(CodeAnalysisKeys.Symbol);
IReadOnlyList<IDocument> methods = Document.GetDocumentList(CodeAnalysisKeys.ExtensionMethods)
?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult))
.OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName))
.ToList();
if (methods?.Count > 0)
{
<h3>Extension Methods</h3>
<div class="doc-summary">
<div>
<dl>
@foreach (var method in methods)
{
ISymbol reducedSymbol = method.Get<IMethodSymbol>(CodeAnalysisKeys.Symbol)?.ReduceExtensionMethod(modelSymbol);
string reducedName = reducedSymbol?.ToDisplayString(new SymbolDisplayFormat(
typeQualificationStyle: SymbolDisplayTypeQualificationStyle.NameAndContainingTypes,
genericsOptions: SymbolDisplayGenericsOptions.IncludeTypeParameters,
parameterOptions: SymbolDisplayParameterOptions.IncludeType,
memberOptions: SymbolDisplayMemberOptions.IncludeParameters,
miscellaneousOptions: SymbolDisplayMiscellaneousOptions.UseSpecialTypes));
<div>
<dt>
@method.GetModifiers(skipStatic:true) @method.GetDocument(CodeAnalysisKeys.ReturnType).GetString(CodeAnalysisKeys.DisplayName) @Context.GetTypeLink(method,reducedName, false)
</dt>
<dd>@Html.Raw(method.GetString(CodeAnalysisKeys.Summary))</dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,59 @@
@using Statiq.CodeAnalysis
@using Microsoft.AspNetCore.Html
@using Docs.Extensions
@{
var isEnum = Document.GetString(CodeAnalysisKeys.SpecificKind) == "Enum";
IReadOnlyList<IDocument> fields;
if (isEnum)
{
fields = Document.GetDocumentList(CodeAnalysisKeys.Members)?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "Field")
.OrderBy(x => x.Get(CodeAnalysisKeys.ConstantValue) as int? ?? 0)
.ToList();
}
else
{
fields = Document.GetDocumentList(CodeAnalysisKeys.Members)?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "Field")
.OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName))
.ToList();
}
if (fields?.Count > 0)
{
<h3>Fields</h3>
<div class="doc-summary">
<div>
<dl>
@foreach (var field in fields)
{
<div>
<dt>
<div class="flex flex-row">
<div class="w-4/5">
@if (isEnum)
{
@Context.GetTypeLink(field, false)
}
else
{
@field.GetModifiers() @Context.GetTypeLink(field.GetDocument(CodeAnalysisKeys.Type))
@Context.GetTypeLink(field, false)
}
</div>
<div>
@(field.GetBool(CodeAnalysisKeys.HasConstantValue) ? new HtmlString(field.Get(CodeAnalysisKeys.ConstantValue)?.ToString() ?? "null") : new HtmlString(string.Empty))
</div>
</div>
</dt>
<dd>
@Html.Raw(field.GetString(CodeAnalysisKeys.Summary))
</dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,30 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@{
IReadOnlyList<IDocument> methods = Model.GetDocumentList(CodeAnalysisKeys.Members)
?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "Method")
.OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName))
.ToList();
if (methods?.Count > 0)
{
<h3>Methods</h3>
<div class="doc-summary">
<div>
<dl>
@foreach (var method in methods)
{
<div>
<dt>
@method.GetModifiers() @method.GetDocument(CodeAnalysisKeys.ReturnType).GetString(CodeAnalysisKeys.DisplayName) @Context.GetTypeLink(method, false)
</dt>
<dd>@Html.Raw(method.GetString(CodeAnalysisKeys.Summary))</dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,25 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@{
var parameters = Model.GetDocumentList(CodeAnalysisKeys.Parameters);
var paramComments = Model.GetList<ReferenceComment>(CodeAnalysisKeys.Params);
if (parameters?.Count > 0)
{
<h3>Parameters</h3>
<div class="doc-summary">
<div>
<dl>
@foreach (var parameter in parameters)
{
<div>
<dt>
@Context.GetTypeLink(parameter.GetDocument(CodeAnalysisKeys.Type)) <span class="identifier">@parameter.GetString(CodeAnalysisKeys.Name)</span>
</dt>
<dd>@Html.Raw(paramComments?.Where(x => x.Name.Equals(parameter.GetString(CodeAnalysisKeys.Name))).Select(x => x.Html).FirstOrDefault()) </dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,30 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@{
IReadOnlyList<IDocument> properties = Model.GetDocumentList(CodeAnalysisKeys.Members)
?.Where(x => x.GetBool(CodeAnalysisKeys.IsResult) && x.GetString(CodeAnalysisKeys.Kind) == "Property")
.OrderBy(x => x.GetString(CodeAnalysisKeys.DisplayName))
.ToList();
if (properties?.Count > 0)
{
<h3>Properties</h3>
<div class="doc-summary">
<div>
<dl>
@foreach (var property in properties)
{
<div>
<dt>
@property.GetModifiers() @property.GetDocument(CodeAnalysisKeys.Type).GetString(CodeAnalysisKeys.DisplayName) @Context.GetTypeLink(property, false)
</dt>
<dd>@Html.Raw(property.GetString(CodeAnalysisKeys.Summary))</dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,9 @@
@using Statiq.CodeAnalysis
@{
var remarks = Document.GetString(CodeAnalysisKeys.Remarks);
if (!remarks.IsNullOrWhiteSpace())
{
<h3>Remarks</h3>
<div>@Html.Raw(remarks)</div>
}
}

View File

@ -0,0 +1,23 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@{
var returnType = Model.GetDocument(CodeAnalysisKeys.ReturnType);
var returns = Model.GetString(CodeAnalysisKeys.Returns);
if ((returnType != null && returnType.GetString(CodeAnalysisKeys.DisplayName) != "void") || !string.IsNullOrWhiteSpace(returns))
{
<h3>Returns</h3>
<div class="doc-summary">
<div>
<dl>
<div>
<dt>
@Context.GetTypeLink(returnType, false)
</dt>
<dd></dd>
</div>
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,14 @@
@using Statiq.CodeAnalysis
@{
var seeAlso = Document.GetList<string>(CodeAnalysisKeys.SeeAlso);
if (seeAlso?.Count > 0)
{
<h3 id="SeeAlso">See Also</h3>
<ul>
@foreach (string seeAlsoComment in seeAlso)
{
<li>@Html.Raw(seeAlsoComment)</li>
}
</ul>
}
}

View File

@ -0,0 +1,7 @@
@{
var summary = Document.GetString("Summary");
if (!summary.IsNullOrWhiteSpace())
{
<div class="my-4 md:my-8">@Html.Raw(summary)</div>
}
}

View File

@ -0,0 +1,131 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@{
var containingAssembly = Document.GetDocument(CodeAnalysisKeys.ContainingAssembly);
var containingNamespace = Document.GetDocument(CodeAnalysisKeys.ContainingNamespace);
var containingType = Document.GetDocument(CodeAnalysisKeys.ContainingType);
var type = Document.GetDocument(CodeAnalysisKeys.Type);
var overridden = Document.GetDocument(CodeAnalysisKeys.Overridden);
IReadOnlyList<IDocument> allInterfaces = Document.GetDocumentList(CodeAnalysisKeys.AllInterfaces);
IReadOnlyList<IDocument> baseTypes = Document.GetDocumentList(CodeAnalysisKeys.BaseTypes)?
.Where(i => !i.GetString(CodeAnalysisKeys.QualifiedName).Equals("System.Object"))
.Reverse()
.ToList();
IReadOnlyList<IDocument> derivedTypes = Document.GetDocumentList(CodeAnalysisKeys.DerivedTypes);
IReadOnlyList<IDocument> implementingTypes = Document.GetDocumentList(CodeAnalysisKeys.ImplementingTypes);
if (containingAssembly is object
|| containingNamespace is object
|| allInterfaces?.Count > 0
|| baseTypes?.Count > 0
|| derivedTypes?.Count > 0
|| implementingTypes?.Count > 0)
{
<div class="doc-summary tiny-term">
<div>
<dl>
@if (containingAssembly != null)
{
<div>
<dt>Assembly</dt>
<dd>containingAssembly</dd>
</div>
}
@if (containingNamespace != null)
{
<div>
<dt>Namespace</dt>
<dd>@Context.GetTypeLink(containingNamespace)</dd>
</div>
}
@if (containingType != null)
{
<div>
<dt>Containing Type</dt>
<dd>@Context.GetTypeLink(containingType)</dd>
</div>
}
@if (overridden != null)
{
<div>
<dt>Overridden</dt>
<dd>@Context.GetTypeLink(overridden)</dd>
</div>
}
@if (allInterfaces?.Count > 0)
{
<div>
<dt>Interfaces</dt>
<dd>
<ul class="list-unstyled">
@foreach (var interfaceDocument in allInterfaces)
{
<li>@Context.GetTypeLink(interfaceDocument)</li>
}
</ul>
</dd>
</div>
}
@if (baseTypes?.Count > 0)
{
<div>
<dt>Base Types</dt>
<dd>
<ul class="list-unstyled">
@foreach (var baseType in baseTypes)
{
<li>@Context.GetTypeLink(baseType)</li>
}
</ul>
</dd>
</div>
}
@if (derivedTypes?.Count > 0)
{
<div>
<dt>Derived Types</dt>
<dd>
<ul class="list-unstyled">
@foreach (var derivedType in derivedTypes)
{
<li>@Context.GetTypeLink(derivedType)</li>
}
</ul>
</dd>
</div>
}
@if (implementingTypes?.Count > 0)
{
<div>
<dt>Implementing Types</dt>
<dd>
<ul class="list-unstyled">
@foreach (var implementingType in implementingTypes)
{
<li>@Context.GetTypeLink(implementingType)</li>
}
</ul>
</dd>
</div>
}
@if (type != null)
{
<div>
<dt>@Document.GetString(CodeAnalysisKeys.Kind) Type</dt>
<dd>@Context.GetTypeLink(type)</dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,8 @@
@using Statiq.CodeAnalysis
@{
string syntax = Document.GetString(CodeAnalysisKeys.Syntax);
if (!syntax.IsNullOrWhiteSpace())
{
<pre class="language-csharp"><code class="language-csharp">@syntax</code></pre>
}
}

View File

@ -0,0 +1,26 @@
@using Statiq.CodeAnalysis
@{
var typeParameters = Model.GetDocumentList(CodeAnalysisKeys.TypeParameters);
var typeParams = Model.GetList<ReferenceComment>(CodeAnalysisKeys.TypeParams);
if (typeParameters?.Count > 0)
{
<h3>Parameters</h3>
<div class="doc-summary">
<div>
<dl>
@foreach (var typeParam in typeParameters)
{
<div>
<dt>
<code>@typeParam.GetString(CodeAnalysisKeys.Name)</code>
</dt>
<dd>@Html.Raw(typeParams?.Where(x => x.Name.Equals(typeParam.GetString(CodeAnalysisKeys.Name))).Select(x => x.Html).FirstOrDefault()) </dd>
</div>
}
</dl>
</div>
</div>
}
}

View File

@ -0,0 +1,12 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@{
IDocument type = Document.GetDocument(CodeAnalysisKeys.Type);
string value = Document.GetString(CodeAnalysisKeys.Value);
}
@if (type is object && !string.IsNullOrWhiteSpace(value))
{
<p>@Context.GetTypeLink(type)</p>
<p>@Html.Raw(value)</p>
}

View File

@ -0,0 +1,48 @@
@using Statiq.CodeAnalysis
@using Docs.Extensions
@inherits StatiqRazorPage<IDocument>
@{
Layout = @"../_layout.cshtml";
}
@section header{
<h1 class="text-2xl md:text-4xl align-baseline font-extrabold">
@Document.GetString(CodeAnalysisKeys.DisplayName) <span class="text-lg md:text-2xl text-uppercase text-sky-600 dark:text-sky-400">@Document.GetString(CodeAnalysisKeys.SpecificKind)</span>
</h1>
<nav class="flex mt-2" aria-label="Breadcrumb">
<ol class="flex flex-col sm:flex-row sm:items-center space-x-2 lg:space-x-3">
@{
var isFirst = true;
}
@foreach (var parent in Context.GetExecutionCache("sidebar", ctx => ctx.OutputPages).GetAncestorsOf(Document, Document.IdEquals(Model)).Reverse().Skip(1))
{
<li>
<div class="flex items-center">
@if (isFirst)
{
isFirst = false;
}
else
{
<svg class="flex-shrink-0 h-5 w-5 mr-2 lg:mr-3 text-slate-400 dark:text-slate-500" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
<path fill-rule="evenodd" d="M7.293 14.707a1 1 0 010-1.414L10.586 10 7.293 6.707a1 1 0 011.414-1.414l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414 0z" clip-rule="evenodd"/>
</svg>
}
<span class="font-light text-sm text-slate-600 dark:text-slate-300" >@Html.DocumentLink(parent, parent.GetString(WebKeys.Title, parent.GetTitle()))</span>
</div>
</li>
}
</ol>
</nav>
}
@await Html.PartialAsync($"Kind/_{Model.GetString(CodeAnalysisKeys.Kind)}.cshtml", Model)
@{
IgnoreBody();
}

View File

@ -0,0 +1,11 @@
Title: API Reference
Order: 10000
---
<p>The Spectre.Console API reference is organized by namespace. Each namespace has one or more classes for working with Console applications.</p>
<ul>
@foreach (var child in OutputPages.GetChildrenOf(Document).OrderBy(i => i.GetTitle()))
{
<li>@Html.DocumentLink(child)</li>
}
</ul>

View File

@ -1,14 +1,20 @@
Title: Borders
Order: 2
Description: "*Spectre.Console* makes it easy to create tables and panels with a variety of different styles of borders."
Highlights:
- Rounded
- Square
- Heavy
- And more...
---
There is different built-in borders you can use for tables and panels.
There are different built-in borders you can use for tables and panels.
# Table borders
## Table borders
<img src="../assets/images/borders/table.png" style="max-width: 100%;">
![Examples of table borders](../assets/images/borders/table.png)
## Example
### Example
To set a table border to `SimpleHeavy`:
@ -19,15 +25,15 @@ table.Border = TableBorder.SimpleHeavy;
---
# Panel borders
## Panel borders
<img src="../assets/images/borders/panel.png" style="max-width: 100%;">
![Examples of panel borders](../assets/images/borders/panel.png)
## Example
### Example
To set a panel border to `Rounded`:
```csharp
var panel = new Panel("Hello World");
panel.Border = BoxBorder.Rounded;
```
```

View File

@ -1,31 +1,27 @@
Title: Colors
Order: 0
Description: "*Spectre.Console* allows easy rendering of the standard ANSI colors of your terminal, and also supports rendering up to 24-bit colors depending on the capabilities of your terminal."
Highlights:
- Predefined common colors
- Easy syntax for inline styling
---
The following is a list of the standard 8-bit colors supported in terminals.
Note that the first 16 colors are generally defined by the system or your terminal software, and may not display exactly as rendered here.
# Usage
## Usage
You can either use the colors in code, such as `new Style(foreground: Color.Maroon)` or
in markup text such as `AnsiConsole.Markup("[maroon on blue]Hello[/]")`.
# Standard colors
## Standard colors
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1">
<i class="fas fa-search" aria-hidden="true"></i>
</span>
</div>
<input
class="form-control w-100 filter"
data-table="color-results"
type="text" placeholder="Search Colors..." autocomplete="off"
aria-label="Search Colors">
</div>
<input
id="colorSearch"
type="search"
oninput="search(this, 'color-results', 2)"
placeholder="Search for colors.."
title="Type in a color" />
<?# ColorTable /?>
<script type="text/javascript" src="../assets/js/table-search.js"></script>

View File

@ -1,5 +1,9 @@
Title: Emojis
Order: 3
Description: "For terminals that support Emojis, *Spectre.Console* supports a simple syntax for rendering emojis."
Highlights:
- ":rocket: becomes 🚀"
- ":waning_gibbous_moon: becomes 🌖"
---
Please note that what emojis that can be used is completely up to
@ -13,7 +17,7 @@ before Unicode 13.0 that belongs in the `Emoji_Presentation` category
in the official emoji list at
https://www.unicode.org/Public/UCD/latest/ucd/emoji/emoji-data.txt
# Usage
## Usage
```csharp
// Markup
@ -23,14 +27,14 @@ AnsiConsole.MarkupLine("Hello :globe_showing_europe_africa:!");
var hello = "Hello " + Emoji.Known.GlobeShowingEuropeAfrica;
```
# Replacing emojis in text
## Replacing emojis in text
```csharp
var phrase = "Mmmm :birthday_cake:";
var rendered = Emoji.Replace(phrase);
```
# Remapping or adding an emoji
## Remapping or adding an emoji
Sometimes you want to remap an existing emoji, or
add a completely new one. For this you can use the
@ -49,24 +53,18 @@ var phrase = "Hello :globe_showing_europe_africa:!";
var rendered = Emoji.Replace(phrase);
```
# Emojis
## Emojis
_The images in the table below might not render correctly in your
browser for the same reasons mentioned in the `Compatibility` section._
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="input-group-text" id="basic-addon1">
<i class="fas fa-search" aria-hidden="true"></i>
</span>
</div>
<input
class="form-control w-100 filter"
data-table="emoji-results"
type="text" placeholder="Search Emojis..." autocomplete="off"
aria-label="Search Emojis">
</div>
<?# EmojiTable /?>
<input
id="emojiSearch"
type="search"
oninput="search(this, 'emoji-results', 2)"
placeholder="Search for emojis.."
title="Type in an emoji name" />
<script type="text/javascript" src="../assets/js/table-search.js"></script>
<?# EmojiTable /?>

View File

@ -1,7 +1,6 @@
Title: Appendix
Order: 100
---
<h1>Sections</h1>
<ul>

View File

@ -1,12 +1,16 @@
Title: Spinners
Order: 4
Description: "*Spectre.Console* supports over 80 different types of spinners, and allows new ones to be defined. They are used automatically with the controls"
Highlights:
- Status display
- Progress display
---
For all available spinners, see https://jsfiddle.net/sindresorhus/2eLtsbey/embedded/result/
# Usage
## Usage
Spinners can be used with [Progress](xref:progress) and [Status](xref:status).
Spinners can be used with [Progress](xref:live-progress) and [Status](xref:live-status).
```csharp
AnsiConsole.Status()
@ -16,12 +20,12 @@ AnsiConsole.Status()
});
```
# Implementing a spinner
## Implementing a spinner
To implement your own spinner, all you have to do is
inherit from the `Spinner` base class.
In the example below, the spinner will alterate between
In the example below, the spinner will alternate between
the characters `A`, `B` and `C` every 100 ms.
```csharp

View File

@ -1,5 +1,12 @@
Title: Styles
Order: 1
Description: "*Spectre.Console* makes it easy to write text with different styles beyond colors. Depending on your terminal, it can make it easy to use styles such as"
Highlights:
- Bold, Italic, Underline, strikethrough
- Dim, Invert
- Conceal, slowblink, rapidblink
- Links
Xref: appendix-styles
---
Note that what styles that can be used is defined by the system or your terminal software, and may not appear as they should.
@ -41,4 +48,8 @@ Note that what styles that can be used is defined by the system or your terminal
<td><code>strikethrough</code></td>
<td>Shows text with a horizontal line through the center</td>
</tr>
<tr>
<td><code>link</code></td>
<td>Creates a clickable link within text</td>
</tr>
</table>

Binary file not shown.

View File

@ -1,51 +0,0 @@
//
// Base styles
//
.alert {
position: relative;
padding: $alert-padding-y $alert-padding-x;
margin-bottom: $alert-margin-bottom;
border: $alert-border-width solid transparent;
@include border-radius($alert-border-radius);
}
// Headings for larger alerts
.alert-heading {
// Specified to prevent conflicts of changing $headings-color
color: inherit;
}
// Provide class for links that match alerts
.alert-link {
font-weight: $alert-link-font-weight;
}
// Dismissible alerts
//
// Expand the right padding and account for the close button's positioning.
.alert-dismissible {
padding-right: $close-font-size + $alert-padding-x * 2;
// Adjust close link position
.close {
position: absolute;
top: 0;
right: 0;
padding: $alert-padding-y $alert-padding-x;
color: inherit;
}
}
// Alternate styles
//
// Generate contextual modifier classes for colorizing the alert.
@each $color, $value in $theme-colors {
.alert-#{$color} {
@include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
}
}

View File

@ -1,54 +0,0 @@
// Base class
//
// Requires one of the contextual, color modifier classes for `color` and
// `background-color`.
.badge {
display: inline-block;
padding: $badge-padding-y $badge-padding-x;
@include font-size($badge-font-size);
font-weight: $badge-font-weight;
line-height: 1;
text-align: center;
white-space: nowrap;
vertical-align: baseline;
@include border-radius($badge-border-radius);
@include transition($badge-transition);
@at-root a#{&} {
@include hover-focus() {
text-decoration: none;
}
}
// Empty badges collapse automatically
&:empty {
display: none;
}
}
// Quick fix for badges in buttons
.btn .badge {
position: relative;
top: -1px;
}
// Pill badges
//
// Make them extra rounded with a modifier to replace v3's badges.
.badge-pill {
padding-right: $badge-pill-padding-x;
padding-left: $badge-pill-padding-x;
@include border-radius($badge-pill-border-radius);
}
// Colors
//
// Contextual variations (linked badges get darker on :hover).
@each $color, $value in $theme-colors {
.badge-#{$color} {
@include badge-variant($value);
}
}

View File

@ -1,42 +0,0 @@
.breadcrumb {
display: flex;
flex-wrap: wrap;
padding: $breadcrumb-padding-y $breadcrumb-padding-x;
margin-bottom: $breadcrumb-margin-bottom;
@include font-size($breadcrumb-font-size);
list-style: none;
background-color: $breadcrumb-bg;
@include border-radius($breadcrumb-border-radius);
}
.breadcrumb-item {
// The separator between breadcrumbs (by default, a forward-slash: "/")
+ .breadcrumb-item {
padding-left: $breadcrumb-item-padding;
&::before {
display: inline-block; // Suppress underlining of the separator in modern browsers
padding-right: $breadcrumb-item-padding;
color: $breadcrumb-divider-color;
content: escape-svg($breadcrumb-divider);
}
}
// IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
// without `<ul>`s. The `::before` pseudo-element generates an element
// *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
//
// To trick IE into suppressing the underline, we give the pseudo-element an
// underline and then immediately remove it.
+ .breadcrumb-item:hover::before {
text-decoration: underline;
}
// stylelint-disable-next-line no-duplicate-selectors
+ .breadcrumb-item:hover::before {
text-decoration: none;
}
&.active {
color: $breadcrumb-active-color;
}
}

View File

@ -1,163 +0,0 @@
// stylelint-disable selector-no-qualifying-type
// Make the div behave like a button
.btn-group,
.btn-group-vertical {
position: relative;
display: inline-flex;
vertical-align: middle; // match .btn alignment given font-size hack above
> .btn {
position: relative;
flex: 1 1 auto;
// Bring the hover, focused, and "active" buttons to the front to overlay
// the borders properly
@include hover() {
z-index: 1;
}
&:focus,
&:active,
&.active {
z-index: 1;
}
}
}
// Optional: Group multiple button groups together for a toolbar
.btn-toolbar {
display: flex;
flex-wrap: wrap;
justify-content: flex-start;
.input-group {
width: auto;
}
}
.btn-group {
// Prevent double borders when buttons are next to each other
> .btn:not(:first-child),
> .btn-group:not(:first-child) {
margin-left: -$btn-border-width;
}
// Reset rounded corners
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn-group:not(:last-child) > .btn {
@include border-right-radius(0);
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) > .btn {
@include border-left-radius(0);
}
}
// Sizing
//
// Remix the default button sizing classes into new ones for easier manipulation.
.btn-group-sm > .btn { @extend .btn-sm; }
.btn-group-lg > .btn { @extend .btn-lg; }
//
// Split button dropdowns
//
.dropdown-toggle-split {
padding-right: $btn-padding-x * .75;
padding-left: $btn-padding-x * .75;
&::after,
.dropup &::after,
.dropright &::after {
margin-left: 0;
}
.dropleft &::before {
margin-right: 0;
}
}
.btn-sm + .dropdown-toggle-split {
padding-right: $btn-padding-x-sm * .75;
padding-left: $btn-padding-x-sm * .75;
}
.btn-lg + .dropdown-toggle-split {
padding-right: $btn-padding-x-lg * .75;
padding-left: $btn-padding-x-lg * .75;
}
// The clickable button for toggling the menu
// Set the same inset shadow as the :active state
.btn-group.show .dropdown-toggle {
@include box-shadow($btn-active-box-shadow);
// Show no shadow for `.btn-link` since it has no other button styles.
&.btn-link {
@include box-shadow(none);
}
}
//
// Vertical button groups
//
.btn-group-vertical {
flex-direction: column;
align-items: flex-start;
justify-content: center;
> .btn,
> .btn-group {
width: 100%;
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) {
margin-top: -$btn-border-width;
}
// Reset rounded corners
> .btn:not(:last-child):not(.dropdown-toggle),
> .btn-group:not(:last-child) > .btn {
@include border-bottom-radius(0);
}
> .btn:not(:first-child),
> .btn-group:not(:first-child) > .btn {
@include border-top-radius(0);
}
}
// Checkbox and radio options
//
// In order to support the browser's form validation feedback, powered by the
// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
// `display: none;` or `visibility: hidden;` as that also hides the popover.
// Simply visually hiding the inputs via `opacity` would leave them clickable in
// certain cases which is prevented by using `clip` and `pointer-events`.
// This way, we ensure a DOM element is visible to position the popover from.
//
// See https://github.com/twbs/bootstrap/pull/12794 and
// https://github.com/twbs/bootstrap/pull/14559 for more information.
.btn-group-toggle {
> .btn,
> .btn-group > .btn {
margin-bottom: 0; // Override default `<label>` value
input[type="radio"],
input[type="checkbox"] {
position: absolute;
clip: rect(0, 0, 0, 0);
pointer-events: none;
}
}
}

View File

@ -1,139 +0,0 @@
// stylelint-disable selector-no-qualifying-type
//
// Base styles
//
.btn {
display: inline-block;
font-family: $btn-font-family;
font-weight: $btn-font-weight;
color: $body-color;
text-align: center;
white-space: $btn-white-space;
vertical-align: middle;
cursor: if($enable-pointer-cursor-for-buttons, pointer, null);
user-select: none;
background-color: transparent;
border: $btn-border-width solid transparent;
@include button-size($btn-padding-y, $btn-padding-x, $btn-font-size, $btn-line-height, $btn-border-radius);
@include transition($btn-transition);
@include hover() {
color: $body-color;
text-decoration: none;
}
&:focus,
&.focus {
outline: 0;
box-shadow: $btn-focus-box-shadow;
}
// Disabled comes first so active can properly restyle
&.disabled,
&:disabled {
opacity: $btn-disabled-opacity;
@include box-shadow(none);
}
&:not(:disabled):not(.disabled):active,
&:not(:disabled):not(.disabled).active {
@include box-shadow($btn-active-box-shadow);
&:focus {
@include box-shadow($btn-focus-box-shadow, $btn-active-box-shadow);
}
}
}
// Future-proof disabling of clicks on `<a>` elements
a.btn.disabled,
fieldset:disabled a.btn {
pointer-events: none;
}
//
// Alternate buttons
//
@each $color, $value in $theme-colors {
.btn-#{$color} {
@include button-variant($value, $value);
}
}
@each $color, $value in $theme-colors {
.btn-outline-#{$color} {
@include button-outline-variant($value);
}
}
//
// Link buttons
//
// Make a button look and behave like a link
.btn-link {
font-weight: $font-weight-normal;
color: $link-color;
text-decoration: $link-decoration;
@include hover() {
color: $link-hover-color;
text-decoration: $link-hover-decoration;
}
&:focus,
&.focus {
text-decoration: $link-hover-decoration;
box-shadow: none;
}
&:disabled,
&.disabled {
color: $btn-link-disabled-color;
pointer-events: none;
}
// No need for an active state here
}
//
// Button Sizes
//
.btn-lg {
@include button-size($btn-padding-y-lg, $btn-padding-x-lg, $btn-font-size-lg, $btn-line-height-lg, $btn-border-radius-lg);
}
.btn-sm {
@include button-size($btn-padding-y-sm, $btn-padding-x-sm, $btn-font-size-sm, $btn-line-height-sm, $btn-border-radius-sm);
}
//
// Block button
//
.btn-block {
display: block;
width: 100%;
// Vertically space out multiple block buttons
+ .btn-block {
margin-top: $btn-block-spacing-y;
}
}
// Specificity overrides
input[type="submit"],
input[type="reset"],
input[type="button"] {
&.btn-block {
width: 100%;
}
}

View File

@ -1,278 +0,0 @@
//
// Base styles
//
.card {
position: relative;
display: flex;
flex-direction: column;
min-width: 0; // See https://github.com/twbs/bootstrap/pull/22740#issuecomment-305868106
height: $card-height;
word-wrap: break-word;
background-color: $card-bg;
background-clip: border-box;
border: $card-border-width solid $card-border-color;
@include border-radius($card-border-radius);
> hr {
margin-right: 0;
margin-left: 0;
}
> .list-group:first-child {
.list-group-item:first-child {
@include border-top-radius($card-border-radius);
}
}
> .list-group:last-child {
.list-group-item:last-child {
@include border-bottom-radius($card-border-radius);
}
}
}
.card-body {
// Enable `flex-grow: 1` for decks and groups so that card blocks take up
// as much space as possible, ensuring footers are aligned to the bottom.
flex: 1 1 auto;
// Workaround for the image size bug in IE
// See: https://github.com/twbs/bootstrap/pull/28855
min-height: 1px;
padding: $card-spacer-x;
color: $card-color;
}
.card-title {
margin-bottom: $card-spacer-y;
}
.card-subtitle {
margin-top: -$card-spacer-y / 2;
margin-bottom: 0;
}
.card-text:last-child {
margin-bottom: 0;
}
.card-link {
@include hover() {
text-decoration: none;
}
+ .card-link {
margin-left: $card-spacer-x;
}
}
//
// Optional textual caps
//
.card-header {
padding: $card-spacer-y $card-spacer-x;
margin-bottom: 0; // Removes the default margin-bottom of <hN>
color: $card-cap-color;
background-color: $card-cap-bg;
border-bottom: $card-border-width solid $card-border-color;
&:first-child {
@include border-radius($card-inner-border-radius $card-inner-border-radius 0 0);
}
+ .list-group {
.list-group-item:first-child {
border-top: 0;
}
}
}
.card-footer {
padding: $card-spacer-y $card-spacer-x;
background-color: $card-cap-bg;
border-top: $card-border-width solid $card-border-color;
&:last-child {
@include border-radius(0 0 $card-inner-border-radius $card-inner-border-radius);
}
}
//
// Header navs
//
.card-header-tabs {
margin-right: -$card-spacer-x / 2;
margin-bottom: -$card-spacer-y;
margin-left: -$card-spacer-x / 2;
border-bottom: 0;
}
.card-header-pills {
margin-right: -$card-spacer-x / 2;
margin-left: -$card-spacer-x / 2;
}
// Card image
.card-img-overlay {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
padding: $card-img-overlay-padding;
}
.card-img,
.card-img-top,
.card-img-bottom {
flex-shrink: 0; // For IE: https://github.com/twbs/bootstrap/issues/29396
width: 100%; // Required because we use flexbox and this inherently applies align-self: stretch
}
.card-img,
.card-img-top {
@include border-top-radius($card-inner-border-radius);
}
.card-img,
.card-img-bottom {
@include border-bottom-radius($card-inner-border-radius);
}
// Card deck
.card-deck {
.card {
margin-bottom: $card-deck-margin;
}
@include media-breakpoint-up(sm) {
display: flex;
flex-flow: row wrap;
margin-right: -$card-deck-margin;
margin-left: -$card-deck-margin;
.card {
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
flex: 1 0 0%;
margin-right: $card-deck-margin;
margin-bottom: 0; // Override the default
margin-left: $card-deck-margin;
}
}
}
//
// Card groups
//
.card-group {
// The child selector allows nested `.card` within `.card-group`
// to display properly.
> .card {
margin-bottom: $card-group-margin;
}
@include media-breakpoint-up(sm) {
display: flex;
flex-flow: row wrap;
// The child selector allows nested `.card` within `.card-group`
// to display properly.
> .card {
// Flexbugs #4: https://github.com/philipwalton/flexbugs#flexbug-4
flex: 1 0 0%;
margin-bottom: 0;
+ .card {
margin-left: 0;
border-left: 0;
}
// Handle rounded corners
@if $enable-rounded {
&:not(:last-child) {
@include border-right-radius(0);
.card-img-top,
.card-header {
// stylelint-disable-next-line property-blacklist
border-top-right-radius: 0;
}
.card-img-bottom,
.card-footer {
// stylelint-disable-next-line property-blacklist
border-bottom-right-radius: 0;
}
}
&:not(:first-child) {
@include border-left-radius(0);
.card-img-top,
.card-header {
// stylelint-disable-next-line property-blacklist
border-top-left-radius: 0;
}
.card-img-bottom,
.card-footer {
// stylelint-disable-next-line property-blacklist
border-bottom-left-radius: 0;
}
}
}
}
}
}
//
// Columns
//
.card-columns {
.card {
margin-bottom: $card-columns-margin;
}
@include media-breakpoint-up(sm) {
column-count: $card-columns-count;
column-gap: $card-columns-gap;
orphans: 1;
widows: 1;
.card {
display: inline-block; // Don't let them vertically span multiple columns
width: 100%; // Don't let their width change
}
}
}
//
// Accordion
//
.accordion {
> .card {
overflow: hidden;
&:not(:last-of-type) {
border-bottom: 0;
@include border-bottom-radius(0);
}
&:not(:first-of-type) {
@include border-top-radius(0);
}
> .card-header {
@include border-radius(0);
margin-bottom: -$card-border-width;
}
}
}

View File

@ -1,197 +0,0 @@
// Notes on the classes:
//
// 1. .carousel.pointer-event should ideally be pan-y (to allow for users to scroll vertically)
// even when their scroll action started on a carousel, but for compatibility (with Firefox)
// we're preventing all actions instead
// 2. The .carousel-item-left and .carousel-item-right is used to indicate where
// the active slide is heading.
// 3. .active.carousel-item is the current slide.
// 4. .active.carousel-item-left and .active.carousel-item-right is the current
// slide in its in-transition state. Only one of these occurs at a time.
// 5. .carousel-item-next.carousel-item-left and .carousel-item-prev.carousel-item-right
// is the upcoming slide in transition.
.carousel {
position: relative;
}
.carousel.pointer-event {
touch-action: pan-y;
}
.carousel-inner {
position: relative;
width: 100%;
overflow: hidden;
@include clearfix();
}
.carousel-item {
position: relative;
display: none;
float: left;
width: 100%;
margin-right: -100%;
backface-visibility: hidden;
@include transition($carousel-transition);
}
.carousel-item.active,
.carousel-item-next,
.carousel-item-prev {
display: block;
}
.carousel-item-next:not(.carousel-item-left),
.active.carousel-item-right {
transform: translateX(100%);
}
.carousel-item-prev:not(.carousel-item-right),
.active.carousel-item-left {
transform: translateX(-100%);
}
//
// Alternate transitions
//
.carousel-fade {
.carousel-item {
opacity: 0;
transition-property: opacity;
transform: none;
}
.carousel-item.active,
.carousel-item-next.carousel-item-left,
.carousel-item-prev.carousel-item-right {
z-index: 1;
opacity: 1;
}
.active.carousel-item-left,
.active.carousel-item-right {
z-index: 0;
opacity: 0;
@include transition(opacity 0s $carousel-transition-duration);
}
}
//
// Left/right controls for nav
//
.carousel-control-prev,
.carousel-control-next {
position: absolute;
top: 0;
bottom: 0;
z-index: 1;
// Use flex for alignment (1-3)
display: flex; // 1. allow flex styles
align-items: center; // 2. vertically center contents
justify-content: center; // 3. horizontally center contents
width: $carousel-control-width;
color: $carousel-control-color;
text-align: center;
opacity: $carousel-control-opacity;
@include transition($carousel-control-transition);
// Hover/focus state
@include hover-focus() {
color: $carousel-control-color;
text-decoration: none;
outline: 0;
opacity: $carousel-control-hover-opacity;
}
}
.carousel-control-prev {
left: 0;
@if $enable-gradients {
background-image: linear-gradient(90deg, rgba($black, .25), rgba($black, .001));
}
}
.carousel-control-next {
right: 0;
@if $enable-gradients {
background-image: linear-gradient(270deg, rgba($black, .25), rgba($black, .001));
}
}
// Icons for within
.carousel-control-prev-icon,
.carousel-control-next-icon {
display: inline-block;
width: $carousel-control-icon-width;
height: $carousel-control-icon-width;
background: no-repeat 50% / 100% 100%;
}
.carousel-control-prev-icon {
background-image: escape-svg($carousel-control-prev-icon-bg);
}
.carousel-control-next-icon {
background-image: escape-svg($carousel-control-next-icon-bg);
}
// Optional indicator pips
//
// Add an ordered list with the following class and add a list item for each
// slide your carousel holds.
.carousel-indicators {
position: absolute;
right: 0;
bottom: 0;
left: 0;
z-index: 15;
display: flex;
justify-content: center;
padding-left: 0; // override <ol> default
// Use the .carousel-control's width as margin so we don't overlay those
margin-right: $carousel-control-width;
margin-left: $carousel-control-width;
list-style: none;
li {
box-sizing: content-box;
flex: 0 1 auto;
width: $carousel-indicator-width;
height: $carousel-indicator-height;
margin-right: $carousel-indicator-spacer;
margin-left: $carousel-indicator-spacer;
text-indent: -999px;
cursor: pointer;
background-color: $carousel-indicator-active-bg;
background-clip: padding-box;
// Use transparent borders to increase the hit area by 10px on top and bottom.
border-top: $carousel-indicator-hit-area-height solid transparent;
border-bottom: $carousel-indicator-hit-area-height solid transparent;
opacity: .5;
@include transition($carousel-indicator-transition);
}
.active {
opacity: 1;
}
}
// Optional captions
//
//
.carousel-caption {
position: absolute;
right: (100% - $carousel-caption-width) / 2;
bottom: 20px;
left: (100% - $carousel-caption-width) / 2;
z-index: 10;
padding-top: 20px;
padding-bottom: 20px;
color: $carousel-caption-color;
text-align: center;
}

View File

@ -1,41 +0,0 @@
.close {
float: right;
@include font-size($close-font-size);
font-weight: $close-font-weight;
line-height: 1;
color: $close-color;
text-shadow: $close-text-shadow;
opacity: .5;
// Override <a>'s hover style
@include hover() {
color: $close-color;
text-decoration: none;
}
&:not(:disabled):not(.disabled) {
@include hover-focus() {
opacity: .75;
}
}
}
// Additional properties for button version
// iOS requires the button element instead of an anchor tag.
// If you want the anchor version, it requires `href="#"`.
// See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile
// stylelint-disable-next-line selector-no-qualifying-type
button.close {
padding: 0;
background-color: transparent;
border: 0;
appearance: none;
}
// Future-proof disabling of clicks on `<a>` elements
// stylelint-disable-next-line selector-no-qualifying-type
a.close.disabled {
pointer-events: none;
}

View File

@ -1,48 +0,0 @@
// Inline code
code {
@include font-size($code-font-size);
color: $code-color;
word-wrap: break-word;
// Streamline the style when inside anchors to avoid broken underline and more
a > & {
color: inherit;
}
}
// User input typically entered via keyboard
kbd {
padding: $kbd-padding-y $kbd-padding-x;
@include font-size($kbd-font-size);
color: $kbd-color;
background-color: $kbd-bg;
@include border-radius($border-radius-sm);
@include box-shadow($kbd-box-shadow);
kbd {
padding: 0;
@include font-size(100%);
font-weight: $nested-kbd-font-weight;
@include box-shadow(none);
}
}
// Blocks of code
pre {
display: block;
@include font-size($code-font-size);
color: $pre-color;
// Account for some code outputs that place code tags in pre tags
code {
@include font-size(inherit);
color: inherit;
word-break: normal;
}
}
// Enable scrollable blocks of code
.pre-scrollable {
max-height: $pre-scrollable-max-height;
overflow-y: scroll;
}

View File

@ -1,521 +0,0 @@
// Embedded icons from Open Iconic.
// Released under MIT and copyright 2014 Waybury.
// https://useiconic.com/open
// Checkboxes and radios
//
// Base class takes care of all the key behavioral aspects.
.custom-control {
position: relative;
display: block;
min-height: $font-size-base * $line-height-base;
padding-left: $custom-control-gutter + $custom-control-indicator-size;
}
.custom-control-inline {
display: inline-flex;
margin-right: $custom-control-spacer-x;
}
.custom-control-input {
position: absolute;
left: 0;
z-index: -1; // Put the input behind the label so it doesn't overlay text
width: $custom-control-indicator-size;
height: ($font-size-base * $line-height-base + $custom-control-indicator-size) / 2;
opacity: 0;
&:checked ~ .custom-control-label::before {
color: $custom-control-indicator-checked-color;
border-color: $custom-control-indicator-checked-border-color;
@include gradient-bg($custom-control-indicator-checked-bg);
@include box-shadow($custom-control-indicator-checked-box-shadow);
}
&:focus ~ .custom-control-label::before {
// the mixin is not used here to make sure there is feedback
@if $enable-shadows {
box-shadow: $input-box-shadow, $input-focus-box-shadow;
} @else {
box-shadow: $custom-control-indicator-focus-box-shadow;
}
}
&:focus:not(:checked) ~ .custom-control-label::before {
border-color: $custom-control-indicator-focus-border-color;
}
&:not(:disabled):active ~ .custom-control-label::before {
color: $custom-control-indicator-active-color;
background-color: $custom-control-indicator-active-bg;
border-color: $custom-control-indicator-active-border-color;
@include box-shadow($custom-control-indicator-active-box-shadow);
}
// Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247
&[disabled],
&:disabled {
~ .custom-control-label {
color: $custom-control-label-disabled-color;
&::before {
background-color: $custom-control-indicator-disabled-bg;
}
}
}
}
// Custom control indicators
//
// Build the custom controls out of pseudo-elements.
.custom-control-label {
position: relative;
margin-bottom: 0;
color: $custom-control-label-color;
vertical-align: top;
cursor: $custom-control-cursor;
// Background-color and (when enabled) gradient
&::before {
position: absolute;
top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
left: -($custom-control-gutter + $custom-control-indicator-size);
display: block;
width: $custom-control-indicator-size;
height: $custom-control-indicator-size;
pointer-events: none;
content: "";
background-color: $custom-control-indicator-bg;
border: $custom-control-indicator-border-color solid $custom-control-indicator-border-width;
@include box-shadow($custom-control-indicator-box-shadow);
}
// Foreground (icon)
&::after {
position: absolute;
top: ($font-size-base * $line-height-base - $custom-control-indicator-size) / 2;
left: -($custom-control-gutter + $custom-control-indicator-size);
display: block;
width: $custom-control-indicator-size;
height: $custom-control-indicator-size;
content: "";
background: no-repeat 50% / #{$custom-control-indicator-bg-size};
}
}
// Checkboxes
//
// Tweak just a few things for checkboxes.
.custom-checkbox {
.custom-control-label::before {
@include border-radius($custom-checkbox-indicator-border-radius);
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-image: escape-svg($custom-checkbox-indicator-icon-checked);
}
}
.custom-control-input:indeterminate ~ .custom-control-label {
&::before {
border-color: $custom-checkbox-indicator-indeterminate-border-color;
@include gradient-bg($custom-checkbox-indicator-indeterminate-bg);
@include box-shadow($custom-checkbox-indicator-indeterminate-box-shadow);
}
&::after {
background-image: escape-svg($custom-checkbox-indicator-icon-indeterminate);
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
background-color: $custom-control-indicator-checked-disabled-bg;
}
&:indeterminate ~ .custom-control-label::before {
background-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
// Radios
//
// Tweak just a few things for radios.
.custom-radio {
.custom-control-label::before {
// stylelint-disable-next-line property-blacklist
border-radius: $custom-radio-indicator-border-radius;
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-image: escape-svg($custom-radio-indicator-icon-checked);
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
background-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
// switches
//
// Tweak a few things for switches
.custom-switch {
padding-left: $custom-switch-width + $custom-control-gutter;
.custom-control-label {
&::before {
left: -($custom-switch-width + $custom-control-gutter);
width: $custom-switch-width;
pointer-events: all;
// stylelint-disable-next-line property-blacklist
border-radius: $custom-switch-indicator-border-radius;
}
&::after {
top: add(($font-size-base * $line-height-base - $custom-control-indicator-size) / 2, $custom-control-indicator-border-width * 2);
left: add(-($custom-switch-width + $custom-control-gutter), $custom-control-indicator-border-width * 2);
width: $custom-switch-indicator-size;
height: $custom-switch-indicator-size;
background-color: $custom-control-indicator-border-color;
// stylelint-disable-next-line property-blacklist
border-radius: $custom-switch-indicator-border-radius;
@include transition(transform .15s ease-in-out, $custom-forms-transition);
}
}
.custom-control-input:checked ~ .custom-control-label {
&::after {
background-color: $custom-control-indicator-bg;
transform: translateX($custom-switch-width - $custom-control-indicator-size);
}
}
.custom-control-input:disabled {
&:checked ~ .custom-control-label::before {
background-color: $custom-control-indicator-checked-disabled-bg;
}
}
}
// Select
//
// Replaces the browser default select with a custom one, mostly pulled from
// https://primer.github.io/.
//
.custom-select {
display: inline-block;
width: 100%;
height: $custom-select-height;
padding: $custom-select-padding-y ($custom-select-padding-x + $custom-select-indicator-padding) $custom-select-padding-y $custom-select-padding-x;
font-family: $custom-select-font-family;
@include font-size($custom-select-font-size);
font-weight: $custom-select-font-weight;
line-height: $custom-select-line-height;
color: $custom-select-color;
vertical-align: middle;
background: $custom-select-bg $custom-select-background;
border: $custom-select-border-width solid $custom-select-border-color;
@include border-radius($custom-select-border-radius, 0);
@include box-shadow($custom-select-box-shadow);
appearance: none;
&:focus {
border-color: $custom-select-focus-border-color;
outline: 0;
@if $enable-shadows {
box-shadow: $custom-select-box-shadow, $custom-select-focus-box-shadow;
} @else {
box-shadow: $custom-select-focus-box-shadow;
}
&::-ms-value {
// For visual consistency with other platforms/browsers,
// suppress the default white text on blue background highlight given to
// the selected option text when the (still closed) <select> receives focus
// in IE and (under certain conditions) Edge.
// See https://github.com/twbs/bootstrap/issues/19398.
color: $input-color;
background-color: $input-bg;
}
}
&[multiple],
&[size]:not([size="1"]) {
height: auto;
padding-right: $custom-select-padding-x;
background-image: none;
}
&:disabled {
color: $custom-select-disabled-color;
background-color: $custom-select-disabled-bg;
}
// Hides the default caret in IE11
&::-ms-expand {
display: none;
}
// Remove outline from select box in FF
&:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 $custom-select-color;
}
}
.custom-select-sm {
height: $custom-select-height-sm;
padding-top: $custom-select-padding-y-sm;
padding-bottom: $custom-select-padding-y-sm;
padding-left: $custom-select-padding-x-sm;
@include font-size($custom-select-font-size-sm);
}
.custom-select-lg {
height: $custom-select-height-lg;
padding-top: $custom-select-padding-y-lg;
padding-bottom: $custom-select-padding-y-lg;
padding-left: $custom-select-padding-x-lg;
@include font-size($custom-select-font-size-lg);
}
// File
//
// Custom file input.
.custom-file {
position: relative;
display: inline-block;
width: 100%;
height: $custom-file-height;
margin-bottom: 0;
}
.custom-file-input {
position: relative;
z-index: 2;
width: 100%;
height: $custom-file-height;
margin: 0;
opacity: 0;
&:focus ~ .custom-file-label {
border-color: $custom-file-focus-border-color;
box-shadow: $custom-file-focus-box-shadow;
}
// Use [disabled] and :disabled to work around https://github.com/twbs/bootstrap/issues/28247
&[disabled] ~ .custom-file-label,
&:disabled ~ .custom-file-label {
background-color: $custom-file-disabled-bg;
}
@each $lang, $value in $custom-file-text {
&:lang(#{$lang}) ~ .custom-file-label::after {
content: $value;
}
}
~ .custom-file-label[data-browse]::after {
content: attr(data-browse);
}
}
.custom-file-label {
position: absolute;
top: 0;
right: 0;
left: 0;
z-index: 1;
height: $custom-file-height;
padding: $custom-file-padding-y $custom-file-padding-x;
font-family: $custom-file-font-family;
font-weight: $custom-file-font-weight;
line-height: $custom-file-line-height;
color: $custom-file-color;
background-color: $custom-file-bg;
border: $custom-file-border-width solid $custom-file-border-color;
@include border-radius($custom-file-border-radius);
@include box-shadow($custom-file-box-shadow);
&::after {
position: absolute;
top: 0;
right: 0;
bottom: 0;
z-index: 3;
display: block;
height: $custom-file-height-inner;
padding: $custom-file-padding-y $custom-file-padding-x;
line-height: $custom-file-line-height;
color: $custom-file-button-color;
content: "Browse";
@include gradient-bg($custom-file-button-bg);
border-left: inherit;
@include border-radius(0 $custom-file-border-radius $custom-file-border-radius 0);
}
}
// Range
//
// Style range inputs the same across browsers. Vendor-specific rules for pseudo
// elements cannot be mixed. As such, there are no shared styles for focus or
// active states on prefixed selectors.
.custom-range {
width: 100%;
height: add($custom-range-thumb-height, $custom-range-thumb-focus-box-shadow-width * 2);
padding: 0; // Need to reset padding
background-color: transparent;
appearance: none;
&:focus {
outline: none;
// Pseudo-elements must be split across multiple rulesets to have an effect.
// No box-shadow() mixin for focus accessibility.
&::-webkit-slider-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
&::-moz-range-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
&::-ms-thumb { box-shadow: $custom-range-thumb-focus-box-shadow; }
}
&::-moz-focus-outer {
border: 0;
}
&::-webkit-slider-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
margin-top: ($custom-range-track-height - $custom-range-thumb-height) / 2; // Webkit specific
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-webkit-slider-runnable-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent; // Why?
cursor: $custom-range-track-cursor;
background-color: $custom-range-track-bg;
border-color: transparent;
@include border-radius($custom-range-track-border-radius);
@include box-shadow($custom-range-track-box-shadow);
}
&::-moz-range-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-moz-range-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent;
cursor: $custom-range-track-cursor;
background-color: $custom-range-track-bg;
border-color: transparent; // Firefox specific?
@include border-radius($custom-range-track-border-radius);
@include box-shadow($custom-range-track-box-shadow);
}
&::-ms-thumb {
width: $custom-range-thumb-width;
height: $custom-range-thumb-height;
margin-top: 0; // Edge specific
margin-right: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
margin-left: $custom-range-thumb-focus-box-shadow-width; // Workaround that overflowed box-shadow is hidden.
@include gradient-bg($custom-range-thumb-bg);
border: $custom-range-thumb-border;
@include border-radius($custom-range-thumb-border-radius);
@include box-shadow($custom-range-thumb-box-shadow);
@include transition($custom-forms-transition);
appearance: none;
&:active {
@include gradient-bg($custom-range-thumb-active-bg);
}
}
&::-ms-track {
width: $custom-range-track-width;
height: $custom-range-track-height;
color: transparent;
cursor: $custom-range-track-cursor;
background-color: transparent;
border-color: transparent;
border-width: $custom-range-thumb-height / 2;
@include box-shadow($custom-range-track-box-shadow);
}
&::-ms-fill-lower {
background-color: $custom-range-track-bg;
@include border-radius($custom-range-track-border-radius);
}
&::-ms-fill-upper {
margin-right: 15px; // arbitrary?
background-color: $custom-range-track-bg;
@include border-radius($custom-range-track-border-radius);
}
&:disabled {
&::-webkit-slider-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
&::-webkit-slider-runnable-track {
cursor: default;
}
&::-moz-range-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
&::-moz-range-track {
cursor: default;
}
&::-ms-thumb {
background-color: $custom-range-thumb-disabled-bg;
}
}
}
.custom-control-label::before,
.custom-file-label,
.custom-select {
@include transition($custom-forms-transition);
}

View File

@ -1,191 +0,0 @@
// The dropdown wrapper (`<div>`)
.dropup,
.dropright,
.dropdown,
.dropleft {
position: relative;
}
.dropdown-toggle {
white-space: nowrap;
// Generate the caret automatically
@include caret();
}
// The dropdown menu
.dropdown-menu {
position: absolute;
top: 100%;
left: 0;
z-index: $zindex-dropdown;
display: none; // none by default, but block on "open" of the menu
float: left;
min-width: $dropdown-min-width;
padding: $dropdown-padding-y 0;
margin: $dropdown-spacer 0 0; // override default ul
@include font-size($dropdown-font-size);
color: $dropdown-color;
text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)
list-style: none;
background-color: $dropdown-bg;
background-clip: padding-box;
border: $dropdown-border-width solid $dropdown-border-color;
@include border-radius($dropdown-border-radius);
@include box-shadow($dropdown-box-shadow);
}
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.dropdown-menu#{$infix}-left {
right: auto;
left: 0;
}
.dropdown-menu#{$infix}-right {
right: 0;
left: auto;
}
}
}
// Allow for dropdowns to go bottom up (aka, dropup-menu)
// Just add .dropup after the standard .dropdown class and you're set.
.dropup {
.dropdown-menu {
top: auto;
bottom: 100%;
margin-top: 0;
margin-bottom: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(up);
}
}
.dropright {
.dropdown-menu {
top: 0;
right: auto;
left: 100%;
margin-top: 0;
margin-left: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(right);
&::after {
vertical-align: 0;
}
}
}
.dropleft {
.dropdown-menu {
top: 0;
right: 100%;
left: auto;
margin-top: 0;
margin-right: $dropdown-spacer;
}
.dropdown-toggle {
@include caret(left);
&::before {
vertical-align: 0;
}
}
}
// When enabled Popper.js, reset basic dropdown position
// stylelint-disable-next-line no-duplicate-selectors
.dropdown-menu {
&[x-placement^="top"],
&[x-placement^="right"],
&[x-placement^="bottom"],
&[x-placement^="left"] {
right: auto;
bottom: auto;
}
}
// Dividers (basically an `<hr>`) within the dropdown
.dropdown-divider {
@include nav-divider($dropdown-divider-bg, $dropdown-divider-margin-y, true);
}
// Links, buttons, and more within the dropdown menu
//
// `<button>`-specific styles are denoted with `// For <button>s`
.dropdown-item {
display: block;
width: 100%; // For `<button>`s
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
clear: both;
font-weight: $font-weight-normal;
color: $dropdown-link-color;
text-align: inherit; // For `<button>`s
white-space: nowrap; // prevent links from randomly breaking onto new lines
background-color: transparent; // For `<button>`s
border: 0; // For `<button>`s
// Prevent dropdown overflow if there's no padding
// See https://github.com/twbs/bootstrap/pull/27703
@if $dropdown-padding-y == 0 {
&:first-child {
@include border-top-radius($dropdown-inner-border-radius);
}
&:last-child {
@include border-bottom-radius($dropdown-inner-border-radius);
}
}
@include hover-focus() {
color: $dropdown-link-hover-color;
text-decoration: none;
@include gradient-bg($dropdown-link-hover-bg);
}
&.active,
&:active {
color: $dropdown-link-active-color;
text-decoration: none;
@include gradient-bg($dropdown-link-active-bg);
}
&.disabled,
&:disabled {
color: $dropdown-link-disabled-color;
pointer-events: none;
background-color: transparent;
// Remove CSS gradients if they're enabled
@if $enable-gradients {
background-image: none;
}
}
}
.dropdown-menu.show {
display: block;
}
// Dropdown section headers
.dropdown-header {
display: block;
padding: $dropdown-padding-y $dropdown-item-padding-x;
margin-bottom: 0; // for use with heading elements
@include font-size($font-size-sm);
color: $dropdown-header-color;
white-space: nowrap; // as with > li > a
}
// Dropdown text
.dropdown-item-text {
display: block;
padding: $dropdown-item-padding-y $dropdown-item-padding-x;
color: $dropdown-link-color;
}

View File

@ -1,338 +0,0 @@
// stylelint-disable selector-no-qualifying-type
//
// Textual form controls
//
.form-control {
display: block;
width: 100%;
height: $input-height;
padding: $input-padding-y $input-padding-x;
font-family: $input-font-family;
@include font-size($input-font-size);
font-weight: $input-font-weight;
line-height: $input-line-height;
color: $input-color;
background-color: $input-bg;
background-clip: padding-box;
border: $input-border-width solid $input-border-color;
// Note: This has no effect on <select>s in some browsers, due to the limited stylability of `<select>`s in CSS.
@include border-radius($input-border-radius, 0);
@include box-shadow($input-box-shadow);
@include transition($input-transition);
// Unstyle the caret on `<select>`s in IE10+.
&::-ms-expand {
background-color: transparent;
border: 0;
}
// Remove select outline from select box in FF
&:-moz-focusring {
color: transparent;
text-shadow: 0 0 0 $input-color;
}
// Customize the `:focus` state to imitate native WebKit styles.
@include form-control-focus($ignore-warning: true);
// Placeholder
&::placeholder {
color: $input-placeholder-color;
// Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526.
opacity: 1;
}
// Disabled and read-only inputs
//
// HTML5 says that controls under a fieldset > legend:first-child won't be
// disabled if the fieldset is disabled. Due to implementation difficulty, we
// don't honor that edge case; we style them as disabled anyway.
&:disabled,
&[readonly] {
background-color: $input-disabled-bg;
// iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655.
opacity: 1;
}
}
select.form-control {
&:focus::-ms-value {
// Suppress the nested default white text on blue background highlight given to
// the selected option text when the (still closed) <select> receives focus
// in IE and (under certain conditions) Edge, as it looks bad and cannot be made to
// match the appearance of the native widget.
// See https://github.com/twbs/bootstrap/issues/19398.
color: $input-color;
background-color: $input-bg;
}
}
// Make file inputs better match text inputs by forcing them to new lines.
.form-control-file,
.form-control-range {
display: block;
width: 100%;
}
//
// Labels
//
// For use with horizontal and inline forms, when you need the label (or legend)
// text to align with the form controls.
.col-form-label {
padding-top: add($input-padding-y, $input-border-width);
padding-bottom: add($input-padding-y, $input-border-width);
margin-bottom: 0; // Override the `<label>/<legend>` default
@include font-size(inherit); // Override the `<legend>` default
line-height: $input-line-height;
}
.col-form-label-lg {
padding-top: add($input-padding-y-lg, $input-border-width);
padding-bottom: add($input-padding-y-lg, $input-border-width);
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
}
.col-form-label-sm {
padding-top: add($input-padding-y-sm, $input-border-width);
padding-bottom: add($input-padding-y-sm, $input-border-width);
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
}
// Readonly controls as plain text
//
// Apply class to a readonly input to make it appear like regular plain
// text (without any border, background color, focus indicator)
.form-control-plaintext {
display: block;
width: 100%;
padding: $input-padding-y 0;
margin-bottom: 0; // match inputs if this class comes on inputs with default margins
@include font-size($input-font-size);
line-height: $input-line-height;
color: $input-plaintext-color;
background-color: transparent;
border: solid transparent;
border-width: $input-border-width 0;
&.form-control-sm,
&.form-control-lg {
padding-right: 0;
padding-left: 0;
}
}
// Form control sizing
//
// Build on `.form-control` with modifier classes to decrease or increase the
// height and font-size of form controls.
//
// Repeated in `_input_group.scss` to avoid Sass extend issues.
.form-control-sm {
height: $input-height-sm;
padding: $input-padding-y-sm $input-padding-x-sm;
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
@include border-radius($input-border-radius-sm);
}
.form-control-lg {
height: $input-height-lg;
padding: $input-padding-y-lg $input-padding-x-lg;
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
@include border-radius($input-border-radius-lg);
}
// stylelint-disable-next-line no-duplicate-selectors
select.form-control {
&[size],
&[multiple] {
height: auto;
}
}
textarea.form-control {
height: auto;
}
// Form groups
//
// Designed to help with the organization and spacing of vertical forms. For
// horizontal forms, use the predefined grid classes.
.form-group {
margin-bottom: $form-group-margin-bottom;
}
.form-text {
display: block;
margin-top: $form-text-margin-top;
}
// Form grid
//
// Special replacement for our grid system's `.row` for tighter form layouts.
.form-row {
display: flex;
flex-wrap: wrap;
margin-right: -$form-grid-gutter-width / 2;
margin-left: -$form-grid-gutter-width / 2;
> .col,
> [class*="col-"] {
padding-right: $form-grid-gutter-width / 2;
padding-left: $form-grid-gutter-width / 2;
}
}
// Checkboxes and radios
//
// Indent the labels to position radios/checkboxes as hanging controls.
.form-check {
position: relative;
display: block;
padding-left: $form-check-input-gutter;
}
.form-check-input {
position: absolute;
margin-top: $form-check-input-margin-y;
margin-left: -$form-check-input-gutter;
// Use [disabled] and :disabled for workaround https://github.com/twbs/bootstrap/issues/28247
&[disabled] ~ .form-check-label,
&:disabled ~ .form-check-label {
color: $text-muted;
}
}
.form-check-label {
margin-bottom: 0; // Override default `<label>` bottom margin
}
.form-check-inline {
display: inline-flex;
align-items: center;
padding-left: 0; // Override base .form-check
margin-right: $form-check-inline-margin-x;
// Undo .form-check-input defaults and add some `margin-right`.
.form-check-input {
position: static;
margin-top: 0;
margin-right: $form-check-inline-input-margin-x;
margin-left: 0;
}
}
// Form validation
//
// Provide feedback to users when form field values are valid or invalid. Works
// primarily for client-side validation via scoped `:invalid` and `:valid`
// pseudo-classes but also includes `.is-invalid` and `.is-valid` classes for
// server side validation.
@each $state, $data in $form-validation-states {
@include form-validation-state($state, map-get($data, color), map-get($data, icon));
}
// Inline forms
//
// Make forms appear inline(-block) by adding the `.form-inline` class. Inline
// forms begin stacked on extra small (mobile) devices and then go inline when
// viewports reach <768px.
//
// Requires wrapping inputs and labels with `.form-group` for proper display of
// default HTML form controls and our custom form controls (e.g., input groups).
.form-inline {
display: flex;
flex-flow: row wrap;
align-items: center; // Prevent shorter elements from growing to same height as others (e.g., small buttons growing to normal sized button height)
// Because we use flex, the initial sizing of checkboxes is collapsed and
// doesn't occupy the full-width (which is what we want for xs grid tier),
// so we force that here.
.form-check {
width: 100%;
}
// Kick in the inline
@include media-breakpoint-up(sm) {
label {
display: flex;
align-items: center;
justify-content: center;
margin-bottom: 0;
}
// Inline-block all the things for "inline"
.form-group {
display: flex;
flex: 0 0 auto;
flex-flow: row wrap;
align-items: center;
margin-bottom: 0;
}
// Allow folks to *not* use `.form-group`
.form-control {
display: inline-block;
width: auto; // Prevent labels from stacking above inputs in `.form-group`
vertical-align: middle;
}
// Make static controls behave like regular ones
.form-control-plaintext {
display: inline-block;
}
.input-group,
.custom-select {
width: auto;
}
// Remove default margin on radios/checkboxes that were used for stacking, and
// then undo the floating of radios and checkboxes to match.
.form-check {
display: flex;
align-items: center;
justify-content: center;
width: auto;
padding-left: 0;
}
.form-check-input {
position: relative;
flex-shrink: 0;
margin-top: 0;
margin-right: $form-check-input-margin-x;
margin-left: 0;
}
.custom-control {
align-items: center;
justify-content: center;
}
.custom-control-label {
margin-bottom: 0;
}
}
}

View File

@ -1,134 +0,0 @@
// Bootstrap functions
//
// Utility mixins and functions for evaluating source code across our variables, maps, and mixins.
// Ascending
// Used to evaluate Sass maps like our grid breakpoints.
@mixin _assert-ascending($map, $map-name) {
$prev-key: null;
$prev-num: null;
@each $key, $num in $map {
@if $prev-num == null or unit($num) == "%" or unit($prev-num) == "%" {
// Do nothing
} @else if not comparable($prev-num, $num) {
@warn "Potentially invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} whose unit makes it incomparable to #{$prev-num}, the value of the previous key '#{$prev-key}' !";
} @else if $prev-num >= $num {
@warn "Invalid value for #{$map-name}: This map must be in ascending order, but key '#{$key}' has value #{$num} which isn't greater than #{$prev-num}, the value of the previous key '#{$prev-key}' !";
}
$prev-key: $key;
$prev-num: $num;
}
}
// Starts at zero
// Used to ensure the min-width of the lowest breakpoint starts at 0.
@mixin _assert-starts-at-zero($map, $map-name: "$grid-breakpoints") {
$values: map-values($map);
$first-value: nth($values, 1);
@if $first-value != 0 {
@warn "First breakpoint in #{$map-name} must start at 0, but starts at #{$first-value}.";
}
}
// Replace `$search` with `$replace` in `$string`
// Used on our SVG icon backgrounds for custom forms.
//
// @author Hugo Giraudel
// @param {String} $string - Initial string
// @param {String} $search - Substring to replace
// @param {String} $replace ('') - New value
// @return {String} - Updated string
@function str-replace($string, $search, $replace: "") {
$index: str-index($string, $search);
@if $index {
@return str-slice($string, 1, $index - 1) + $replace + str-replace(str-slice($string, $index + str-length($search)), $search, $replace);
}
@return $string;
}
// See https://codepen.io/kevinweber/pen/dXWoRw
@function escape-svg($string) {
@if str-index($string, "data:image/svg+xml") {
@each $char, $encoded in $escaped-characters {
$string: str-replace($string, $char, $encoded);
}
}
@return $string;
}
// Color contrast
@function color-yiq($color, $dark: $yiq-text-dark, $light: $yiq-text-light) {
$r: red($color);
$g: green($color);
$b: blue($color);
$yiq: (($r * 299) + ($g * 587) + ($b * 114)) / 1000;
@if ($yiq >= $yiq-contrasted-threshold) {
@return $dark;
} @else {
@return $light;
}
}
// Retrieve color Sass maps
@function color($key: "blue") {
@return map-get($colors, $key);
}
@function theme-color($key: "primary") {
@return map-get($theme-colors, $key);
}
@function gray($key: "100") {
@return map-get($grays, $key);
}
// Request a theme color level
@function theme-color-level($color-name: "primary", $level: 0) {
$color: theme-color($color-name);
$color-base: if($level > 0, $black, $white);
$level: abs($level);
@return mix($color-base, $color, $level * $theme-color-interval);
}
// Return valid calc
@function add($value1, $value2, $return-calc: true) {
@if $value1 == null {
@return $value2;
}
@if $value2 == null {
@return $value1;
}
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
@return $value1 + $value2;
}
@return if($return-calc == true, calc(#{$value1} + #{$value2}), $value1 + unquote(" + ") + $value2);
}
@function subtract($value1, $value2, $return-calc: true) {
@if $value1 == null and $value2 == null {
@return null;
}
@if $value1 == null {
@return -$value2;
}
@if $value2 == null {
@return $value1;
}
@if type-of($value1) == number and type-of($value2) == number and comparable($value1, $value2) {
@return $value1 - $value2;
}
@return if($return-calc == true, calc(#{$value1} - #{$value2}), $value1 + unquote(" - ") + $value2);
}

View File

@ -1,69 +0,0 @@
// Container widths
//
// Set the container width, and override it for fixed navbars in media queries.
@if $enable-grid-classes {
// Single container class with breakpoint max-widths
.container {
@include make-container();
@include make-container-max-widths();
}
// 100% wide container at all breakpoints
.container-fluid {
@include make-container();
}
// Responsive containers that are 100% wide until a breakpoint
@each $breakpoint, $container-max-width in $container-max-widths {
.container-#{$breakpoint} {
@extend .container-fluid;
}
@include media-breakpoint-up($breakpoint, $grid-breakpoints) {
%responsive-container-#{$breakpoint} {
max-width: $container-max-width;
}
@each $name, $width in $grid-breakpoints {
@if ($container-max-width > $width or $breakpoint == $name) {
.container#{breakpoint-infix($name, $grid-breakpoints)} {
@extend %responsive-container-#{$breakpoint};
}
}
}
}
}
}
// Row
//
// Rows contain your columns.
@if $enable-grid-classes {
.row {
@include make-row();
}
// Remove the negative margin from default .row, then the horizontal padding
// from all immediate children columns (to prevent runaway style inheritance).
.no-gutters {
margin-right: 0;
margin-left: 0;
> .col,
> [class*="col-"] {
padding-right: 0;
padding-left: 0;
}
}
}
// Columns
//
// Common styles for small and large grid columns
@if $enable-grid-classes {
@include make-grid-columns();
}

View File

@ -1,42 +0,0 @@
// Responsive images (ensure images don't scale beyond their parents)
//
// This is purposefully opt-in via an explicit class rather than being the default for all `<img>`s.
// We previously tried the "images are responsive by default" approach in Bootstrap v2,
// and abandoned it in Bootstrap v3 because it breaks lots of third-party widgets (including Google Maps)
// which weren't expecting the images within themselves to be involuntarily resized.
// See also https://github.com/twbs/bootstrap/issues/18178
.img-fluid {
@include img-fluid();
}
// Image thumbnails
.img-thumbnail {
padding: $thumbnail-padding;
background-color: $thumbnail-bg;
border: $thumbnail-border-width solid $thumbnail-border-color;
@include border-radius($thumbnail-border-radius);
@include box-shadow($thumbnail-box-shadow);
// Keep them at most 100% wide
@include img-fluid();
}
//
// Figures
//
.figure {
// Ensures the caption's text aligns with the image.
display: inline-block;
}
.figure-img {
margin-bottom: $spacer / 2;
line-height: 1;
}
.figure-caption {
@include font-size($figure-caption-font-size);
color: $figure-caption-color;
}

View File

@ -1,191 +0,0 @@
// stylelint-disable selector-no-qualifying-type
//
// Base styles
//
.input-group {
position: relative;
display: flex;
flex-wrap: wrap; // For form validation feedback
align-items: stretch;
width: 100%;
> .form-control,
> .form-control-plaintext,
> .custom-select,
> .custom-file {
position: relative; // For focus state's z-index
flex: 1 1 0%;
min-width: 0; // https://stackoverflow.com/questions/36247140/why-dont-flex-items-shrink-past-content-size
margin-bottom: 0;
+ .form-control,
+ .custom-select,
+ .custom-file {
margin-left: -$input-border-width;
}
}
// Bring the "active" form control to the top of surrounding elements
> .form-control:focus,
> .custom-select:focus,
> .custom-file .custom-file-input:focus ~ .custom-file-label {
z-index: 3;
}
// Bring the custom file input above the label
> .custom-file .custom-file-input:focus {
z-index: 4;
}
> .form-control,
> .custom-select {
&:not(:last-child) { @include border-right-radius(0); }
&:not(:first-child) { @include border-left-radius(0); }
}
// Custom file inputs have more complex markup, thus requiring different
// border-radius overrides.
> .custom-file {
display: flex;
align-items: center;
&:not(:last-child) .custom-file-label,
&:not(:last-child) .custom-file-label::after { @include border-right-radius(0); }
&:not(:first-child) .custom-file-label { @include border-left-radius(0); }
}
}
// Prepend and append
//
// While it requires one extra layer of HTML for each, dedicated prepend and
// append elements allow us to 1) be less clever, 2) simplify our selectors, and
// 3) support HTML5 form validation.
.input-group-prepend,
.input-group-append {
display: flex;
// Ensure buttons are always above inputs for more visually pleasing borders.
// This isn't needed for `.input-group-text` since it shares the same border-color
// as our inputs.
.btn {
position: relative;
z-index: 2;
&:focus {
z-index: 3;
}
}
.btn + .btn,
.btn + .input-group-text,
.input-group-text + .input-group-text,
.input-group-text + .btn {
margin-left: -$input-border-width;
}
}
.input-group-prepend { margin-right: -$input-border-width; }
.input-group-append { margin-left: -$input-border-width; }
// Textual addons
//
// Serves as a catch-all element for any text or radio/checkbox input you wish
// to prepend or append to an input.
.input-group-text {
display: flex;
align-items: center;
padding: $input-padding-y $input-padding-x;
margin-bottom: 0; // Allow use of <label> elements by overriding our default margin-bottom
@include font-size($input-font-size); // Match inputs
font-weight: $font-weight-normal;
line-height: $input-line-height;
color: $input-group-addon-color;
text-align: center;
white-space: nowrap;
background-color: $input-group-addon-bg;
border: $input-border-width solid $input-group-addon-border-color;
@include border-radius($input-border-radius);
// Nuke default margins from checkboxes and radios to vertically center within.
input[type="radio"],
input[type="checkbox"] {
margin-top: 0;
}
}
// Sizing
//
// Remix the default form control sizing classes into new ones for easier
// manipulation.
.input-group-lg > .form-control:not(textarea),
.input-group-lg > .custom-select {
height: $input-height-lg;
}
.input-group-lg > .form-control,
.input-group-lg > .custom-select,
.input-group-lg > .input-group-prepend > .input-group-text,
.input-group-lg > .input-group-append > .input-group-text,
.input-group-lg > .input-group-prepend > .btn,
.input-group-lg > .input-group-append > .btn {
padding: $input-padding-y-lg $input-padding-x-lg;
@include font-size($input-font-size-lg);
line-height: $input-line-height-lg;
@include border-radius($input-border-radius-lg);
}
.input-group-sm > .form-control:not(textarea),
.input-group-sm > .custom-select {
height: $input-height-sm;
}
.input-group-sm > .form-control,
.input-group-sm > .custom-select,
.input-group-sm > .input-group-prepend > .input-group-text,
.input-group-sm > .input-group-append > .input-group-text,
.input-group-sm > .input-group-prepend > .btn,
.input-group-sm > .input-group-append > .btn {
padding: $input-padding-y-sm $input-padding-x-sm;
@include font-size($input-font-size-sm);
line-height: $input-line-height-sm;
@include border-radius($input-border-radius-sm);
}
.input-group-lg > .custom-select,
.input-group-sm > .custom-select {
padding-right: $custom-select-padding-x + $custom-select-indicator-padding;
}
// Prepend and append rounded corners
//
// These rulesets must come after the sizing ones to properly override sm and lg
// border-radius values when extending. They're more specific than we'd like
// with the `.input-group >` part, but without it, we cannot override the sizing.
.input-group > .input-group-prepend > .btn,
.input-group > .input-group-prepend > .input-group-text,
.input-group > .input-group-append:not(:last-child) > .btn,
.input-group > .input-group-append:not(:last-child) > .input-group-text,
.input-group > .input-group-append:last-child > .btn:not(:last-child):not(.dropdown-toggle),
.input-group > .input-group-append:last-child > .input-group-text:not(:last-child) {
@include border-right-radius(0);
}
.input-group > .input-group-append > .btn,
.input-group > .input-group-append > .input-group-text,
.input-group > .input-group-prepend:not(:first-child) > .btn,
.input-group > .input-group-prepend:not(:first-child) > .input-group-text,
.input-group > .input-group-prepend:first-child > .btn:not(:first-child),
.input-group > .input-group-prepend:first-child > .input-group-text:not(:first-child) {
@include border-left-radius(0);
}

View File

@ -1,17 +0,0 @@
.jumbotron {
padding: $jumbotron-padding ($jumbotron-padding / 2);
margin-bottom: $jumbotron-padding;
color: $jumbotron-color;
background-color: $jumbotron-bg;
@include border-radius($border-radius-lg);
@include media-breakpoint-up(sm) {
padding: ($jumbotron-padding * 2) $jumbotron-padding;
}
}
.jumbotron-fluid {
padding-right: 0;
padding-left: 0;
@include border-radius(0);
}

View File

@ -1,158 +0,0 @@
// Base class
//
// Easily usable on <ul>, <ol>, or <div>.
.list-group {
display: flex;
flex-direction: column;
// No need to set list-style: none; since .list-group-item is block level
padding-left: 0; // reset padding because ul and ol
margin-bottom: 0;
}
// Interactive list items
//
// Use anchor or button elements instead of `li`s or `div`s to create interactive
// list items. Includes an extra `.active` modifier class for selected items.
.list-group-item-action {
width: 100%; // For `<button>`s (anchors become 100% by default though)
color: $list-group-action-color;
text-align: inherit; // For `<button>`s (anchors inherit)
// Hover state
@include hover-focus() {
z-index: 1; // Place hover/focus items above their siblings for proper border styling
color: $list-group-action-hover-color;
text-decoration: none;
background-color: $list-group-hover-bg;
}
&:active {
color: $list-group-action-active-color;
background-color: $list-group-action-active-bg;
}
}
// Individual list items
//
// Use on `li`s or `div`s within the `.list-group` parent.
.list-group-item {
position: relative;
display: block;
padding: $list-group-item-padding-y $list-group-item-padding-x;
color: $list-group-color;
background-color: $list-group-bg;
border: $list-group-border-width solid $list-group-border-color;
&:first-child {
@include border-top-radius($list-group-border-radius);
}
&:last-child {
@include border-bottom-radius($list-group-border-radius);
}
&.disabled,
&:disabled {
color: $list-group-disabled-color;
pointer-events: none;
background-color: $list-group-disabled-bg;
}
// Include both here for `<a>`s and `<button>`s
&.active {
z-index: 2; // Place active items above their siblings for proper border styling
color: $list-group-active-color;
background-color: $list-group-active-bg;
border-color: $list-group-active-border-color;
}
& + & {
border-top-width: 0;
&.active {
margin-top: -$list-group-border-width;
border-top-width: $list-group-border-width;
}
}
}
// Horizontal
//
// Change the layout of list group items from vertical (default) to horizontal.
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
.list-group-horizontal#{$infix} {
flex-direction: row;
.list-group-item {
&:first-child {
@include border-bottom-left-radius($list-group-border-radius);
@include border-top-right-radius(0);
}
&:last-child {
@include border-top-right-radius($list-group-border-radius);
@include border-bottom-left-radius(0);
}
&.active {
margin-top: 0;
}
& + .list-group-item {
border-top-width: $list-group-border-width;
border-left-width: 0;
&.active {
margin-left: -$list-group-border-width;
border-left-width: $list-group-border-width;
}
}
}
}
}
}
// Flush list items
//
// Remove borders and border-radius to keep list group items edge-to-edge. Most
// useful within other components (e.g., cards).
.list-group-flush {
.list-group-item {
border-right-width: 0;
border-left-width: 0;
@include border-radius(0);
&:first-child {
border-top-width: 0;
}
}
&:last-child {
.list-group-item:last-child {
border-bottom-width: 0;
}
}
}
// Contextual variants
//
// Add modifier classes to change text and background color on individual items.
// Organizationally, this must come after the `:hover` states.
@each $color, $value in $theme-colors {
@include list-group-item-variant($color, theme-color-level($color, -9), theme-color-level($color, 6));
}

View File

@ -1,8 +0,0 @@
.media {
display: flex;
align-items: flex-start;
}
.media-body {
flex: 1;
}

View File

@ -1,47 +0,0 @@
// Toggles
//
// Used in conjunction with global variables to enable certain theme features.
// Vendor
@import "vendor/rfs";
// Deprecate
@import "mixins/deprecate";
// Utilities
@import "mixins/breakpoints";
@import "mixins/hover";
@import "mixins/image";
@import "mixins/badge";
@import "mixins/resize";
@import "mixins/screen-reader";
@import "mixins/size";
@import "mixins/reset-text";
@import "mixins/text-emphasis";
@import "mixins/text-hide";
@import "mixins/text-truncate";
@import "mixins/visibility";
// Components
@import "mixins/alert";
@import "mixins/buttons";
@import "mixins/caret";
@import "mixins/pagination";
@import "mixins/lists";
@import "mixins/list-group";
@import "mixins/nav-divider";
@import "mixins/forms";
@import "mixins/table-row";
// Skins
@import "mixins/background-variant";
@import "mixins/border-radius";
@import "mixins/box-shadow";
@import "mixins/gradients";
@import "mixins/transition";
// Layout
@import "mixins/clearfix";
@import "mixins/grid-framework";
@import "mixins/grid";
@import "mixins/float";

Some files were not shown because too many files have changed in this diff Show More