


Steve Clark's Professional Portfolio


Steve Clark's Professional Portfolio

Multi-Select Dropdown
Each reusable component can have many layouts and styles. Components are made up of simple elements, like text, images, form inputs, links and various calls to action. Each element can have dozens of configurable items. The example below explores the rabbit holes for an otherwise simple dropdown.
The seeminingly infinite requirements and specifications are indeed overwhelming. However, years of repeating the same process led me to create the schema for all of it. Once there is a home for everything you know all the questions to ask and you have all the places to put the answers.
When you hire me you get this level of detail for the dozens of components that build the user journeys your customers want and need.
Multi-Select Dropdown Detailed Annotations Multi-Select Dropdown
Multi-Select Dropdowns are used within forms mostly for filtering on multiple values.
- Permutations
- Interactions
- Presentation
- Technical
- Authoring
- Accessibility
- Findability
- Metrics
- History
Permutations
Layouts
Label Above
DeltaNone. Default layout
CSS FileCSS Class.multi-select-dropdown
.multi-select-dropdown--label-top
Label Right
DeltaLabel is on the left
UsageThis layout can be used to preserve vertical space
CSS Class.multi-select-dropdown
.multi-select-dropdown--label-left
Styles
Light Background
DeltaNone. Default style
CSS FileCSS Class.multi-select-dropdown
.multi-select-dropdown--light-bg
Dark Background
DeltaLabel is on the left
UsageThis style would be used for dark mode or could be used when dropdown is embedded in a dark background component
CSS Class.multi-select-dropdown
.multi-select-dropdown--dark-bg
Interactions
AField labelUser InteractionView
BField containerUser InteractionClick/tap
Expected ResultExpand/collapse
CommentsUser can click or tap anywhere within the field to expand it.
CPromptUser InteractionExpand/collapse
Expected Resultannotation description
CommentsUser can click or tap anywhere within the field to expand it.
DExpand iconUser InteractionExpand/collapse
Expected Resultannotation description
CommentsUser can click or tap anywhere within the field to expand it.
ECollapse iconUser InteractionClick/tap
Expected Resultannotation description
CommentsUser must click or tap on this icon or anwhere within the top of the expanded field to collapse it.
Field will also colllapse upon Submit.FCheckbox - deselectedUser InteractionClick/tap
Expected ResultItem is selected
CommentsSee also "Display Logic" in the Presentation annotations
GMulti-select optionsUser InteractionClick/tap
Expected ResultItem is selected as defined in Annotation J
CommentsUser can click or tap anywhere on an unselected line to select it.
HCTA button - inactiveUser InteractionView
CommentsCTA is, by definition, inactive. It is therefore view-only.
JCheckbox - selectedUser InteractionClick/tap
Expected ResultItem becomes deselected as defined in Annotation G
CommentsUser can click or tap anywhere on a selected line to deselect it.
KCTA button - activeUser InteractionClick/tap
Expected ResultCloses dropdown
Navigates to defined page or flow
CommentsBy clicking the Submit CTA the form output is collected and sent to its defined service, page or flow.
Presentation
Specs
HTMLdiv class="dropdown-container"
CSS FileCSS Class.dropdown-container
CSS Naming ConventionBlock, Element, Modifier (BEM)
FrameworksVue.js
JavascriptResponsiveCSS modifiers have been designed for each viewport and are applied based on @media:
SM (default): 767 and below
MD: .md/ 768 - 991px
LG: .lg/ 992px - 1199px
XL: .xl/ 1200 and above
Annotations
AField LabelCSS Class.field-label
HTML Markup.dropdown-container
Semantic HTML'label' element
Display LogicAlways displayed
BField containerCSS Class.dropdown-container
HTML Markupdiv class="dropdown-container"
Semantic HTML.dropdown-container
JavascriptmultiSelectDropdown.js
Display LogicAlways displayed as curated by author
CommentsThis annotation pertains to the entire dropdown element, which is scripted with multiSelectDropdown.js
CPromptCSS Class.field-hint
HTML Markupdiv class=".field-hint"
Semantic HTMLplaceholder
Display LogicPresented until user executes form action via CTA button
DExpand iconCSS Class.arrow-container
.arrow
.arrow-container
.arrow-CTA-down
HTML Markupclass="arrow arrow-CTA-down"
Assetdropdown-controls-sprite.png
Asset LocationDigital asset manager (DAM) /icons/sprites/
Display LogicDownward-facing arrow is presented when dropdown is inactive (not in focus)
CommentsApproach uses CSS, not a movable HTML viewport.
ECollapse iconCSS Class.arrow-container
.arrow
.arrow-container
.arrow-CTA-down
HTML Markupclass="arrow arrow-CTA-up"
Assetdropdown-controls-sprite.png
Asset LocationDigital asset manager (DAM) /icons/sprites/
Display LogicUpward-facing arrow is presented when dropdown is active (in focus)
CommentsApproach uses CSS, not a movable HTML viewport.
FCheckbox - deselectedCSS Class.dropdown-checkbox-wrapper
.dropdown-checkbox
HTML Markupinput type="checkbox"
Semantic HTMLlabel
for
Assetdropdown-controls-sprite.png
Asset LocationDigital asset manager (DAM) /icons/sprites/
Display LogicUnchecked asset is presented adjacent to unselected items
CommentsApproach uses CSS, not a movable HTML viewport.
The .dropdown-checkbox class is the default (unchecked).
GMulti-select optionsCSS Class.dropdown-text-option
HTML Markupdiv class ="dropdown-text-option"
Semantic HTMLoption
select
Display LogicDisplayed when field has focus.
Commentsannotation description
HCTA button - inactiveCSS Class.dropdown-cta-button
HTML Markupbutton class="dropdown-cta-button"
Semantic HTMLbutton type="submit"
JavascriptmultiSelectDropdown.js
Display LogicInactive version of button is presented until user selects an item.
CommentsButton is inactive by default. Once an option is selected it becomes active (focus). This is managed in the Javascript.
JCheckbox - selectedCSS Class.dropdown-checkbox-wrapper
.dropdown-checkbox
.input:checked + .dropdown-checkbox
HTML Markupinput type="checkbox"
Semantic HTMLlabel
for
Assetdropdown-controls-sprite.png
Asset LocationDigital asset manager (DAM) /icons/sprites/
Display LogicChecked asset is presented adjacent to selected items
CommentsApproach uses CSS, not a movable HTML viewport.
The .input:checked + .dropdown-checkbox is a variation of dropdown-checkbox. When the state of the item changes to checked this variation is invoked.
KCTA button - activeCSS Class.dropdown-cta-button active
HTML Markupbutton class="dropdown-cta-button active"
Semantic HTMLbutton type="submit"
JavascriptmultiSelectDropdown.js
Display LogicActive version of button is presented once user selects an item.
CommentsOnce an option is selected CTA becomes active (focus). This is managed in the Javascript.e
Technical
Specs
CMS ComponentMulti-Select Dropdown
Content Management SystemContentstack
Digital Asset ManagerContentstack
PIMInriver
ERPSAP
CRMSalesforce
API FrameworkFlask
Annotations
AField labelSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
BField containerSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
CPromptSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
DExpand iconSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
ECollapse iconSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
FCheckbox - deselectedSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
GMulti-select optionsSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
HCTA button - inactiveSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
JCheckbox - selectedSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
KCTA button - activeSystem of RecordCMS
DAM
PIM
ERP
CRM
IntegrationsContent Layer (CMS)
Presentation Layer (client-side)
Data Layer
Logic Layer
Security Layer
CommentsThis could get its content from ....
Content is managed in the CMS
Authoring and Experience Curation
Authoring annotation is different from the UI/UX annotations, however, the annotation IDs are consistent. Annotation A covers the Field Label, Annotation C covers the Prompt, etc.
Specs
CMS ComponentMulti-Select Dropdown
Component TypeCustom
Core ComponentCombo Box
Annotations
A1Field Label SourceInterface TypeDropdown
ActionAuthor select
DefaultAuthor Input
OptionsAuthor Input
Data Dictionary
InstructionsAuthor Input - author can input a string into the Field Label Text field (Annotation A2)
Data Dictionary - author can select a value from the data dictionary
Note: if Data Dictionary is selected please check the context as text strings may change.
A2Field Label TextInterface TypeText Field
RequiredNo
Minimum3
Maximum24
InstructionsInputs exceeding the maximum will be truncated in the UI; there is no limit on this field
If a value is selected from the data dictionary it will be populated in the Field Label Text field and the field will be uneditable.
C1Prompt SourceInterface TypeDropdown
ActionAuthor select
DefaultAuthor Input
OptionsAuthor Input
Data Dictionary
InstructionsAuthor Input (default) - author can input a string into the Prompt Text field (Annotation C2)
Data Dictionary - author can select a value from the data dictionary
Note: if Data Dictionary is selected please check the context as text strings may change.
C2Prompt TextInterface TypeText Field
RequiredYes
Minimum5
Maximum20
InstructionsInputs exceeding the maximum will be truncated in the UI; there is no limit on this field
If a value is selected from the data dictionary it will be populated in Prompt Text field and the field will be uneditable.
G1Field Values SourceInterface TypeDropdown
ActionAuthor select
DefaultAuthor Input
OptionsAuthor Input
Data Dictionary
Script
InstructionsAuthor Input (default) - author must input at least 3 strings of text, each separated by a hard return, in the Field Value text area (Annotation G2).
Data Dictionary - author can select values from the data dictionary
Note: if Data Dictionary is selected please check the context as text strings may change.
Script - Author can choose one script from a list. Script will return an array of values that will populate the dropdown as options.
G2Field ValuesInterface TypeText Area
RequiredYes
Minimum3
Maximum10
InstructionsAt least three (3) strings separated by a hard return. If more than 10 strings are inputted only the first 10 will appear in the UI. Each string will appear in the dropdown, and may be truncated by design constraints.
If a value is selected from the data dictionary it will be populated in Prompt Text field and the field will be uneditable.
H1/K1CTA ButtonInterface TypeDropdown
ActionAuthor select
DefaultData Dictionary
OptionsData Dictionary
Author Input
InstructionsData Dictionary (default)- author can select a value from the data dictionary. The data dictionary value "Submit" is the default for this CTA.
Note: if a different data dictionary string is used please check the context as text strings may change.
Author Input - author can input a string into the CTA Text field (Annotation H2/K2)
H2/K2CTA ButtonInterface TypeText Field
RequiredYes
Minimum2
Maximum12
InstructionsInputs exceeding the maximum will be truncated in the UI; there is no limit on this field
If a value is selected from the data dictionary it will be populated in CTA Text field and the field will be uneditable.
LLayoutInterface TypeDropdown
ActionAuthor select
DefaultLabels Above
OptionsLabel Above
Label Left
InstructionsLabels Above is the default layout Labels Left will present the label to the left of the dropdown.
MStyleInterface TypeDropdown
ActionAuthor select
DefaultLabels Above
OptionsLight Background
Dark Background
InstructionsLight Background is the default style. Dark text on a light background.
Dark Background presents light text on a dark background.
All colors are brand-approved from the site's color palette.
All styles meet WCAG 2.1 Level AA contrast requirements.
Accessibility
Specs
ContrastColor contrast for all text and essential visual elements meets WCAG 2.1 Level AA requirements.
Large TextThe design ensures readability of large text (18pt or 14pt bold and above) across all breakpoints, and color contrast meets the WCAG 2.1 Level AA requirement of 3:1.
Annotations
AField labelARIA labelUses html markup 'label'
Labeling'label' element
CommentsThe ‘label' element provides the accessible name.
The 'for' attribute of the 'label' should be associated with the 'id' of the input element.
BField containerARIA labelUses html markup 'label
Focustabindex="0"
Keyboard ControlsEscape key closes the dropdown and returns focus to the trigger button
Labeling'select' element
CommentsThe ‘label' element provides the accessible name.
Ensure visible focus indicator.
Each option within the combo box should be a 'option' element. The 'label; element (as described above) should be used to label the 'select' element itself.
CPromptARIA labelUses html markup 'placeholder' or aria-describedby
Labeling'placeholder' attribute directly on the 'input', 'textarea', or 'select' element.
CommentsThe ‘placeholder' element provides the accessible name.
For more complex or persistent hints, use a separate 'div' or 'span' with a class like form-hint and associate it with the input using aria-describedby.
DExpand iconARIA labelaria-expanded="false"
Keyboard Controlsannotation description
LabelingNot applicable
CommentsA control that expands a section might have text like "Show More" or use an icon with visually hidden text (using a class like sr-only for screen readers).
The button itself would be the semantic element.
ECollapse iconARIA labelaria-expanded="true"
Keyboard ControlsEscape key closes the dropdown and returns focus to the trigger button
LabelingNot applicable
CommentsA control that expands a section might have text like "Show More" or use an icon with visually hidden text (using a class like sr-only for screen readers).
The button itself would be the semantic element.
FCheckbox - deselectedARIA labelUses html markup 'label'
FocusCovered via html markup
Keyboard ControlsSelect or deselect by pressing Spacebar or Enter
Labelinginput type="checkbox"
CommentsThe checked attribute conveys the state.
Each checkbox should have an associated 'label' element (using the 'for' attribute).
The checked attribute on the 'input' indicates the selected state.
GMulti-select optionsARIA labelUses html markup 'option'
FocusCovered via html markup
Keyboard ControlsNavigate options via Up/Down arrow keys
Labelingoption
select
CommentsThe text content of the 'option' elements serves as their accessible name.
The 'option' elements within a 'select' are inherently semantic and self-explanatory.
Their text content provides the meaning.
HCTA button - inactiveARIA labelUses html markup button-type="submit"
FocusCovered via html markup
Keyboard Controlsannotation description
Labelingbutton type="submit"
CommentsThe text content of the button type="submit" provides its accessible name.
The text content of the button (e.g., "Submit," "Save") provides the semantic meaning.
JCheckbox - selectedARIA labelUses html markup 'label'
FocusCovered via html markup
Keyboard ControlsSelect or deselect by pressing Spacebar or Enter
Labelinginput type="checkbox"
CommentsThe checked attribute conveys the state.
Each checkbox should have an associated 'label' element (using the 'for' attribute).
The checked attribute on the 'input' indicates the selected state.
KCTA button - activeARIA labelUses html markup button-type="submit"
FocusCovered via html markup
Keyboard ControlsShift + Tab: Moves focus backward to the Submit button from the element that had focus after it.
When the Submit button has focus, pressing the Enter key will activate the button, triggering the form submission.
Labelingbutton type="submit"
CommentsThe text content of the button type="submit" provides its accessible name.
The text content of the button (e.g., "Submit," "Save") provides the semantic meaning.
SEO, AIO and Site Search
Form components like this are not usually indexed for search. However, deliberate content and element tagging are a best-practice for search and accessibility. Annotations below cover the meta data, html markup and semantic HTML for this component.
Specs
Search PlatformSolr
Schema.org TaggingEnabled
Annotations
AField LabelCSS Class.field-label
HTML Markup.dropdown-container
Semantic HTML'label' element
BField containerCSS Class.dropdown-container
HTML Markupdiv class="dropdown-container"
Semantic HTML.dropdown-container
CPromptCSS Class.field-hint
HTML Markupdiv class=".field-hint"
Semantic HTMLplaceholder
DExpand iconCSS Class.arrow-container
.arrow
.arrow-container
.arrow-CTA-down
HTML Markupclass="arrow arrow-CTA-down"
ECollapse iconCSS Class.arrow-container
.arrow
.arrow-container
.arrow-CTA-down
HTML Markupclass="arrow arrow-CTA-up"
FCheckbox - deselectedCSS Class.dropdown-checkbox-wrapper
.dropdown-checkbox
HTML Markupinput type="checkbox"
Semantic HTMLlabel
for
GMulti-select optionsCSS Class.dropdown-text-option
HTML Markupdiv class ="dropdown-text-option"
Semantic HTMLoption
select
HCTA button - inactiveCSS Class.dropdown-cta-button
HTML Markupbutton class="dropdown-cta-button"
Semantic HTMLbutton type="submit"
JCheckbox - selectedMeta Data.###
HTML Markupinput type="checkbox"
Semantic HTMLlabel
for
KCTA button - activeMeta Data###
HTML Markupbutton class="dropdown-cta-button active"
Semantic HTMLbutton type="submit"
Metrics and Analytics
Specs
Analytics PlatformGoogle Analytics
Annotations
BField containerEventdropdownOpenedComboBox
Event DescriptionTriggered when the dropdown is opened
Only triggered if user explicitly selects the field, not the icon
ECollapse iconEventdropdownOpenedIcon
Event DescriptionTriggered when the dropdown is opened
Only triggered if user explicitly selects the icon
FCheckbox - deselectedEventoptionDeselected
Event DescriptionTriggered when a checkbox option is selected.
Capture ID and label of each selected item
JCheckbox - selectedEventoptionDeselected
Event DescriptionTriggered when a checkbox option is selected.
Capture id and label of deselected item
KCTA button - activeEventdropdownSubmitted
Event DescriptionTriggered when a "Submit" CTA option is selected.
Capture number of selected items
User Testing
Rapid Prototype Testing Plan
Component Briefs
User Test Findings
Three concepts were tested, on real humans, in all viewports and styles (light background and dark background).
We tested a version with labels on top, labels to the left and label as a prompt inside the dropdown. Users reacted best to the first two, but found the label inside the box to be confusing.Users preferred Labels Above layout and the Light Background style.
Based on these results we decided to build two layouts and two styles.
The Labels Above layout with the Light Background style became the default. The Labels to the Left layout and Dark Background style are optional. This results in four permutations.
These findings are detailed in the Mult-Select Dropdown v1.1 Prototype and Testing Plan document.Release History
Release 1.1
Date12/6/2021
Dev SprintSprint 25
UAT findings3 UI defects and 1 functional defect found. All cleared.
Release 1.0
Date8/1/2021
Dev SprintSprint 3
UAT Findings
20 UI defects and 19 functional defect found. 17 UI defects cleared, 3 were pushed. All 19 functional defects were cleared.
Footer goes hereWhy Documentation Like This Matters
You are a product manager supporting multiple sites for your organization. One Tuesday afternoon you start seeing a handful of tickets from your “Website Feedback” link in your site’s footer. They are all about the multi-select dropdown.
You investigate and find that the checkbox icon is missing. You can still make selections, but there’s a broken image link where the icon should be. You also observe that the up and down arrows are also displaying broken links.
It’s a visual defect and a poor customer experience.
Current State: Without This Tool
In today’s world you would most likely open a support ticket with IT. While you classified it as Critical, you still need to plead your case to the Board. This takes a day. Once you win someone in IT has to isolate the problem. This is very common, even in small organizations.
You detailed the ticket correctly with Steps to Reproduce, Expected Result, Actual Result, but it still takes them two days to figure it out. They fix the issue, you test it in the staging environment, approve the fix, and wait until the next deployment on Monday.
Meanwhile, your analytics tell you that 10,347 customers had a broken experience, and you have received over 50 notifications about the issue.
A conservative estimate of the person-hours required to address this issue would be about $1,000. Additionally, your customers have been enduring a broken experience for a week. This does not reflect well on your brand. It could have been fixed in minutes, very few customers would have been impacted, and your brand would be relatively unblemished.
Succeeding With This Tool
Upon confirming the issue you navigate to the Multi-Select Dropdown component in the functional design system. Knowing it’s a presentation layer issue, you click on the Presentation tab and find Annotations F and J, which describe the Deselected and Selected states, respectively, of the Checkbox element.
You see that both the Deselected and Selected states use the .dropdown-checkbox-wrapper and .dropdown-checkbox CSS classes. They also use an asset called dropdown-controls-sprite.png in the /icons/sprites/ folder of your digital asset manager (DAM).
The Expand/Collapse icons use the .arrow-container, .arrow, .arrow-container, .arrow-CTA-down, and .arrow-CTA-up CSS classes. However, these also use dropdown-controls-sprite.png.
In a matter of minutes you have isolated the issue.
The design system tool links to the form-controls.css file where the CSS classes live, and it links to the /icons/sprites folder of your DAM. You could explore the CSS but you’re highly certain the issue is with the sprite. In the icons/sprites folder you search for dropdown-controls-sprite.png and it’s not there. What now? Next you sort all assets by last updated and at the top of the list there’s a file called asjfdsds.png that was last saved 36 minutes ago. You open it and find the four images that represent your up/down arrows and your selected/deselected checkboxes.
You’ve solved the case. To resolve the issue you need to rename the file back to dropdown-controls-sprite.png. Immediately you return to the live page where you observed the issue and invoke the multi-select dropdown. Before clicking on it you notice the down arrow is appearing. This tells you that your fix worked. You invoke the dropdown and all the arrows and checkboxes are behaving as expected.
Meanwhile, there are two more inbox notifications about the broken assets. Using your generic “Web Support” email address, you respond everyone notifying them it has been resolved, asking them to re-test to confirm, and thanking them for reporting the issue. A few respond back saying it looks good, some thank you for following up..
Superior Outcomes
With the help of the design system tool you managed to clear a costly issue within minutes of hearing about it. You didn’t need a ticket or a software deployment or a justification for marking it a critical defect. You owned it. This is what digital product managers do.
Steve Clark
Full-Stack Product Manager/Web Application Design Architect
t3xt me at fore zero ate dash five six nine dash won seven six zero
in other words
00000100 00000000 00001000 00000101 00000110 00001001 00000001 00000111 00000110 00000000