LETTER-SELECT (LMU-Intern Modul )
src/app/shared/components/letter-select/templates
Demo Section
Each variation will be presented in the following section.
Readme
letterSelect (component
)
Description
This blueprint is based on the blueprint of Veams.
Requirements
Veams#5.0.0
Installation
Installation with Veams from local machine
veams install bp absolute/filepath/to/letter-select
Fields
letter-select.hbs
Settings
Parameter | Type | Default | Description |
---|---|---|---|
settings.letterSelectClasses | String | '' |
Modifier classes for component |
settings.letterSelectContextClass | String | 'default' |
Context class of component |
settings.letterSelectJsOptions | Object | null |
JavaScript options object which gets stringified |
settings.letterSelectJsModule | String | ‘’ | Integrate the js-Modul Name ‘letter-select’ to get the Modul if it is integrated in other moduls and it is for the scrollbar-solution |
settings.letterSelectID | int | Number for the id of the inputfield. It is importnat if there are more than 1 Elemnt in a page to have different ids for every letter-select included. | |
settings.scrollIndicatorEnabled | Boolean | true |
Here you can handle if the Scrollindicator will be used or not ‘true’ : Everything for the Functionality of the scroll-indicator will be included |
setting.letterUsedForFilter | STRING | Comma seperated List of active letters. Only this Letters will be active. |
Content
Parameter | Type | Description |
---|---|---|
content.letteritems | Array with Objects | Every Arrayentry is an Objekt with Infos to the specific Letter |
letter-select__item.hbs
Settings
Parameter | Type | Description |
---|---|---|
settings.letterSelectID | int | Specific number for one A-Z-Filter. This Number will be integrated in the id of the checkbox und in the for-Attribute of the Label. it should be the same ID as in the parent Attribute letterSelectID. |
Every AZ-Filter-Modul in a webpage should have a key-ID for the whole site. In FS it is possible to take the ID of the Absatzvorlage
Content
| Parameter | Type | Description | | content.lettername | STRING | one alphabetic letter in uppercase
JavaScript Options
The module gives you the possibility to override default JS options:
Option | Type | Default | Description |
---|
SASS
Variables
There are multiple variables which you can change:
Variable | Value | Description |
---|
Modifier Classes
There are modifier classes you can add to c-letter-select
:
Modifier | Description |
---|---|
is-scrollable-left | is for CSS-handling the overlay on the left side of the A-Z-Filter by using a scrollbar. Javascript is handling the use of the css class depending of the position of the scrollbar |
is-scrollable-right | is for CSS-handling the overlay on the right side of the A-Z-Filter by using a scrollbar. Javascript is handling the use of the css class depending of the position of the scrollbar |
is-not-included | set a letter to inaktiv view |
Templates
letter-select.hbs
<form >
<div class="c-letter-select{{#if settings.letterSelectContextClass}}--{{settings.letterSelectContextClass}}{{else}}--default{{/if}}{{#if settings.letterSelectClasses}} {{settings.letterSelectClasses}}{{/if}}"
data-css="c-letter-select" {{#if
settings.letterSelectJsModule}}
data-js-module="{{settings.letterSelectJsModule}}"{{#if settings.letterSelectJsOptions}}
data-js-options='{{stringify settings.letterSelectJsOptions}}'{{/if}}{{/if}}>
<div class="letter-select__content" {{#if settings.scrollIndicatorEnabled}} data-js-item="letter-scroll-indicator"{{/if}}>
<div class="letter-select__wrapper"{{#if settings.scrollIndicatorEnabled}}
data-js-item="letter-scroll-wrapper"{{/if}}>
<div class="letter-select__area"{{#if settings.scrollIndicatorEnabled}}
data-js-item="letter-scroll-content"{{/if}} data-js-item-letters="selected-letters" data-js-letters-content="{{#if settings.letterUsedForFilter}}{{settings.letterUsedForFilter}}{{/if}}">
{{#if content.letteritems}}
{{#each content.letteritems}}
<div class="letter-select__item-wrapper">
{{> letter-select__item}}
</div>
{{/each}}
{{/if}}
</div>
</div>
</div>
<input type="hidden" id="{{#if settings.letterSelectID}}{{settings.letterSelectID}}-{{/if}}az-select" name="{{#if settings.letterSelectID}}{{settings.letterSelectID}}-{{/if}}az-select" data-js-item="choosen-az" value="">
</div>
</form>
letter-select__item.hbs
{{#if content.lettername}}
<input type="checkbox" id="{{settings.letterSelectID}}-letter_{{content.lettername}}" name="letters" value="{{content.lettername}}" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="{{settings.letterSelectID}}-letter_{{content.lettername}}" data-letter="{{content.lettername}}" class="letter-select__label">{{content.lettername}}</label>
{{/if}}
Data File
letter-select.hjson
{
"variations": {
"default": {
"docs": {
"variationName": "Default"
},
"settings": {
"letterSelectContextClass": "default",
"letterSelectClasses": "",
"letterSelectJsModule": "letter-select",
"letterSelectID": "1",
"letterSelectJsOptions": {
"scrollToEnd": false
},
"scrollIndicatorEnabled": true,
"letterUsedForFilter": "A,B,C,D,E,F,G,H,I,L,M,N,O,P"
},
"content": {
"letteritems":[
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "A"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "B"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "C"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "D"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "E"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "F"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "G"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "H"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "I"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "J"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "K"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "L"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "M"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "N"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "O"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "P"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "Q"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "R"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "S"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "T"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "U"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "V"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "W"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "X"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "Y"
}
},
{
"settings": {
"letterSelectID": "1"
},
"content": {
"lettername": "Z"
}
}
]
}
}
}
}
Styles
letter-select.scss
/* ===================================================
component: letter-select
=================================================== */
/* ---------------------------------------------------
Global Styles
--------------------------------------------------- */
[data-css="c-letter-select"] {
.letter-select__content{
position: relative;
margin: 0 auto;
&::-webkit-scrollbar {
display: none;
}
&::before,
&::after {
position: absolute;
top: 0;
bottom: 0;
width: 40px;
z-index: 1;
}
/*
MODIFIERS
----------------------- */
&.is-scrollable-left {
&::before {
content: '';
left: -1px;
width: 50px;
background: linear-gradient(to right, rgba($color-white, 1), rgba($color-white, 1) 33%, rgba($color-white, 0));
}
}
&.is-scrollable-right {
&::after {
content: '';
right: -1px;
background: linear-gradient(to left, rgba($color-white, 1), rgba($color-white, 1) 33%, rgba($color-white, 0));
}
}
}
.letter-select__wrapper {
overflow-x: auto;
overflow-y: hidden;
overflow: -moz-scrollbars-auto;
-ms-overflow-style: auto;
-webkit-overflow-scrolling: touch;
padding: 10px 0;
@include print() {
overflow: visible;
}
}
.letter-select__area {
position: relative;
display: inline-block;
white-space: nowrap;
padding: 0;
@include bp($bp-tablet-l) {
padding: 0;
}
@include print() {
white-space: normal;
padding: 0;
}
}
.letter-select__item-wrapper {
white-space: nowrap;
display: inline-block;
&.is-not-included {
//display: none;
.letter-select__label {
background-color: $color-gray;
border: 1px solid $color-gray;
&:hover {
background-color: $color-gray;
color: $color-white;
border: 1px solid $color-gray;
cursor: default;
}
}
}
label[data-letter="I"]{
padding: 3px 0px 0px 12px;
}
label[data-letter="W"], label[data-letter="M"]{
padding: 3px 0px 0px 7px;
}
}
.letter-select__checkbox {
@extend %visuallyhidden;
float: left;
@include hcm() {
border: 1px solid $color-white;
margin-top: 8px;
clip: auto;
position: relative;
float: left;
cursor: pointer;
& ~ .letter-select__label {
padding: 0px 8px;
margin-right: 20px;
width: auto;
display: block;
height: auto;
float: left;
background-color: $color-white;
color: $color-black;
border: 1px solid $color-white;
line-height: 1.6em; // refactor to unitless line-height
font-size: 1.8rem;
letter-spacing: .27px;
&:hover,
&.a11y-focus-key {
background-color: $color-white;
color: $color-black;
border: 1px solid $color-white;
}
}
}
&:checked {
& ~ .letter-select__label {
background-color: $color-white;
color: $color-green;
padding: 2px 0px 0px 8px;
border: 2px solid $color-green;
&:hover {
padding: 3px 0px 0px 9px;
border: 1px solid $color-green;
}
@include print() {
padding: 0px 0px 0px 2px;
border: 0;
font-family: $font-bold;
font-size: 1.6rem;
line-height: (24/16);
letter-spacing: .3px;
}
}
&.a11y-focus-key {
& ~ .letter-select__label {
border: 2px dashed #800;
}
}
}
&.a11y-focus-key {
& ~ .letter-select__label {
border: 2px dashed #800;
}
}
}
.letter-select__label {
margin-right: 12px;
padding: 3px 0px 0px 9px;
background-color: $color-green;
color: $color-white;
width: 30px;
height: 30px;
display: inline-block;
position: relative;
font-family: $font-bold;
font-size: 1.6rem;
line-height: (24/16);
letter-spacing: .3px;
border: 1px solid $color-green;
&:hover {
background-color: $color-white;
color: $color-green;
border: 1px solid $color-green;
cursor: pointer;
}
@include bp($bp-tablet-l) {
margin-right: 4px;
}
@include bp($bp-desktop-m) {
margin-right: 2px;
}
@include print() {
margin-right: 1px;
padding: 0px 0px 0px 4px;
width: 19px;
height: 19px;
font-family: $font-regular;
font-size: 1.5rem;
line-height: (22/15);
letter-spacing: .25px;
border: 1px solid $color-black;
}
}
}
/* ---------------------------------------------------
Context: Default
--------------------------------------------------- */
.c-letter-select--default {
}
Scripts
letter-select.js
/**
* Description of LetterSelect.
* Class properties and decorators are supported.
*
* @module LetterSelect
* @version v1.0.0
*
* @author your_name
*/
// Imports
import $ from 'jquery';
import Component from '@veams/component';
class LetterSelect extends Component {
/**
* Class Properties
*/
$el = $(this.el);
$scrollIndicator = $(this.options.selectors.scrollIndicator, this.$el);
$scrollWrapper = $(this.options.selectors.scrollWrapper, this.$el);
$scrollContent = $(this.options.selectors.scrollContent, this.$el);
$choosenAZField = $(this.options.selectors.choosenAZField, this.$el);
_wrapperDimension = null;
_contentDimension = null;
constructor(obj) {
let options = {
classes: {
down: 'is-scrollable-down',
left: 'is-scrollable-left',
right: 'is-scrollable-right',
up: 'is-scrollable-up'
},
activeLetterElement: [],
letterItems: [],
selectedLettersElement: [],
selectedLetters: [],
allselectedLetters: ["A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"],
isVerticalScroll: false,
offset: 20,
scrollToEnd: false,
selectors: {
scrollContent: '[data-js-item="letter-scroll-content"]',
scrollIndicator: '[data-js-item="letter-scroll-indicator"]',
scrollWrapper: '[data-js-item="letter-scroll-wrapper"]',
letterItemCheckbox: '[data-js-item="letter-item-chbx"]',
choosenAZField: '[data-js-item="choosen-az"]'
}
};
super(obj, options);
}
/** =================================================
* GETTER & SETTER
* ================================================ */
/**
* Get module information
*/
static get info() {
return {
version: '1.0.0'
};
}
get subscribe() {
return {
'{{context.EVENTS.resize}}': 'update'
};
}
/**
* Set wrapper dimension
*/
set wrapperDimension(dimension) {
this._wrapperDimension = dimension;
}
/**
* Get wrapper dimension
*/
get wrapperDimension() {
return this._wrapperDimension;
}
/**
* Set content dimension
*/
set contentDimension(dimension) {
this._contentDimension = dimension;
}
/**
* Get content dimension
*/
get contentDimension() {
return this._contentDimension;
}
/** =================================================
* EVENTS
* ================================================ */
/**
* Bind additional events (or non bubbling events)
*/
bindEvents() {
this.options.letterItems = this.el.querySelectorAll(
'[data-js-item="letter-item-chbx"]'
);
if (this.options.letterItems.length > 0) {
this.options.letterItems.forEach(opt => {
opt.addEventListener('click', () => {
this.handleLetterItems(opt);
});
});
this.options.letterItems.forEach(checkbox => {
checkbox.addEventListener('keydown', event => {
const keyCode = event.which || event.keyCode;
//alert (keyCode);
switch (keyCode) {
// esc key
case 13:
if (this.options.selectedLetters.includes ( checkbox.value.toUpperCase() )) {
if (checkbox.checked) {
checkbox.checked = false;
} else {
checkbox.checked = true;
}
this.handleLetterItems(checkbox);
}
break;
}
});
});
}
let fnUpdate = this.update.bind(this);
this.$scrollWrapper.on(this.context.EVENTS.scroll, fnUpdate);
}
/** =================================================
* STANDARD METHODS
* ================================================= */
didMount() {
if (this.options.isVerticalScroll) {
this.scrollStartClass = this.options.classes.up;
this.scrollEndClass = this.options.classes.down;
this.scrollFunc = 'scrollTop';
} else {
this.scrollStartClass = this.options.classes.left;
this.scrollEndClass = this.options.classes.right;
this.scrollFunc = 'scrollLeft';
}
this.update();
/* Handling of existing Letters. Can be activated by setting Attribute data-js-letters-content with a comma seperated String of all used letters */
this.options.selectedLettersElement = this.el.querySelectorAll(
'[data-js-item-letters="selected-letters"]'
);
if (this.options.selectedLettersElement.length > 0) {
if (this.options.selectedLettersElement[0].getAttribute("data-js-letters-content") && this.options.selectedLettersElement[0].getAttribute("data-js-letters-content").length > 0) {
this.options.selectedLetters = this.options.selectedLettersElement[0].getAttribute("data-js-letters-content").toUpperCase().split(',');
} else {
this.options.selectedLetters = this.options.allselectedLetters;
}
} else {
this.options.selectedLetters = this.options.allselectedLetters;
}
/* Setting a Class for the not used Letters */
this.options.letterItems.forEach(opt => {
if (!this.options.selectedLetters.includes ( opt.value.toUpperCase() )) {
let closestList = opt.closest("div");
closestList.classList.add("is-not-included");
opt.setAttribute("disabled","disabled");
}
});
}
/**
* Render class
*/
render() {
return this;
}
/** =================================================
* CUSTOM SCROLL INDICATOR METHODS
* ================================================= */
/**
* Update dimensions and classes
*
* @param {Object} [e] - event object
*/
update(e) {
this.updateDimensions();
if ((!e || e.type === 'resize') && this.options.scrollToEnd) {
this.$scrollWrapper[0][this.scrollFunc] = this.contentDimension;
}
this.updateClasses();
}
/**
* Update classes
*
*/
updateClasses() {
let scrolled = this.$scrollWrapper[0][this.scrollFunc];
if (this.contentDimension <= this.wrapperDimension) {
this.$scrollIndicator.removeClass(this.scrollStartClass + ' ' + this.scrollEndClass);
return;
}
if (scrolled <= this.options.offset) {
this.$scrollIndicator.removeClass(this.scrollStartClass);
} else {
this.$scrollIndicator.addClass(this.scrollStartClass);
}
if (scrolled >= this.contentDimension - this.wrapperDimension - this.options.offset) {
this.$scrollIndicator.removeClass(this.scrollEndClass);
} else {
this.$scrollIndicator.addClass(this.scrollEndClass);
}
}
/**
* Update dimensions
*
*/
updateDimensions() {
if (this.options.isVerticalScroll) {
this.wrapperDimension = this.$scrollWrapper[0].clientHeight;
this.contentDimension = this.$scrollContent.outerHeight(true);
} else {
this.wrapperDimension = this.$scrollWrapper[0].clientWidth;
this.contentDimension = this.$scrollContent.outerWidth(true);
}
}
/**
* Script to get the result of a checkbox click
* All checkboxes will be set to unchecked, the clicked checkbox will be set to checked
*
* @param {Object} [e] - Event object
*/
handleLetterItems(e) {
if (this.options.selectedLetters.includes ( e.value.toUpperCase() )) {
if (e.checked) {
this.options.letterItems.forEach(opt => {
opt.checked = false;
});
e.checked = true;
this.$choosenAZField.val(e.value);
} else {
this.$choosenAZField.val("");
}
this.$choosenAZField.trigger('change');
} else {
e.checked = false;
}
}
}
export default LetterSelect;
HTML Output
Default
<form>
<div class="c-letter-select--default" data-css="c-letter-select" data-js-module="letter-select" data-js-options='{"scrollToEnd":false}'>
<div class="letter-select__content" data-js-item="letter-scroll-indicator">
<div class="letter-select__wrapper" data-js-item="letter-scroll-wrapper">
<div class="letter-select__area" data-js-item="letter-scroll-content" data-js-item-letters="selected-letters" data-js-letters-content="A,B,C,D,E,F,G,H,I,L,M,N,O,P">
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_A" name="letters" value="A" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_A" data-letter="A" class="letter-select__label">A</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_B" name="letters" value="B" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_B" data-letter="B" class="letter-select__label">B</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_C" name="letters" value="C" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_C" data-letter="C" class="letter-select__label">C</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_D" name="letters" value="D" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_D" data-letter="D" class="letter-select__label">D</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_E" name="letters" value="E" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_E" data-letter="E" class="letter-select__label">E</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_F" name="letters" value="F" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_F" data-letter="F" class="letter-select__label">F</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_G" name="letters" value="G" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_G" data-letter="G" class="letter-select__label">G</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_H" name="letters" value="H" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_H" data-letter="H" class="letter-select__label">H</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_I" name="letters" value="I" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_I" data-letter="I" class="letter-select__label">I</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_J" name="letters" value="J" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_J" data-letter="J" class="letter-select__label">J</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_K" name="letters" value="K" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_K" data-letter="K" class="letter-select__label">K</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_L" name="letters" value="L" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_L" data-letter="L" class="letter-select__label">L</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_M" name="letters" value="M" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_M" data-letter="M" class="letter-select__label">M</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_N" name="letters" value="N" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_N" data-letter="N" class="letter-select__label">N</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_O" name="letters" value="O" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_O" data-letter="O" class="letter-select__label">O</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_P" name="letters" value="P" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_P" data-letter="P" class="letter-select__label">P</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_Q" name="letters" value="Q" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_Q" data-letter="Q" class="letter-select__label">Q</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_R" name="letters" value="R" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_R" data-letter="R" class="letter-select__label">R</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_S" name="letters" value="S" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_S" data-letter="S" class="letter-select__label">S</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_T" name="letters" value="T" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_T" data-letter="T" class="letter-select__label">T</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_U" name="letters" value="U" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_U" data-letter="U" class="letter-select__label">U</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_V" name="letters" value="V" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_V" data-letter="V" class="letter-select__label">V</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_W" name="letters" value="W" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_W" data-letter="W" class="letter-select__label">W</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_X" name="letters" value="X" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_X" data-letter="X" class="letter-select__label">X</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_Y" name="letters" value="Y" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_Y" data-letter="Y" class="letter-select__label">Y</label>
</div>
<div class="letter-select__item-wrapper">
<input type="checkbox" id="1-letter_Z" name="letters" value="Z" class="letter-select__checkbox" data-js-item="letter-item-chbx"><label for="1-letter_Z" data-letter="Z" class="letter-select__label">Z</label>
</div>
</div>
</div>
</div>
<input type="hidden" id="1-az-select" name="1-az-select" data-js-item="choosen-az" value="">
</div>
</form>