Access denied! You tried to view a page you're not authorized to view.
diff --git a/Samples/Mvc/Sample.Mvc/Views/Account/ChangeRoles.cshtml b/Samples/Mvc/Sample.Mvc/Views/Account/ChangeRoles.cshtml new file mode 100644 index 0000000..a9fcf57 --- /dev/null +++ b/Samples/Mvc/Sample.Mvc/Views/Account/ChangeRoles.cshtml @@ -0,0 +1,22 @@ +@{ + ViewData["Title"] = "Register"; +} + +For testing purposes, you can change your role(s) here to see authorization in action.
+ + + diff --git a/Samples/Mvc/Sample.Mvc/Views/Account/Register.cshtml b/Samples/Mvc/Sample.Mvc/Views/Account/Register.cshtml new file mode 100644 index 0000000..b6efdad --- /dev/null +++ b/Samples/Mvc/Sample.Mvc/Views/Account/Register.cshtml @@ -0,0 +1,21 @@ +@{ + ViewData["Title"] = "Register"; +} + +(Already registered? Please Sign in.)
+ + + diff --git a/Samples/Mvc/Sample.Mvc/Views/Account/RegisterFailure.cshtml b/Samples/Mvc/Sample.Mvc/Views/Account/RegisterFailure.cshtml new file mode 100644 index 0000000..d6796e7 --- /dev/null +++ b/Samples/Mvc/Sample.Mvc/Views/Account/RegisterFailure.cshtml @@ -0,0 +1,13 @@ + +@{ + ViewData["Title"] = "RegisterFailure"; +} + ++ Error details: @ViewBag.FailureReason +
++ Try again? Register or sign in. +
+ diff --git a/Samples/Mvc/Sample.Mvc/Views/Account/SignIn.cshtml b/Samples/Mvc/Sample.Mvc/Views/Account/SignIn.cshtml new file mode 100644 index 0000000..b044a93 --- /dev/null +++ b/Samples/Mvc/Sample.Mvc/Views/Account/SignIn.cshtml @@ -0,0 +1,18 @@ +@{ + ViewData["Title"] = "Sign in"; +} + ++ Error details: @ViewBag.FailureReason +
++ Try again? Sign in or register. +
+ diff --git a/Samples/Mvc/Sample.Mvc/Views/Home/AdminOnly.cshtml b/Samples/Mvc/Sample.Mvc/Views/Home/AdminOnly.cshtml new file mode 100644 index 0000000..1f114ed --- /dev/null +++ b/Samples/Mvc/Sample.Mvc/Views/Home/AdminOnly.cshtml @@ -0,0 +1,6 @@ +@{ + ViewData["Title"] = "Home Page"; +} + +If you can read this, you're an admin
diff --git a/Samples/Mvc/Sample.Mvc/Views/Home/Index.cshtml b/Samples/Mvc/Sample.Mvc/Views/Home/Index.cshtml new file mode 100644 index 0000000..0938c70 --- /dev/null +++ b/Samples/Mvc/Sample.Mvc/Views/Home/Index.cshtml @@ -0,0 +1,24 @@ +@{ + ViewData["Title"] = "Home Page"; +} + ++ Hi, @User.Identity.Name. You're currently signed in, and your role is @ViewBag.UserRoles. 😎 +
++ From here, you can change your role, view an admin-only page, or sign out. +
++ Your user is saved in Raven. View it. +
+ } + else + { + + } +Use this page to detail your site's privacy policy.
diff --git a/Samples/Mvc/Sample.Mvc/Views/Shared/Error.cshtml b/Samples/Mvc/Sample.Mvc/Views/Shared/Error.cshtml new file mode 100644 index 0000000..a1e0478 --- /dev/null +++ b/Samples/Mvc/Sample.Mvc/Views/Shared/Error.cshtml @@ -0,0 +1,25 @@ +@model ErrorViewModel +@{ + ViewData["Title"] = "Error"; +} + +
+ Request ID: @Model.RequestId
+
+ Swapping to Development environment will display more detailed information about the error that occurred. +
++ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +
diff --git a/Samples/Mvc/Sample.Mvc/Views/Shared/_CookieConsentPartial.cshtml b/Samples/Mvc/Sample.Mvc/Views/Shared/_CookieConsentPartial.cshtml new file mode 100644 index 0000000..a535ea4 --- /dev/null +++ b/Samples/Mvc/Sample.Mvc/Views/Shared/_CookieConsentPartial.cshtml @@ -0,0 +1,25 @@ +@using Microsoft.AspNetCore.Http.Features + +@{ + var consentFeature = Context.Features.GetHi, @User.Identity.Name. You're currently signed in. 😎
- Your user is saved in Raven. View it. + Your user is saved in Raven. View it.
} else diff --git a/Sample/Pages/Index.cshtml.cs b/Samples/RazorPages/Pages/Index.cshtml.cs similarity index 100% rename from Sample/Pages/Index.cshtml.cs rename to Samples/RazorPages/Pages/Index.cshtml.cs diff --git a/Sample/Pages/Privacy.cshtml b/Samples/RazorPages/Pages/Privacy.cshtml similarity index 100% rename from Sample/Pages/Privacy.cshtml rename to Samples/RazorPages/Pages/Privacy.cshtml diff --git a/Sample/Pages/Privacy.cshtml.cs b/Samples/RazorPages/Pages/Privacy.cshtml.cs similarity index 100% rename from Sample/Pages/Privacy.cshtml.cs rename to Samples/RazorPages/Pages/Privacy.cshtml.cs diff --git a/Sample/Pages/Shared/_CookieConsentPartial.cshtml b/Samples/RazorPages/Pages/Shared/_CookieConsentPartial.cshtml similarity index 100% rename from Sample/Pages/Shared/_CookieConsentPartial.cshtml rename to Samples/RazorPages/Pages/Shared/_CookieConsentPartial.cshtml diff --git a/Sample/Pages/Shared/_Layout.cshtml b/Samples/RazorPages/Pages/Shared/_Layout.cshtml similarity index 100% rename from Sample/Pages/Shared/_Layout.cshtml rename to Samples/RazorPages/Pages/Shared/_Layout.cshtml diff --git a/Sample/Pages/Shared/_LoginPartial.cshtml b/Samples/RazorPages/Pages/Shared/_LoginPartial.cshtml similarity index 100% rename from Sample/Pages/Shared/_LoginPartial.cshtml rename to Samples/RazorPages/Pages/Shared/_LoginPartial.cshtml diff --git a/Sample/Pages/Shared/_ValidationScriptsPartial.cshtml b/Samples/RazorPages/Pages/Shared/_ValidationScriptsPartial.cshtml similarity index 100% rename from Sample/Pages/Shared/_ValidationScriptsPartial.cshtml rename to Samples/RazorPages/Pages/Shared/_ValidationScriptsPartial.cshtml diff --git a/Sample/Pages/_ViewImports.cshtml b/Samples/RazorPages/Pages/_ViewImports.cshtml similarity index 100% rename from Sample/Pages/_ViewImports.cshtml rename to Samples/RazorPages/Pages/_ViewImports.cshtml diff --git a/Samples/RazorPages/Pages/_ViewStart.cshtml b/Samples/RazorPages/Pages/_ViewStart.cshtml new file mode 100644 index 0000000..a5f1004 --- /dev/null +++ b/Samples/RazorPages/Pages/_ViewStart.cshtml @@ -0,0 +1,3 @@ +@{ + Layout = "_Layout"; +} diff --git a/Sample/Program.cs b/Samples/RazorPages/Program.cs similarity index 100% rename from Sample/Program.cs rename to Samples/RazorPages/Program.cs diff --git a/Sample/Readme.md b/Samples/RazorPages/Readme.md similarity index 76% rename from Sample/Readme.md rename to Samples/RazorPages/Readme.md index 062e1d0..970af42 100644 --- a/Sample/Readme.md +++ b/Samples/RazorPages/Readme.md @@ -3,23 +3,23 @@ This is a Razor Pages sample that shows how to use Raven.Identity. There are four areas of interest: - 1. [appsettings.json](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Sample/appsettings.json) - where we configure our connection to Raven. - 2. [AppUser.cs](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Sample/Models/AppUser.cs) - our user class containing any user data like FirstName and LastName. - 3. [RavenSaveChangesAsyncFilter.cs](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Sample/Filters/RavenSaveChangesAsyncFilter.cs) - where we save changes to Raven after actions finish executing. This makes sense for a Razor Pages project. For an MVC or Web API project, use a RavenController base class instead. - 4. [Startup.cs](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Sample/Startup.cs) - where we wire up everything. + 1. [appsettings.json](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Samples/RazorPages/appsettings.json) - where we configure our connection to Raven. + 2. [AppUser.cs](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Samples/RazorPages/Models/AppUser.cs) - our user class containing any user data like FirstName and LastName. + 3. [RavenSaveChangesAsyncFilter.cs](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Samples/RazorPages/Filters/RavenSaveChangesAsyncFilter.cs) - where we save changes to Raven after actions finish executing. This makes sense for a Razor Pages project. For an MVC or Web API project, use a RavenController base class instead. + 4. [Startup.cs](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Samples/RazorPages/Startup.cs) - where we wire up everything. More details below. ## 1. appsettings.json - connection to Raven -Our [appsettings.json file](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Sample/appsettings.json) defines our connection to Raven. This is done using the [RavenDB.DependencyInjection](https://github.com/JudahGabriel/RavenDB.DependencyInjection/) package. +Our [appsettings.json file](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Samples/RazorPages/appsettings.json) defines our connection to Raven. This is done using the [RavenDB.DependencyInjection](https://github.com/JudahGabriel/RavenDB.DependencyInjection/) package. ```json "RavenSettings": { "Urls": [ "http://live-test.ravendb.net" ], - "DatabaseName": "Raven.Identity.Sample", + "DatabaseName": "Raven.Identity.Sample.RazorPages", "CertFilePath": "", "CertPassword": "" }, @@ -27,7 +27,7 @@ Our [appsettings.json file](https://github.com/JudahGabriel/RavenDB.Identity/blo ## 2. AppUser.cs - user class -We create our own [AppUser class](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Sample/Models/AppUser.cs) to hold user data: +We create our own [AppUser class](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Samples/RazorPages/Models/AppUser.cs) to hold user data: ```csharp public class AppUser : Raven.Identity.IdentityUser @@ -45,7 +45,7 @@ While this step isn't strictly necessary -- it's possible to skip AppUser and ju We need to `.SaveChangesAsync()` for anything to persist in Raven. Where should we do this? -While we could call `.SaveChangesAsync()` in the code-behind of every Razor page, that is tedious and error prone. Instead, we create a Razor action filter to save changes, [RaveSaveChangesAsyncFilter.cs](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Sample/Filters/RavenSaveChangesAsyncFilter.cs): +While we could call `.SaveChangesAsync()` in the code-behind of every Razor page, that is tedious and error prone. Instead, we create a Razor action filter to save changes, [RaveSaveChangesAsyncFilter.cs](https://github.com/JudahGabriel/RavenDB.Identity/blob/master/Samples/RazorPages/Filters/RavenSaveChangesAsyncFilter.cs): ```csharp ///`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\n// stylelint-disable font-weight-notation\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n// stylelint-enable font-weight-notation\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so\n // we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\n// stylelint-disable font-weight-notation\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n// stylelint-enable font-weight-notation\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so\n // we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `
`s get reset. However, we also reset the\n// bottom margin to use `rem` units instead of `em`.\np {\n margin-top: 0;\n margin-bottom: $paragraph-margin-bottom;\n}\n\n// Abbreviations\n//\n// 1. Remove the bottom border in Firefox 39-.\n// 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n// 3. Add explicit cursor to indicate changed behavior.\n// 4. Duplicate behavior to the data-* attribute for our tooltip plugin\n\nabbr[title],\nabbr[data-original-title] { // 4\n text-decoration: underline; // 2\n text-decoration: underline dotted; // 2\n cursor: help; // 3\n border-bottom: 0; // 1\n}\n\naddress {\n margin-bottom: 1rem;\n font-style: normal;\n line-height: inherit;\n}\n\nol,\nul,\ndl {\n margin-top: 0;\n margin-bottom: 1rem;\n}\n\nol ol,\nul ul,\nol ul,\nul ol {\n margin-bottom: 0;\n}\n\ndt {\n font-weight: $dt-font-weight;\n}\n\ndd {\n margin-bottom: .5rem;\n margin-left: 0; // Undo browser default\n}\n\nblockquote {\n margin: 0 0 1rem;\n}\n\ndfn {\n font-style: italic; // Add the correct font style in Android 4.3-\n}\n\n// stylelint-disable font-weight-notation\nb,\nstrong {\n font-weight: bolder; // Add the correct font weight in Chrome, Edge, and Safari\n}\n// stylelint-enable font-weight-notation\n\nsmall {\n font-size: 80%; // Add the correct font size in all browsers\n}\n\n//\n// Prevent `sub` and `sup` elements from affecting the line height in\n// all browsers.\n//\n\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\n\nsub { bottom: -.25em; }\nsup { top: -.5em; }\n\n\n//\n// Links\n//\n\na {\n color: $link-color;\n text-decoration: $link-decoration;\n background-color: transparent; // Remove the gray background on active links in IE 10.\n -webkit-text-decoration-skip: objects; // Remove gaps in links underline in iOS 8+ and Safari 8+.\n\n @include hover {\n color: $link-hover-color;\n text-decoration: $link-hover-decoration;\n }\n}\n\n// And undo these styles for placeholder links/named anchors (without href)\n// which have not been made explicitly keyboard-focusable (without tabindex).\n// It would be more straightforward to just use a[href] in previous block, but that\n// causes specificity issues in many other styles that are too complex to fix.\n// See https://github.com/twbs/bootstrap/issues/19402\n\na:not([href]):not([tabindex]) {\n color: inherit;\n text-decoration: none;\n\n @include hover-focus {\n color: inherit;\n text-decoration: none;\n }\n\n &:focus {\n outline: 0;\n }\n}\n\n\n//\n// Code\n//\n\npre,\ncode,\nkbd,\nsamp {\n font-family: $font-family-monospace;\n font-size: 1em; // Correct the odd `em` font sizing in all browsers.\n}\n\npre {\n // Remove browser default top margin\n margin-top: 0;\n // Reset browser default of `1em` to use `rem`s\n margin-bottom: 1rem;\n // Don't allow content to break outside\n overflow: auto;\n // We have @viewport set which causes scrollbars to overlap content in IE11 and Edge, so\n // we force a non-overlapping, non-auto-hiding scrollbar to counteract.\n -ms-overflow-style: scrollbar;\n}\n\n\n//\n// Figures\n//\n\nfigure {\n // Apply a consistent margin strategy (matches our type styles).\n margin: 0 0 1rem;\n}\n\n\n//\n// Images and content\n//\n\nimg {\n vertical-align: middle;\n border-style: none; // Remove the border on images inside links in IE 10-.\n}\n\nsvg {\n // Workaround for the SVG overflow bug in IE10/11 is still required.\n // See https://github.com/twbs/bootstrap/issues/26878\n overflow: hidden;\n vertical-align: middle;\n}\n\n\n//\n// Tables\n//\n\ntable {\n border-collapse: collapse; // Prevent double borders\n}\n\ncaption {\n padding-top: $table-cell-padding;\n padding-bottom: $table-cell-padding;\n color: $table-caption-color;\n text-align: left;\n caption-side: bottom;\n}\n\nth {\n // Matches default `