diff --git a/css/pico.slim.css b/css/pico.slim.css
index fc67fe53..8b3647be 100644
--- a/css/pico.slim.css
+++ b/css/pico.slim.css
@@ -209,6 +209,9 @@ kbd {
0 0.125rem 2rem rgba(27, 40, 50, 0.08),
0 0 0 0.0625rem rgba(27, 40, 50, 0.024);
--card-sectionning-background-color: #fbfbfc;
+ --dropdown-background-color: var(--card-background-color);
+ --dropdown-focus-background-color: #f6f8f9;
+ --dropdown-color: var(--form-element-color);
--modal-overlay-background-color: rgba(213, 220, 226, 0.8);
--progress-background-color: #d5dce2;
--progress-color: var(--primary);
@@ -306,6 +309,9 @@ kbd {
0 0.125rem 2rem rgba(0, 0, 0, 0.12),
0 0 0 0.0625rem rgba(0, 0, 0, 0.036);
--card-sectionning-background-color: #18232c;
+ --dropdown-background-color: var(--card-background-color);
+ --dropdown-focus-background-color: rgba(115, 130, 140, 0.05);
+ --dropdown-color: var(--form-element-color);
--modal-overlay-background-color: rgba(36, 51, 62, 0.9);
--progress-background-color: #24333e;
--progress-color: var(--primary);
@@ -402,6 +408,9 @@ kbd {
0 0.125rem 2rem rgba(0, 0, 0, 0.12),
0 0 0 0.0625rem rgba(0, 0, 0, 0.036);
--card-sectionning-background-color: #18232c;
+ --dropdown-background-color: var(--card-background-color);
+ --dropdown-focus-background-color: rgba(115, 130, 140, 0.05);
+ --dropdown-color: var(--form-element-color);
--modal-overlay-background-color: rgba(36, 51, 62, 0.9);
--progress-background-color: #24333e;
--progress-color: var(--primary);
diff --git a/css/themes/default.css b/css/themes/default.css
index 22c48465..038741d4 100644
--- a/css/themes/default.css
+++ b/css/themes/default.css
@@ -273,6 +273,9 @@ kbd {
0 0.125rem 2rem rgba(27, 40, 50, 0.08),
0 0 0 0.0625rem rgba(27, 40, 50, 0.024);
--card-sectionning-background-color: #fbfbfc;
+ --dropdown-background-color: var(--card-background-color);
+ --dropdown-focus-background-color: #f6f8f9;
+ --dropdown-color: var(--form-element-color);
--modal-overlay-background-color: rgba(213, 220, 226, 0.8);
--progress-background-color: #d5dce2;
--progress-color: var(--primary);
@@ -370,6 +373,9 @@ kbd {
0 0.125rem 2rem rgba(0, 0, 0, 0.12),
0 0 0 0.0625rem rgba(0, 0, 0, 0.036);
--card-sectionning-background-color: #18232c;
+ --dropdown-background-color: var(--card-background-color);
+ --dropdown-focus-background-color: rgba(115, 130, 140, 0.05);
+ --dropdown-color: var(--form-element-color);
--modal-overlay-background-color: rgba(36, 51, 62, 0.9);
--progress-background-color: #24333e;
--progress-color: var(--primary);
@@ -466,6 +472,9 @@ kbd {
0 0.125rem 2rem rgba(0, 0, 0, 0.12),
0 0 0 0.0625rem rgba(0, 0, 0, 0.036);
--card-sectionning-background-color: #18232c;
+ --dropdown-background-color: var(--card-background-color);
+ --dropdown-focus-background-color: rgba(115, 130, 140, 0.05);
+ --dropdown-color: var(--form-element-color);
--modal-overlay-background-color: rgba(36, 51, 62, 0.9);
--progress-background-color: #24333e;
--progress-color: var(--primary);
diff --git a/docs/dropdowns.html b/docs/dropdowns.html
new file mode 100644
index 00000000..195a55cf
--- /dev/null
+++ b/docs/dropdowns.html
@@ -0,0 +1,95 @@
+
Dropdowns • Pico.css Dropdowns Dropdown menus and custom selects without JavaScript. Dropdowns are built with <details role ="list" >
as a wrapper and <summary >
and <ul >
as direct childs.
For style consistency with the form elements, dropdowns are styled as a <select >
by default.
Dropdown Select <!-- Dropdown -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" >Dropdown</summary >
+ <ul role ="listbox" >
+ <li ><a >Mauris vehicula velit</a ></li >
+ <li ><a >Nunc dignissim sapien</a ></li >
+ <li ><a >Aenean egestas quam</a ></li >
+ </ul >
+</details >
+
+<!-- Select -->
+<select >
+ <option value ="" disabled selected >Select</option >
+ <option >…</option >
+</select >
+
role ="button"
on the <summary >
element can be used to turn the dropdown into a button.
Dropdown as a button 1 Dropdown as a button 2 Dropdown as a button 3 <!-- Primary -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" role ="button" >
+ Dropdown as a button 1
+ </summary >
+ <ul role ="listbox" >
+ …
+ </ul >
+</details >
+
+<!-- Secondary -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" role ="button" class ="secondary" >
+ Dropdown as a button 2
+ </summary >
+ <ul role ="listbox" >
+ …
+ </ul >
+</details >
+
+<!-- Contrast -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" role ="button" class ="contrast" >
+ Dropdown as a button 3
+ </summary >
+ <ul role ="listbox" >
+ …
+ </ul >
+</details >
+
Dropdowns can be used as custom selects with <input type ="radio" >
or <input type ="checkbox" >
Select single element Select multiple elements <!-- With radio buttons -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" >Dropdown</summary >
+ <ul role ="listbox" >
+ <li >
+ <label for ="small" >
+ <input type ="radio" id ="small" name ="size" value ="small" >
+ Small
+ </label >
+ </li >
+ <li >
+ <label for ="medium" >
+ <input type ="radio" id ="medium" name ="size" value ="medium" >
+ Medium
+ </label >
+ </li >
+ <li >
+ <label for ="large" >
+ <input type ="radio" id ="large" name ="size" value ="large" >
+ Large
+ </label >
+ </li >
+ </ul >
+</details >
+
+<!-- With checkboxes -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" >Dropdown</summary >
+ <ul role ="listbox" >
+ <li >
+ <label >
+ <input type ="checkbox" >
+ Banana
+ </label >
+ </li >
+ <li >
+ <label >
+ <input type ="checkbox" >
+ Watermelon
+ </label >
+ </li >
+ <li >
+ <label >
+ <input type ="checkbox" >
+ Apple
+ </label >
+ </li >
+ </ul >
+</details >
+
+
\ No newline at end of file
diff --git a/docs/src/_sidebar.html b/docs/src/_sidebar.html
index a6eab849..ec0c3940 100644
--- a/docs/src/_sidebar.html
+++ b/docs/src/_sidebar.html
@@ -43,7 +43,7 @@
Accordions
Cards
- Dropdown
+ Dropdowns
Modal
Navs
Progress
diff --git a/docs/src/dropdown.html b/docs/src/dropdown.html
deleted file mode 100644
index c081b2ec..00000000
--- a/docs/src/dropdown.html
+++ /dev/null
@@ -1,128 +0,0 @@
-
-
-
- ${require('./_head.html') title="Dropdown" description="a dropdown
- component, without JavaScript." canonical="dropdown.html" }
-
-
-
- ${require('./_nav.html')}
-
-
- ${require('./_sidebar.html') active="dropdown-link"}
-
-
-
-
- Dropdown
- single / multi select dropdown, without JavaScript.
-
-
-
- Single select
-
-
-
- Multi-select
-
-
-
-
- Usage notes
-
-
- in order to use dropdown component, use
- role='list'
on details tag.
-
-
- no need to use javascript to close the dropdown when clicked
- outside.
-
-
- for both single / multi-select case, need javascript to update
- summary
tag text when any option selected.
-
-
- in case of single select, remove open
attribute on
- details
tag using javascript when an option is
- selected.
-
-
-
-
-
- <!-- For Single-select -->
- <details role="list" >
- <summary aria-haspopup="listbox" >Single select</summary >
- <ul role="listbox" >
- <li >
- <label for="01" >
- <input type="radio" id="01" name="option1" / >
- Option 1
- </label >
- </li >
- <li >
- <label for="02" >
- <input type="radio" id="02" name="option1" / >
- Option 2
- </label >
- </li >
- </ul >
- </details >
-
-
- <!-- For Multi-select -->
- <details role="list" >
- <summary aria-haspopup="listbox" >Multi select</summary >
- <ul role="listbox" >
- <li >
- <label for="01" >
- <input type="checkbox" id="01" name="option1" / >
- Option 1
- </label >
- </li >
- <li >
- <label for="01" >
- <input type="checkbox" id="02" name="option1" / >
- Option 2
- </label >
- </li >
- </ul >
- </details >
-
-
-
-
-
- ${require('./_footer.html')}
-
-
-
-
-
diff --git a/docs/src/dropdowns.html b/docs/src/dropdowns.html
new file mode 100644
index 00000000..833e0e2d
--- /dev/null
+++ b/docs/src/dropdowns.html
@@ -0,0 +1,229 @@
+
+
+
+ ${require('./_head.html')
+ title="Dropdowns"
+ description="Dropdown menus and custom selects without JavaScript."
+ canonical="dropdowns.html"
+ }
+
+
+
+ ${require('./_nav.html')}
+
+
+ ${require('./_sidebar.html') active="dropdowns-link"}
+
+
+
+
+ Dropdowns
+ Dropdown menus and custom selects without JavaScript.
+
+ Dropdowns are built with <details role ="list" >
as a wrapper and <summary >
and <ul >
as direct childs.
+ For style consistency with the form elements, dropdowns are styled as a <select >
by default.
+
+
+ Dropdown
+
+
+
+ Select
+
+
+
+<!-- Dropdown -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" >Dropdown</summary >
+ <ul role ="listbox" >
+ <li ><a >Mauris vehicula velit</a ></li >
+ <li ><a >Nunc dignissim sapien</a ></li >
+ <li ><a >Aenean egestas quam</a ></li >
+ </ul >
+</details >
+
+<!-- Select -->
+<select >
+ <option value ="" disabled selected >Select</option >
+ <option >…</option >
+</select >
+
+
+
+
+ role ="button"
on the <summary >
element can be used to turn the dropdown into a button.
+
+
+ Dropdown as a button 1
+
+
+
+ Dropdown as a button 2
+
+
+
+ Dropdown as a button 3
+
+
+
+
+<!-- Primary -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" role ="button" >
+ Dropdown as a button 1
+ </summary >
+ <ul role ="listbox" >
+ …
+ </ul >
+</details >
+
+<!-- Secondary -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" role ="button" class ="secondary" >
+ Dropdown as a button 2
+ </summary >
+ <ul role ="listbox" >
+ …
+ </ul >
+</details >
+
+<!-- Contrast -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" role ="button" class ="contrast" >
+ Dropdown as a button 3
+ </summary >
+ <ul role ="listbox" >
+ …
+ </ul >
+</details >
+
+
+
+
+ Dropdowns can be used as custom selects with <input type ="radio" >
or <input type ="checkbox" >
+
+
+ Select single element
+
+
+
+ Select multiple elements
+
+
+
+
+<!-- With radio buttons -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" >Dropdown</summary >
+ <ul role ="listbox" >
+ <li >
+ <label for ="small" >
+ <input type ="radio" id ="small" name ="size" value ="small" >
+ Small
+ </label >
+ </li >
+ <li >
+ <label for ="medium" >
+ <input type ="radio" id ="medium" name ="size" value ="medium" >
+ Medium
+ </label >
+ </li >
+ <li >
+ <label for ="large" >
+ <input type ="radio" id ="large" name ="size" value ="large" >
+ Large
+ </label >
+ </li >
+ </ul >
+</details >
+
+<!-- With checkboxes -->
+<details role ="list" >
+ <summary aria-haspopup ="listbox" >Dropdown</summary >
+ <ul role ="listbox" >
+ <li >
+ <label >
+ <input type ="checkbox" >
+ Banana
+ </label >
+ </li >
+ <li >
+ <label >
+ <input type ="checkbox" >
+ Watermelon
+ </label >
+ </li >
+ <li >
+ <label >
+ <input type ="checkbox" >
+ Apple
+ </label >
+ </li >
+ </ul >
+</details >
+
+
+
+
+
+ ${require('./_footer.html')}
+
+
+
+
+
+
diff --git a/scss/components/_dropdown.scss b/scss/components/_dropdown.scss
index 5c4ba292..19d3a9bc 100644
--- a/scss/components/_dropdown.scss
+++ b/scss/components/_dropdown.scss
@@ -1,93 +1,118 @@
-details[role='list'] {
+details[role="list"] {
position: relative;
padding: 0;
border-bottom: none;
summary {
- height: calc(
- 1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 +
- var(--border-width) * 2
- );
- margin-bottom: 0;
- padding: var(--form-element-spacing-vertical)
- var(--form-element-spacing-horizontal);
- border: var(--border-width) solid var(--form-element-border-color);
- border-radius: var(--border-radius);
- line-height: inherit;
- cursor: pointer;
+ margin: 0;
- &::after {
- height: 100%;
- transform: rotate(0deg);
+ &:not([role="button"]) {
+ height: calc(
+ 1rem * var(--line-height) + var(--form-element-spacing-vertical) * 2 +
+ var(--border-width) * 2
+ );
+ padding: var(--form-element-spacing-vertical) var(--form-element-spacing-horizontal);
+ border: var(--border-width) solid var(--form-element-border-color);
+ border-radius: var(--border-radius);
+ background-color: var(--form-element-background-color);
+ color: var(--form-element-placeholder-color);
+ line-height: inherit;
+ cursor: pointer;
+
+ @if $enable-transitions {
+ transition: background-color var(--transition),
+ border-color var(--transition), color var(--transition),
+ box-shadow var(--transition);
+ }
+
+ // Active & Focus
+ &:active,
+ &:focus {
+ border-color: var(--form-element-active-border-color);
+ background-color: var(--form-element-active-background-color);
+ }
+
+ // Focus
+ &:focus {
+ box-shadow: 0 0 0 var(--outline-width) var(--form-element-focus-color);
+ }
+
+ // Marker
+ &::after {
+ height: 100%;
+ }
}
& + ul {
- z-index: 100;
+ z-index: 99;
position: absolute;
top: auto;
- right: 0px;
- left: 0px;
+ right: 0;
+ left: 0;
margin: 0;
padding: 0;
border: var(--border-width) solid var(--form-element-border-color);
border-top: none;
- border-bottom-right-radius: var(--border-radius);
- border-bottom-left-radius: var(--border-radius);
- background-color: var(--background-color);
- list-style: none;
+ border-radius: var(--border-radius);
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+ background-color: var(--dropdown-background-color);
+ color: var(--dropdown-color);
li {
margin-bottom: 0;
- &::marker {
- content: '';
+ padding: calc(var(--form-element-spacing-vertical) * 0.5) var(--form-element-spacing-horizontal);
+ list-style: none;
+
+ &:first-of-type {
+ margin-top: calc(var(--form-element-spacing-vertical) * 0.5);
}
- label {
- position: relative;
- width: 100%;
- margin: 0;
- padding: var(--form-element-spacing-vertical)
- var(--form-element-spacing-horizontal);
- cursor: pointer;
- &:hover {
- background-color: var(--secondary-focus);
- }
+ &:last-of-type {
+ margin-bottom: calc(var(--form-element-spacing-vertical) * 0.5);
+ }
- input[type='radio'],
- input[type='checkbox'] {
- appearance: none;
- }
+ &:hover {
+ background-color: var(--dropdown-focus-background-color);
+ }
+
+ a {
+ display: block;
+ width: 100%;
+ color: var(--dropdown-color);
+ text-decoration: none;
}
}
+
+ }
+
+ &::after {
+ transform: rotate(0deg);
}
}
&[disabled] summary,
&.disabled summary {
- color: var(--muted-color);
- cursor: not-allowed;
+ border-color: var(--form-element-disabled-border-color);
+ background-color: var(--form-element-disabled-background-color);
+ opacity: var(--form-element-disabled-opacity);
pointer-events: none;
}
&[open] summary {
- margin-bottom: 0;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
&::before {
display: block;
- z-index: 80;
+ z-index: 1;
position: fixed;
top: 0;
right: 0;
bottom: 0;
left: 0;
background: transparent;
- content: ' ';
+ content: '';
cursor: default;
}
-
- &::after {
- transform: rotate(180deg);
- }
}
-}
+}
\ No newline at end of file
diff --git a/scss/themes/default/_dark.scss b/scss/themes/default/_dark.scss
index 0c6fd352..d13bbf72 100644
--- a/scss/themes/default/_dark.scss
+++ b/scss/themes/default/_dark.scss
@@ -112,6 +112,11 @@
0 0 0 0.0625rem #{rgba($black, 0.036)};
--card-sectionning-background-color: #{mix($black, $grey-900, 12.5%)};
+ // Dropdown ()
+ --dropdown-background-color: var(--card-background-color);
+ --dropdown-focus-background-color: #{rgba($grey-500, 0.05)};
+ --dropdown-color: var(--form-element-color);
+
// Modal ()
--modal-overlay-background-color: #{rgba(mix($grey-900, $grey-800), 0.9)};
diff --git a/scss/themes/default/_light.scss b/scss/themes/default/_light.scss
index 3a0f1c9c..26f1c985 100644
--- a/scss/themes/default/_light.scss
+++ b/scss/themes/default/_light.scss
@@ -112,6 +112,11 @@
0 0 0 0.0625rem #{rgba($grey-900, 0.024)};
--card-sectionning-background-color: #{mix($grey-50, $white, 25%)};
+ // Dropdown ()
+ --dropdown-background-color: var(--card-background-color);
+ --dropdown-focus-background-color: #{mix($grey-50, $white)};
+ --dropdown-color: var(--form-element-color);
+
// Modal ()
--modal-overlay-background-color: #{rgba($grey-100, 0.8)};