and Self-assembly of isomeric naphthalene appended glucono derivatives: nanofibers and nanotwists with circularly polarized luminescence emission By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4115-4120DOI: 10.1039/C9SM02542A, PaperZongwen Liu, Yuqian Jiang, Jian Jiang, Donghua Zhai, Decai Wang, Minghua LiuTwo isomers of naphthalene derivatives are self-assembled into nanofibers and nanotwists with CPL emission, respectively.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Geometry underlies the mechanical stiffening and softening of an indented floating film By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4121-4130DOI: 10.1039/D0SM00250J, Paper Open Access   This article is licensed under a Creative Commons Attribution-NonCommercial 3.0 Unported Licence.Monica M. Ripp, Vincent Démery, Teng Zhang, Joseph D. PaulsenUsing experiments, simulations, and theory, we map out the remarkably rich mechanical response of a floating polymer film to indentation.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Lipid-core/polymer-shell hybrid nanoparticles: synthesis and characterization by fluorescence labeling and electrophoresis By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4173-4181DOI: 10.1039/D0SM00077A, PaperSophie Bou, Xinyue Wang, Nicolas Anton, Redouane Bouchaala, Andrey S. Klymchenko, Mayeul CollotNew hybrid nanoparticles have been obtained by simple nanoprecipitation using fluorescent labeling of both the oily core (BODIPY) and the polymeric shell (rhodamine) thus allowing the use of electrophoresis to assess their formation and stability.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Ordering of binary colloidal crystals by random potentials By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4267-4273DOI: 10.1039/D0SM00208A, PaperAndré S. Nunes, Sabareesh K. P. Velu, Iryna Kasianiuk, Denis Kasyanyuk, Agnese Callegari, Giorgio Volpe, Margarida M. Telo da Gama, Giovanni Volpe, Nuno A. M. AraújoA random potential can control the number of defects in a binary colloidal crystal.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Effect of network homogeneity on mechanical, thermal and electrochemical properties of solid polymer electrolytes prepared by homogeneous 4-arm poly(ethylene glycols) By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4290-4298DOI: 10.1039/D0SM00289E, PaperMonami Tosa, Kei Hashimoto, Hisashi Kokubo, Kazuhide Ueno, Masayoshi WatanabeThe effect of network inhomogeneity in solid polymer electrolytes on its electrolyte properties was investigated by employing a model polymer network composed of a homogeneous 4-arm poly(ethylene glycol) (tetra-PEG) network and Li salt.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Filamentous and step-like behavior of gelling coarse fibrin networks revealed by high-frequency microrheology By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4234-4242DOI: 10.1039/C9SM02228G, PaperPablo Domínguez-García, Giovanni Dietler, László Forró, Sylvia JeneyBy a micro-experimental methodology, we study the ongoing molecular process inside coarse fibrin networks by means of microrheology.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Rapid characterization of neutral polymer brush with a conventional zetameter and a variable pinch of salt By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4274-4282DOI: 10.1039/C9SM01850F, PaperMena Youssef, Alexandre Morin, Antoine Aubret, Stefano Sacanna, Jérémie PalacciWe take advantage of the nanoscopic nature of the Debye length and used it as a probe to characterize polymer brushes on colloidal particles.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Ionic effects on synthetic polymers: from solutions to brushes and gels By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4087-4104DOI: 10.1039/D0SM00199F, Review ArticleHaiyang Yuan, Guangming LiuIn this review, the polymer solutions, brushes, and gels are employed to exemplify the ionic effects on synthetic polymers.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Protonated state and synergistic role of Nd3+ doped barium cerate perovskite for the enhancement of ionic pathways in novel sulfonated polyethersulfone for H2/O2 fuel cells By feeds.rsc.org Published On :: Soft Matter, 2020, 16,4220-4233DOI: 10.1039/D0SM00427H, PaperR. Gayathri, M. Ramesh Prabhu1.8 times higher current density and power density were obtained for a Nd3+ doped barium cerate membrane compared to pure SPES.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Correlation of Hierarchical Structure and Rheological Behavior of Polypseudorotaxane Gel Composed of Pluronic and β-cyclodextrin By feeds.rsc.org Published On :: Soft Matter, 2020, Accepted ManuscriptDOI: 10.1039/D0SM00406E, Paperkuo-chih Shih, Chien-You Su, Shing-Yun Chang, Grethe V Jensen, Chi-Chung Hua, Mu-Ping Nieh, Hsi-Mei LaiWe have identified the hierarchical (primary, secondary, tertiary and quaternary) structures of a polypseudorotaxane (PPR) gel composed of Pluronic F108 and β-cyclodextrin system to be β-cyclodextrin crystalline, lamellar sheets, lamellar...The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Polypyrrole and polyaniline nanocomposites with high photothermal conversion efficiency By feeds.rsc.org Published On :: Soft Matter, 2020, Advance ArticleDOI: 10.1039/D0SM00306A, CommunicationLorena Ruiz-Pérez, Loris Rizzello, Jinping Wang, Nan Li, Giuseppe Battaglia, Yiwen PeiA simple and scalable synthetic approach to produce functional conducting polymer (CP) nanocomposites using the Fe-complexed PISA-prepared nanoparticles is demonstrated.To cite this article before page numbers are assigned, use the DOI form of citation above.The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Single chain in mean field simulation of flexible and semiflexible polymers: Comparison with discrete chain self-consistent field theory By feeds.rsc.org Published On :: Soft Matter, 2020, Accepted ManuscriptDOI: 10.1039/D0SM00620C, PaperSo Jung Park, Jaeup KimSingle chain in mean field (SCMF) simulation is a theoretical framework performing Monte Carlo moves of explicit polymer chains under quasi-instantaneously updated external fields which were originally imported from the...The content of this RSS Feed (c) The Royal Society of Chemistry Full Article
and Peers and Politics, c. 1650 - 1850: Essays in Honour of Clyve Jones By www.wiley.com Published On :: 2020-03-16T04:00:00Z A collection of essays in honour of Clyve Jones who has made an incomparable contribution to our understanding of the history of the Westminster house of lords – its politics, procedures and business – and to the history of the English and Scottish peerage more generally Read More... Full Article
and Copper, Brass, and Bronze Surfaces: A Guide to Alloys, Finishes, Fabrication, and Maintenance in Architecture and Art By www.wiley.com Published On :: 2020-03-24T04:00:00Z A FULL-COLOR GUIDE FOR ARCHITECTS AND DESIGN PROFESSIONALS TO THE SELECTION AND APPLICATION OF COPPER, BRASS, AND BRONZECopper, Brass, and Bronze Surfaces, third in Zahner's Architectural Metals Series, provides a comprehensive and authoritative treatment of copper, brass, and bronze applications in architecture and art. If offers architecture and design professionals the information they need to ensure proper maintenance and fabrication techniques Read More... Full Article
and The Landscapists By www.wiley.com Published On :: 2020-04-06T04:00:00Z Who defines the landscapes around us? What practices are employed as contemporary landscapes are produced? This issue argues that landscapes are made and remade through interrelations between people and the worlds around them – from geographers investigating the lives of urban wastelands to landscape architects projecting future cities, and from migrants navigating border systems to artists working with local residents. In contrast to tendencies to Read More... Full Article
and Sports Fields: Design, Construction, and Maintenance, 3rd Edition By www.wiley.com Published On :: 2020-04-07T04:00:00Z THE UPDATED, AUTHORITATIVE GUIDE TO SPORTS FIELD MANAGEMENT THAT INCLUDES THE LATEST DEVELOPMENTS IN, AND ON, THE FIELDThe updated Third Edition of Sports Fields: Design, Construction, and Maintenance is a comprehensive reference for professionals who are responsible for the design, construction, renovation, and maintenance of athletic facilities. This book contains illustrative examples of specific design elements of the most popular sports facilities Read More... Full Article
and Museum Transformations: Decolonization and Democratization By www.wiley.com Published On :: 2020-04-14T04:00:00Z MUSEUM TRANSFORMATIONS DECOLONIZATION AND DEMOCRATIZATIONEdited By ANNIE E. COOMBES ANDRUTH B. PHILLIPSMuseum Transformations: Decolonization and Democratization addresses contemporary approaches to decolonization, greater democratization, and revisionist narratives in museum exhibition and program development around the world. The text explores how museums of art, history, and ethnography responded to deconstructive critiques from activists and poststructuralist Read More... Full Article
and Designing a World-Class Architecture Firm: The People, Stories, and Strategies Behind HOK By www.wiley.com Published On :: 2020-04-14T04:00:00Z Offers architects and creative services professionals exclusive insights and strategies for success from the former CEO of HOK.Designing a World Class Architecture Firm: The People, Stories and Strategies Behind HOK tells the history of one of the largest design firms in the world and draws lessons from it that can help other architects, interior designers, urban planners and creative services professionals grow bigger or better. Former HOK CEO Patrick Read More... Full Article
and Understanding and increasing digital readiness By www.cisco.com Published On :: Tue, 21 Jan 2020 08:00:00 PST The Cisco Digital Readiness Index was developed to holistically measure a countryâ€TMs level of digital readiness. More RSS Feed for Cisco: newsroom.cisco.com/rss-feeds ... Full Article Corporate Social Responsibility Digital Transformation
and Inclusion and Diversity in an AI World By newsroom.cisco.com Published On :: Wed, 22 Jan 2020 04:00:00 PST Artificial intelligence can improve countless lives. But only if we get it right. More RSS Feed: newsroom.cisco.com/rss-feeds ... Full Article Artificial Intelligence
and Does your 2020 talent plan reflect automation and AI trends? By blogs.cisco.com Published On :: Wed, 22 Jan 2020 08:00:00 PST Automation and Artificial Intelligence (AI) are radically changing the way modern networks are being designed, operated and resourced. More RSS Feed for Cisco: newsroom.cisco.com/rss-feeds ... Full Article Analytics & Automation Artificial Intelligence
and From privacy to trust and ROI By blogs.cisco.com Published On :: Mon, 27 Jan 2020 08:00:00 PST Insights from the Cisco Data Privacy Research Program More RSS Feed for Cisco: newsroom.cisco.com/rss-feeds ... Full Article Security
and Sand lorry owners seek exemption from quarterly tax payment By www.thehindu.com Published On :: Fri, 08 May 2020 21:42:35 +0530 Most lorries were not operated during the lockdown which resulted in loss, they say Full Article Tamil Nadu
and Tapping expertise — how T.N. is handling the crisis By www.thehindu.com Published On :: Fri, 08 May 2020 23:44:57 +0530 Multiple panels with senior bureaucrats constituted to address issues arising out of the pandemic Full Article Tamil Nadu
and [ASAP] Modulation of the Visible Absorption and Reflection Profiles of ITO Nanocrystal Thin Films by Plasmon Excitation By dx.doi.org Published On :: Mon, 13 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.9b01825 Full Article
and [ASAP] Size, Ligand, and Defect-Dependent Electron–Phonon Coupling in Chalcogenide and Perovskite Nanocrystals and Its Impact on Luminescence Line Widths By dx.doi.org Published On :: Mon, 13 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.0c00034 Full Article
and [ASAP] Quasinormal-Mode Non-Hermitian Modeling and Design in Nonlinear Nano-Optics By dx.doi.org Published On :: Wed, 15 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.0c00014 Full Article
and [ASAP] Colloidal Quantum-Dots/Graphene/Silicon Dual-Channel Detection of Visible Light and Short-Wave Infrared By dx.doi.org Published On :: Fri, 17 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.0c00247 Full Article
and [ASAP] Update to Our Reader, Reviewer, and Author Communities—April 2020 By dx.doi.org Published On :: Wed, 22 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.0c00628 Full Article
and [ASAP] Goodbye Juan José Sáenz (1960–2020): A Bright Scientific Mind, an Unusually Prolific Friend, and a Family Man By dx.doi.org Published On :: Wed, 22 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.0c00526 Full Article
and [ASAP] Multifunctional Metasurface: Coplanar Embedded Design for Metalens and Nanoprinted Display By dx.doi.org Published On :: Thu, 23 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.9b01795 Full Article
and [ASAP] Near-Field Radiative Heat Transfer between Dissimilar Materials Mediated by Coupled Surface Phonon- and Plasmon-Polaritons By dx.doi.org Published On :: Fri, 24 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.0c00404 Full Article
and [ASAP] Exciton-Polaritons with Magnetic and Electric Character in All-Dielectric Metasurfaces By dx.doi.org Published On :: Thu, 30 Apr 2020 04:00:00 GMT ACS PhotonicsDOI: 10.1021/acsphotonics.0c00063 Full Article
and Interactivity and Animation with Variable Fonts By feedproxy.google.com Published On :: Thu, 05 Dec 2019 12:00:00 +0000 Mandy Michael turns the corner on our variable font adventure and stumbles into a grotto of wonder and amazement. Not forgetting the need for a proper performance budget, Mandy shows how variable fonts can free your creativity from bygone technical constraints. If you read Jason’s introductory article about variable fonts, you’ll understand the many benefits and opportunities that they offer in modern web development. From this point on we’ll assume that you have either read Jason’s introduction or have some prior knowledge of variable fonts so we can skip over the getting started information. If you haven’t read up on variable fonts before jump over to “Introduction to Variable Fonts: Everything you thought you knew about fonts just changed” first and then come join me back here so we can dive into using variable fonts for interactivity and animations! Creative Opportunities If we can use variable fonts to improve the performance of our websites while increasing the amount of style variations available to us, it means that we no longer need to trade off design for performance. Creativity can be the driving force behind our decisions, rather than performance and technical limitations. Cookie text effect font: This Man is a Monster, by Comic Book Fonts. My goal is to demonstrate how to create interactive, creative text on the web by combining variable fonts with CSS and JavaScript techniques that you may already be familiar with. With the introduction of variable fonts, designs which would have previously been a heavy burden on performance, or simply impossible due to technical limitations, are now completely possible. Still I Rise Poem by Maya Angelou, Demo emphasising different words with variable fonts. View on Codepen. Variable fonts demo with CSS Grid using multiple weights and font sizes to emphasise different parts of the message. View on Codepen. The tone and intent of our words can be more effectively represented with less worry over the impacts of loading in “too many font weights” (or other styles). This means that we can start a new path and focus on representing the content in more meaningful ways. For example, emphasising different words, or phrases depending on their importance in the story or content. Candy Cane Christmas Themed Text Effect with FS Pimlico Glow by Font Smith. View on Codepen. Note: using variable fonts does not negate the need for a good web font performance strategy! This is still important, because after all, they are still fonts. Keep that in mind and check out some of the great work done by Monica Dinculescu, Zach Leatherman or this incredible article by Helen Homes. Variable Fonts & Animations Because variable fonts can have an interpolated range of values we can leverage the flexibility and interactive nature of the web. Rather than using SVG, videos or JavaScript to accomplish these effects, we can create animations or transitions using real text, and we can do this using techniques we may already be familiar with. This means we can have editable, selectable, searchable, copy-pastable text, which is accessible via a screenreader. Grass Variable Font Demo Growing Grass Variable Font Text. Demo on Codepen. This effect is achieved using a font called Decovar, by David Berlow. To achieve the animation effect we only need a couple of things to get started. First, we set up the font-family and make use of the new property font-variation-settings to access the different axes available in Decovar. h1 { font-family: "Decovar"; font-variation-settings: 'INLN' 1000, 'SWRM' 1000; } For this effect, we use two custom axis – the first is called “inline” and is represented by the code INLI and the second is “skeleton worm” represented by the code SWRM. For both axes, the maximum value is 1000 and the minimum value is 0. For this effect, we’ll make the most of the full axis range. Once we have the base set up, we can create the animation. There are a number of ways to animate variable fonts. In this demo, we’ll use CSS keyframe animations and the font-variation-settings property, but you can also use CSS transitions and JavaScript as well. The code below will start with the “leaves” expanded and then shrink back until it disappears. @keyframes grow { 0% { font-variation-settings: 'INLN' 1000, 'SWRM' 1000; } 100% { font-variation-settings: 'INLN' 1000, 'SWRM' 0; } } Once we have created the keyframes we can add the animation to the h1 element, and that is the last piece needed in order to create the animation. h1 { font-family: "Decovar"; font-variation-settings: 'INLN' 1000, 'SWRM' 1000; animation: grow 4s linear alternate infinite; } What this demonstrates is that typically, to accomplish effects like this, the heavy lifting is done by the font. We really only need a few lines of CSS for the animation, which if you think about it, is pretty incredible. There are all sorts of interesting, creative applications of variable fonts, and a lot of incredible fonts you can make the most of. Whether you want to create that “hand-writing” effect that we often see represented with SVG, or something a little different, there are a lot of different options. Duos Writer: Hand Writing Demo of hand writing variable font, Duos Writer by Underware. Decovar: Disappearing Text See the Pen CSS-only variable font demo using Decovar Regular by Mandy Michael (@mandymichael) on CodePen. Cheee: Snow Text Snow Text Effect - Text fills up with snow and gets “heavier” at the bottom as more snow gathers. Featuring “Cheee” by OhNoTypeCo. View on Codepen. Variable Fonts, Media Queries and Customisation It’s not that these are just beautiful or cool effects, what they demonstrate is that as developers and designers we can now control the font itself and that that means is that variable fonts allow typography on the web to adapt to the flexible nature of our screens, environments and devices. We can even make use of different CSS media queries to provide more control over our designs based on environments, light contrast and colour schemes. Though the CSS Media Queries Level 5 Spec is still in draft stages, we can experiment with the prefers-color-scheme (also known as dark mode) media query right now! Dark Mode featuring Oozing Cheee by OhNoTypeCo Oozing Dark Mode Text featuring “Cheee” by OhNoTypeCo. View Demo on Codepen. The above example uses a font called “Cheee” by OhNoTypeCo and demonstrates how to make use of a CSS Transition and the prefers-color-scheme media query to transition the axis of a variable font. h1 { font-family: “Cheee" font-variation-settings: "TEMP" 0; transition: all 4s linear; } @media (prefers-color-scheme: dark) { h1 { font-variation-settings: "TEMP" 1000; } } Dark mode isn’t just about changing the colours, it’s important to consider things like weight as well. It’s the combination of the weight, colour and size of a font that determines how legible and accessible it is for the user. In the example above, I’m creating a fun effect – but more practically, dark mode allows us to modify the contrast and styles to ensure better legibility and usability in different environments. What is even more exciting about variable fonts in this context is that if developers and designers can have this finer control over our fonts to create more legible, accessible text, it also means the user has access to this as well. As a result, users that create their own stylesheets to customise the experience to their specific requirements, can now adjust the pages font weight, width or other available axis to what best suits them. Providing users with this kind of flexibility is such an incredible opportunity that we have never had before! As CSS develops, we’ll have access to different environmental and system features that allow us to take advantage of our users unique circumstances. We can start to design our typography to adjust to things like screen width - which might allow us to tweak the font weight, width, optical size or other axes to be more readable on smaller or larger screens. Where the viewport is wide we can have more detail, when its smaller in a more confined space we might look at reducing the width of the font—this helps to maintain the integrity of the design as the viewport gets smaller or, to fit text into a particular space. See the Pen CSS is Awesome - Variable fonts Edition. by Mandy Michael (@mandymichael) on CodePen. We have all been in the situation where we just need the text to be slightly narrower to fit within the available space. If you use a variable font with a width axis you can slightly modify the width to adjust to the space available, and do so in a way that the font was designed to do, rather than using things like letter spacing which doesn’t consider the kerning of the characters. Variable Fonts, JavaScript and Interactive Effects We can take these concepts even further and mix in a little JavaScript to make use of a whole suite of different interactions, events, sensors and apis. The best part about this is whether you are using device orientation, light sensors, viewport resizes, scroll events or mouse movement, the base JavaScript doesn’t really change. To demonstrate this, we’ll use a straightforward example – we’ll match our font weight to the size of our viewport – as the viewport gets smaller, the font weight gets heavier. Demo: As the viewport width changes, the weight of the text “Jello” becomes heavier. We’ll start off by setting our base values. We need to define the minimum and maximum axis values for the font weight, and the minimum and maximum event range, in this case the viewport size. Basically we’re defining the start and end points for both the font and the event. // Font weight axis range const minAxisValue = 200 const maxAxisValue = 900 // Viewport range const minEventValue = 320px const maxEventValue = 1440px Next we determine the current viewport width, which we can access with something like window.innerWidth. // Current viewport width const windowWidth = window.innerWidth Using the current viewport width value, we create the new scale for the viewport, so rather than the pixels values we convert it to a range of 0 - 0.99. const windowSize = (windowWidth - minEventValue) / (maxEventValue - minEventValue) // Outputs a value from 0 - 0.99 We then take that new viewport decimal value and use it to determine the font weight based on viewport scale. const fontWeight = windowSize * (minAxisValue - maxAxisValue) + maxAxisValue; // Outputs a value from 200 - 900 including decimal places This final value is what we use to update our CSS. You can do this however you want – lately I like to use CSS Custom Properties. This will pass the newly calculated font weight value into our CSS and update the weight as needed. // JavaScript p.style.setProperty("--weight", fontWeight); Finally, we can put all this inside a function and inside an event listener for window resize. You can modify this however you need to in order to improve performance, but in essence, this is all you need to achieve the desired outcome. function fluidAxisVariation() { // Current viewport width const windowWidth = window.innerWidth // Get new scales for viewport and font weight const viewportScale = (windowWidth - 320) / (1440 - 320); const fontWeightScale = viewportScale * (200 - 900) + 900; // Set in CSS using CSS Custom Property p.style.setProperty("--weight", fontWeightScale); } window.addEventListener("resize", fluidAxisVariation); You can apply this to single elements, or multiple. In this case, I’m changing the paragraph font weights and different rates, but also reducing the width axis of the headline so it doesn’t wrap onto multiple lines. As previously mentioned, this code can be used to create all sorts of really amazing, interesting effects. All that’s required is passing in different event and axis values. In the following example, I’m using mouse position events to change the direction and rotation of the stretchy slinky effect provided by the font “Whoa” by Scribble Tone. See the Pen Slinky Text - WHOA Variable font demo by Mandy Michael (@mandymichael) on CodePen. We can also take the dark mode/colour schemes idea further by making use of the Ambient Light Sensor to modify the font to be more legible and readable in low light environments. This effect uses Tiny by Jack Halten Fahnestock from Velvetyne Type Foundry and demonstrates how we modify our text based by query the characteristics of the user’s display or light-level, sound or other sensors. It’s only because Variable fonts give us more control over each of these elements that we can fine-tune the font characteristics to maximise the legibility, readability and overall accessibility of our website text. And while these examples might seem trivial, they are great demonstrations of the possibilities. This is a level of control over our fonts and text that is unprecedented. Using device orientation to change the scale and weight of individual characters. View on Codepen. Variable Fonts offer a new world of interactivity, usability and accessibility, but they are still a new technology. This means we have the opportunity to figure out how and what we can achieve with them. From where I stand, the possibilities are endless, so don’t be limited by what we can already do – the web is still young and there is so much for us to create. Variable fonts open up doors that never existed before and they give us an opportunity to think more creatively about how we can create better experiences for our users. At the very least, we can improve the performance of our websites, but at best, we can make more usable, more accessible, and more meaningful content - and that, is what gets me really excited about the future of web typography with variable fonts. About the author Mandy is a community organiser, speaker, and developer working as the Front End Development Manager at Seven West Media in Western Australia. She is a co-organiser and Director of Mixin Conf, and the founder and co-organiser of Fenders, a local meetup for front-end developers providing events, mentoring and support to the Perth web community. Mandy’s passion is CSS, HTML and JS and hopes to inspire that passion in others. She loves the supportive and collaborative nature of the web and strives to encourage this environment through the community groups she is a part of. Her aim is to create a community of web developers who can share, mentor, learn and grow together. More articles by Mandy Full Article Code Design typography
and Art Direction and the New WordPress Editor By feedproxy.google.com Published On :: Fri, 13 Dec 2019 12:00:00 +0000 Mel Choyce explores how the new WordPress editor (also know as Gutenberg) can be used to create more carefully art directed posts. Like gifts carefully arranged beneath the Christmas tree, it’s the contents that matters but the presentation that sells. The New York Times release of Snowfall in 2012 took the web industry by storm. Media-rich and captivating, its design evoked wonder, fear, and desperation in the face of an avalanche. Snowfall was one of the first great art directed digital experiences in this era of the modern web (Space Jam, obviously, being one of the great experiences of the era prior). “Art direction combines art and design to evoke a cultural and emotional reaction. …Art direction is about evoking the right emotion, it’s about creating that connection to what you’re seeing and experiencing.” Art Direction and Design by Dan Mall Art direction isn’t a new concept. Pick up any magazine or print publication — designers have long been creating evocative media experiences. Then the web came and messed that up. Fonts and even colors were limited at first, especially if you wanted to create something using semantic HTML rather than Flash. Early HTML and CSS didn’t offer great ways to create dynamic layouts like you’d see in a magazine. Floats, am I right? A lot’s changed in the past decade. We have reliable ways to serve fonts, opening up vast typographic possibilities. CSS features like Flexbox and Grid allow for complex layouts. Plus, our hardware is getting better and better. We live in exciting times. Behind the curve But not everyone’s kept up. For most of its history, the WordPress editor was a text-first writing experience, shining with simple blogs but falling flat in the face of a complex website. Want some columns on your page? Well, there’s a plugin for that, it lets you write some pseudo-code WordPress called shortcodes, and yeah you just need to wrap your columns in this code in your editor… Or, uh, maybe you could hand-code a template for your theme that offers three columns of widget areas and put everything in there? Or maybe… You get the point. The new WordPress editor (codenamed “Gutenberg”) introduces the concept of blocks, like building blocks or bricks or LEGO. Rather than needing to hand-code anything, you have an interface for editing all sorts of content, even the aforementioned former nightmare of columns. Blocks can come with placeholders, so you can fill-in-the-blanks rather than having to build from scratch. The new WordPress block editor allows me to focus on the best way of presenting my content instead of focusing on how I’m going to technically enter the content. The block editor allows my designer brain to think more creatively. I can go about creating an appropriate emotional reaction for a site’s content, rather than focusing on implementation. Block it to me The building blocks of the new editor (text, media) are the same, but the new ways to combine and build upon those blocks makes for a better art direction experience. Your browser doesn’t support HTML5 video. Here is a link to the video instead. New to the WordPress editor is the Media and Text block, which combines — you guessed it — media and text into a new way to approach layouts. Your browser doesn’t support HTML5 video. Here is a link to the video instead. This is the foundation of the new WordPress editor. Take atomic pieces, and combine them to make whole sections and layouts. Best yet, no fumbling with floats if you want to put some text next to an image! Do you want to build a website? Let’s imagine I’m building a website for a non-profit that rescues black cats. They offer adoption services, run a fostering program, and take in abandoned, feral, or other cats in need. The primary goal of the site is to connect people to the rescue organization. Raising awareness and soliciting donations are secondary, but still important factors. Because so much of a person’s experience with WordPress is contingent on their particular setup — themes, plugins, and admin customizations — I’ve decided to keep this site pretty light. The Twenty Twenty Theme WordPress releases a new default theme pretty much every year. This year’s theme, Twenty Twenty, was built with Gutenberg in mind. It supports optional features like color schemes and wider block alignments. The design is clean and modern, and offers some additional customization options. I think it’s a good choice for this website. Columns While there’s no internal grid system in WordPress (yet!), the Columns block comes close to allowing complex layouts within a post or page. With it, you can start to break out of one column and think more like a print designer. The most straightforward layout we could do is a familiar pattern on the web — three feature columns consisting of a heading, some text, and a button. To accomplish this, I loaded up the editor and started planning. First, I added a group block to contain my columns, and provide a background color. (The columns block does not currently support background colors, but it might in the future.) I want my columns to stand out from the white background of the page, so I opt for a light grey. Within the group, I placed my Column block, which features a convenient placeholder to help me pick which layout I want: I opt for the three column option. From here, it’s easy to build out my section — headings, paragraphs, and buttons are all existing blocks I can plop right into my columns: It looks really good on the front-end of my site, too: This is all fairly straightforward, but by changing up a couple columns widths and some sizing, I can get something that looks more dynamic and draws attention to the adoption process, which is the most important feature: I could even add an image, change up my background color to match, and nest “Foster” and “Save” into another set of columns beneath “Adopt”: All of this from the same set of blocks, yet each variation strikes a different impact. …And, you know, feels a little less like this: which one of the two possible websites are you currently designing? pic.twitter.com/ZD0uRGTqqm— Jon Gold (@jongold) February 2, 2016 But if I wanted to start looking like that, uh, second example — I can! Media and Text The aforementioned Media and Text block is a great building block for some eye-catching, informational parts of my homepage. Galleries To break up all that text content and get my site looking less like it’s for a startup, how about adding even more cute cats in between? You can never have too many cat photos on the internet. CoBlocks is a fantastic plugin that adds new blocks to WordPress, among them the icon block I used above, as well as a couple of different gallery layouts. I think carousels are terrible when they’re used for showcasing features or content, but I think they’re a good gallery format, and having something horizontal means my cats aren’t taking up too much space (unlike my own black cat, who likes to hog all my leg room in bed). My favorite thing about this block is that, even though it’s fully-featured, it’s still 100x less of a chaotic mess than any other slider plugin I’ve experienced in WordPress. CoBlocks comes with Carousel, Collage, Masonry, Offest, and Stacked gallery blocks. The default Gallery block in WordPress is also pretty good — much better than it used to be. Buttons Alright, where am I? I have my intro columns featuring the primary information about site, some informational text, lots of cute cat photos, more informational text… I think my homepage is shaping up. I just need one final element: a donation section. Can’t take care of those kitties without some cash. The only way to integrate payments into WordPress is to either link to a third party platform, or use a plugin. I’ve used ActBlue quite a bit when making candidate websites, so I’m going to pretend that this site uses a third party service that, like ActBlue, lets me link to specific donation increments off-site. WordPress has a Buttons block underway that lets you add a row of buttons, without needing to rely on another block like Columns, but in the meantime, CoBlocks has an equivalent block I can use for now. Great. It’s got a bold color, and I can link to a couple different donation increments. But it could really use… something, you know, that draws the eye even more? Shape Divider CoBlocks has another great block, Shape Divider, which lets you add a decorative border that sits nicely above or below any container element, like the group block I’m using here. It comes with a variety of shape styles, like hills, rounded, and pointed. I settle on waves, which includes some overlapping transparencies along the top. It’s different from the rest of my page, but in a good way — it’s a subtle way for that section to stand out. With that final block, my homepage is almost done. I just want to touch on two more blocks that can be used to improve the design: the Separator block, and the Spacer block. Separator Separator inserts an <hr /> into the page, with some minimal styles to make it look nice. Themes can then add new styles, or restyle the default to get some fancy alternatives, like this: The Separator block is a great way to break up sections in a page. Spacer The Spacer block is an abomination, but I love it. It’s just an empty space. Think spacer gif, but spacer div. It’s terrible, but oh, oh so useful. I can increase space between elements without having to write any custom CSS. It empowers folks that are visual, but not technical. Combine it with Columns and you can almost pretend that you’re using a grid! (It is, at the very least, hidden from screen readers.) Okay but what does it look like? With those in place, let’s check out my homepage. Almost perfect. It’s bold, streamlined, and features plenty of cute cats. The only issue that caught my eye is the gap of white between the page content and the footer, which I can fix with some CSS added into WordPress’s Customizer tool: .home .footer-nav-widgets-wrapper { margin-top: 0; } Not too bad, considering this is the first bit of CSS I’ve had to write for my homepage layout. Much better. How about the old editor? Out of curiosity, I tried to recreate my homepage using the Classic Editor plugin, which restores the old WordPress editing interface. Since I used some of my favorite plugins on my block editor site, I decided it was only fair to leverage plugins on my classic site. I installed Shortcodes Ultimate, a plugin offering over 60 shortcodes to improve the WordPress editor. It has a good shortcode picking interface, great documentation, and in my opinion, is one of the best shortcode plugins the WordPress community has to offer. Your browser doesn’t support HTML5 video. Here is a link to the video instead. This wasn’t fun. No shortcode interface will make the experience worth it to me, when I could use Gutenberg. One misplaced bracket, and I’ve borked my site. It takes a whole lot of time. And, I almost always need to write a bunch of custom styles to get it to work with my theme. Yes, this is a LiveJournal icon I’ve had saved for like, 16 years. With our homepage complete, let’s move on to some interior pages. There are a couple other blocks, and combinations of blocks, that can help me build out the rest of my site. Cover Block One of the earliest complex blocks offered in the new WordPress editor was the “Cover” block, which can be used for banners and hero images: Originally, it only allowed you to add an image or video, headings, and paragraphs, but the requirements have recently been loosened so you can add whatever blocks you like. This can lead to some unique layout possibilities. Take, for example, a “Teams” section on our About page. We could use columns to make a simple layout, like this: But if we have better images, we could explore using Cover to create more visual impact: Let’s say we didn’t have any staff images, or they’re all poor quality and weirdly cropped, which is… not an usual occurrence! We can forego images altogether and instead, use the new gradient picker in Cover and use that to create visual impact: Explore third-party blocks Like CoBlocks’s gallery blocks, many third-party WordPress plugins can enhance your site and allow you to create a better experience for your visitors. Accordions Let’s say this rescue organization has some FAQs. Rather than creating a wall-of-text, we could use an accordion block to organize the content for easier browsing: Accordion Block from CoBlocks Grids If columns aren’t adequate for achieving the layout you’re looking to build, you could try the Grids plugin by Evolve, which comes with a “build your own grid” feature: I can use this block to make a more visually interesting landing page for the “Get Involved” section, which only exists to link out to its child pages: Typography You can also use plugins like CoBlocks and Kioken Blocks to customize your site’s typography, opening up the possibilities for a truly from-scratch site design. And I have to admit, as someone who makes web software, the idea of giving full typographic control to users terrifies me… but as a designer, I absolutely love this feature! ???? With these tools, it won’t take long to finish my website. Tons of new possibilities Mix and match to create beautiful, art-directed experiences using blocks. You can look for plugins that support and build on the new editor, or specifically download individual blocks in the new WordPress block directory (just beta launched!). Unsure of how to combine blocks to make an impact? A couple of plugins like Atomic Blocks, Kioken Blocks, and Ultimate Addons for Gutenberg include pre-curated layouts you can quickly add to your own sites. These layouts are already art directed, so you can choose the one that creates the biggest impact on your own audience. Explore, and share your results! About the author Mel Choyce is a wicked awesome product designer based in Boston, Massachusetts. Not only is Mel a WordPress Core Committer and former Release Lead, she is a regular core contributor and speaks frequently at WordCamps on design, typography, and user experience. When Mel isn’t designing products at Automattic, she enjoys cold brew coffee, craft beer, and rocking out in her band. Say hi to her on Twitter at @melchoyce, and visit her site at choycedesign.com. More articles by Mel Full Article Design design
and Design Tokens and Component Based Design By feedproxy.google.com Published On :: Sat, 14 Dec 2019 12:00:00 +0000 Stuart Robson rolls up his sleeves and begins to piece together the jigsaw puzzle that is design tokens and component based design. Starting with the corners, and working around the edges, Stu helps us to piece together a full picture of a modern design system. If you stare at your twitter feed long enough, it can look like everyone is talking about Design Systems. In some cases you could be persuaded to think how shallow the term can go. “Isn’t this what we called Style Guides?”, “Here’s my React Design System”, “I’ve just updated the Design System in Sketch” To me, they are some and all of these things. Over the last 4 years of consulting with two clients on their Design System, my own view has changed a little. If you dig a little deeper into Design Systems twitter you will probably see the term “Design Tokens” pop up at least once a day somewhere. Design Tokens came out of work that was being done at Salesforce with Jina and others who pioneered the creation of Design Tokens as we know them today – creating the first command line tool in Theo that had started the adoption of Design Tokens to the wider Design Systems Community. A cool term but, what are they? If you look at your client work, your companies site, the project you’re working on you should notice some parts of the page have a degree of consistency: the background colour of your form buttons is the same colour as your link text, or your text has the same margin, or your card elements have the same spacing as your media object. These are design decisions, and they should be littered across the overall design of your project. These decisions might start off in a Sketch file and make their way into code from detailed investigation of a Sketch file, or you may find that the design evolves from your design application once it gets into code. These design decisions can change, and to keep them synchronised across design and development in applications, as well as a larger documentation site in your Design System, is going to take some effort. This is where Design Tokens come in, and I find the best way to succinctly reiterate what they are is via the two following quotes… “Design Tokens are an abstraction for everything impacting the visual design of an app/platform.” – Sönke Rohde …and “We use them in place of hard-coded values in order to maintain a scale-able and consistent visual system.” – Jina There are several global design decisions that we can abstract to create a top level design token – Sizing, Font Families, Font Styles, Font Weights, Font Sizes, Line Heights, Border Styles, Border Colours, Border Radius, Horizontal Rule Colours, Background Colours, Gradients, Background Gradients, Box Shadows, Filters, Text Colours, Text Shadow, Time, Media Queries, Z Index, Icons – these can all be abstracted as required. So, spicy Sass variables? We can look at Design Tokens as an abstraction of CSS, sort of like Sass variables, but spicier. Looking at them like this we can see that they are (in either .yaml or .json) a group of related key value pairs with more information that can be added as needed. The great thing with abstracting design decisions outside of your CSS pre-processor is that you’re not tying those decisions to one platform or codebase. As a crude example, we can see here that we are defining a name and a value that could then become our color, background-color, or border-color, and more. # Colours # ------- - name: color-red value: #FF0000 - name: color-green value: #00FF00 - name: color-blue value: #0000FF - name: color-white value: #FFFFFF - name: color-black value: #000000 These can then generate our Sass variables (as an example) for our projects. $color-red: #FF0000 !default; $color-green: #00FF00 !default; $color-blue: #0000FF !default; $color-white: #FFFFFF !default; $color-black: #000000 !default; Why are they so good Ok, so we now know what Design Tokens are, but why do we need them? What makes them better than our existing solutions (css pre-processors) for defining these design decisions? I think there are 5 really good reasons why we all should start abstracting these design decisions away from the CSS that they may live in. Some of these reasons are similar to reasons some developers use a pre-processor like Sass, but with added bonuses. Consistency Much like using a CSS pre-processor or using CSS custom properties, being able to define a background colour, breakpoint, or font-size in more than one place using the same key ensures that we are using the Sass values across the entire product suite we are developing for. Using our Design Tokens in their generated formats, we can be sure to not end up with 261 shades of blue. Maintainability By using a pre-processor like Sass, or using native CSS custom properties, we can already have maintainable code in our projects. Design Tokens also do this at the abstracted level as well. Scalability “Design Tokens enable us to scale our Design across all the permutations.” – Jina At this point, we’re only talking about abstracting the design decisions for use in CSS. Having Design Tokens allows design to scale for multiple brands or multiple projects as needed. The main benefit of Design Tokens in regards to scalability is the option that it gives us to offer the Design Tokens for other platforms and frameworks as needed. With some of the tools available, we can even have these Tokens shared between applications used by designers and developers. Your marketing site and your iOS application can soon share the same design decisions codified, and you can move towards creating an Android app or web application as required. Documentation If we abstract the design decisions from one platform specific programming language it would be no good if it wasn’t made to be easily accessible. The tools and applications available that are mentioned later in this article can now create their own documentation, or allow you to create your own. This documentation is either hosted within a web-based application or can be self-hosted with the rest of your Design Systems documentation. Most of the command line tools go further and allow you do add more details that you wish to convey in the documentation, making it as unique as it is required for your project. Empowerment When you abstract your design decisions to Design Tokens, you can help empower other people on the project. With the tools available today, and the tools that are just around the corner, we can have these design decisions determined by anyone on the team. No-one necessarily needs to understand how to set up the codebase to update the colour slightly. Some of the tools I mention later on allow you to update the Design Tokens in the browser. Design Systems are already “bridging the gap” between design and development. With Design Tokens and the tooling available, we can create better team relationships by closing that gap instead. Some of the benefits of creating and using Design Tokens are the same as using a pre-processor when it comes to authoring CSS. I feel the added bonuses of being able to empower other team members and document how you use them, as well as the fundamental reasoning in that they can be platform agnostic, are all great “selling points” to why you need to start using Design Tokens today. Tools There are several tools available to help you and your team to create the required files from your abstracted Design Tokens: Command Line Tools There are several tools available on the command line that can be used as part of, or separate to, your development process. These tools allow you to define the Design Tokens in a .json or .yaml file format which can then be compiled into the formats you require. Some have built in functions to turn the inputted values to something different when compiled – for example, turning hexadecimal code that is a Design Token into a RGB value in your .css file. These command line tools, written in JavaScript, allow you to create your own ways in which you want things transformed. My current client has certain design decisions for typography in long form content (font size, weight, line height and margins) which need to be together to make sense. Being able to write JavaScript to compile these design decisions into an independent Sass map for each element allows us to develop with assurance that the long form content has the correct styling. WYSIWYG Tools WYSIWYG (What You See Is What You Get Tools) have been around for almost as long as we have been able to make websites. I can just about remember using Dreamweaver 2, before I knew what a <table> was. When browsers started to employ vendor prefixes to new CSS for their browsers, a flurry of online WYSIWYG tools came with it built in. They’re still there, but the industry has moved on. Design Tokens also have a few WYSIWYG tools available. From simpler online tools that allow you to generate the correct Sass variables needed for your design decisions to tools that store your decisions online and allow you to export them as npm packages. These types of tools for creating Design Tokens can help empower the team as a whole, with some automatically creating documentation which can easily be shared with a url. Retrofitting Tools If you are starting from scratch on a new re-design or on a new project that requires a Design System and Tokens, the many of the tools mentioned above will help you along your way. But what if you’re in the middle of a project, or you have to maintain something and want to start to create the parts required for a Design System? Luckily there are several tools and techniques to help you make a start. One new tool that might be useful is Superposition. Currently in private beta with the public release set for Q1 of 2020 Superposition helps you “Extract design tokens from websites and use them in code and in your design tool.” Entering your domain gives you a nice visual documentation of your sites styles as Design Tokens. These can then be exported as Sass Variables, CSS Custom Properties, JavaScript with the team working on exports to iOS and Android. If you have an existing site, this could be a good first step before moving to one of the other tools mentioned above. You could also make use of CSSStats or Project Wallace’s Analysis page that I mentioned earlier. This would give you an indication of what Design Tokens you would need to implement. Component Based Design So, we’ve created our Design Tokens by abstracting the design decisions of brand colours, typography, spacing and more. Is that as far as we can go? Levels of Design Decisions Once we have created our first set of Design Tokens for our project, we can take it that little bit deeper. With command line tools and some of the applications available, you can link these more global decisions to a more deeper level. For example, you can take your chosen colours and make further design decisions on the themes of your project, such as what the primary, secondary, or tertiary colours are or what your general component and layout spacing will be. With this, we can go one step further. We could also define some component specific design decisions that can then be compiled for the developer to use. Invest in time to check over the designs with a fine toothcomb and make sure you are using the correct Sass variable or CSS custom property for that component. If you are going more than one or two levels of design decision making, you can compile each set of these Design Tokens to your Sass variables which can then be used as required. So you can provide: global, theme, component level Sass variables which can be used in the project. Or you could choose to only compile what you need for the components you are creating. Variables, Maps, Custom Properties Some of the tools available for creating and maintaining your Design Tokens allow you to compile to certain programming languages. With my current client work, I am making use of Sass variables, Sass maps, and CSS custom properties. The Design Tokens are compiled into one or more of these options depending on how they will be used. Colours are compiled as global Sass variables, inside of a couple of Sass maps and CSS custom properties. Our macro layout breakpoints are defined as a single Sass map. If we know we are creating a component that has the ability to be themed, we can make use of CSS custom properties to reduce the amount of CSS we need to override, and also allow us to inline things that can be changed via a CMS as required. Which leaves us using Sass variables for parts of a component that won’t change. We are using Sass maps differently still. As mentioned, we generate a Sass map containing the design decisions for each element of text, and we can use long form text. This Sass map is then compiled into separate CSS declarations as needed using Sass mixins. I find the beauty of being able to make use of the global, themed, and component level design decisions by compiling them into various formats (that essentially become CSS) and that gives us more power in authoring components. Creating Consistent Utility Classes As you have created your more global generic design decisions, you can create your own small set of utility classes. Using a pre-processor like Sass you can define a set of mixins and functions that can take your Design Tokens that have been compiled down into variables and maps and generate separate classes for each design decision. By making tokens available to all digital teams, we can enable them to create custom experiences that are aligned to current visual standards when a component does not (or will not) exist in the design system. Maya King In creating utility classes with Design Tokens (using something like Sass) you have consistency with the overall Design System for times when you or a team need to create a one-off component for a project. These exceptions tend to be something that won’t make it as part of the overall Design System, but it still needs that look and feel. Having classes available that we can guarantee use the generic, global design decisions from the Design Tokens means these one-off components should be well on their way to have the overall look and feel of the project, and will get any updates with little to no additional overhead. Wrapping Up I think we are starting to see the potential of using Design Tokens as Design Systems become even more popular. I think that, from this overview, we can see how they can help us close the gap that still exists in places between the designers and developers on the team. They can help empower people who do not code to make changes that can be automatically updating live work. I think you can start now. You may not have or need what you could term “a fully-fledged Design System” but this small step will help move towards one in the future and give you instant benefits of consistency and maintainability now. If you want more Design Tokens, as well as the links that are dotted around this article I also maintain a GitHub repo of Awesome Design Tokens which I try to keep updated with links to tools, articles, examples, videos, and anything else that’s related to Design Tokens. About the author Stuart Robson is a freelance front-end developer and design systems advocate who curates the design systems newsletter - news.design.systems More articles by Stuart Full Article Design style-guides
and Building a Dictaphone Using Media Recorder and getUserMedia By feedproxy.google.com Published On :: Tue, 17 Dec 2019 12:00:00 +0000 Chris Mills brushes up his shorthand and shows how the MediaStream Recording API in modern browsers can be used to capture audio directly from the user’s device. Inching ever closer to the capabilities of native software, it truly is an exciting time to be a web developer. The MediaStream Recording API makes it easy to record audio and/or video streams. When used with MediaDevices.getUserMedia(), it provides an easy way to record media from the user’s input devices and instantly use the result in web apps. This article shows how to use these technologies to create a fun dictaphone app. A sample application: Web Dictaphone To demonstrate basic usage of the MediaRecorder API, we have built a web-based dictaphone. It allows you to record snippets of audio and then play them back. It even gives you a visualisation of your device’s sound input, using the Web Audio API. We’ll just concentrate on the recording and playback functionality in this article, for brevity’s sake. You can see this demo running live, or grab the source code on GitHub. This has pretty good support on modern desktop browsers, but pretty patchy support on mobile browsers currently. Basic app setup To grab the media stream we want to capture, we use getUserMedia(). We then use the MediaRecorder API to record the stream, and output each recorded snippet into the source of a generated <audio> element so it can be played back. We’ll first declare some variables for the record and stop buttons, and the <article> that will contain the generated audio players: const record = document.querySelector('.record'); const stop = document.querySelector('.stop'); const soundClips = document.querySelector('.sound-clips'); Next, we set up the basic getUserMedia structure: if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { console.log('getUserMedia supported.'); navigator.mediaDevices.getUserMedia ( // constraints - only audio needed for this app { audio: true }) // Success callback .then(function(stream) { }) // Error callback .catch(function(err) { console.log('The following `getUserMedia` error occured: ' + err); } ); } else { console.log('getUserMedia not supported on your browser!'); } The whole thing is wrapped in a test that checks whether getUserMedia is supported before running anything else. Next, we call getUserMedia() and inside it define: The constraints: Only audio is to be captured for our dictaphone. The success callback: This code is run once the getUserMedia call has been completed successfully. The error/failure callback: The code is run if the getUserMedia call fails for whatever reason. Note: All of the code below is found inside the getUserMedia success callback in the finished version. Capturing the media stream Once getUserMedia has created a media stream successfully, you create a new Media Recorder instance with the MediaRecorder() constructor and pass it the stream directly. This is your entry point into using the MediaRecorder API — the stream is now ready to be captured into a <Blob>, in the default encoding format of your browser. const mediaRecorder = new MediaRecorder(stream); There are a series of methods available in the MediaRecorder interface that allow you to control recording of the media stream; in Web Dictaphone we just make use of two, and listen to some events. First of all, MediaRecorder.start() is used to start recording the stream once the record button is pressed: record.onclick = function() { mediaRecorder.start(); console.log(mediaRecorder.state); console.log("recorder started"); record.style.background = "red"; record.style.color = "black"; } When the MediaRecorder is recording, the MediaRecorder.state property will return a value of “recording”. As recording progresses, we need to collect the audio data. We register an event handler to do this using mediaRecorder.ondataavailable: let chunks = []; mediaRecorder.ondataavailable = function(e) { chunks.push(e.data); } Last, we use the MediaRecorder.stop() method to stop the recording when the stop button is pressed, and finalize the Blob ready for use somewhere else in our application. stop.onclick = function() { mediaRecorder.stop(); console.log(mediaRecorder.state); console.log("recorder stopped"); record.style.background = ""; record.style.color = ""; } Note that the recording may also stop naturally if the media stream ends (e.g. if you were grabbing a song track and the track ended, or the user stopped sharing their microphone). Grabbing and using the blob When recording has stopped, the state property returns a value of “inactive”, and a stop event is fired. We register an event handler for this using mediaRecorder.onstop, and construct our blob there from all the chunks we have received: mediaRecorder.onstop = function(e) { console.log("recorder stopped"); const clipName = prompt('Enter a name for your sound clip'); const clipContainer = document.createElement('article'); const clipLabel = document.createElement('p'); const audio = document.createElement('audio'); const deleteButton = document.createElement('button'); clipContainer.classList.add('clip'); audio.setAttribute('controls', ''); deleteButton.innerHTML = "Delete"; clipLabel.innerHTML = clipName; clipContainer.appendChild(audio); clipContainer.appendChild(clipLabel); clipContainer.appendChild(deleteButton); soundClips.appendChild(clipContainer); const blob = new Blob(chunks, { 'type' : 'audio/ogg; codecs=opus' }); chunks = []; const audioURL = window.URL.createObjectURL(blob); audio.src = audioURL; deleteButton.onclick = function(e) { let evtTgt = e.target; evtTgt.parentNode.parentNode.removeChild(evtTgt.parentNode); } } Let’s go through the above code and look at what’s happening. First, we display a prompt asking the user to name their clip. Next, we create an HTML structure like the following, inserting it into our clip container, which is an <article> element. <article class="clip"> <audio controls></audio> <p>_your clip name_</p> <button>Delete</button> </article> After that, we create a combined Blob out of the recorded audio chunks, and create an object URL pointing to it, using window.URL.createObjectURL(blob). We then set the value of the <audio> element’s src attribute to the object URL, so that when the play button is pressed on the audio player, it will play the Blob. Finally, we set an onclick handler on the delete button to be a function that deletes the whole clip HTML structure. So that’s basically it — we have a rough and ready dictaphone. Have fun recording those Christmas jingles! As a reminder, you can find the source code, and see it running live, on the MDN GitHub. This article is based on Using the MediaStream Recording API by Mozilla Contributors, and is licensed under CC-BY-SA 2.5. About the author Chris Mills manages the MDN web docs writers’ team at Mozilla, which involves spreadsheets, meetings, writing docs and demos about open web technologies, and occasional tech talks at conferences and universities. He used to work for Opera and W3C, and enjoys playing heavy metal drums and drinking good beer. More articles by Chris Full Article Code apis
and Five Interesting Ways to Use Array.reduce() (And One Boring Way) By feedproxy.google.com Published On :: Wed, 18 Dec 2019 12:00:00 +0000 Chris Ferdinandi turns the heat down low and lets the sauce reduce while we take a look at how to add spice to our source with a sprinkling of Array.reduce(). Just a little ingenuity with the humblest of functions. Of all the modern array methods, the one I had the hardest time wrapping my head around was Array.reduce(). On the surface, it seems like a simple, boring method that doesn’t do much. But below its humble exterior, Array.reduce() is actually a powerful, flexible addition to your developer toolkit. Today, we’re going to look at some cool things you can do with Array.reduce(). How Array.reduce() works Most of the modern array methods return a new array. The Array.reduce() method is a bit more flexible. It can return anything. Its purpose is to take an array and condense its content into a single value. That value can be a number, a string, or even an object or new array. That’s the part that’s always tripped me up – I didn’t realize just how flexible it is! The syntax The Array.reduce() accepts two arguments: a callback method to run against each item in the array, and a starting value. The callback also accepts two arguments: the accumulator, which is the current combined value, and the current item in the loop. Whatever you return is used as the accumulator for the next item in the loop. On the very first loop, that starting value is used instead. var myNewArray = [].reduce(function (accumulator, current) { return accumulator; }, starting); Let’s look at some examples to make this all tangible. 1. Adding numbers together Let’s say you had an array of numbers that you wanted to add together. Using Array.forEach(), you might do something like this: var total = 0; [1, 2, 3].forEach(function (num) { total += num; }); This is the cliche example for using Array.reduce(). I find the word accumulator confusing, so in this example, I’m calling it sum, because that’s what it is. var total = [1, 2, 3].reduce(function (sum, current) { return sum + current; }, 0); Here, we pass in 0 as our starting value. In the callback, we add the current value to the sum, which has our starting value of 0 on the first loop, then 1 (the starting value of 0 plus the item value of 1), then 3 (the sum value of 1 plus the item value of 2), and so on. Here’s a demo. 2. Combining multiple array methods into Array.map() and Array.filter() into a single step Imagine you had an array of wizards at Hogwarts. var wizards = [ { name: 'Harry Potter', house: 'Gryfindor' }, { name: 'Cedric Diggory', house: 'Hufflepuff' }, { name: 'Tonks', house: 'Hufflepuff' }, { name: 'Ronald Weasley', house: 'Gryfindor' }, { name: 'Hermione Granger', house: 'Gryfindor' } ]; You want to create a new array that contains just the names of wizards who are in Hufflepuff. One way you could do that is by using the Array.filter() method to get back just wizards whose house property is Hufflepuff. Then, you’d use the Array.map() method to create a new array containing just the name property for the remaining wizards. // Get the names of the wizards in Hufflepuff var hufflepuff = wizards.filter(function (wizard) { return wizard.house === 'Hufflepuff'; }).map(function (wizard) { return wizard.name; }); With the Array.reduce() method, we can get the same array in a single pass, improving our performance. You pass in an empty array ([]) as the starting value. On each pass, you check to see if the wizard.house is Hufflepuff. If it is, you push it to the newArr (our accumulator in this example). If not, you do nothing. Either way, you return the newArr to become the accumulator on the next pass. // Get the names of the wizards in Hufflepuff var hufflepuff = wizards.reduce(function (newArr, wizard) { if (wizard.house === 'Hufflepuff') { newArr.push(wizard.name); } return newArr; }, []); Here’s another demo. 3. Creating markup from an array What if, instead of creating an array of names, we wanted to create an unordered list of wizards in Hufflepuff? Instead of passing an empty array into Array.reduce() as our starting value, we’ll pass in an empty string ('') and call it html. If the wizard.house equals Hufflepuff, we’ll concatenate our html string with the wizard.name wrapped in an opening and closing list item (li). Then, we’ll return the html to become the accumulator on the next loop. // Create a list of wizards in Hufflepuff var hufflepuffList = wizards.reduce(function (html, wizard) { if (wizard.house === 'Hufflepuff') { html += '<li>' + wizard.name + '</li>'; } return html; }, ''); Add an opening and closing unordered list element before and after Array.reduce(), and you’re ready to inject your markup string into the DOM. // Create a list of wizards in Hufflepuff var hufflepuffList = '<ul>' + wizards.reduce(function (html, wizard) { if (wizard.house === 'Hufflepuff') { html += '<li>' + wizard.name + '</li>'; } return html; }, '') + '</ul>'; See it in action here. 4. Grouping similar items in an array together The lodash library has a groupBy() method takes a collection of items as an array and groups them together into an object based on some criteria. Let’s say you want an array of numbers. If you wanted to group all of the items in numbers together based on their integer value, you would do this with lodash. var numbers = [6.1, 4.2, 6.3]; // returns {'4': [4.2], '6': [6.1, 6.3]} _.groupBy(numbers, Math.floor); If you had an array of words, and you wanted to group the items in words by their length, you would do this. var words = ['one', 'two', 'three']; // returns {'3': ['one', 'two'], '5': ['three']} _.groupBy(words, 'length'); Creating a groupBy() function with Array.reduce() You can recreate that same functionality using the Array.reduce() method. We’ll create a helper function, groupBy(), that accepts the array and criteria to sort by as arguments. Inside groupBy(), we’ll run Array.reduce() on our array, passing in an empty object ({}) as our starting point, and return the result. var groupBy = function (arr, criteria) { return arr.reduce(function (obj, item) { // Some code will go here... }, {}); }; Inside the Array.reduce() callback function, we’ll check to see if the criteria is a function, or a property of the item. Then we’ll get its value from the current item. If there’s no property in the obj with that value yet, we’ll create it and assign an empty array as its value. Finally, we’ll push the item to that key, and return the object as the accumulator for the next loop. var groupBy = function (arr, criteria) { return arr.reduce(function (obj, item) { // Check if the criteria is a function to run on the item or a property of it var key = typeof criteria === 'function' ? criteria(item) : item[criteria]; // If the key doesn't exist yet, create it if (!obj.hasOwnProperty(key)) { obj[key] = []; } // Push the value to the object obj[key].push(item); // Return the object to the next item in the loop return obj; }, {}); }; Here’s a demo of the completed helper function. Special thanks to Tom Bremer for helping me make some improvements to this one. You can find this helper function and more like it on the Vanilla JS Toolkit. 5. Combining data from two sources into an array Remember our array of wizards? var wizards = [ { name: 'Harry Potter', house: 'Gryfindor' }, { name: 'Cedric Diggory', house: 'Hufflepuff' }, { name: 'Tonks', house: 'Hufflepuff' }, { name: 'Ronald Weasley', house: 'Gryfindor' }, { name: 'Hermione Granger', house: 'Gryfindor' } ]; What if you had another data set, an object of house points each wizard has earned. var points = { HarryPotter: 500, CedricDiggory: 750, RonaldWeasley: 100, HermioneGranger: 1270 }; Imagine you wanted to combine both sets of data into a single array, with the number of points added to each wizard’s data in the wizards array. How would you do it? The Array.reduce() method is perfect for this! var wizardsWithPoints = wizards.reduce(function (arr, wizard) { // Get the key for the points object by removing spaces from the wizard's name var key = wizard.name.replace(' ', ''); // If the wizard has points, add them // Otherwise, set them to 0 if (points[key]) { wizard.points = points[key]; } else { wizard.points = 0; } // Push the wizard object to the new array arr.push(wizard); // Return the array return arr; }, []); Here’s a demo combining data from two sources into an array. 6. Combining data from two sources into an object What if you instead wanted to combine the two data sources into an object, where each wizard’s name was the key, and their house and points were properties? Again, the Array.reduce() method is perfect for this. var wizardsAsAnObject = wizards.reduce(function (obj, wizard) { // Get the key for the points object by removing spaces from the wizard's name var key = wizard.name.replace(' ', ''); // If the wizard has points, add them // Otherwise, set them to 0 if (points[key]) { wizard.points = points[key]; } else { wizard.points = 0; } // Remove the name property delete wizard.name; // Add wizard data to the new object obj[key] = wizard; // Return the array return obj; }, {}); Here’s a demo combining two data sets into an object. Should you use Array.reduce() more? The Array.reduce() method has gone from being something I thought was pointless to my favorite JavaScript method. So, should you use it? And when? The Array.reduce() method has fantastic browser support. It works in all modern browsers, and IE9 and above. It’s been supported in mobile browsers for a long time, too. If you need to go back even further than that, you can add a polyfill to push support back to IE6. The biggest complaint you can make about Array.reduce() is that it’s confusing for people who have never encountered it before. Combining Array.filter() with Array.map() is slower to run and involves extra steps, but it’s easier to read. It’s obvious from the names of the methods what they’re supposed to be doing. That said, there are times where Array.reduce() makes things that would be complicated more simple rather than more complicated. The groupBy() helper function is a good example. Ultimately, this is another tool to add to your toolkit. A tool that, if used right, can give you super powers. About the author Chris Ferdinandi helps people learn vanilla JavaScript. He believes there’s a simpler, more resilient way to make things for the web. Chris is the author of the Vanilla JS Pocket Guide series, creator of the Vanilla JS Academy training program, and host of the Vanilla JS Podcast. His developer tips newsletter is read by thousands of developers each weekday. He’s taught developers at organizations like Chobani and the Boston Globe, and his JavaScript plugins have been used used by Apple and Harvard Business School. Chris Coyier, the founder of CSS-Tricks and CodePen, has described his writing as “infinitely quote-worthy.” Chris loves pirates, puppies, and Pixar movies, and lives near horse farms in rural Massachusetts. He runs Go Make Things with Bailey Puppy, a lab-mix from Tennessee. More articles by Chris Full Article Code javascript
and Usability and Security; Better Together By feedproxy.google.com Published On :: Sun, 22 Dec 2019 12:00:00 +0000 Divya Sasidharan calls into question the trade-offs often made between security and usability. Does a secure interface by necessity need to be hard to use? Or is it the choice we make based on years of habit? Snow has fallen, snow on snow. Security is often synonymous with poor usability. We assume that in order for something to be secure, it needs to by default appear impenetrable to disincentivize potential bad actors. While this premise is true in many instances like in the security of a bank, it relies on a fundamental assumption: that there is no room for choice. With the option to choose, a user almost inevitably picks a more usable system or adapts how they interact with it regardless of how insecure it may be. In the context of the web, passwords are a prime example of such behavior. Though passwords were implemented as a way to drastically reduce the risk of attack, they proved to be marginally effective. In the name of convenience, complex, more secure passwords were shirked in favor of easy to remember ones, and passwords were liberally reused across accounts. This example clearly illustrates that usability and security are not mutually exclusive. Rather, security depends on usability, and it is imperative to get user buy-in in order to properly secure our applications. Security and Usability; a tale of broken trust At its core, security is about fostering trust. In addition to protecting user accounts from malicious attacks, security protocols provide users with the peace of mind that their accounts and personal information is safe. Ironically, that peace of mind is incumbent on users using the security protocols in the first place, which further relies on them accepting that security is needed. With the increased frequency of cyber security threats and data breaches over the last couple of years, users have grown to be less trusting of security experts and their measures. Security experts have equally become less trusting of users, and see them as the “the weakest link in the chain”. This has led to more cumbersome security practices such as mandatory 2FA and constant re-login flows which bottlenecks users from accomplishing essential tasks. Because of this break down in trust, there is a natural inclination to shortcut security altogether. Build a culture of trust not fear Building trust among users requires empowering them to believe that their individual actions have a larger impact on the security of the overall organization. If a user understands that their behavior can put critical resources of an organization at risk, they will more likely behave with security in mind. For this to work, nuance is key. Deeming that every resource needs a similarly high number of checks and balances diminishes how users perceive security and adds unnecessary bottlenecks to user workflows. In order to lay the foundation for good security, it’s worth noting that risk analysis is the bedrock of security design. Instead of blindly implementing standard security measures recommended by the experts, a better approach is to tailor security protocols to meet specific use cases and adapt as much as possible to user workflows. Here are some examples of how to do just that: Risk based authentication Risk based authentication is a powerful way to perform a holistic assessment of the threats facing an organization. Risks occur at the intersection of vulnerability and threat. A high risk account is vulnerable and faces the very real threat of a potential breach. Generally, risk based authentication is about calculating a risk score associated with accounts and determining the proper approach to securing it. It takes into account a combination of the likelihood that that risk will materialize and the impact on the organization should the risk come to pass. With this system, an organization can easily adapt access to resources depending on how critical they are to the business; for instance, internal documentation may not warrant 2FA, while accessing business and financial records may. Dynamically adaptive auth Similar to risk based auth, dynamically adaptive auth adjusts to the current situation. Security can be strengthened and slackened as warranted, depending on how risky the access point is. A user accessing an account from a trusted device in a known location may be deemed low risk and therefore not in need of extra security layers. Likewise, a user exhibiting predictive patterns of use should be granted quick and easy access to resources. The ability to adapt authentication based on the most recent security profile of a user significantly improves the experience by reducing unnecessary friction. Conclusion Historically, security failed to take the user experience into account, putting the onus of securing accounts solely on users. Considering the fate of password security, we can neither rely on users nor stringent security mechanisms to keep our accounts safe. Instead, we should aim for security measures that give users the freedom to bypass them as needed while still protecting our accounts from attack. The fate of secure systems lies in the understanding that security is a process that must constantly adapt to face the shifting landscape of user behavior and potential threats. About the author Divya is a web developer who is passionate about open source and the web. She is currently a developer experience engineer at Netlify, and believes that there is a better workflow for building and deploying sites that doesn’t require a server—ask her about the JAMstack. You will most likely find her in the sunniest spot in the room with a cup of tea in hand. More articles by Divya Full Article UX security
and Four Ways Design Systems Can Promote Accessibility – and What They Can’t Do By feedproxy.google.com Published On :: Mon, 23 Dec 2019 12:00:00 +0000 Amy Hupe prepares a four bird roast of tasty treats so we can learn how the needs of many different types of users can be served through careful implementation of components within a design system. Design systems help us to make our products consistent, and to make sure we’re creating them in the most efficient way possible. They also help us to ensure our products are designed and built to a high quality; that they’re not only consistent in appearance, and efficiently-built, but that they are good. And good design means accessible design. 1 in 5 people in the UK have a long term illness, impairment or disability – and many more have a temporary disability. Designing accessible services is incredibly important from an ethical, reputational and commercial standpoint. For EU government websites and apps, accessibility is also a legal requirement. With that in mind, I’ll explain the four main ways I think we can use design systems to promote accessible design within an organisation, and what design systems can’t do. 1. Bake it in Design systems typically provide guidance and examples to aid the design process, showing what best practice looks like. Many design systems also encompass code that teams can use to take these elements into production. This gives us an opportunity to build good design into the foundations of our products, not just in terms of how they look, but also how they work. For everyone. Let me give an example. The GOV.UK Design System contains a component called the Summary list. It’s used in a few different contexts on GOV.UK, to summarise information. It’s often used at the end of a long or complex form, to let users check their answers before they send them, like this: Users can review the information and, if they’ve entered something incorrectly, they can go back and edit their answer by clicking the “Change” link on the right-hand side. This works well if you can see the change link, because you can see which information it corresponds to. In the top row, for example, I can see that the link is giving me the option to change the name I’ve entered because I can see the name label, and the name I put in is next to it. However, if you’re using a screen reader, this link – and all the others – will just say “change”, and it becomes harder to tell what you’re selecting. So to help with this, the GOV.UK Design System team added some visually-hidden text to the code in the example, to make the link more descriptive. Sighted users won’t see this text, but when a screen reader reads out the link, it’ll say “change name”. This makes the component more accessible, and helps it to satisfy a Web Content Accessibility Guidelines (WCAG 2.1) success criterion for links which says we must “provide link text that identifies the purpose of the link without needing additional context”. By building our components with inclusion in mind, we can make it easier to make products accessible, before anyone’s even had to think about it. And that’s a great starting point. But that doesn’t mean we don’t have to think about it – we definitely do. And a design system can help with that too. 2. Explain it Having worked as the GOV.UK Design System’s content designer for the best part of 3 years, I’m somewhat biased about this, but I think that the most valuable aspect of a design system is its documentation. (Here’s a shameless plug for my patterns Day talk on design system documentation earlier this year, if you want to know more about that.) When it comes to accessibility, written documentation lets us guide good practice in a way that code and examples alone can’t. By carefully documenting implementation rules for each component, we have an opportunity to distribute accessible design principles throughout a design system. This means design system users encounter them not just once, but repeatedly and frequently, in various contexts, which helps to build awareness over time. For instance, WCAG 2.1 warns against using colour as “the only visual means of conveying information, calling an action, prompting a response or distinguishing a visual element”. This is a general principle to follow, but design system documentation lets us explain how this relates to specific components. Take the GOV.UK Design System’s warning buttons. These are used for actions with serious, often destructive consequences that can’t easily be undone – like permanently deleting an account. The example doesn’t tell you this, but the guidance explains that you shouldn’t rely on the red colour of warning buttons to communicate that the button performs a serious action, since not all users will be able to see the colour or understand what it signifies. Instead, it says, “make sure the context and button text makes clear what will happen if the user selects it”. In this way, the colour is used as an enhancement for people who can interpret it, but it’s not necessary in order to understand it. Making the code in our examples and component packages as accessible as possible by default is really important, but written documentation like this lets us be much more explicit about how to design accessible services. 3. Lead by example In our design systems’ documentation, we’re telling people what good design looks like, so it’s really important that we practice what we preach. Design systems are usually for members of staff, rather than members of the public. But if we want to build an inclusive workplace, we need to hold them to the same standards and ensure they’re accessible to everyone who might need to use them – today and in the future. One of the ways we did this in my team, was by making sure the GOV.UK Design System supports users who need to customise the colours they use to browse the web. There are a range of different user needs for changing colours on the web. People who are sensitive to light, for instance, might find a white background too bright. And some users with dyslexia find certain colours easier to read than others. My colleague, Nick Colley, wrote about the work we did to ensure GOV.UK Design System’s components will work when users change colours on GOV.UK. To ensure we weren’t introducing barriers to our colleagues, we also made it possible to customise colours in the GOV.UK Design System website itself. Building this flexibility into our design system helps to support our colleagues who need it, but it also shows others that we’re committed to inclusion and removing barriers. 4. Teach it The examples I’ve drawn on here have mostly focused on design system documentation and tooling, but design systems are much bigger than that. In the fortuitously-timed “There is No Design System”, Jina reminds us that tooling is just one of the ways we systematise design: …it’s a lot of people-focused work: Reviewing. Advising. Organizing. Coordinating. Triaging. Educating. Supporting.” To make a design system successful, we can’t just build a set of components and hope they work. We have to actively help people find it, use it and contribute to it. That means we have to go out and talk about it. We have to support people in learning to use it and help new teams adopt it. These engagement activities and collaborative processes that sit around it can help to promote awareness of the why, not just the what. At GDS, we ran workshops on accessibility in the design system, getting people to browse various web pages using visual impairment simulation glasses to understand how visually impaired users might experience our content. By working closely with our systems’ users and contributors like this, we have an opportunity to bring them along on the journey of making something accessible. We can help them to test out their code and content and understand how they’ll work on different platforms, and how they might need to be adjusted to make sure they’re accessible. We can teach them what accessibility means in practice. These kinds of activities are invaluable in helping to promote accessible design thinking. And these kinds of lessons – when taught well – are disseminated as colleagues share knowledge with their teams, departments and the wider industry. What design systems can’t do Our industry’s excitement about design systems shows no signs of abating, and I’m excited about the opportunities it affords us to make accessible design the default, not an edge case. But I want to finish on a word about their limitations. While a design system can help to promote awareness of the need to be accessible, and how to design products and services that are, a design system can’t make an organisation fundamentally care about accessibility. Even with the help of a thoughtfully created design system, it’s still possible to make really inaccessible products if you’re not actively working to remove barriers. I feel lucky to have worked somewhere that prioritises accessibility. Thanks to the work of some really brilliant people, it’s just part of the fabric at GDS. (For more on that work and those brilliant people, I can’t think of a better place to start than my colleague Ollie Byford’s talk on inclusive forms.) I’m far from being an accessibility expert, but I can write about this because I’ve worked in an organisation where it’s always a central consideration. This shouldn’t be something to feel lucky about. It should be the default, but sadly we’re not there yet. Not even close. Earlier this year, Domino’s pizza was successfully sued by a blind customer after he was unable to order food on their website or mobile app, despite using screen-reading software. And in a recent study carried out by disability equality charity, Scope, 50% of respondents said that they had given up on buying a product because the website, app or in-store machine had accessibility issues. Legally, reputationally and most importantly, morally, we all have a duty to do better. To make sure our products and services are accessible to everyone. We can use design systems to help us on that journey, but they’re just one part of our toolkit. In the end, it’s about committing to the cause – doing the work to make things accessible. Because accessible design is good design. About the author Amy is a content specialist and design systems advocate who’s spent the last 3 years working as a Senior Content Designer at the Government Digital Service. In that time, she’s led the content strategy for the GOV.UK Design System, including a straightforward and inclusive approach to documentation. In January, Amy will continue her work in this space, in her new role as Product Manager for Babylon Health’s design system, DNA. More articles by Amy Full Article Process style-guides
and Cigarette taxes and smoking among sexual minority adults [electronic resource] / Christopher Carpenter, Dario Sansone By darius.uleth.ca Published On :: Cambridge, Mass. : National Bureau of Economic Research, 2020 Full Article
and The effects of e-cigarette taxes on e-cigarette prices and tobacco product sales [electronic resource] : evidence from retail panel data / Chad D. Cotti, Charles J. Courtemanche, Johanna Catherine Maclean, Erik T. Nesson, Michael F. Pesko, Nathan Tefft By darius.uleth.ca Published On :: Cambridge, Mass. : National Bureau of Economic Research, 2020 Full Article
and Effect of prescription opioids and prescription opioid control policies on infant health [electronic resource] / Engy Ziedan, Robert Kaestner By darius.uleth.ca Published On :: Cambridge, Mass. : National Bureau of Economic Research, 2020 Full Article
and Cigarette taxes and teen marijuana use [electronic resource] / D. Mark Anderson, Kyutaro Matsuzawa, Joseph J. Sabia By darius.uleth.ca Published On :: Cambridge, Mass. : National Bureau of Economic Research, 2020 Full Article
and Suburban Xanadu [electronic resource] : the Casino Resort on the Las Vegas Strip and Beyond By darius.uleth.ca Published On :: Hoboken : Taylor & Francis, 2003. Full Article
and Vicious games [electronic resource] : capitalism and gambling / Rebecca Cassidy. By darius.uleth.ca Published On :: London : Pluto Press, 2020. Full Article
and Drug courts [electronic resource] : a new approach to treatment and rehabilitation / James E. Lessenger, Glade F. Roper, editors By darius.uleth.ca Published On :: New York : Springer, [2007] Full Article
and IANCU, ANDREI v. BRUNETTI, ERIK. Decided 06/24/2019 By www.law.cornell.edu Published On :: Mon, 24 Jun 2019 00:00:00 EDT Full Article
and UNITED STATES v. HAYMOND, ANDRE R.. Decided 06/26/2019 By www.law.cornell.edu Published On :: Wed, 26 Jun 2019 00:00:00 EDT Full Article
and TENN. WINE AND SPIRITS RETAILERS ASSN. v. BLAIR. Decided 06/26/2019 By www.law.cornell.edu Published On :: Wed, 26 Jun 2019 00:00:00 EDT Full Article