Are you over 18 and want to see adult content?
More Annotations
A complete backup of https://cmjapan.com
Are you over 18 and want to see adult content?
A complete backup of https://stuckonyou.com.au
Are you over 18 and want to see adult content?
A complete backup of https://hbz-nrw.de
Are you over 18 and want to see adult content?
A complete backup of https://exit1.org
Are you over 18 and want to see adult content?
A complete backup of https://retiredracehorseproject.org
Are you over 18 and want to see adult content?
A complete backup of https://msautogroup.com
Are you over 18 and want to see adult content?
A complete backup of https://awaytravel.com
Are you over 18 and want to see adult content?
A complete backup of https://top-personal.ru
Are you over 18 and want to see adult content?
A complete backup of https://girlschannel.net
Are you over 18 and want to see adult content?
A complete backup of https://wikihow.vn
Are you over 18 and want to see adult content?
A complete backup of https://vorsten.nl
Are you over 18 and want to see adult content?
A complete backup of https://ctdata.org
Are you over 18 and want to see adult content?
Favourite Annotations
A complete backup of visitclearwaterflorida.com
Are you over 18 and want to see adult content?
A complete backup of trackyourtruck.com
Are you over 18 and want to see adult content?
A complete backup of yourmodernfamily.com
Are you over 18 and want to see adult content?
A complete backup of colmenarviejo.com
Are you over 18 and want to see adult content?
A complete backup of household-design.com
Are you over 18 and want to see adult content?
A complete backup of akaeastbaltimore.com
Are you over 18 and want to see adult content?
Text
BLOG.PROTOTYPR.IO
STOP ASKING âWHAT PROBLEM ARE WE TRYING TO SOLVE?â WHY THE HECK DO YOU NEED A DESIGN SYSTEM? The real value of any design system can be summarized in two simple words: Scalability and Speed. Scalability: A well-implemented design system allows us to design and build easily at scale. Either if you are a startup rapidly expanding into new markets, or if you are an enterprise multinational with a wide portfolio of software, thecapacity
10 PSYCHOLOGICAL RULES I USED TO MAKE USERS LOVE AT FIRST Illustration by Storytale. A good design is not only solving the right problem but also creates positive emotions for the users. Back in the old days, a physical product could be through the 5 human senses to create emotions; but it seems hard for a digital product because itâs only dry interactions on the device screen, followed by aseries of services.
TOP 10 FUNNY LOREM IPSUM GENERATORS TO MAKE YOUR DESIGN As we all know about the lorem ipsum, Itâs totally fake content to put in your mokup but sometimes itâs not suitable for the design. Itâs a random text NORTH STAR PRODUCT MANAGEMENT. THE PROCESS *IS* THE North Star Product Management maps long-term complexity onto short-term planning. It means maintaining both: ⢠⾠North Star Docs which are comprehensive, long-term (but flexible) Spec Documents for our full, complete product â alongside; ⢠✠Strides, which are short-term, iterative, small-scoped pieces of work that mostly fitin
WHAT THE HELL IS âTEAM CULTUREâ AND WHY IS IT SO IMPORTANT Itâs how people work together towards a common goal and how they treat each other. These attributes could be positive or negative. Culture is a difficult concept to grasp because itâs generally unspoken and unwritten. Itâs about dynamics between humans. Different teams within a company can manifest their own culture. HOW TO MAKE A BACKGROUND BLUR IN CSS WITH ONE LINE OF CODE If you want the blur to have a color, youâll need to add the background property with an rgba value. Make sure that the alpha (opacity) is less than 1, so we can see through the color. Then weâll add the magical backdrop-filter CSS property and give it a value of blur (8px). Hint, hintincrease/decrease the px to increase/decrease the blur. HOW TO CREATE SKELETON LOADERS IN CSS Using a pseudo-element. Letâs analyse this pseudo-element code: As you can see, since the width of the gradient is 150px, its initial value should be -150px to the left. Another important part is the background property. You want to go from transparent into transparent to perfectly blend it into the background of its container. GPT-3 DESIGN HYPE 𤯠: GPT3 FIGMA, PLUS MORE DESIGN AND UX Hereâs some of the hype around the internets and twitters about GPT-3 and design: 1. Sharif started with this GPT-3 layout generator: Sharif is the founder of debuild.co, where heâs trying to provide this technology as a âfaster way to develop web appsâ: A SKELETON LOADER: AN OVERVIEW, PURPOSE, USAGE AND DESIGNSEE MORE ONBLOG.PROTOTYPR.IO
STOP ASKING âWHAT PROBLEM ARE WE TRYING TO SOLVE?â WHY THE HECK DO YOU NEED A DESIGN SYSTEM? The real value of any design system can be summarized in two simple words: Scalability and Speed. Scalability: A well-implemented design system allows us to design and build easily at scale. Either if you are a startup rapidly expanding into new markets, or if you are an enterprise multinational with a wide portfolio of software, thecapacity
10 PSYCHOLOGICAL RULES I USED TO MAKE USERS LOVE AT FIRST Illustration by Storytale. A good design is not only solving the right problem but also creates positive emotions for the users. Back in the old days, a physical product could be through the 5 human senses to create emotions; but it seems hard for a digital product because itâs only dry interactions on the device screen, followed by aseries of services.
TOP 10 FUNNY LOREM IPSUM GENERATORS TO MAKE YOUR DESIGN As we all know about the lorem ipsum, Itâs totally fake content to put in your mokup but sometimes itâs not suitable for the design. Itâs a random text NORTH STAR PRODUCT MANAGEMENT. THE PROCESS *IS* THE North Star Product Management maps long-term complexity onto short-term planning. It means maintaining both: ⢠⾠North Star Docs which are comprehensive, long-term (but flexible) Spec Documents for our full, complete product â alongside; ⢠✠Strides, which are short-term, iterative, small-scoped pieces of work that mostly fitin
WHAT THE HELL IS âTEAM CULTUREâ AND WHY IS IT SO IMPORTANT Itâs how people work together towards a common goal and how they treat each other. These attributes could be positive or negative. Culture is a difficult concept to grasp because itâs generally unspoken and unwritten. Itâs about dynamics between humans. Different teams within a company can manifest their own culture. HOW TO MAKE A BACKGROUND BLUR IN CSS WITH ONE LINE OF CODE If you want the blur to have a color, youâll need to add the background property with an rgba value. Make sure that the alpha (opacity) is less than 1, so we can see through the color. Then weâll add the magical backdrop-filter CSS property and give it a value of blur (8px). Hint, hintincrease/decrease the px to increase/decrease the blur. HOW TO CREATE SKELETON LOADERS IN CSS Using a pseudo-element. Letâs analyse this pseudo-element code: As you can see, since the width of the gradient is 150px, its initial value should be -150px to the left. Another important part is the background property. You want to go from transparent into transparent to perfectly blend it into the background of its container. UI/UX CASE STUDY. A GLIMPSE INTO MY DESIGN THINKING Overview. This is a UI/UX case study of a real estate-based trading app. As the app is still in development, the whole concept and idea behind it cannot be revealed yet. However, the key focus here is to get inside my head and understand how I began my research and integrated the entire idea through design.. Methods Used: UX Research, Feature Analysis and Grouping, Wireframing, UI Design and ALL YOU NEED IS 5 FONTS There werenât as many web fonts to pick from when I started my freelance career in the early 2000s, still I was always overwhelmed by the number of fonts to choose from. With no formal education in design or typography, my choices were uninformed and limited. STOP ASKING âWHAT PROBLEM ARE WE TRYING TO SOLVE?â Stop asking âWhat problem are we trying to solve?â. Ben Crothers. Jun 17, 2020 ¡ 5 min read. âWhat problem are we trying to solve?â is a smart question, but it usually gets us nowhere. Hereâs a better way, and some better questions to ask. I was in yet another planning meeting, when my colleague leaned back in his chair and said MY JOURNEY FROM 0 TO $4K AS DESIGNER IN 4 MONTHS I was playing online games all day and I was a burden to my family. I think one of the most lucky part of my life is studying âWeb Programmingâ in high school 10 years ago, even though I didnâtknow
SKELETON LOADER: AN OVERVIEW, PURPOSE, USAGE AND DESIGN In simplest terms, Skeleton Loader is a static / animated placeholder for the information that is still loading. It mimic the structure and look of the entire view. It gives an idea regarding what kind of content is loading in each block like image, text, long NEW IN IOS 15 FOR PRODUCT DESIGNERS & DESIGN ENGINEERS Location Permission. Over the past few years, the location pe r mission received multiple updates to enhance privacy. In iOS 13 a new option was introduced to allow access to your location just once. The native location permission would be displayed and every time you use the app, you would see the permission alert again. UNDERSTANDING ANIMATION BASED ON THE BURGER ICON CSS In the case of a burger icon, starting frame is a shape before the user interacts with an icon. Itâs a stack of lines, basically. Letâs name this first frame A. The final frame is the one after the userâs interaction. In our example, itâs a cross sign. Letâsname it B.
A PRAGMATIC GUIDE TO DESIGNING AND BUILDING RESPONSIVE WEB While explaining the process of designing and building a responsive web application, I am using one of the apps Iâve built as an example. The web app is called Planner and itâs a to-do list app that allows to organize and track tasks that need to be done.. Check out the code on GitHub. 7 BEST UX PRACTICES FOR DESIGNING LONG ONLINE FORMS TL;DR. Do these seven things to make a usable long online form: group your questions into sections, make location visible, donât make questions out-of-focus, use a stepper, set expectations before the start, add help text and make it understandable, and. donât stop people from clicking âSENDâ. HOW TO CREATE SKELETON LOADERS IN CSS Using a pseudo-element. Letâs analyse this pseudo-element code: As you can see, since the width of the gradient is 150px, its initial value should be -150px to the left. Another important part is the background property. You want to go from transparent into transparent to perfectly blend it into the background of its container. HOW TO WRITE AN IMAGE DESCRIPTION GPT-3 DESIGN HYPE 𤯠: GPT3 FIGMA, PLUS MORE DESIGN AND UX Hereâs some of the hype around the internets and twitters about GPT-3 and design: 1. Sharif started with this GPT-3 layout generator: Sharif is the founder of debuild.co, where heâs trying to provide this technology as a âfaster way to develop web appsâ: A FREE COLOR TOOLS FOR DESIGNERS. A COLLECTION OF NEW TOOLS Khroma is an AI color tool designed to create countless color combinations for design projects. This tool allows you to choose a combination of 50 colors to your liking and combines them thanks to Artificial Intelligence.In practice, youâll train a neural network powered algorithm to generate colors that you like and block ones you donât, all directly in your browser. HOW I BUILT A FINANCE TRACKER TOOL IN NOTION (WITHSEE MORE ONBLOG.PROTOTYPR.IO
FIVE CRITICAL QUESTIONS TO ASK AS A VR/AR PRACTITIONER For richness, I mean two things: The dimension of info. Info with physical attributes. We can store the data with not only the textual or pixel info but also info that covers other senses like physical attributes, depth, smell, material, etc. ⥠Break the limitation ofspace and time.
7 BEST UX PRACTICES FOR DESIGNING LONG ONLINE FORMS TL;DR. Do these seven things to make a usable long online form: group your questions into sections, make location visible, donât make questions out-of-focus, use a stepper, set expectations before the start, add help text and make it understandable, and. donât stop people from clicking âSENDâ. 10 PSYCHOLOGICAL RULES I USED TO MAKE USERS LOVE AT FIRST Illustration by Storytale. A good design is not only solving the right problem but also creates positive emotions for the users. Back in the old days, a physical product could be through the 5 human senses to create emotions; but it seems hard for a digital product because itâs only dry interactions on the device screen, followed by aseries of services.
HOW TO MAKE A BACKGROUND BLUR IN CSS WITH ONE LINE OF CODE If you want the blur to have a color, youâll need to add the background property with an rgba value. Make sure that the alpha (opacity) is less than 1, so we can see through the color. Then weâll add the magical backdrop-filter CSS property and give it a value of blur (8px). Hint, hintincrease/decrease the px to increase/decrease the blur. TOP 10 FUNNY LOREM IPSUM GENERATORS TO MAKE YOUR DESIGN As we all know about the lorem ipsum, Itâs totally fake content to put in your mokup but sometimes itâs not suitable for the design. Itâs a random text HOW TO WRITE AN IMAGE DESCRIPTION GPT-3 DESIGN HYPE 𤯠: GPT3 FIGMA, PLUS MORE DESIGN AND UX Hereâs some of the hype around the internets and twitters about GPT-3 and design: 1. Sharif started with this GPT-3 layout generator: Sharif is the founder of debuild.co, where heâs trying to provide this technology as a âfaster way to develop web appsâ: A FREE COLOR TOOLS FOR DESIGNERS. A COLLECTION OF NEW TOOLS Khroma is an AI color tool designed to create countless color combinations for design projects. This tool allows you to choose a combination of 50 colors to your liking and combines them thanks to Artificial Intelligence.In practice, youâll train a neural network powered algorithm to generate colors that you like and block ones you donât, all directly in your browser. HOW I BUILT A FINANCE TRACKER TOOL IN NOTION (WITHSEE MORE ONBLOG.PROTOTYPR.IO
FIVE CRITICAL QUESTIONS TO ASK AS A VR/AR PRACTITIONER For richness, I mean two things: The dimension of info. Info with physical attributes. We can store the data with not only the textual or pixel info but also info that covers other senses like physical attributes, depth, smell, material, etc. ⥠Break the limitation ofspace and time.
7 BEST UX PRACTICES FOR DESIGNING LONG ONLINE FORMS TL;DR. Do these seven things to make a usable long online form: group your questions into sections, make location visible, donât make questions out-of-focus, use a stepper, set expectations before the start, add help text and make it understandable, and. donât stop people from clicking âSENDâ. 10 PSYCHOLOGICAL RULES I USED TO MAKE USERS LOVE AT FIRST Illustration by Storytale. A good design is not only solving the right problem but also creates positive emotions for the users. Back in the old days, a physical product could be through the 5 human senses to create emotions; but it seems hard for a digital product because itâs only dry interactions on the device screen, followed by aseries of services.
HOW TO MAKE A BACKGROUND BLUR IN CSS WITH ONE LINE OF CODE If you want the blur to have a color, youâll need to add the background property with an rgba value. Make sure that the alpha (opacity) is less than 1, so we can see through the color. Then weâll add the magical backdrop-filter CSS property and give it a value of blur (8px). Hint, hintincrease/decrease the px to increase/decrease the blur. TOP 10 FUNNY LOREM IPSUM GENERATORS TO MAKE YOUR DESIGN As we all know about the lorem ipsum, Itâs totally fake content to put in your mokup but sometimes itâs not suitable for the design. Itâs a random text WHAT THE HELL IS âTEAM CULTUREâ AND WHY IS IT SO IMPORTANT Itâs how people work together towards a common goal and how they treat each other. These attributes could be positive or negative. Culture is a difficult concept to grasp because itâs generally unspoken and unwritten. Itâs about dynamics between humans. Different teams within a company can manifest their own culture. HOW TO WRITE AN IMAGE DESCRIPTION An image description is a written caption that describes the essential information in an image. Itâs often described as alt text since the alt tag is a common place to store them. Image descriptions can define photos, graphics, gifs, and video â basically anything containing visual information. Providing descriptions for imagery and video 45 DESIGN THINKING EXERCISES YOU CAN USE TODAY Downloadable PDF. Below are 43 activities that can be done in 5-minutes or less, as well as 2 design processes to facilitate workshops . They are simple but powerful for identifying values, imagining outcomes, and executing on successful products, services, policy designs and more. While many design thinking processes showlinear progression
7 BEST UX PRACTICES FOR DESIGNING LONG ONLINE FORMS TL;DR. Do these seven things to make a usable long online form: group your questions into sections, make location visible, donât make questions out-of-focus, use a stepper, set expectations before the start, add help text and make it understandable, and. donât stop people from clicking âSENDâ. 9 PSYCHOLOGICAL RULES I USED TO KEEP USERS ENGAGED WITH MY Illustration by Storytale. According to Don Norman, people develop emotions with an object on three levels: visceral (intrinsic), behavioral (behavior), and reflective (reflection).In case you missed my previous article about the Visceral level, take a look. At the Behavioral level, emotions are formed based on the product's usability. Do all the features work correctly or not, and how long 10 TIPS FOR RAPID PROTOTYPING ON THE HOLOLENS 2 Iâll talk about what works and does n ât work for prototyping for Augmented Reality, and fun methods that can help you think more spatially and at a human-scale â such as building things out of clay or drawing on windows! As well as tips for quickly bringing your ideas into Unity. At PTC we care about AR for many reasons, one of which is the usefulness of head-mounted displays for NOTHING IS FOR NOTHING IN DESIGN. EVERY SINGLE PIECE OF A year back, I was hired as UI/UX Designer in a startup while in the midst of a pandemic-stricken labor market. I was trusted because of my skills and experience. Despite having some internship NEW IN IOS 15 FOR PRODUCT DESIGNERS & DESIGN ENGINEERS Location Permission. Over the past few years, the location pe r mission received multiple updates to enhance privacy. In iOS 13 a new option was introduced to allow access to your location just once. The native location permission would be displayed and every time you use the app, you would see the permission alert again. VR EXPERIENCE FOR MENTAL HEALTH This contains all of my initial ideas about VR experiences, grouped into types of experience such as games, productivity, experience. These initial ideas lead to some bigger stories where ideas are HOW TO CREATE SKELETON LOADERS IN CSS Using a pseudo-element. Letâs analyse this pseudo-element code: As you can see, since the width of the gradient is 150px, its initial value should be -150px to the left. Another important part is the background property. You want to go from transparent into transparent to perfectly blend it into the background of its container. WHY I SAID âNOâ TO A FREELANCE JOB OFFER AS A JUNIOR UX/UI Two weeks ago I got a message from a startup on Behance that they would like to work with me because they liked my case studies. At that time, I had just finished my UX course at CareerFoundry and hadnât even started sending out applications because I thought my website needed a little update. 45 DESIGN THINKING EXERCISES YOU CAN USE TODAY Downloadable PDF. Below are 43 activities that can be done in 5-minutes or less, as well as 2 design processes to facilitate workshops . They are simple but powerful for identifying values, imagining outcomes, and executing on successful products, services, policy designs and more. While many design thinking processes showlinear progression
GPT-3 DESIGN HYPE 𤯠: GPT3 FIGMA, PLUS MORE DESIGN AND UX Hereâs some of the hype around the internets and twitters about GPT-3 and design: 1. Sharif started with this GPT-3 layout generator: Sharif is the founder of debuild.co, where heâs trying to provide this technology as a âfaster way to develop web appsâ: A NORTH STAR PRODUCT MANAGEMENT. THE PROCESS *IS* THE North Star Product Management maps long-term complexity onto short-term planning. It means maintaining both: ⢠⾠North Star Docs which are comprehensive, long-term (but flexible) Spec Documents for our full, complete product â alongside; ⢠✠Strides, which are short-term, iterative, small-scoped pieces of work that mostly fitin
ORGANIZED SCSS FOLDER STRUCTURES FOR DESIGN SYSTEMS Iâve worked on a few different design systems over recent years, and they all have unique properties that affect how we organized them. Specifically the most technically-ambitious design systems lived directly next to the code that consumed it, and the most design-ambitious systems needed to include hundreds of prototype page templates and variants of those pages for user testing and NEED-TO-KNOW SKILLS OF UI DESIGN FOR MOBILE DEVICES 1. UI design principle. Donât think the practical UI design principle does not apply to small mobile screens. Five elements of UI design you should take into consideration: 1). Goal-driven Design. This allows you to customize the app working process and meetrequirements for
EXPRESSING TIME IN UI & UX DESIGN: 5 RULESâŚAND A FEW OTHER Rule 3: Finish on time. If you provide an indication that a process will take 10 minutes, ensure that the indication does not take longer. In short, finish within the stated time. Do not stop the timer or bounce it from 7 minutes back up to 8 minutes. Likewise, ensure the progress bar does not bounce back and forth. 6 BARRIERS TO WORKING IN A MULTI-DISCIPLINARY TEAM (AND In a team with different skillsets, one can be hopeful and idealistic about the outcome. The goal is to work as one team, put users first and create awesome experiences. Unfortunately, things donât 20 CREATIVE SEARCH BAR DESIGN INSPIRATIONS WITH HTML/CSS A great list of 20 creative HTML/CSS/ Bootstrap search bar design for your inspiration. The search bar connects people with websites, mobile apps, and the world. Itâs a conversation window between the user and the app or website. In the face of complicated web content, users express their needs by searching keywords, expecting to obtain FIVE CRITICAL QUESTIONS TO ASK AS A VR/AR PRACTITIONER For richness, I mean two things: The dimension of info. Info with physical attributes. We can store the data with not only the textual or pixel info but also info that covers other senses like physical attributes, depth, smell, material, etc. ⥠Break the limitation ofspace and time.
6 SHARP ALTERNATIVES TO BORING SERIF DEFAULTS S tarting a new design project is a great opportunity to test some new typefaces. I am sharing with y o u 6 serif typefaces which are a totally good choice to replace any boring serif font like the Times. All of them have specifically strong shapes and their sharp aesthetic takes inspiration from the inscriptional forms of letter carved fromstone.
45 DESIGN THINKING EXERCISES YOU CAN USE TODAY Downloadable PDF. Below are 43 activities that can be done in 5-minutes or less, as well as 2 design processes to facilitate workshops . They are simple but powerful for identifying values, imagining outcomes, and executing on successful products, services, policy designs and more. While many design thinking processes showlinear progression
GPT-3 DESIGN HYPE 𤯠: GPT3 FIGMA, PLUS MORE DESIGN AND UX Hereâs some of the hype around the internets and twitters about GPT-3 and design: 1. Sharif started with this GPT-3 layout generator: Sharif is the founder of debuild.co, where heâs trying to provide this technology as a âfaster way to develop web appsâ: A NORTH STAR PRODUCT MANAGEMENT. THE PROCESS *IS* THE North Star Product Management maps long-term complexity onto short-term planning. It means maintaining both: ⢠⾠North Star Docs which are comprehensive, long-term (but flexible) Spec Documents for our full, complete product â alongside; ⢠✠Strides, which are short-term, iterative, small-scoped pieces of work that mostly fitin
ORGANIZED SCSS FOLDER STRUCTURES FOR DESIGN SYSTEMS Iâve worked on a few different design systems over recent years, and they all have unique properties that affect how we organized them. Specifically the most technically-ambitious design systems lived directly next to the code that consumed it, and the most design-ambitious systems needed to include hundreds of prototype page templates and variants of those pages for user testing and NEED-TO-KNOW SKILLS OF UI DESIGN FOR MOBILE DEVICES 1. UI design principle. Donât think the practical UI design principle does not apply to small mobile screens. Five elements of UI design you should take into consideration: 1). Goal-driven Design. This allows you to customize the app working process and meetrequirements for
EXPRESSING TIME IN UI & UX DESIGN: 5 RULESâŚAND A FEW OTHER Rule 3: Finish on time. If you provide an indication that a process will take 10 minutes, ensure that the indication does not take longer. In short, finish within the stated time. Do not stop the timer or bounce it from 7 minutes back up to 8 minutes. Likewise, ensure the progress bar does not bounce back and forth. 6 BARRIERS TO WORKING IN A MULTI-DISCIPLINARY TEAM (AND In a team with different skillsets, one can be hopeful and idealistic about the outcome. The goal is to work as one team, put users first and create awesome experiences. Unfortunately, things donât 20 CREATIVE SEARCH BAR DESIGN INSPIRATIONS WITH HTML/CSS A great list of 20 creative HTML/CSS/ Bootstrap search bar design for your inspiration. The search bar connects people with websites, mobile apps, and the world. Itâs a conversation window between the user and the app or website. In the face of complicated web content, users express their needs by searching keywords, expecting to obtain FIVE CRITICAL QUESTIONS TO ASK AS A VR/AR PRACTITIONER For richness, I mean two things: The dimension of info. Info with physical attributes. We can store the data with not only the textual or pixel info but also info that covers other senses like physical attributes, depth, smell, material, etc. ⥠Break the limitation ofspace and time.
6 SHARP ALTERNATIVES TO BORING SERIF DEFAULTS S tarting a new design project is a great opportunity to test some new typefaces. I am sharing with y o u 6 serif typefaces which are a totally good choice to replace any boring serif font like the Times. All of them have specifically strong shapes and their sharp aesthetic takes inspiration from the inscriptional forms of letter carved fromstone.
NEW IN IOS 15 FOR PRODUCT DESIGNERS & DESIGN ENGINEERS Location Permission. Over the past few years, the location pe r mission received multiple updates to enhance privacy. In iOS 13 a new option was introduced to allow access to your location just once. The native location permission would be displayed and every time you use the app, you would see the permission alert again. 9 PSYCHOLOGICAL RULES I USED TO KEEP USERS ENGAGED WITH MY Illustration by Storytale. According to Don Norman, people develop emotions with an object on three levels: visceral (intrinsic), behavioral (behavior), and reflective (reflection).In case you missed my previous article about the Visceral level, take a look. At the Behavioral level, emotions are formed based on the product's usability. Do all the features work correctly or not, and how long STOP ASKING âWHAT PROBLEM ARE WE TRYING TO SOLVE?â Stop asking âWhat problem are we trying to solve?â. Ben Crothers. Jun 17, 2020 ¡ 5 min read. âWhat problem are we trying to solve?â is a smart question, but it usually gets us nowhere. Hereâs a better way, and some better questions to ask. I was in yet another planning meeting, when my colleague leaned back in his chair and said VR EXPERIENCE FOR MENTAL HEALTH This contains all of my initial ideas about VR experiences, grouped into types of experience such as games, productivity, experience. These initial ideas lead to some bigger stories where ideas are CURIOSITY QUESTIONS. 105 PROMPTS TO CONNECT REMOTE TEAMS 105 Prompts to connect remote teams all year long. âCuriosity Questionsâ is published by Jasmine Rosen in Prototypr. UX DESIGN FOR NAVIGATION MENUS. NAVIGATION MENUS ARE ONE 6) Donât hide it. Navigation menus are one of the most-clicked-on pieces of interface, and they provide major contextual information to the user, so it should always be visible. The default on mobile these days seems to be the hamburger menu, but there are alternatives that donât hide the nav completely: tabs, progressive collapsing 7 BEST UX PRACTICES FOR DESIGNING LONG ONLINE FORMS TL;DR. Do these seven things to make a usable long online form: group your questions into sections, make location visible, donât make questions out-of-focus, use a stepper, set expectations before the start, add help text and make it understandable, and. donât stop people from clicking âSENDâ. TOP 10 FUNNY LOREM IPSUM GENERATORS TO MAKE YOUR DESIGN As we all know about the lorem ipsum, Itâs totally fake content to put in your mokup but sometimes itâs not suitable for the design. Itâs a random text FIVE CRITICAL QUESTIONS TO ASK AS A VR/AR PRACTITIONER For richness, I mean two things: The dimension of info. Info with physical attributes. We can store the data with not only the textual or pixel info but also info that covers other senses like physical attributes, depth, smell, material, etc. ⥠Break the limitation ofspace and time.
60 OF THE BEST GRAPHIC DESIGNERS TO FOLLOW ON BEHANCE 15. Jessica Walsh. Jessica Walsh is an American graphic designer, art director and illustrator, and a partner at renowned creative agency Sagmeister & Walsh. Born in NYC and raised in nearby Ridgefield, Connecticut, she began coding and designing websites at just 11 years old and went on to study graphic design at the Rhode Island School ofDesign.
45 DESIGN THINKING EXERCISES YOU CAN USE TODAY Downloadable PDF. Below are 43 activities that can be done in 5-minutes or less, as well as 2 design processes to facilitate workshops . They are simple but powerful for identifying values, imagining outcomes, and executing on successful products, services, policy designs and more. While many design thinking processes showlinear progression
GPT-3 DESIGN HYPE 𤯠: GPT3 FIGMA, PLUS MORE DESIGN AND UX Hereâs some of the hype around the internets and twitters about GPT-3 and design: 1. Sharif started with this GPT-3 layout generator: Sharif is the founder of debuild.co, where heâs trying to provide this technology as a âfaster way to develop web appsâ: A NORTH STAR PRODUCT MANAGEMENT. THE PROCESS *IS* THE North Star Product Management maps long-term complexity onto short-term planning. It means maintaining both: ⢠⾠North Star Docs which are comprehensive, long-term (but flexible) Spec Documents for our full, complete product â alongside; ⢠✠Strides, which are short-term, iterative, small-scoped pieces of work that mostly fitin
ORGANIZED SCSS FOLDER STRUCTURES FOR DESIGN SYSTEMS Iâve worked on a few different design systems over recent years, and they all have unique properties that affect how we organized them. Specifically the most technically-ambitious design systems lived directly next to the code that consumed it, and the most design-ambitious systems needed to include hundreds of prototype page templates and variants of those pages for user testing and NEED-TO-KNOW SKILLS OF UI DESIGN FOR MOBILE DEVICES 1. UI design principle. Donât think the practical UI design principle does not apply to small mobile screens. Five elements of UI design you should take into consideration: 1). Goal-driven Design. This allows you to customize the app working process and meetrequirements for
EXPRESSING TIME IN UI & UX DESIGN: 5 RULESâŚAND A FEW OTHER Rule 3: Finish on time. If you provide an indication that a process will take 10 minutes, ensure that the indication does not take longer. In short, finish within the stated time. Do not stop the timer or bounce it from 7 minutes back up to 8 minutes. Likewise, ensure the progress bar does not bounce back and forth. 6 BARRIERS TO WORKING IN A MULTI-DISCIPLINARY TEAM (AND In a team with different skillsets, one can be hopeful and idealistic about the outcome. The goal is to work as one team, put users first and create awesome experiences. Unfortunately, things donât 20 CREATIVE SEARCH BAR DESIGN INSPIRATIONS WITH HTML/CSS A great list of 20 creative HTML/CSS/ Bootstrap search bar design for your inspiration. The search bar connects people with websites, mobile apps, and the world. Itâs a conversation window between the user and the app or website. In the face of complicated web content, users express their needs by searching keywords, expecting to obtain FIVE CRITICAL QUESTIONS TO ASK AS A VR/AR PRACTITIONER For richness, I mean two things: The dimension of info. Info with physical attributes. We can store the data with not only the textual or pixel info but also info that covers other senses like physical attributes, depth, smell, material, etc. ⥠Break the limitation ofspace and time.
6 SHARP ALTERNATIVES TO BORING SERIF DEFAULTS S tarting a new design project is a great opportunity to test some new typefaces. I am sharing with y o u 6 serif typefaces which are a totally good choice to replace any boring serif font like the Times. All of them have specifically strong shapes and their sharp aesthetic takes inspiration from the inscriptional forms of letter carved fromstone.
45 DESIGN THINKING EXERCISES YOU CAN USE TODAY Downloadable PDF. Below are 43 activities that can be done in 5-minutes or less, as well as 2 design processes to facilitate workshops . They are simple but powerful for identifying values, imagining outcomes, and executing on successful products, services, policy designs and more. While many design thinking processes showlinear progression
GPT-3 DESIGN HYPE 𤯠: GPT3 FIGMA, PLUS MORE DESIGN AND UX Hereâs some of the hype around the internets and twitters about GPT-3 and design: 1. Sharif started with this GPT-3 layout generator: Sharif is the founder of debuild.co, where heâs trying to provide this technology as a âfaster way to develop web appsâ: A NORTH STAR PRODUCT MANAGEMENT. THE PROCESS *IS* THE North Star Product Management maps long-term complexity onto short-term planning. It means maintaining both: ⢠⾠North Star Docs which are comprehensive, long-term (but flexible) Spec Documents for our full, complete product â alongside; ⢠✠Strides, which are short-term, iterative, small-scoped pieces of work that mostly fitin
ORGANIZED SCSS FOLDER STRUCTURES FOR DESIGN SYSTEMS Iâve worked on a few different design systems over recent years, and they all have unique properties that affect how we organized them. Specifically the most technically-ambitious design systems lived directly next to the code that consumed it, and the most design-ambitious systems needed to include hundreds of prototype page templates and variants of those pages for user testing and NEED-TO-KNOW SKILLS OF UI DESIGN FOR MOBILE DEVICES 1. UI design principle. Donât think the practical UI design principle does not apply to small mobile screens. Five elements of UI design you should take into consideration: 1). Goal-driven Design. This allows you to customize the app working process and meetrequirements for
EXPRESSING TIME IN UI & UX DESIGN: 5 RULESâŚAND A FEW OTHER Rule 3: Finish on time. If you provide an indication that a process will take 10 minutes, ensure that the indication does not take longer. In short, finish within the stated time. Do not stop the timer or bounce it from 7 minutes back up to 8 minutes. Likewise, ensure the progress bar does not bounce back and forth. 6 BARRIERS TO WORKING IN A MULTI-DISCIPLINARY TEAM (AND In a team with different skillsets, one can be hopeful and idealistic about the outcome. The goal is to work as one team, put users first and create awesome experiences. Unfortunately, things donât 20 CREATIVE SEARCH BAR DESIGN INSPIRATIONS WITH HTML/CSS A great list of 20 creative HTML/CSS/ Bootstrap search bar design for your inspiration. The search bar connects people with websites, mobile apps, and the world. Itâs a conversation window between the user and the app or website. In the face of complicated web content, users express their needs by searching keywords, expecting to obtain FIVE CRITICAL QUESTIONS TO ASK AS A VR/AR PRACTITIONER For richness, I mean two things: The dimension of info. Info with physical attributes. We can store the data with not only the textual or pixel info but also info that covers other senses like physical attributes, depth, smell, material, etc. ⥠Break the limitation ofspace and time.
6 SHARP ALTERNATIVES TO BORING SERIF DEFAULTS S tarting a new design project is a great opportunity to test some new typefaces. I am sharing with y o u 6 serif typefaces which are a totally good choice to replace any boring serif font like the Times. All of them have specifically strong shapes and their sharp aesthetic takes inspiration from the inscriptional forms of letter carved fromstone.
NEW IN IOS 15 FOR PRODUCT DESIGNERS & DESIGN ENGINEERS Location Permission. Over the past few years, the location pe r mission received multiple updates to enhance privacy. In iOS 13 a new option was introduced to allow access to your location just once. The native location permission would be displayed and every time you use the app, you would see the permission alert again. 9 PSYCHOLOGICAL RULES I USED TO KEEP USERS ENGAGED WITH MY Illustration by Storytale. According to Don Norman, people develop emotions with an object on three levels: visceral (intrinsic), behavioral (behavior), and reflective (reflection).In case you missed my previous article about the Visceral level, take a look. At the Behavioral level, emotions are formed based on the product's usability. Do all the features work correctly or not, and how long STOP ASKING âWHAT PROBLEM ARE WE TRYING TO SOLVE?â Stop asking âWhat problem are we trying to solve?â. Ben Crothers. Jun 17, 2020 ¡ 5 min read. âWhat problem are we trying to solve?â is a smart question, but it usually gets us nowhere. Hereâs a better way, and some better questions to ask. I was in yet another planning meeting, when my colleague leaned back in his chair and said VR EXPERIENCE FOR MENTAL HEALTH This contains all of my initial ideas about VR experiences, grouped into types of experience such as games, productivity, experience. These initial ideas lead to some bigger stories where ideas are CURIOSITY QUESTIONS. 105 PROMPTS TO CONNECT REMOTE TEAMS 105 Prompts to connect remote teams all year long. âCuriosity Questionsâ is published by Jasmine Rosen in Prototypr. UX DESIGN FOR NAVIGATION MENUS. NAVIGATION MENUS ARE ONE 6) Donât hide it. Navigation menus are one of the most-clicked-on pieces of interface, and they provide major contextual information to the user, so it should always be visible. The default on mobile these days seems to be the hamburger menu, but there are alternatives that donât hide the nav completely: tabs, progressive collapsing 7 BEST UX PRACTICES FOR DESIGNING LONG ONLINE FORMS TL;DR. Do these seven things to make a usable long online form: group your questions into sections, make location visible, donât make questions out-of-focus, use a stepper, set expectations before the start, add help text and make it understandable, and. donât stop people from clicking âSENDâ. TOP 10 FUNNY LOREM IPSUM GENERATORS TO MAKE YOUR DESIGN As we all know about the lorem ipsum, Itâs totally fake content to put in your mokup but sometimes itâs not suitable for the design. Itâs a random text FIVE CRITICAL QUESTIONS TO ASK AS A VR/AR PRACTITIONER For richness, I mean two things: The dimension of info. Info with physical attributes. We can store the data with not only the textual or pixel info but also info that covers other senses like physical attributes, depth, smell, material, etc. ⥠Break the limitation ofspace and time.
60 OF THE BEST GRAPHIC DESIGNERS TO FOLLOW ON BEHANCE 15. Jessica Walsh. Jessica Walsh is an American graphic designer, art director and illustrator, and a partner at renowned creative agency Sagmeister & Walsh. Born in NYC and raised in nearby Ridgefield, Connecticut, she began coding and designing websites at just 11 years old and went on to study graphic design at the Rhode Island School ofDesign.
Get trending design toolsGet weekly design tools and newsEnter email address
Subscribe
Search
Stories
ToolboxNews People
Sign In
Sign Up
Toolbox
Stories
News
People
Sign In
Sign Up
âď¸
Featured Article
INTERACTION DESIGN IS MORE THAN JUST USER FLOWS AND CLICKSRICHARD YANG
How to evaluate interaction costs and improve UX. There are three coreskills...
ON PROTOTYPR
FEATURED ARTICLES
Show all
USING CC LIBRARIES WITH ADOBE XDBY JERLYN
SHOPEE MOBILE APP â A UX CASE STUDYBY CHEW YUNE
UX CHALLENGES
BY JORDAN BOWMAN
LATEST TOOLS
See more â
PROTOPIE â NO-CODE PROTOTYPING TOOLPromoted
PLASMIC
INPUT KIT FROM FRAMERFIGMASTER
PROTOTYPR CIRCLE
FROM THE WEB
Tutorial: From Sketch to Xcode Part 3 â Adding a Tab Bar In this tutorial Iâm going to explore the scenario where you have built something in Sketch with Sketch2React and used our Capacitor 3.0 export for creating iOS projects. In itself really amazing, but you feel you could do more. Alwayssketch2react.io
Create AI videos by simply typing in text 1 Select your AI presenter Choose from our in-house video avatars or create your own avatar. 2 Type in your script Just type or paste in your video script.We support 40+ languages. 3 Get your video Your video will be created within minutes. Translate, download or stream itwww.synthesia.io
Designers Need to Move People and Pixels Shahrzad Samadzadeh, VP of UX at Salesforce, talks about design as a team sport. Hi Iâm Denise, the senior director of design at Salesforce. Iâve been working to define and develop the emergent practice of Relationship Design. In doing so, Iâve beenmedium.com
Adding A Commenting System To A WYSIWYG Editor In recent years, weâve seen Collaboration penetrate a lot of digital workflows and use-cases across many professions. Just within the Design and Software Engineering community, we see designers collaborate on design artifacts using tools like Figma, teams doing Sprint and Project Planning using tools like Mural and interviews being conducted using CoderPad. All these tools are constantly aiming to bridge the gap between an online and a physical world experience of executing these workflows and making the collaboration experience as rich and seamless as possible. For the majority of the Collaboration Tools like these, the ability to share opinions with one another and have discussions about the same content is a must-have. A Commenting System that enables collaborators to annotate parts of a document and have conversations about them is at the heart of this concept. Along with building one for text in a WYSIWYG Editor, the article tries to engage the readers into how we try to weigh the pros and cons and attempt to find a balance between application complexity and user experience when it comes to building features for WYSIWYG Editors or Word Processors in general. Representing Comments In Document Structure In order to find a way to represent comments in a rich text documentâs data structure, letâs look at a few scenarios under which comments could be created inside an editor. Comments created over text that has no styles on it (basic scenario); Comments created over text that may be bold/italic/underlined, and soon;
Comments that overlap each other in some way (partial overlap where two comments share only a few words or fully-contained where one commentâs text is fully contained within text of another comment); Comments created over text inside a link (special because links are nodes themselves in our document structure); Comments that span multiple paragraphs (special because paragraphs are nodes in our document structure and comments are applied to text nodes which are paragraphâs children). Looking at the above use-cases, it seems like comments in the way they can come up in a rich text document are very similar to character styles (bold, italics etc). They can overlap with each other, go over text in other types of nodes like links and even span multiple parent nodes like paragraphs. For this reason, we use the same method to represent comments as we do for character styles, i.e. âMarksâ (as they are so called in SlateJS terminology). Marks are just regular properties on nodes â speciality being that Slateâs API around marks (Editor.addMark and Editor.removeMark) handles changing of the node hierarchy as multiple marks get applied to the same range of text. This is extremely useful to us as we deal with a lot of different combinations of overlappingcomments.
Comment Threads As Marks Whenever a user selects a range of text and tries to insert a comment, technically, theyâre starting a new comment thread for that text range. Because we would allow them to insert a comment and later replies to that comment, we treat this event as a new comment thread insertion in the document. The way we represent comment threads as marks is that each comment thread is represented by a mark named as commentThread_threadID where threadID is a unique ID we assign to each comment thread. So, if the same range of text has two comment threads over it, it would have two properties set to the true â commentThread_thread1 and commentThread_thread2. This is where comment threads are very similar to character styles since if the same text was bold and italic, it would have both the properties set to true â bold and italic. Before we dive into actually setting this structure up, itâs worth looking at how the text nodes change as comment threads get applied to them. The way this works (as it does with any mark) is that when a mark property is being set on the selected text, Slateâs Editor.addMark API would split the text node(s) if needed such that in the resulting structure, text nodes are set up in a way that each text node has the exact same value of the mark. To understand this better, take a look at the following three examples that show the before-and-after state of the text nodes once a comment thread is inserted on the selected text: Highlighting Commented Text Now that we know how we are going to represent comments in the document structure, letâs go ahead and add a few to the example document from the first article and configure the editor to actually show them as highlighted. Since we will have a lot of utility functions to deal with comments in this article, we create a EditorCommentUtils module that will house all these utils. To start with, we create a function that creates a mark for a given comment thread ID. We then use that to insert a few comment threads in ourExampleDocument.
# src/utils/EditorCommentUtils.js const COMMENT_THREAD_PREFIX = âcommentThread_â; export function getMarkForCommentThreadID(threadID) { return `${COMMENT_THREAD_PREFIX}${threadID}`;}
Below image underlines in red the ranges of text that we have as example comment threads added in the next code snippet. Note that the text âRichard McClintockâ has two comment threads that overlap each other. Specifically, this is a case of one comment thread being fully contained inside another. # src/utils/ExampleDocument.js import { getMarkForCommentThreadID } from â../utils/EditorCommentUtilsâ; import { v4 as uuid } from âuuidâ; const exampleOverlappingCommentThreadID = uuid(); const ExampleDocument = ; We focus on the UI side of things of a Commenting System in this article so we assign them IDs in the example document directly using the npm package uuid. Very likely that in a production version of an editor, these IDs are created by a backend service. We now focus on tweaking the editor to show these text nodes as highlighted. In order to do that, when rendering text nodes, we need a way to tell if it has comment threads on it. We add a util getCommentThreadsOnTextNode for that. We build on the StyledText component that we created in the first article to handle the case where it may be trying to render a text node with comments on. Since we have some more functionality coming that would be added to commented text nodes later, we create a component CommentedText that renders the commented text. StyledText will check if the text node itâs trying to render has any comments on it. If it does, it renders CommentedText. It uses a util getCommentThreadsOnTextNode to deducethat.
# src/utils/EditorCommentUtils.js export function getCommentThreadsOnTextNode(textNode) {return new Set(
// Because marks are just properties on nodes, // we can simply use Object.keys() here. Object.keys(textNode) .filter(isCommentThreadIDMark) .map(getCommentThreadIDFromMark));
}
export function getCommentThreadIDFromMark(mark) { if (!isCommentThreadIDMark(mark)) { throw new Error(âExpected mark to be of a comment threadâ);}
return mark.replace(COMMENT_THREAD_PREFIX, ââ);}
function isCommentThreadIDMark(mayBeCommentThread) { return mayBeCommentThread.indexOf(COMMENT_THREAD_PREFIX) === 0;}
The first article built a component StyledText that renders text nodes (handling character styles and so on). We extend that component to use the above util and render a CommentedText component if the node hascomments on it.
# src/components/StyledText.js import { getCommentThreadsOnTextNode } from â../utils/EditorCommentUtilsâ; export default function StyledText({ attributes, children, leaf }) {âŚ
const commentThreads = getCommentThreadsOnTextNode(leaf); if (commentThreads.size > 0) {return (
{children}
);
}
return {children};
}
Below is the implementation of CommentedText that renders the text node and attaches the CSS that shows it as highlighted. # src/components/CommentedText.js import â./CommentedText.cssâ; import classNames from âclassnamesâ; export default function CommentedText(props) { const { commentThreads, âŚotherProps } = props;return (
{props.children}
);
}
# src/components/CommentedText.css.comment {
background-color: #feeab5;}
With all of the above code coming together, we now see text nodes with comment threads highlighted in the editor. Note: The users currently cannot tell if certain text has overlapping comments on it. The entire highlighted text range looks like a single comment thread. We address that later in the article where we introduce the concept of active comment thread which lets users select a specific comment thread and be able to see its range in the editor. UI Storage For Comments Before we add the functionality that enables a user to insert new comments, we first setup a UI state to hold our comment threads. In this article, we use RecoilJS as our state management library to store comment threads, comments contained inside the threads and other metadata like creation time, status, comment author etc. Letâs add Recoil to our application:> yarn add recoil
We use Recoil atoms to store these two data structures. If youâre not familiar with Recoil, atoms are what hold the application state. For different pieces of application state, youâd usually want to set up different atoms. Atom Family is a collection of atoms â it can be thought to be a Map from a unique key identifying the atom to the atoms themselves. Itâs worth going through core concepts of Recoil at this point and familiarizing ourselves with them. For our use case, we store comment threads as an Atom family and then wrap our application in a RecoilRoot component. RecoilRoot is applied to provide the context in which the atom values are going to be used. We create a separate module CommentState that holds our Recoil atom definitions as we add more atom definitions later in the article. # src/utils/CommentState.js import { atom, atomFamily } from ârecoilâ; export const commentThreadsState = atomFamily({ key: âcommentThreadsâ,default: ,
});
export const commentThreadIDsState = atom({ key: âcommentThreadIDsâ,default: new Set(),
});
Worth calling out few things about these atom definitions: Each atom/atom family is uniquely identified by a key and can be set up with a default value. As we build further in this article, we are going to need a way to iterate over all the comment threads which would basically mean needing a way to iterate over commentThreadsState atom family. At the time of writing this article, the way to do that with Recoil is to set up another atom that holds all the IDs of the atom family. We do that with commentThreadIDsState above. Both these atoms would have to be kept in sync whenever we add/delete comment threads. We add a RecoilRoot wrapper in our root App component so we can use these atoms later. Recoilâs documentation also provides a helpful Debugger component that we take as it is and drop into our editor. This component will leave console.debug logs to our Dev console as Recoil atoms are updated in real-time. # src/components/App.js import { RecoilRoot } from ârecoilâ; export default function App() {âŚ
return (
>
âŚ
);
}
# src/components/Editor.js export default function Editor({ ⌠}): JSX.Element {âŚ..
return (
< >
âŚ..
);
function DebugObserver(): React.Node { // see API link above for implementation.}
We also need to need to add code that initializes our atoms with the comment threads that already exist on the document (the ones we added to our example document in the previous section, for instance). We do that at a later point when we build the Comments Sidebar that needs to read all the comment threads in a document. At this point, we load our application, make sure there are no errors pointing to our Recoil setup and move forward.Adding New Comments
In this section, we add a button to the toolbar that lets the user add comments (viz. create a new comment thread) for the selected text range. When the user selects a text range and clicks on this button, we need to do the below: Assign a unique ID to the new comment thread being inserted. Add a new mark to Slate document structure with the ID so the user sees that text highlighted. Add the new comment thread to Recoil atoms we created in the previoussection.
Letâs add a util function to EditorCommentUtils that does #1 and #2. # src/utils/EditorCommentUtils.js import { Editor } from âslateâ; import { v4 as uuidv4 } from âuuidâ; export function insertCommentThread(editor, addCommentThreadToState) { const threadID = uuidv4(); const newCommentThread = { // comments as added would be appended to the thread here.comments: ,
creationTime: new Date(), // Newly created comment threads are OPEN. We deal with statuses // later in the article.status: âopenâ,
};
addCommentThreadToState(threadID, newCommentThread); Editor.addMark(editor, getMarkForCommentThreadID(threadID), true);return threadID;
}
By using the concept of marks to store each comment thread as its own mark, weâre able to simply use the Editor.addMark API to add a new comment thread on the text range selected. This call alone handles all the different cases of adding comments â some of which we described in the earlier section â partially overlapping comments, comments inside/overlapping links, comments over bold/italic text, comments spanning paragraphs and so on. This API call adjusts the node hierarchy to create as many new text nodes as needed to handle thesecases.
addCommentThreadToState is a callback function that handles step #3 â adding the new comment thread to Recoil atom . We implement that next as a custom callback hook so that itâs re-usable. This callback needs to add the new comment thread to both the atoms â commentThreadsState and commentThreadIDsState. To be able to do this, we use the useRecoilCallback hook. This hook can be used to construct a callback which gets a few things that can be used to read/set atom data. The one weâre interested in right now is the set function which can be used to update an atom value as set(atom, newValueOrUpdaterFunction). # src/hooks/useAddCommentThreadToState.jsimport {
commentThreadIDsState, commentThreadsState, } from â../utils/CommentStateâ; import { useRecoilCallback } from ârecoilâ; export default function useAddCommentThreadToState() { return useRecoilCallback( ({ set }) = > (id, threadData) = > { set(commentThreadIDsState, (ids) = > new Set()); set(commentThreadsState(id), threadData);},
);
}
The first call to set adds the new ID to the existing set of comment thread IDs and returns the new Set(which becomes the new value of theatom).
In the second call, we get the atom for the ID from the atom family â commentThreadsState as commentThreadsState(id) and then set the threadData to be its value. atomFamilyName(atomID) is how Recoil lets us access an atom from its atom family using the unique key. Loosely speaking, we could say that if commentThreadsState was a javascript Map, this call is basically â commentThreadsState.set(id,threadData).
Now that we have all this code setup to handle insertion of a new comment thread to the document and Recoil atoms, lets add a button to our toolbar and wire it up with the call to these functions. # src/components/Toolbar.js import { insertCommentThread } from â../utils/EditorCommentUtilsâ; import useAddCommentThreadToState from â../hooks/useAddCommentThreadToStateâ; export default function Toolbar({ selection, previousSelection }) { const editor = useEditor();âŚ
const addCommentThread = useAddCommentThreadToState(); const onInsertComment = useCallback(() = > { const newCommentThreadID = insertCommentThread(editor,addCommentThread);
}, );
return (
âŚ
);
}
Note: We use onMouseDown and not onClick which would have made the editor lose focus and selection to become null. Weâve discussed that in a little more detail in the link insertion section of the firstarticle.
In the below example, we see the insertion in action for a simple comment thread and an overlapping comment thread with links. Notice how we get updates from Recoil Debugger confirming our state is getting updated correctly. We also verify that new text nodes are created as threads are being added to the document. In the above example, the user inserts the following comment threadsin that order:
Comment Thread #1 over character âBâ (length = 1). Comment Thread #2 over âABâ (length = 2). Comment Thread #3 over âBCâ (length = 2). At the end of these insertions, because of the way Slate splits the text nodes with marks, we will have three text nodes â one for each character. Now, if the user clicks on âBâ, going by the shortest length rule, we select thread #1 as it is the shortest of the three in length. If we donât do that, we wouldnât have a way to select Comment Thread #1 ever since it is only one-character in length and also a part of two other threads. Although this rule makes it easy to surface shorter-length comment threads, we could run into situations where longer comment threads become inaccessible since all the characters contained in them are part of some other shorter comment thread. Letâs look at an examplefor that.
Letâs assume we have 100 characters (say, character âAâ typed 100 times that is) and the user inserts comment threads in thefollowing order:
Comment Thread # 1 of range 20,80 Comment Thread # 2 of range 0,50 Comment Thread # 3 of range 51,100 As you can see in the above example, if we follow the rule we just described here, clicking on any character between #20 and #80, would always select threads #2 or #3 since they are shorter than #1 and hence #1 would not be selectable. Another scenario where this rule can leave us undecided as to which comment thread to select is when there are more than one comment threads of the same shortest length on atext node.
For such combination of overlapping comments and many other such combinations that one could think of where following this rule makes a certain comment thread inaccessible by clicking on text, we build a Comments Sidebar later in this article which gives user a view of all the comment threads present in the document so they can click on those threads in the sidebar and activate them in the editor to see the range of the comment. We still would want to have this rule and implement it as it should cover a lot of overlap scenarios except for the less-likely examples we cited above. We put in all this effort around this rule primarily because seeing highlighted text in the editor and clicking on it to comment is a more intuitive way of accessing a comment on text than merely using a list of comments inthe sidebar.
Insertion Rule
The rule is:
âIf the text user has selected and is trying to comment on is already fully covered by comment thread(s), donât allow thatinsertion.â
This is so because if we did allow this insertion, each character in that range would end up having at least two comment threads (one existing and another the new one we just allowed) making it difficult for us to determine which one to select when the user clicks on thatcharacter later.
Looking at this rule, one might wonder why we need it in the first place if we already have the Shortest Comment Range Rule that allows us to select the smallest text range. Why not allow all combinations of overlaps if we can use the first rule to deduce the right comment thread to show? As some of the examples weâve discussed earlier, the first rule works for a lot of scenarios but not all of them. With the Insertion Rule, we try to minimize the number of scenarios where the first rule cannot help us and we have to fallback on the Sidebar as the only way for the user to access that comment thread. Insertion Rule also prevents exact-overlaps of comment threads. This rule is commonly implemented by a lot of popular editors. Below is an example where if this rule didnât exist, we would allow the Comment Thread #3 and then as a result of the first rule, #3 would not be accessible since it would become the longest in length. In this example, letâs assume we donât wait for intersection to become 0 and just stop when we reach the edge of a comment thread. Now, if the user clicked on #2 and we start traversal in reverse direction, weâd stop at the start of text node #2 itself since thatâs the start of the comment thread A. As a result, we might not compute the comment thread lengths correctly for A & B. With the implementation above traversing the farthest edges (text nodes 1,2, and 3), we should get B as the shortest comment thread as expected. To see the implementation visually, below is a walkthrough with a slideshow of the iterations. We have two comment threads A and B that overlap each other over text node #3 and the user clicks on the overlapping text node #3. Now that we have all the code in to make selection of comment threads work, letâs see it in action. To test our traversal code well, we test some straightforward cases of overlap and some edge cases like: Clicking on a commented text node at the start/end of the editor. Clicking on a commented text node with comment threads spanning multiple paragraphs. Clicking on a commented text node right before an image node. Clicking on a commented text node overlapping links. Now that our state is correctly initialized, we can start implementing the sidebar. All our comment threads in the UI are stored in the Recoil atom family â commentThreadsState. As highlighted earlier, the way we iterate through all the items in a Recoil atom family is by tracking the atom keys/ids in another atom. Weâve been doing that with commentThreadIDsState. Letâs add the CommentSidebar component that iterates through the set of ids in this atom and renders a CommentThread component for each. # src/components/CommentsSidebar.js import â./CommentSidebar.cssâ; import {commentThreadIDsState,} from â../utils/CommentStateâ; import { useRecoilValue } from ârecoilâ; export default function CommentsSidebar(params) { const allCommentThreadIDs = useRecoilValue(commentThreadIDsState);return (
Comments
{Array.from(allCommentThreadIDs).map((id) = > ())}
);
}
Now, we implement the CommentThread component that listens to the Recoil atom in the family corresponding to the comment thread it is rendering. This way, as the user adds more comments on the thread in the editor or changes any other metadata, we can update the sidebar toreflect that.
As the sidebar could grow to be really big for a document with a lot of comments, we hide all comments but the first one when we render the sidebar. The user can use the âShow/Hide Repliesâ button to show/hide the entire thread of comments. # src/components/CommentSidebar.js function CommentThread({ id }) { const { comments } = useRecoilValue(commentThreadsState(id)); const = useState(false); const onBtnClick = useCallback(() = > { setShouldShowReplies(!shouldShowReplies);}, );
if (comments.length === 0) {return null;
}
const = comments;
return (
{shouldShowReplies
? otherComments.map((comment, index) = > ())
: null}
{comments.length > 1 ? ( {shouldShowReplies ? âHide Repliesâ : âShow Repliesâ}) : null}
);
}
Weâve reused the CommentRow component from the popover although we added a design treatment using showConnector prop that basically makes all the comments look connected with a thread in the sidebar. Now, we render the CommentSidebar in the Editor and verify that it shows all the threads we have in the document and correctly updates as we add new threads or new comments to existing threads. # src/components/Editor.jsreturn (
< >
âŚ..
);
We now move on to implementing a popular Comments Sidebar interactionfound in editors:
Clicking on a comment thread in the sidebar should select/activate that comment thread. We also add a differential design treatment to highlight a comment thread in the sidebar if itâs active in the editor. To be able to do so, we use the Recoil atom â activeCommentThreadIDAtom. Letâs update the CommentThread componentto support this.
# src/components/CommentsSidebar.js function CommentThread({ id }) {const =
useRecoilState(
activeCommentThreadIDAtom);
const onClick = useCallback(() = > { setActiveCommentThreadID(id);}, );
âŚ
return (
âŚ.
);
If we look closely, we have a bug in our implementation of sync-ing the active comment thread with the sidebar. As we click on different comment threads in the sidebar, the correct comment thread is indeed highlighted in the editor. However, the Comment Popover doesnât actually move to the changed active comment thread. It stays where it was first rendered. If we look at the implementation of the Comment Popover, it renders itself against the first text node in the editorâs selection. At that point in the implementation, the only way to select a comment thread was to click on a text node so we could conveniently rely on the editorâs selection since it was updated by Slate as a result of the click event. In the above onClick event, we donât update the selection but merely update the Recoil atom value causing Slateâs selection to remain unchanged and hence the Comment Popover doesnât move. A solution to this problem is to update the editorâs selection along with updating the Recoil atom when the user clicks on the comment thread in the sidebar. The steps do this are: Find all text nodes that have this comment thread on them that we are going to set as the new active thread. Sort these text nodes in the order in which they appear in the document (We use Slateâs Path.compare API for this). Compute a selection range that spans from the start of the first text node to the end of the last text node. Set the selection range to be the editorâs new selection (using Slateâs Transforms.select API). If we just wanted to fix the bug, we could just find the first text node in Step #1 that has the comment thread and set that to be the editorâs selection. However, it feels like a cleaner approach to select the entire comment range as we really are selecting the commentthread.
Letâs update the onClick callback implementation to include thesteps above.
const onClick = useCallback(() = > { const textNodesWithThread = Editor.nodes(editor, {at: ,
mode: âlowestâ,
match: (n) = > Text.isText(n) && getCommentThreadsOnTextNode(n).has(id),});
let textNodeEntry = textNodesWithThread.next().value; const allTextNodePaths = ; while (textNodeEntry != null) { allTextNodePaths.push(textNodeEntry); textNodeEntry = textNodesWithThread.next().value;}
// sort the text nodes allTextNodePaths.sort((p1, p2) = > Path.compare(p1, p2)); // set the selection on the editor Transforms.select(editor, { anchor: Editor.point(editor, allTextNodePaths, { edge: âstartâ}),
focus: Editor.point(editor,
allTextNodePaths,
{ edge: âendâ }
),
});
// Update the Recoil atom value. setActiveCommentThreadID(id);}, );
Note: allTextNodePaths contains the path to all the text nodes. We use the Editor.point API to get the start and end points at that path. The first article goes through Slateâs Location concepts. Theyâre also well-documented on Slateâs documentation. Letâs verify that this implementation does fix the bug and the Comment Popover moves to the active comment thread correctly. This time, we also test with a case of overlapping threads to make sure it doesnât break there. With the bug fix, weâve enabled another sidebar interaction that we havenât discussed yet. If we have a really long document and the user clicks on a comment thread in the sidebar thatâs outside the viewport, weâd want to scroll to that part of the document so the user can focus on the comment thread in the editor. By setting the selection above using Slateâs API, we get that for free. Letâs seeit in action below.
With that, we wrap our implementation of the sidebar. Towards the end of the article, we list out some nice feature additions and enhancements we can do to the Comments Sidebar that help elevate the Commenting and Review experience on the editor. Resolving And Re-Opening Comments In this section, we focus on enabling users to mark comment threads as âResolvedâ or be able to re-open them for discussion if needed. From an implementation detail perspective, this is the status metadata on a comment thread that we change as the user performs this action. From a userâs perspective, this is a very useful feature as it gives them a way to affirm that the discussion about something on the document has concluded or needs to be re-opened because there are some updates/new perspectives, and so on. To enable toggling the status, we add a button to the CommentPopover that allows the user to toggle between the two statuses: open andresolved.
# src/components/CommentThreadPopover.js export default function CommentThreadPopover({editorOffsets,
selection,
threadID,
}) {
âŚ
const = useRecoilState( commentThreadsState(threadID));
âŚ
const onToggleStatus = useCallback(() = > { const currentStatus = threadData.status; setCommentThreadData((threadData) = > ({âŚthreadData,
status: currentStatus === âopenâ ? âresolvedâ : âopenâ,}));
}, );
return (
}
>
âŚ
);
}
function Header({ onToggleStatus, shouldAllowStatusChange, status }) {return (
{shouldAllowStatusChange && status != null ? ( {status === âopenâ ? âResolveâ : âRe-Openâ}) : null}
);
}
Before we test this, letâs also give the Comments Sidebar a differential design treatment for resolved comments so that the user can easily detect which comment threads are un-resolved or open and focus on those if they want to. # src/components/CommentsSidebar.js function CommentThread({ id }) {âŚ
const { comments, status } = useRecoilValue(commentThreadsState(id));âŚ
return (
âŚ
);
}
Conclusion
In this article, we built the core UI infrastructure for a Commenting System on a Rich Text Editor. The set of functionalities we add here act as a foundation to build a richer Collaboration Experience on an editor where collaborators could annotate parts of the document and have conversations about them. Adding a Comments Sidebar gives us a space to have more conversational or review-based functionalities to be enabled on the product. Along those lines, here are some of features that a Rich Text Editor could consider adding on top of what we built in this article: Support for @ mentions so collaborators could tag one another incomments;
Support for media types like images and videos to be added to commentthreads;
Suggestion Mode at the document level that allows reviewers to make edits to the document that appear as suggestions for changes. One could refer to this feature in Google Docs or Change Tracking in Microsoft Word as examples; Enhancements to the sidebar to search conversations by keyword, filter threads by status or comment author(s), and so on. smashingmagazine.com 2021 Logo Trend Report This year is about drama: comedy, tragedy and satire. A connection with the human experience.www.logolounge.com
Reducing Design Friction: Why a dev might be your best design teamhire.
Reducing Design friction: Why a dev might be the best hire for your design teamTL;DR: 6 months of work by 1 intern and the 20% time of two âdev-signersâ led to designs taking 30% less time to create for designers at Atlassian. Interested to learn how? Read onâŚRepetition is the antithesis of fun. The games industry has known this for yearsâââgrinding out the same thing over and over for the same reward creates diminishing dopamine responses until it becomes aggravating. Conversely, performing an action that amplifies your reward is immensely satisfying.Exponential reward leads to high user satisfaction. Impressively scientific gif proves this. Just look at the smiley faces the graphs make.Games like Cookie Clicker are based entirely around thisâââexponential return from the same action. Other games such as Factorio go even further, allowing users to completely automate every action in the game, leading to enormous returns on efficiency for every action. This simple mechanic done well has led to it being the #2 top-rated game of all time on steam, and itâs described by one user as:As designers, we can learn a lot from this. By removing aggravating repetitive tasks, we can see exponential returns in our design efficiency. This is what Atlassianâs Design Tooling Team has been pursuing in the last year.Identifying the problem areasOur first step was simply observing designers as they did in their day-to-day work. A shout out to Dovetail here, which really helped us track and tag our research in a way that was easy to break down and digest. What we found among the top issues were three that we thought would be easy to automate:Inserting good copy into designsGoing through the proper processes for licensing photosFinding the right symbol in our GUI packOnce we had this list, we went to work.Lorem Ipsum? Hardly Missâem.Good copy is hard to write. Not because we arenât destined to be the next Steven King, but because we often fit content to match our designs rather than content that would actually be used. This leads to mocks that look great but production pages that look cramped.Sometimes we repeat the same thing over and over just to fill space, leading to a lack of realism when looking at the design. Sometimes we repeat the same thing over and over just to fill space, leading to a lack of realism when looking at⌠well you get the point. More importantly, though, good data takes a lot of time. Luckily Sketchâs data providers make this an easy fix. All we did was create 50 or so entries per data type (i.e. 50 Jira project names, 50 Confluence page titles, etc), toss them into a JSON file, and bamâââinstant time savings for our designers.Filling in Jira project names with Sketchâs data APINote the two projects near the endâââjust by using random data, we caught an issue with overflow/lack of truncation. Had we typed this by hand, weâd likely have written data to fit the design. Not all is perfect in the land of Sketch data providers, however as it generates each entity independently, you end up with a lot of poorly matched data:Jenny hopefully doesnât look like Danny DevitoLack of realism in data breaks people out of their thinking. Just like this misspelt word and the poor grammar in the previous sentence. You lose thebcontext of what youâre looking at because bad data is like a rock in your shoeâââno matter what youâre doing that tiny pebble will be the source of all of your attention. To maintain focus, good data should be matched:Data that looks correct. Itâs boring, but thatâs the point.We wrote a Sketch plugin that links data types together so that Jie Yan Songâs email will always be jysong@atlassian, and her picture will always be her smiling. On that note, letâs talk about her picture.Faces, Licensing, and AIEarly on, we knew we wanted avatars to be a part of the data generators pack. Up to this point we had two images that everyone at Atlassian used for all of their mock-ups. Someone, somewhere had added these to a Dropbox folder of design resources, and well, the rest was history. Forgotten history, unfortunatelyâââno one knew if the photos were licensed or where they came from. This was problematic as inevitably these photos ended up in main stage demos, ads, and who knows where else. Even if it was a royalty-free photo from Unsplash, the risk is the same face advertising the latest Jira feature may also be used to advertise extra strength laxatives. The only safe course is to set up your own photoshoot through a modeling agency to ensure you have full control of the photos. As a tooling team, we did this so our designers didnât have to. The three goals were:Have photos we controlled the license forHave strong representations of diversityBe able to distribute these photos as an open-source libraryAgencies were keen and well-suited to satisfy the first two points, but we still wanted the option to open source our design plugin work (including the avatars) at a later date. Every modeling agency we talked to refused to operate under those conditions, as they wanted to ensure their modelsâ faces didnât end up on disparaging products. Luckily for us, the agency approach wasnât the only option we pursued. Nvidia had just published their paper on GAN-created faces, and the results were pretty stunning. We waited for them to publish their source then generated over a thousand fake people. The best of these ended up in Atlassianâs Fake User Pack:License-free, fully reusable, and with broad diversity represented, the GAN approach satisfied all of our needs. The best partâââthe user pack and data generators cut design time, on average, by 15%.This work was done almost entirely by our intern Huw, as well as two of our senior âdev-signersâ, in their 20% time. Big wins for a small time investment.Finding a Symbol in Nested NightmaresWe have a large number of symbols and variations in our design system. With small parts, subcomponents, and overrides for all of them, our Sketch menus turned into a living nightmare.We ran a quick calculation and realized there were over two thousand options in our symbol insertion dropdown in Sketch. This significantly slowed down any efficiency and creativity while trying to find the right symbol to use. Sketch Runner helps with this (huge props to how well that works) but unfortunately this only works if you know the exact name of the component itself.We have new designers starting every week and so needed a way to alias components in the future and to provide just-in-time documentation for each of the symbols. While itâs still early days, it ended up not being too difficult to create a searchable insertion pattern in React:By their powers combinedâŚWith all of the above wins, designs that used to take an hour are now taking 42 minutes. Thatâs 30% of designersâ time saved from the work of an excellent intern combined with some designerâs side time!The best news? Weâre providing all of this as an open-source extension so you can accelerate your own work. These can be accessed via the repository on Github. If you use these materials do toss us a PR with some things youâve found that have helped your organization design fasterâââweâd love to hear about it.Reducing Design Friction: Why a dev might be your best design team hire. was originally published in Designing Atlassian on Medium, where people are continuing the conversation by highlighting and responding to this story.medium.com
Improve your UX with heatmaps Itâs often said that actions speak louder than words, and while goal-based and qualitative user tests are a key part of the design journey, sometimes the most informative test of all, is to watch a user interact organically with yourmarvelapp.com
Cognitive Bias and the Design Process A look at the systematic errors in thinking that affects decisions and judgment during the design process.jonyablonski.com
Embracing the mess at Config 2021 Watch all of the videos from Config 2021, and read on for some of our favorite moments about what it means to celebrate failure, move through obstacles, and embrace the tough parts of product development.www.figma.com
Sometimes more is more⌠One of the most rewarding aspects of running a small, independent software company together with a great friend is that you have so much trust in each other, that more than often things move forward without discussion. We read betweensketch2react.io
SEE MORE â
GET PROTOTYPR WEEKLY đ The latest design tools and news once a week.Enter email address
Subscribe
IN CASE YOU
MISS THEM
SEE ALL
205
How a feature focus can harm your product20 APR 2021
204
Einstein Designer
8 APR 2021
203
Do free fonts get a bad wrap?2 APR 2021
202
Figma not free anymore?2 APR 2021
Build your prototype like a real app. Validate features and discover UX problems easily and quickly.BROUGHT TO YOU BY:
PROTOPIE
Get Prototypr Weekly Top articles and tools every week đEnter email address
Subscribe
Created by Ann , Graeme, and Sofia
. Illustrations by MarĂa.
Š 2020 Prototpyr, All rights reserved.Good Stuff
* Medium Publication* Prototypr Open
Other Resources
* Adobe Fund for Design * Made with Tailwind* Mail by Letter
* Privacy Policy
Details
Copyright © 2024 ArchiveBay.com. All rights reserved. Terms of Use | Privacy Policy | DMCA | 2021 | Feedback | Advertising | RSS 2.0