-
warning
-
+
This field is required.
@@ -137,12 +137,12 @@ exports[`checks for invalid email 1`] = `
-
warning
-
+
Please enter a valid email address.
@@ -176,12 +176,12 @@ exports[`checks for invalid email 1`] = `
-
warning
-
+
Emails do not match. Try again.
@@ -363,12 +363,12 @@ exports[`shows error when submitting empty form 1`] = `
-
warning
-
+
This field is required.
@@ -402,12 +402,12 @@ exports[`shows error when submitting empty form 1`] = `
-
warning
-
+
This field is required.
diff --git a/src/core/client/admin/test/auth/__snapshots__/createPassword.spec.tsx.snap b/src/core/client/admin/test/auth/__snapshots__/createPassword.spec.tsx.snap
index aec57f3a7..2db89ea4e 100644
--- a/src/core/client/admin/test/auth/__snapshots__/createPassword.spec.tsx.snap
+++ b/src/core/client/admin/test/auth/__snapshots__/createPassword.spec.tsx.snap
@@ -57,24 +57,24 @@ we require users to create a password.
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
Password must contain at least 8 characters.
@@ -184,12 +184,12 @@ we require users to create a password.
tabIndex={0}
title="Show password"
>
-
visibility
-
+
@@ -274,24 +274,24 @@ we require users to create a password.
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
This field is required.
@@ -386,12 +386,12 @@ GraphQL request (4:3)
tabIndex={0}
title="Show password"
>
-
visibility
-
+
@@ -471,12 +471,12 @@ we require users to create a password.
tabIndex={0}
title="Show password"
>
-
visibility
-
+
diff --git a/src/core/client/admin/test/auth/__snapshots__/createUsername.spec.tsx.snap b/src/core/client/admin/test/auth/__snapshots__/createUsername.spec.tsx.snap
index 3e8ddb374..b9be99a4b 100644
--- a/src/core/client/admin/test/auth/__snapshots__/createUsername.spec.tsx.snap
+++ b/src/core/client/admin/test/auth/__snapshots__/createUsername.spec.tsx.snap
@@ -46,12 +46,12 @@ exports[`checks for invalid username 1`] = `
-
warning
-
+
Username must contain at least 3 characters.
@@ -217,12 +217,12 @@ exports[`shows error when submitting empty form 1`] = `
-
warning
-
+
This field is required.
diff --git a/src/core/client/admin/test/auth/__snapshots__/restricted.spec.tsx.snap b/src/core/client/admin/test/auth/__snapshots__/restricted.spec.tsx.snap
index 7e2486afa..a7d656e88 100644
--- a/src/core/client/admin/test/auth/__snapshots__/restricted.spec.tsx.snap
+++ b/src/core/client/admin/test/auth/__snapshots__/restricted.spec.tsx.snap
@@ -81,12 +81,12 @@ exports[`show restricted screen for commenters and staff 1`] = `
-
lock
-
+
-
lock
-
+
-
warning
-
+
This field is required.
@@ -85,12 +85,12 @@ exports[`accepts correct password 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
visibility
-
+
@@ -544,12 +544,12 @@ For more information visit:
target="_blank"
>
https://developers.facebook.com/docs/facebook-login/web
-
open_in_new
-
+
.
@@ -664,12 +664,12 @@ For more information visit:
tabIndex={0}
title="Hide Client Secret"
>
-
visibility
-
+
@@ -853,12 +853,12 @@ exports[`change settings: enable oidc configure box 1`] = `
target="_blank"
>
https://openid.net/connect/
-
open_in_new
-
+
-
visibility
-
+
@@ -1333,12 +1333,12 @@ exports[`change settings: oidc validation errors 1`] = `
target="_blank"
>
https://openid.net/connect/
-
open_in_new
-
+
-
warning
-
+
This field is required.
@@ -1465,12 +1465,12 @@ needs to be displayed, e.g. “Log in with <Facebook>”.
-
warning
-
+
This field is required.
@@ -1512,24 +1512,24 @@ needs to be displayed, e.g. “Log in with <Facebook>”.
tabIndex={0}
title="Hide Client Secret"
>
-
visibility
-
+
-
warning
-
+
This field is required.
@@ -1591,12 +1591,12 @@ the remaining fields. You may also enter the information manually.
-
warning
-
+
This field is required.
@@ -1632,12 +1632,12 @@ the remaining fields. You may also enter the information manually.
-
warning
-
+
This field is required.
@@ -1673,12 +1673,12 @@ the remaining fields. You may also enter the information manually.
-
warning
-
+
This field is required.
@@ -1714,12 +1714,12 @@ the remaining fields. You may also enter the information manually.
-
warning
-
+
This field is required.
@@ -1893,12 +1893,12 @@ exports[`regenerate sso key 1`] = `
tabIndex={0}
title="Hide SSO Key"
>
-
visibility
-
+
@@ -2556,12 +2556,12 @@ integration to register for a new account.
target="_blank"
>
https://openid.net/connect/
-
open_in_new
-
+
-
visibility
-
+
@@ -3058,12 +3058,12 @@ integration to register for a new account.
tabIndex={0}
title="Hide SSO Key"
>
-
visibility
-
+
@@ -3093,12 +3093,12 @@ integration to register for a new account.
KEY GENERATED AT:
Invalid Date
-
warning
-
+
@@ -3284,12 +3284,12 @@ to create and set up a web application. For more information visit:
target="_blank"
>
https://developers.google.com/identity/protocols/OAuth2WebServer#creatingcred
-
open_in_new
-
+
.
@@ -3404,12 +3404,12 @@ to create and set up a web application. For more information visit:
tabIndex={0}
title="Hide Client Secret"
>
-
visibility
-
+
@@ -3592,12 +3592,12 @@ For more information visit:
target="_blank"
>
https://developers.facebook.com/docs/facebook-login/web
-
open_in_new
-
+
.
@@ -3712,12 +3712,12 @@ For more information visit:
tabIndex={0}
title="Hide Client Secret"
>
-
visibility
-
+
diff --git a/src/core/client/admin/test/configure/__snapshots__/general.spec.tsx.snap b/src/core/client/admin/test/configure/__snapshots__/general.spec.tsx.snap
index e8caeadb1..044c20724 100644
--- a/src/core/client/admin/test/configure/__snapshots__/general.spec.tsx.snap
+++ b/src/core/client/admin/test/configure/__snapshots__/general.spec.tsx.snap
@@ -556,12 +556,12 @@ moderation panel.
aria-hidden={true}
className="SelectField-afterWrapper"
>
-
expand_more
-
+
@@ -701,12 +701,12 @@ moderation panel.
aria-hidden={true}
className="SelectField-afterWrapper"
>
-
expand_more
-
+
@@ -942,12 +942,12 @@ based on the needs of your community.
aria-hidden={true}
className="SelectField-afterWrapper"
>
-
expand_more
-
+
diff --git a/src/core/client/admin/test/configure/__snapshots__/moderation.spec.tsx.snap b/src/core/client/admin/test/configure/__snapshots__/moderation.spec.tsx.snap
index 61691baba..26e0ceab0 100644
--- a/src/core/client/admin/test/configure/__snapshots__/moderation.spec.tsx.snap
+++ b/src/core/client/admin/test/configure/__snapshots__/moderation.spec.tsx.snap
@@ -712,12 +712,12 @@ improve the API over time.
tabIndex={0}
title="Hide API Key"
>
-
visibility
-
+
@@ -903,12 +903,12 @@ in your Akismet account:
tabIndex={0}
title="Hide API Key"
>
-
visibility
-
+
diff --git a/src/core/client/admin/test/decisionHistory/__snapshots__/decisionHistory.spec.tsx.snap b/src/core/client/admin/test/decisionHistory/__snapshots__/decisionHistory.spec.tsx.snap
index 432b97930..dcbc0f30b 100644
--- a/src/core/client/admin/test/decisionHistory/__snapshots__/decisionHistory.spec.tsx.snap
+++ b/src/core/client/admin/test/decisionHistory/__snapshots__/decisionHistory.spec.tsx.snap
@@ -7,12 +7,12 @@ exports[`loads more 1`] = `
-
history
-
+
@@ -37,12 +37,12 @@ exports[`loads more 1`] = `
-
check
-
+
-
chevron_right
-
+
@@ -101,12 +101,12 @@ exports[`loads more 1`] = `
-
cancel
-
+
-
chevron_right
-
+
@@ -165,12 +165,12 @@ exports[`loads more 1`] = `
-
check
-
+
-
chevron_right
-
+
@@ -232,12 +232,12 @@ exports[`opens popover when clicked on button showing loading state 1`] = `
@@ -633,12 +633,12 @@ exports[`renders rejected queue with comments 1`] = `
onTouchEnd={[Function]}
type="button"
>
-
close
-
+
@@ -746,12 +746,12 @@ exports[`renders rejected queue with comments and load more 1`] = `
target="_blank"
>
View Context
-
open_in_new
-
+
@@ -826,12 +826,12 @@ exports[`renders rejected queue with comments and load more 1`] = `
>
Details
-
arrow_drop_down
-
+
@@ -864,12 +864,12 @@ exports[`renders rejected queue with comments and load more 1`] = `
onTouchEnd={[Function]}
type="button"
>
-
close
-
+
diff --git a/src/core/client/admin/test/moderate/__snapshots__/searchBar.spec.tsx.snap b/src/core/client/admin/test/moderate/__snapshots__/searchBar.spec.tsx.snap
index 9003dc74b..b4d5744ed 100644
--- a/src/core/client/admin/test/moderate/__snapshots__/searchBar.spec.tsx.snap
+++ b/src/core/client/admin/test/moderate/__snapshots__/searchBar.spec.tsx.snap
@@ -33,12 +33,12 @@ exports[`all stories active search with no results 1`] = `
-
search
-
+
@@ -172,12 +172,12 @@ exports[`all stories active search with too many results 1`] = `
See all results
-
arrow_forward
-
+
`;
@@ -215,12 +215,12 @@ exports[`all stories renders search bar 1`] = `
-
warning
-
+
This field is required.
@@ -188,12 +188,12 @@ Your email address will be used to:
-
done
-
+
-
done
-
+
-
done
-
+
-
warning
-
+
Please enter a valid email address.
@@ -314,12 +314,12 @@ Your email address will be used to:
-
warning
-
+
Emails do not match. Try again.
@@ -386,12 +386,12 @@ Your email address will be used to:
-
done
-
+
-
done
-
+
-
done
-
+
-
done
-
+
-
done
-
+
-
done
-
+
-
warning
-
+
This field is required.
@@ -668,12 +668,12 @@ Your email address will be used to:
-
warning
-
+
This field is required.
@@ -720,12 +720,12 @@ Your email address will be used to:
-
done
-
+
-
done
-
+
-
done
-
+
-
done
-
+
-
done
-
+
-
done
-
+
-
visibility
-
+
-
warning
-
+
Password must contain at least 8 characters.
@@ -175,12 +175,12 @@ we require users to create a password.
tabIndex={0}
title="Show password"
>
-
visibility
-
+
@@ -264,24 +264,24 @@ we require users to create a password.
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
This field is required.
@@ -376,12 +376,12 @@ GraphQL request (4:3)
tabIndex={0}
title="Show password"
>
-
visibility
-
+
@@ -461,12 +461,12 @@ we require users to create a password.
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
This field is required.
@@ -1035,12 +1035,12 @@ exports[`checks for invalid characters in username 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
@@ -1097,12 +1097,12 @@ exports[`checks for invalid email 1`] = `
-
warning
-
+
Please enter a valid email address.
@@ -1141,12 +1141,12 @@ exports[`checks for invalid email 1`] = `
-
warning
-
+
This field is required.
@@ -1195,24 +1195,24 @@ exports[`checks for invalid email 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
This field is required.
@@ -1230,12 +1230,12 @@ exports[`checks for invalid email 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
@@ -1292,12 +1292,12 @@ exports[`checks for too long username 1`] = `
-
warning
-
+
This field is required.
@@ -1336,12 +1336,12 @@ exports[`checks for too long username 1`] = `
-
warning
-
+
Usernames cannot be longer than 30 characters.
@@ -1390,24 +1390,24 @@ exports[`checks for too long username 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
This field is required.
@@ -1425,12 +1425,12 @@ exports[`checks for too long username 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
@@ -1487,12 +1487,12 @@ exports[`checks for too short password 1`] = `
-
warning
-
+
This field is required.
@@ -1531,12 +1531,12 @@ exports[`checks for too short password 1`] = `
-
warning
-
+
This field is required.
@@ -1585,24 +1585,24 @@ exports[`checks for too short password 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
Password must contain at least 8 characters.
@@ -1620,12 +1620,12 @@ exports[`checks for too short password 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
@@ -1682,12 +1682,12 @@ exports[`checks for too short username 1`] = `
-
warning
-
+
This field is required.
@@ -1726,12 +1726,12 @@ exports[`checks for too short username 1`] = `
-
warning
-
+
Username must contain at least 3 characters.
@@ -1780,24 +1780,24 @@ exports[`checks for too short username 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
This field is required.
@@ -1815,12 +1815,12 @@ exports[`checks for too short username 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
@@ -1990,12 +1990,12 @@ exports[`renders sign up form 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
@@ -2012,12 +2012,12 @@ exports[`renders sign up form 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
@@ -2077,12 +2077,12 @@ exports[`shows error when submitting empty form 1`] = `
-
warning
-
+
This field is required.
@@ -2121,12 +2121,12 @@ exports[`shows error when submitting empty form 1`] = `
-
warning
-
+
This field is required.
@@ -2175,24 +2175,24 @@ exports[`shows error when submitting empty form 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
-
warning
-
+
This field is required.
@@ -2210,12 +2210,12 @@ exports[`shows error when submitting empty form 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
@@ -2351,12 +2351,12 @@ exports[`shows server error 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
@@ -2373,12 +2373,12 @@ exports[`shows server error 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
@@ -2507,12 +2507,12 @@ exports[`submits form successfully 1`] = `
tabIndex={0}
title="Show password"
>
-
visibility
-
+
@@ -2529,12 +2529,12 @@ exports[`submits form successfully 1`] = `
onTouchEnd={[Function]}
type="submit"
>
-
email
-
+
Sign up with Email
diff --git a/src/core/client/stream/App/App.tsx b/src/core/client/stream/App/App.tsx
index af6049d3f..b3244277f 100644
--- a/src/core/client/stream/App/App.tsx
+++ b/src/core/client/stream/App/App.tsx
@@ -1,6 +1,9 @@
+import cn from "classnames";
import { HorizontalGutter, TabContent, TabPane } from "coral-ui/components";
import React, { FunctionComponent } from "react";
+import CLASSES from "coral-stream/classes";
+
import Comments from "../tabs/Comments";
import Configure from "../tabs/Configure";
import Profile from "../tabs/Profile";
@@ -16,16 +19,28 @@ export interface AppProps {
const App: FunctionComponent = props => {
return (
-
+
-
+
-
+
-
+
diff --git a/src/core/client/stream/App/__snapshots__/App.spec.tsx.snap b/src/core/client/stream/App/__snapshots__/App.spec.tsx.snap
index fa42a9c69..b8ec81cef 100644
--- a/src/core/client/stream/App/__snapshots__/App.spec.tsx.snap
+++ b/src/core/client/stream/App/__snapshots__/App.spec.tsx.snap
@@ -2,7 +2,7 @@
exports[`renders correctly 1`] = `
diff --git a/src/core/client/stream/classes.ts b/src/core/client/stream/classes.ts
index 1ebef9e79..ca0bd923c 100644
--- a/src/core/client/stream/classes.ts
+++ b/src/core/client/stream/classes.ts
@@ -1,4 +1,9 @@
const CLASSES = {
+ /**
+ * app is the container of the app.
+ */
+ app: "coral coral-stream",
+
/**
* guidlines represents the box containing the guidlines.
*/
@@ -76,7 +81,7 @@ const CLASSES = {
featured: "coral coral-tabBarSecondary-tab coral-tabBarComments-featured",
/**
- * featuredTooltip is the tooltip next to the fextured tab.
+ * featuredTooltip is the tooltip next to the featured tab.
*/
featuredTooltip: "coral coral-tabBarComments-featuredTooltip",
},
@@ -130,6 +135,17 @@ const CLASSES = {
* signIn is the button for submitting a new comment and signing in.
*/
signIn: "coral coral-createComment-signIn",
+
+ /**
+ * inReview is the message notifying the user that the posted comment is
+ * in review.
+ */
+ inReview: "coral coral-createComment-inReview",
+
+ /**
+ * dismissButton is the button to dismiss the in review message.
+ */
+ dismissButton: "coral coral-createComment-dismissButton",
},
/**
@@ -142,6 +158,12 @@ const CLASSES = {
*/
$root: "coral coral-createReplyComment",
+ /**
+ * inReview is the message notifying the user that the posted comment is
+ * in review.
+ */
+ inReview: "coral coral-createReplyComment-inReview",
+
/**
* submit is the button for submitting a new reply.
*/
@@ -156,6 +178,15 @@ const CLASSES = {
* dimiss is the button to dismiss the message after submit.
*/
dismiss: "coral coral-createReplyComment-dismiss",
+
+ /**
+ * replyTo shows the author of the parent comment.
+ */
+ replyTo: {
+ $root: "coral coral-createReplyComment-replyTo",
+ text: "coral coral-createReplyComment-replyToText",
+ username: "coral coral-createReplyComment-replyToUsername",
+ },
},
/**
@@ -167,6 +198,22 @@ const CLASSES = {
*/
$root: "coral coral-editComment",
+ /**
+ * inReview is the message notifying the user that the edited comment is
+ * in review.
+ */
+ inReview: "coral coral-editComment-inReview",
+
+ /**
+ * remainingTime is the message telling the user the remaining time.
+ */
+ remainingTime: "coral coral-editComment-remainingTime",
+
+ /**
+ * expiredTime appears when the comment can no longer be edited.
+ */
+ expiredTime: "coral coral-editComment-expiredTime",
+
/**
* submit is the button for submitting the edit.
*/
@@ -198,36 +245,601 @@ const CLASSES = {
$root: "coral coral-comment",
/**
- * username is the text display for any given Username in the system.
+ * topBar is the uppper bar of the comment.
*/
- username: "coral coral-comment-username",
+ topBar: {
+ /**
+ * $root represents the container of the top bar.
+ */
+ $root: "coral coral-comment-topBar",
+
+ /**
+ * username is the text display for any given Username in the system.
+ */
+ username: "coral coral-username coral-comment-username",
+
+ /**
+ * timestamp is the text that contains the time since the comment was
+ * published.
+ */
+ timestamp: "coral coral-timestamp coral-comment-timestamp",
+
+ /**
+ * edited is the text that indicated that a comment was edited.
+ */
+ edited: "coral coral-comment-edited",
+
+ /**
+ * userTag can be used to target a tag associated with a User.
+ */
+ userTag: "coral coral-userTag coral-comment-userTag",
+
+ /**
+ * userBadge can be used to target a badge associated with a User.
+ */
+ userBadge: "coral coral-userBadge coral-comment-userBadge",
+
+ /**
+ * commentTag can be used to target a tag associated with a Comment.
+ */
+ commentTag: "coral coral-commentTag coral-comment-commentTag",
+
+ /**
+ * caretButton can be used to target the caret that opens the moderation dropdown.
+ */
+ caretButton: "coral coral-comment-caret",
+
+ /**
+ * editButton can be used to target the edit button.
+ */
+ editButton: "coral coral-comment-editButton",
+ },
/**
- * timestamp is the text that contains the time since the comment was
- * published.
+ * content is the html text body of the comment.
*/
- timestamp: "coral coral-comment-timestamp",
+ content: "coral coral-content coral-comment-content",
/**
- * userTag can be used to target a tag associated with a User.
+ * readMoreOfConversation is the link that continues the
+ * thread of the conversation on a deeper level.
*/
- userTag: "coral coral-comment-userTag",
-
- /**
- * userBadge can be used to target a badge associated with a User.
- */
- userBadge: "coral coral-comment-userBadge",
-
- /**
- * commentTag can be used to target a tag associated with a Comment.
- */
- commentTag: "coral coral-comment-commentTag",
+ readMoreOfConversation: "coral coral-comment-readMoreOfConveration",
/**
* inReplyTo shows the author of the parent comment.
*/
- inReplyTo: "coral coral-comment-inReplyTo",
+ inReplyTo: {
+ $root: "coral coral-comment-inReplyTo",
+ text: "coral coral-comment-inReplyToText",
+ username: "coral coral-comment-inReplyToUsername",
+ },
+
+ /**
+ * actionBar is the lower bar of the comment.
+ */
+ actionBar: {
+ /**
+ * $root represents the container of action bar.
+ */
+ $root: "coral coral-comment-actionBar",
+ /**
+ * reactButton is the reaction button.
+ */
+ reactButton: "coral coral-reactButton coral-comment-reactButton",
+ /**
+ * reactedButton is the class added to the reaction button
+ * when the viewer has already reacted to the comment.
+ */
+ reactedButton: "coral-reactedButton coral-comment-reactedButton",
+ /**
+ * replyButton is button that triggers the reply form.
+ */
+ replyButton: "coral coral-comment-replyButton",
+ /**
+ * shareButton is the button that will show the permalink popover.
+ */
+ shareButton: "coral coral-comment-shareButton",
+ /**
+ * reportButton is the button that triggers the report feature.
+ */
+ reportButton: "coral coral-reportButton coral-comment-reportButton",
+ /**
+ * reportedButton is added to report button when the viewer
+ * has already reported the comment.
+ */
+ reportedButton: "coral-reportedButton coral-comment-reportedButton",
+ },
+
+ /**
+ * indentation classes for the different levels.
+ */
+ indent: [
+ "",
+ "coral coral-indent-1",
+ "coral coral-indent-2",
+ "coral coral-indent-3",
+ "coral coral-indent-4",
+ "coral coral-indent-5",
+ "coral coral-indent-6",
+ ],
},
+
+ /**
+ * rejectedTombstone is shown when a comment got rejected.
+ */
+ rejectedTombstone: {
+ $root: "coral coral-rejectedtombstone",
+ goToModerateButton: "coral coral-rejectedtombstone-goToModerateButton",
+ },
+ /**
+ * deletedTombstone is shown when a comment has been deleted.
+ */
+ deletedTombstone: "coral coral-rejectedtombstone",
+
+ /**
+ * ignoredTombstown is shown when a comment got ignored.
+ */
+ ignoredTombstone: "coral coral-ignoredTombstone",
+
+ /**
+ * replyList represents the list of replies to a comment.
+ */
+ replyList: {
+ /**
+ * showAllButton is the button to show all replies.
+ */
+ showAllButton: "coral coral-replyList-showAllButton",
+ /**
+ * showAllButton is the button to show incoming live replies.
+ */
+ showMoreReplies: "coral coral-replyList-showMoreButton",
+ },
+
+ /**
+ * comment is the visual representation of a featured comment.
+ */
+ featuredComment: {
+ /**
+ * $root represents the container containing a featured comment.
+ */
+ $root: "coral coral-featuredComment",
+
+ /**
+ * authorBar is the uppper bar of the comment.
+ */
+ authorBar: {
+ $root: "coral coral-featuredComment-authorBar",
+
+ /**
+ * username is the text display for any given Username in the system.
+ */
+ username: "coral coral-username coral-comment-username",
+
+ /**
+ * timestamp is the text that contains the time since the comment was
+ * published.
+ */
+ timestamp: "coral coral-timestamp coral-comment-timestamp",
+
+ /**
+ * userTag can be used to target a tag associated with a User.
+ */
+ userTag: "coral coral-userTag coral-comment-userTag",
+ },
+
+ /**
+ * content is the html text body of the featured comment.
+ */
+ content: "coral coral-content coral-featuredComment-content",
+
+ /**
+ * actionBar is the lower bar of the featured comment.
+ */
+ actionBar: {
+ /**
+ * $root represents the container of action bar.
+ */
+ $root: "coral coral-featuredComment-actionBar",
+
+ /**
+ * replies indicates the amount of replies this comment has.
+ */
+ replies: "coral coral-featuredComment-replies",
+
+ /**
+ * reactButton is the reaction button.
+ */
+ reactButton: "coral coral-reactButton coral-featuredComment-reactButton",
+ /**
+ * reactedButton is the class added to the reaction button
+ * when the viewer has already reacted to the comment.
+ */
+ reactedButton: "coral-reactedButton coral-featuredComment-reactedButton",
+ /**
+ * goToConversation is the link that leads to the whole conversation.
+ */
+ goToConversation: "coral coral-featuredComment-goToConversationButton",
+ },
+ },
+
+ /**
+ * userPopover is the popover that appears when clicking on the username.
+ */
+ userPopover: {
+ /**
+ * $root is the container of the user popover.
+ */
+ $root: "coral coral-userPopover",
+ /**
+ * username that is rendeed inside the user popover.
+ */
+ username: "coral coral-username coral-userPopover-username",
+ /**
+ * ignoreButton that will trigger the ignore user popover.
+ */
+ ignoreButton: "coral coral-userPopover-ignoreButton",
+ },
+
+ /**
+ * ignoreUserPopover is the popover that allow the
+ * viewer to ignore a user.
+ */
+ ignoreUserPopover: {
+ /**
+ * $root is the container of the ignore user popover.
+ */
+ $root: "coral coral-ignoreUserPopover",
+ cancelButton: "coral coral-ignoreUserPopover-cancelButton",
+ ignoreButton: "coral coral-ignoreUserPopover-ignoreButton",
+ },
+
+ /**
+ * sharePopover is the popover that shows the permalink of the comment.
+ */
+ sharePopover: {
+ $root: "coral coral-sharePopover",
+ copyButton: "coral coral-sharePopover-copyButotn",
+ },
+
+ /**
+ * reportPopover is the popover that appears when the viewer clicks on the
+ * report button.
+ */
+ reportPopover: {
+ $root: "coral coral-reportPopover",
+ closeButton: "coral coral-reportPopover-closeButton",
+ cancelButton: "coral coral-reportPopover-cancelButton",
+ submitButton: "coral coral-reportPopover-submitButton",
+ },
+
+ /**
+ * moderationDropdown is the dropdown that appears when clicking on the
+ * caret as a priviledged user (at least moderator).
+ */
+ moderationDropdown: {
+ $root: "coral coral-moderationDropdown",
+ approveButton:
+ "coral coral-dropdownButton coral-moderationDropdown-approveButton",
+ approvedButton:
+ "coral coral-dropdownButton coral-moderationDropdown-approveedButton",
+ rejectButton:
+ "coral coral-dropdownButton coral-moderationDropdown-rejectButton",
+ rejectedButton:
+ "coral coral-dropdownButton coral-moderationDropdown-rejectedButton",
+ featureButton:
+ "coral coral-dropdownButton coral-moderationDropdown-featureButton",
+ unfeatureButton:
+ "coral coral-dropdownButton coral-moderationDropdown-unfeatureButton",
+ banUserButton:
+ "coral coral-dropdownButton coral-moderationDropdown-banUserButton",
+ bannedButton:
+ "coral coral-dropdownButton coral-moderationDropdown-bannedButton",
+ goToModerateButton:
+ "coral coral-dropdownButton coral-moderationDropdown-goToModerateButton",
+ },
+
+ /**
+ * banUserPopover is the popover that allows the viewer to ban users.
+ */
+ banUserPopover: {
+ $root: "coral coral-banUserPopover",
+ cancelButton: "coral coral-banUserPopover-cancelButton",
+ banButton: "coral coral-banUserPopover-banButton",
+ },
+
+ /**
+ * viewerBox is the box that indicates which user is logged in and
+ * provides login, signout or register functionality.
+ */
+ viewerBox: {
+ $root: "coral coral-viewerBox",
+ logoutButton: "coral coral-viewerBox-logoutButton",
+ signInButton: "coral coral-viewerBox-signInButton",
+ registerButton: "coral coral-viewerBox-registerButton",
+ },
+
+ /**
+ * comments tab pane is the default tab pane.
+ */
+ commentsTabPane: {
+ /**
+ * $root is the container for the comments tab pane.
+ */
+ $root: "coral coral-comments",
+ /**
+ * authenticated will indicate that the user is logged in.
+ */
+ authenticated: "coral coral-authenticated",
+ /**
+ * unauthenticated will indicate that the user hasn't logged in yet.
+ */
+ unauthenticated: "coral coral-unauthenticated",
+ },
+
+ /**
+ * allCommentsTabPane is the tab pane that shows all comments.
+ */
+ allCommentsTabPane: {
+ $root: "coral coral-allComments",
+ /**
+ * loadMoreButton is the button to paginate.
+ */
+ loadMoreButton:
+ "coral coral-loadMoreButton coral-allComments-loadMoreButton",
+ /**
+ * viewNewButton is the button that reveals newer comments.
+ */
+ viewNewButton: "coral coral-allComments-viewNewButton",
+ },
+
+ /**
+ * featuredCommentsTabPane is the tab pane that shows featured comments.
+ */
+ featuredCommentsTabPane: {
+ $root: "coral coral-featuredComments",
+ loadMoreButton:
+ "coral coral-loadMoreButton coral-featuredComments-loadMoreButton",
+ },
+
+ /**
+ * permalinkView is the tab pane that shows the conversation of a comment.
+ */
+ permalinkView: {
+ /**
+ * $root is the container for the permalink tab pane.
+ */
+ $root: "coral coral-permalink",
+ /**
+ * authenticated will be applied to the container when the user is logged in.
+ */
+ authenticated: "coral-authenticated",
+ /**
+ * unauthenticated will be applied to the container when the user has not logged in yet.
+ */
+ unauthenticated: "coral-unauthenticated",
+
+ /**
+ * viewFullDiscussionButton is the button that leads to the full comment stream.
+ */
+ viewFullDiscussionButton: "coral coral-permalink-viewFullDiscussionButton",
+ },
+
+ /**
+ * conversationThread shows the thread of comments that lead to the permalinked comment.
+ */
+ conversationThread: {
+ $root: "coral coral-conversationThread",
+ /**
+ * rootParent is the root comment that is shown in the thread before it has been
+ * expanded.
+ */
+ rootParent: {
+ $root: "coral coral-rootParent",
+ username: "coral coral-username coral-rootParent-username",
+ timestamp: "coral coral-timestamp coral-rootParent-timestamp",
+ userTag: "coral coral-userTag coral-rootParent-userTag",
+ },
+ /**
+ * showMore is the button that reveals all comments between root parent and highlighted comment.
+ */
+ showMore: "coral coral-conversationThread-showMore",
+ /**
+ * highlighted is the comment that is targeted by the permalink.
+ */
+ hightlighted: "coral coral-conversationThread-highlighted",
+ },
+
+ /**
+ * myProfileTabPane is the tab pane that shows the profile of the viewer.
+ */
+ myProfileTabPane: {
+ $root: "coral coral-myProfile",
+ },
+
+ /**
+ * myUsername is the username part of my profile.
+ */
+ myUsername: {
+ username: "coral coral-myUsername",
+ editButton: "coral coral-myUsername-editButton",
+ form: {
+ $root: "coral coral-changeMyUsername",
+ username: "coral coral-changeMyUsername-username",
+ cancelButton: "coral coral-changeMyUsername-cancelButton",
+ saveButton: "coral coral-changeMyUsername-saveButton",
+ closeButton: "coral coral-changeMyUsername-closeButton",
+ errorMessage: "coral coral-changeMyEmail-errorMessage",
+ },
+ },
+
+ /**
+ * myUsername is the email part of my profile.
+ */
+ myEmail: {
+ email: "coral coral-myEmail",
+ unverified: "coral coral-myEmail-unverified",
+ editButton: "coral coral-myEmail-editButton",
+ form: {
+ $root: "coral coral-changeMyEmail",
+ currentEmail: "coral coral-changeMyEmail-currentEmail",
+ cancelButton: "coral coral-changeMyEmail-cancelButton",
+ saveButton: "coral coral-changeMyEmail-saveButton",
+ errorMessage: "coral coral-changeMyEmail-errorMessage",
+ },
+ },
+
+ /**
+ * myUsername is the verify email part of my profile.
+ */
+ verifyEmail: {
+ $root: "coral coral-verifyEmail",
+ resendButton: "coral coral-verifyEmail-resendButton",
+ resentMessage: "coral coral-verifyEmail-resentMessage",
+ },
+
+ /**
+ * myCommentsTabPane is the tab pane that shows viewers comments.
+ */
+ myCommentsTabPane: {
+ $root: "coral coral-myComments",
+ loadMoreButton:
+ "coral coral-loadMoreButton coral-myComments-loadMoreButton",
+ },
+
+ /**
+ * myComment is the comment that shows up in the viewers comment history.
+ */
+ myComment: {
+ $root: "coral coral-myComment",
+ story: "coral coral-myComment-story",
+ timestamp: "coral coral-myComment-timestamp",
+ content: "coral coral-myComment-content",
+ replies: "coral coral-myComment-replies",
+ viewConversationButton: "coral coral-myComment-viewConversationButton",
+ },
+
+ /**
+ * settingsTabPane is the tab pane that shows viewers settings.
+ */
+ settingsTabPane: {
+ $root: "coral coral-settings",
+ },
+
+ /**
+ * ignoredCommenters is ignored commenters settings.
+ */
+ ignoredCommenters: {
+ $root: "coral coral-ignoredCommenters",
+ username: "coral coral-ignoredCommenters-username",
+ stopIgnoreButton: "coral coral-ignoredCommenters-stopIgnoreButton",
+ },
+
+ /**
+ * changePassword allows the viewer to change password in settings.
+ */
+ changePassword: {
+ $root: "coral coral-changePassword",
+ forgotButton: "coral coral-changePassword-forgotButton",
+ changeButton: "coral coral-changePassword-changeButton",
+ successMessage: "coral coral-changePassword-successMessage",
+ errorMessage: "coral coral-changePassword-errorMessage",
+ },
+
+ /**
+ * downloadCommentHistory allows the viewer to download the comment
+ * history in settings.
+ */
+ downloadCommentHistory: {
+ $root: "coral coral-downloadCommentHistory",
+ requestButton: "coral coral-downloadCommentHistory-requestButton",
+ recentRequest: "coral coral-downloadCommentHistory-recentRequest",
+ requestLater: "coral coral-downloadCommentHistory-requestLater",
+ },
+
+ /**
+ * deleteMyAccount allows the viewer to delete their account.
+ */
+ deleteMyAccount: {
+ $root: "coral coral-deleteMyAccount",
+ requestButton: "coral coral-deleteMyAccount-requestButton",
+ cancelRequestButton: "coral coral-deleteMyAccount-cancelRequestButton",
+ },
+
+ /**
+ * pendingAccountDeletion is the message box informing the viewer
+ * about a pending account deletion.
+ */
+ pendingAccountDeletion: {
+ $root: "coral coral-pendingAccountDeletion",
+ cancelRequestButton:
+ "coral coral-pendingAccountDeletion-cancelRequestButton",
+ },
+
+ /**
+ * deleteMyAccount allows the viewer to delete their account.
+ */
+ deleteMyAccountModal: {
+ $root: "coral coral-deleteMyAccountModal",
+ header: "coral coral-deleteMyAccountModal-header",
+ cancelButton: "coral coral-deleteMyAccountModal-cancelButton",
+ proceedButton: "coral coral-deleteMyAccountModal-proceedButton",
+ doneButton: "coral coral-deleteMyAccountModal-doneButton",
+ deleteMyAccountButton: "coral coral-deleteMyAccount-deleteMyAccountButton",
+ },
+
+ /**
+ * configureTabPane is the tab pane that lets priviledged users to
+ * change settings of the stream.
+ */
+ configureTabPane: {
+ $root: "coral coral-configure",
+ },
+
+ /**
+ * configureMessageBox is the message box section in the stream configure.
+ */
+ configureMessageBox: {
+ $root: "coral coral-configureMessageBox",
+ messageBox: "coral coral-configureMessageBox-messageBox",
+ option: "coral coral-configureMessageBox-option",
+ },
+
+ /**
+ * configureCommentStream allows priviledged users to adjust settings of
+ * the stream.
+ */
+ configureCommentStream: {
+ $root: "coral coral-configureCommentStream",
+ applyButton: "coral coral-configureCommentStream-applyButton",
+ errorMessage: "coral coral-configureCommentStream-errorMessage",
+ },
+
+ /**
+ * closeCommentStream allows priviledged users to close the stream.
+ */
+ closeCommentStream: {
+ $root: "coral coral-closeCommentStream",
+ closeButton: "coral coral-closeCommentStream-closeButton",
+ },
+
+ /**
+ * openCommentStream allows priviledged users to open the stream.
+ */
+ openCommentStream: {
+ $root: "coral coral-openCommentStream",
+ openButton: "coral coral-openCommentStream-openButton",
+ },
+
+ /**
+ * spinner is the loading indicator.
+ */
+ spinner: "coral-spinner",
+
+ /**
+ * validation message that shows up on form errors.
+ */
+ validationMessage: "coral-validation-message",
};
export default CLASSES;
diff --git a/src/core/client/stream/common/Counter.ts b/src/core/client/stream/common/Counter.ts
index 30156421c..580d51ea2 100644
--- a/src/core/client/stream/common/Counter.ts
+++ b/src/core/client/stream/common/Counter.ts
@@ -5,8 +5,11 @@ import CLASSES from "coral-stream/classes";
import { Counter } from "coral-ui/components";
import { PropTypesOf } from "coral-ui/types";
+/**
+ * Like from coral ui but with a stable css classname.
+ */
export default withProps<
- PropTypesOf,
+ Partial>,
PropTypesOf
>(({ className }) => ({
className: cn(className, CLASSES.counter),
diff --git a/src/core/client/stream/common/FieldValidationMessage.ts b/src/core/client/stream/common/FieldValidationMessage.ts
new file mode 100644
index 000000000..dc20315d5
--- /dev/null
+++ b/src/core/client/stream/common/FieldValidationMessage.ts
@@ -0,0 +1,16 @@
+import cn from "classnames";
+import { withProps } from "recompose";
+
+import { ValidationMessage } from "coral-framework/lib/form";
+import CLASSES from "coral-stream/classes";
+import { PropTypesOf } from "coral-ui/types";
+
+/**
+ * Like from the form library but with a stable css classname.
+ */
+export default withProps<
+ Partial>,
+ PropTypesOf
+>(({ className }) => ({
+ className: cn(className, CLASSES.validationMessage),
+}))(ValidationMessage);
diff --git a/src/core/client/stream/common/MessageBox/__snapshots__/MessageBox.spec.tsx.snap b/src/core/client/stream/common/MessageBox/__snapshots__/MessageBox.spec.tsx.snap
index c31491163..b65087755 100644
--- a/src/core/client/stream/common/MessageBox/__snapshots__/MessageBox.spec.tsx.snap
+++ b/src/core/client/stream/common/MessageBox/__snapshots__/MessageBox.spec.tsx.snap
@@ -12,12 +12,12 @@ exports[`renders icon 1`] = `