Hi Dave, as discussed [here](https://discourse.nodered.org/t/angular-notificatioā¦ns/47232/9?u=steve-mcl)
This PR adds the option `class` to UI elements so that custom CSS is easier to address items within a dashboard group or element.
The class names are applied to `ng-class` at the top level meaning a user can add CSS for the card or its content.
Dirty demo...
![Jkfi9Y6lwf](https://user-images.githubusercontent.com/44235289/122566584-9b2f0880-d03f-11eb-8ed4-506a534aa207.gif)
demo flow
```
[{"id":"f4b7f5d47f78fcfc","type":"inject","z":"af952aeaa20f4f97","name":"","props":[{"p":"topic","vt":"str"},{"p":"payload"},{"p":"className","v":"notification-error","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"ERROR","payload":"An error happened","payloadType":"str","x":440,"y":240,"wires":[["07e9633b37b26775"]]},{"id":"07e9633b37b26775","type":"ui_toast","z":"af952aeaa20f4f97","position":"top right","displayTime":"50","highlight":"","sendall":true,"outputs":0,"ok":"OK","cancel":"","raw":true,"className":"","topic":"","name":"","x":800,"y":220,"wires":[]},{"id":"887c3c77e479e52e","type":"ui_template","z":"af952aeaa20f4f97","group":"dce9e7a2.d20c78","name":"styles","order":10,"width":0,"height":0,"format":"<style>\n /* notification colors */\n md-toast.notification-info {\n border-width: 10px;\n border-color: darkgreen;\n }\n md-toast.notification-info > h3 {\n background-color: green;\n }\n md-toast.notification-info > div {\n background: rgba(0, 255, 0, 0.5);\n color: darkgreen;\n }\n\n md-toast.notification-warn {\n border-width: 10px;\n border-color: darkorange;\n }\n md-toast.notification-warn > h3 {\n background-color: orange;\n }\n md-toast.notification-warn > div {\n background: rgba(245, 173, 66, 0.5);\n color: darkorange;\n }\n \n md-toast.notification-error {\n border-width: 10px;\n border-color: darkred;\n }\n md-toast.notification-error > h3 {\n background-color: red;\n }\n md-toast.notification-error > div {\n background: rgba(255, 0, 0, 0.5);\n color: darkred;\n }\n\n\n /* Button colors */\n .nr-dashboard-theme .button-info.nr-dashboard-button button.md-button {\n background: rgba(0, 255, 0, 0.5);\n color: rgb(0, 30, 0);\n }\n .nr-dashboard-theme .button-error.nr-dashboard-button button.md-button {\n background: rgba(255, 0, 0, 0.5);\n color: rgb(30, 0, 0);\n }\n .nr-dashboard-theme .button-warn.nr-dashboard-button button.md-button {\n background: rgba(245, 173, 66, 0.5);\n color: rgb(145, 73, 22);\n }\n\n md-card._md.blue-card {\n background: lightblue;\n }\n\n md-card._md.gray-card {\n background: lightgray;\n }\n\n md-card.yellow-card.visible {\n background: yellow !important;\n }\n\n md-card.visible.bold-span-text > span {\n font-weight: bold !important;\n }\n\n md-card.visible.bold-p-label > p.label {\n font-weight: bold !important;\n }\n\n md-card.my-chart._md.layout-align-center-center.visible {\n background: lightgoldenrodyellow;\n }\n\n md-card.my-chart._md.layout-align-center-center.visible\n p.label.nr-dashboard-chart-title.nr-dashboard-chart-titlel {\n font-family: cursive;\n font-size: larger;\n font-stretch: extra-expanded;\n font-style: italic;\n font-variant-caps: small-caps;\n background-color: aquamarine;\n border: black;\n border-width: 2px;\n border-style: solid;\n padding-top: 0px;\n }\n\n\n .my-group {\n background: brown !important;\n } \n .my-group p.nr-dashboard-cardtitle {\n font-size: 30px;\n font-style: italic;\n margin: 0px;\n padding-right: 12px;\n padding-bottom: 12px !important;\n }\n md-card.my-form.nr-dashboard-form {\n background: peachpuff;\n }\n md-card.my-form button[type=submit] {\n background: green;\n }\n md-card.my-form button[type=submit]:hover {\n background: red;\n }\n\n</style>","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"global","className":"","x":730,"y":160,"wires":[[]]},{"id":"372dc9715e13dbc4","type":"inject","z":"af952aeaa20f4f97","name":"","props":[{"p":"topic","vt":"str"},{"p":"payload"},{"p":"className","v":"notification-info","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"INFO","payload":"Some info","payloadType":"str","x":400,"y":160,"wires":[["07e9633b37b26775"]]},{"id":"274974bef8ef7e49","type":"inject","z":"af952aeaa20f4f97","name":"","props":[{"p":"topic","vt":"str"},{"p":"payload"},{"p":"className","v":"notification-warn","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"WARN","payload":"This is a warning","payloadType":"str","x":430,"y":200,"wires":[["07e9633b37b26775"]]},{"id":"99cd63bd68e4608a","type":"ui_button","z":"af952aeaa20f4f97","name":"","group":"da148e61.f015f","order":11,"width":"4","height":"1","passthru":false,"label":"show error","tooltip":"","color":"","bgcolor":"","className":"button-error","icon":"","payload":"This is an error","payloadType":"str","topic":"ERROR TITLE","topicType":"str","x":390,"y":320,"wires":[["489d9ee5f15aa662"]]},{"id":"489d9ee5f15aa662","type":"change","z":"af952aeaa20f4f97","name":"","rules":[{"t":"set","p":"className","pt":"msg","to":"notification-error","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":590,"y":320,"wires":[["07e9633b37b26775"]]},{"id":"60b8fccd18b8f5dd","type":"ui_button","z":"af952aeaa20f4f97","name":"","group":"da148e61.f015f","order":11,"width":"4","height":"1","passthru":false,"label":"show info","tooltip":"","color":"","bgcolor":"","className":"button-info","icon":"","payload":"This is just information","payloadType":"str","topic":"INFO TITLE","topicType":"str","x":380,"y":360,"wires":[["c84b76cc56f35b51"]]},{"id":"c84b76cc56f35b51","type":"change","z":"af952aeaa20f4f97","name":"","rules":[{"t":"set","p":"className","pt":"msg","to":"notification-info","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":590,"y":360,"wires":[["07e9633b37b26775"]]},{"id":"aee19488541fe52f","type":"ui_button","z":"af952aeaa20f4f97","name":"","group":"da148e61.f015f","order":11,"width":"4","height":"1","passthru":false,"label":"show warn","tooltip":"","color":"","bgcolor":"","className":"button-warn","icon":"","payload":"This is a warning","payloadType":"str","topic":"WARN TITLE","topicType":"str","x":390,"y":400,"wires":[["16ca42fe5bd2a0eb"]]},{"id":"16ca42fe5bd2a0eb","type":"change","z":"af952aeaa20f4f97","name":"","rules":[{"t":"set","p":"className","pt":"msg","to":"notification-warn","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":590,"y":400,"wires":[["07e9633b37b26775"]]},{"id":"7de4faabaa5cd06f","type":"inject","z":"af952aeaa20f4f97","name":"set class button-info","props":[{"p":"ui_control","v":"{ \"className\":\"button-info\" }","vt":"json"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":170,"y":420,"wires":[["aee19488541fe52f"]]},{"id":"d6b65ffa68be66c2","type":"inject","z":"af952aeaa20f4f97","name":"set class button-warn","props":[{"p":"ui_control","v":"{ \"className\":\"button-warn\" }","vt":"json"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":160,"y":380,"wires":[["aee19488541fe52f"]]},{"id":"ad25abafd6e5d947","type":"ui_switch","z":"af952aeaa20f4f97","name":"","label":"switch class=gray-card bold-p-label","tooltip":"","group":"da148e61.f015f","order":4,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"payload.content","topicType":"msg","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"gray-card bold-p-label","x":920,"y":280,"wires":[[]]},{"id":"50d031a9245d8e9c","type":"ui_slider","z":"af952aeaa20f4f97","name":"","label":"slider - class=gray-card","tooltip":"","group":"da148e61.f015f","order":7,"width":0,"height":0,"passthru":true,"outs":"all","topic":"pitch","topicType":"str","min":0,"max":"30","step":"0.5","className":"gray-card","x":930,"y":400,"wires":[[]]},{"id":"1cbc491f5447379a","type":"ui_slider","z":"af952aeaa20f4f97","name":"","label":"slider - class=blue-card bold-p-label","tooltip":"","group":"da148e61.f015f","order":7,"width":0,"height":0,"passthru":true,"outs":"all","topic":"roll","topicType":"str","min":0,"max":"30","step":"0.5","className":"blue-card bold-p-label","x":960,"y":440,"wires":[[]]},{"id":"3ee345fd72fdb982","type":"inject","z":"af952aeaa20f4f97","name":"","props":[{"p":"ui_control","v":"{ \"className\":\"button-warn\" }","vt":"json"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":650,"y":500,"wires":[["50d031a9245d8e9c","1cbc491f5447379a"]]},{"id":"6a4098178f578c4a","type":"inject","z":"af952aeaa20f4f97","name":"","props":[{"p":"ui_control","v":"{ \"className\":\"button-info\" }","vt":"json"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":640,"y":540,"wires":[["50d031a9245d8e9c","1cbc491f5447379a"]]},{"id":"d412219ba3edc8f7","type":"inject","z":"af952aeaa20f4f97","name":"enabled true","props":[{"p":"enabled","v":"true","vt":"bool"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":190,"y":480,"wires":[["aee19488541fe52f"]]},{"id":"1f29c7b55eab3db8","type":"inject","z":"af952aeaa20f4f97","name":"enabled false","props":[{"p":"enabled","v":"false","vt":"bool"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":190,"y":520,"wires":[["aee19488541fe52f"]]},{"id":"8881611f795336ec","type":"ui_switch","z":"af952aeaa20f4f97","name":"","label":"switch class=blue-card","tooltip":"","group":"da148e61.f015f","order":4,"width":0,"height":0,"passthru":true,"decouple":"false","topic":"payload.content","topicType":"msg","style":"","onvalue":"true","onvalueType":"bool","onicon":"","oncolor":"","offvalue":"false","offvalueType":"bool","officon":"","offcolor":"","animate":false,"className":"blue-card","x":920,"y":320,"wires":[[]]},{"id":"ade3ee9c0252009c","type":"ui_template","z":"af952aeaa20f4f97","group":"da148e61.f015f","name":"","order":11,"width":0,"height":0,"format":"This ui-template has the class \"yellow-card bold-span-text\"\n<div>\n I am the content of a div in a ui-template\n</div>\n\n<pre>\n I am the content of a pre in a ui-template\n</pre>\n\n<span>\n I am the content of a span in a ui-template\n</span>\n","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"yellow-card bold-span-text","x":880,"y":540,"wires":[[]]},{"id":"dd96667d574643ef","type":"ui_template","z":"af952aeaa20f4f97","group":"da148e61.f015f","name":"","order":11,"width":0,"height":0,"format":"This ui-template has the class \"yellow-card\" only\n<div>\n I am the content of a div in a ui-template\n</div>\n\n<pre>\n I am the content of a pre in a ui-template\n</pre>\n\n<span>\n I am the content of a span in a ui-template\n</span>\n","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"yellow-card","x":880,"y":580,"wires":[[]]},{"id":"491fcaad8d1445a8","type":"ui_chart","z":"af952aeaa20f4f97","name":"","group":"da148e61.f015f","order":9,"width":"12","height":"4","label":"chart without class","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"2","removeOlderPoints":"120","removeOlderUnit":"60","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"","x":470,"y":680,"wires":[[]]},{"id":"543f1ba81f61d864","type":"inject","z":"af952aeaa20f4f97","name":"","props":[{"p":"payloadxxx","v":"[\t {\t \"series\": [\"A\", \"B\", \"C\"],\t \"data\": [\t [\t { \"x\": $toMillis($now()), \"y\": 5 },\t { \"x\": $toMillis($now())+100, \"y\": 4 },\t { \"x\": $toMillis($now())+200, \"y\": 2 } \t ],\t [\t { \"x\": $toMillis($now()), \"y\": 6 },\t { \"x\": $toMillis($now())+100, \"y\": 7 },\t { \"x\": $toMillis($now())+200, \"y\": 6 } \t ],\t [\t { \"x\": $toMillis($now()), \"y\": 7 },\t { \"x\": $toMillis($now())+100, \"y\": 9 },\t { \"x\": $toMillis($now())+200, \"y\": 7 } \t ] \t ],\t \"labels\": [\"\"] \t }\t]\t","vt":"jsonata"},{"p":"topic","vt":"str"},{"p":"payload"}],"repeat":"2","crontab":"","once":false,"onceDelay":0.1,"topic":"data","payload":"(\t $minimum := 1;\t $maximum := 10;\t $round(($random() * ($maximum-$minimum)) + $minimum, 0)\t)","payloadType":"jsonata","x":280,"y":680,"wires":[["491fcaad8d1445a8","4e7769680e0a7c5f"]]},{"id":"4e7769680e0a7c5f","type":"ui_chart","z":"af952aeaa20f4f97","name":"","group":"da148e61.f015f","order":9,"width":"12","height":"4","label":"chart with class my-chart","chartType":"line","legend":"false","xformat":"HH:mm:ss","interpolate":"linear","nodata":"","dot":false,"ymin":"","ymax":"","removeOlder":"2","removeOlderPoints":"120","removeOlderUnit":"60","cutout":0,"useOneColor":false,"useUTC":false,"colors":["#1f77b4","#aec7e8","#ff7f0e","#2ca02c","#98df8a","#d62728","#ff9896","#9467bd","#c5b0d5"],"outputs":1,"useDifferentColor":false,"className":"my-chart","x":490,"y":720,"wires":[[]]},{"id":"f0de01d6dd9ef37e","type":"ui_template","z":"af952aeaa20f4f97","group":"6bb8ed49fa5e7238","name":"","order":11,"width":0,"height":0,"format":"This ui-template has the class \"yellow-card bold-span-text\"\n<div>\n I am the content of a div in a ui-template\n</div>\n\n<pre>\n I am the content of a pre in a ui-template\n</pre>\n\n<span>\n I am the content of a span in a ui-template\n</span>\n","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"yellow-card bold-span-text","x":1100,"y":540,"wires":[[]]},{"id":"3117438adf7c148f","type":"ui_template","z":"af952aeaa20f4f97","group":"6bb8ed49fa5e7238","name":"","order":11,"width":0,"height":0,"format":"This ui-template has the class \"yellow-card\" only\n<div>\n I am the content of a div in a ui-template\n</div>\n\n<pre>\n I am the content of a pre in a ui-template\n</pre>\n\n<span>\n I am the content of a span in a ui-template\n</span>\n","storeOutMessages":true,"fwdInMessages":true,"resendOnRefresh":true,"templateScope":"local","className":"yellow-card","x":1100,"y":580,"wires":[[]]},{"id":"724f510b2bf64b77","type":"ui_form","z":"af952aeaa20f4f97","name":"","label":"class=my-form","group":"6bb8ed49fa5e7238","order":2,"width":0,"height":0,"options":[{"label":"Name","value":"Name","type":"text","required":true,"rows":null},{"label":"Age","value":"Age","type":"number","required":false,"rows":null}],"formValue":{"Name":"","Age":""},"payload":"","submit":"submit","cancel":"cancel","topic":"topic","topicType":"msg","splitLayout":"","className":"my-form","x":900,"y":660,"wires":[[]]},{"id":"dce9e7a2.d20c78","type":"ui_group","name":"Object detection","tab":"5132060d.4cde48","order":1,"disp":true,"width":"9","collapse":false},{"id":"da148e61.f015f","type":"ui_group","name":"Demo class=my-group","tab":"da5706ae.6caf58","order":3,"disp":true,"width":"12","collapse":false,"className":"my-group"},{"id":"6bb8ed49fa5e7238","type":"ui_group","name":"another group (no class)","tab":"da5706ae.6caf58","order":2,"disp":true,"width":"8","collapse":false,"className":""},{"id":"5132060d.4cde48","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false},{"id":"da5706ae.6caf58","type":"ui_tab","name":"Home","icon":"dashboard","disabled":false,"hidden":false}]
```