Merge pull request #1990 from ing-bank/subclasser-example/button

Subclasser example/button
This commit is contained in:
SynnefonK 2023-05-31 12:16:18 +02:00 committed by GitHub
commit ac2f2155f2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
15 changed files with 556 additions and 268 deletions

View file

@ -0,0 +1,30 @@
# Button >> Extensions ||90
```js script
import { html } from '@mdjs/mdjs-preview';
import './extensions/bootstrap-button.mjs';
```
## Bootstrap button
```js preview-story
const capitalize = s => s[0].toUpperCase() + s.slice(1);
export const bootstrapButton = () => {
const variants = [
'primary',
'secondary',
'success',
'danger',
'warning',
'info',
'light',
'dark',
'link',
];
return html`<div>
${variants.map(v => html`<bootstrap-button variant="${v}">${capitalize(v)}</bootstrap-button>`)}
</div>`;
};
```

View file

@ -0,0 +1,10 @@
export type BootstrapButtonVariant =
| 'primary'
| 'secondary'
| 'success'
| 'danger'
| 'warning'
| 'info'
| 'light'
| 'dark'
| 'link';

View file

@ -0,0 +1,240 @@
import { LionButton } from '@lion/ui/button.js';
import { css } from 'lit';
/**
* @typedef {import('./BootstrapButtonTypes.js').BootstrapButtonVariant} BootstrapButtonVariant
*/
export class BootstrapButton extends LionButton {
/** @type {any} */
static properties = {
variant: { type: String, reflect: true },
};
static styles = [
...super.styles,
css`
:host {
--bs-border-radius: 0.375rem;
--bs-border-width: 1px;
--bs-btn-font-family: system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue',
'Noto Sans', 'Liberation Sans', Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji',
'Segoe UI Symbol', 'Noto Color Emoji';
margin: 0.25rem 0.125rem;
--bs-btn-padding-x: 0.75rem;
--bs-btn-padding-y: 0.375rem;
--bs-btn-font-size: 1rem;
--bs-btn-font-weight: 400;
--bs-btn-line-height: 1.5;
--bs-btn-color: var(--bs-body-color);
--bs-btn-bg: transparent;
--bs-btn-border-width: var(--bs-border-width);
--bs-btn-border-color: transparent;
--bs-btn-border-radius: var(--bs-border-radius);
--bs-btn-hover-border-color: transparent;
--bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
--bs-btn-disabled-opacity: 0.65;
--bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), 0.5);
display: inline-block;
padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x);
font-family: var(--bs-btn-font-family);
font-size: var(--bs-btn-font-size);
font-weight: var(--bs-btn-font-weight);
line-height: var(--bs-btn-line-height);
color: var(--bs-btn-color);
text-align: center;
text-decoration: none;
vertical-align: middle;
cursor: pointer;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
border: var(--bs-btn-border-width) solid var(--bs-btn-border-color);
border-radius: var(--bs-btn-border-radius);
background-color: var(--bs-btn-bg);
transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out,
border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out;
text-transform: none;
}
:host(:not([disabled])) {
cursor: pointer;
}
:host(:hover) {
color: var(--bs-btn-hover-color);
background-color: var(--bs-btn-hover-bg);
border-color: var(--bs-btn-hover-border-color);
}
:host(:active),
:host([active]) {
color: var(--bs-btn-active-color);
background-color: var(--bs-btn-active-bg);
border-color: var(--bs-btn-active-border-color);
}
:host([variant='primary']) {
--bs-btn-color: #fff;
--bs-btn-bg: #0d6efd;
--bs-btn-border-color: #0d6efd;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #0b5ed7;
--bs-btn-hover-border-color: #0a58ca;
--bs-btn-focus-shadow-rgb: 49, 132, 253;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #0a58ca;
--bs-btn-active-border-color: #0a53be;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #0d6efd;
--bs-btn-disabled-border-color: #0d6efd;
}
:host([variant='secondary']) {
--bs-btn-color: #fff;
--bs-btn-bg: #6c757d;
--bs-btn-border-color: #6c757d;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #5c636a;
--bs-btn-hover-border-color: #565e64;
--bs-btn-focus-shadow-rgb: 130, 138, 145;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #565e64;
--bs-btn-active-border-color: #51585e;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #6c757d;
--bs-btn-disabled-border-color: #6c757d;
}
:host([variant='success']) {
--bs-btn-color: #fff;
--bs-btn-bg: #198754;
--bs-btn-border-color: #198754;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #157347;
--bs-btn-hover-border-color: #146c43;
--bs-btn-focus-shadow-rgb: 60, 153, 110;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #146c43;
--bs-btn-active-border-color: #13653f;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #198754;
--bs-btn-disabled-border-color: #198754;
}
:host([variant='danger']) {
--bs-btn-color: #fff;
--bs-btn-bg: #dc3545;
--bs-btn-border-color: #dc3545;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #bb2d3b;
--bs-btn-hover-border-color: #b02a37;
--bs-btn-focus-shadow-rgb: 225, 83, 97;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #b02a37;
--bs-btn-active-border-color: #a52834;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #dc3545;
--bs-btn-disabled-border-color: #dc3545;
}
:host([variant='warning']) {
--bs-btn-color: #000;
--bs-btn-bg: #ffc107;
--bs-btn-border-color: #ffc107;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #ffca2c;
--bs-btn-hover-border-color: #ffc720;
--bs-btn-focus-shadow-rgb: 217, 164, 6;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #ffcd39;
--bs-btn-active-border-color: #ffc720;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #000;
--bs-btn-disabled-bg: #ffc107;
--bs-btn-disabled-border-color: #ffc107;
}
:host([variant='info']) {
--bs-btn-color: #000;
--bs-btn-bg: #0dcaf0;
--bs-btn-border-color: #0dcaf0;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #31d2f2;
--bs-btn-hover-border-color: #25cff2;
--bs-btn-focus-shadow-rgb: 11, 172, 204;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #3dd5f3;
--bs-btn-active-border-color: #25cff2;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #000;
--bs-btn-disabled-bg: #0dcaf0;
--bs-btn-disabled-border-color: #0dcaf0;
}
:host([variant='light']) {
--bs-btn-color: #000;
--bs-btn-bg: #f8f9fa;
--bs-btn-border-color: #f8f9fa;
--bs-btn-hover-color: #000;
--bs-btn-hover-bg: #d3d4d5;
--bs-btn-hover-border-color: #c6c7c8;
--bs-btn-focus-shadow-rgb: 211, 212, 213;
--bs-btn-active-color: #000;
--bs-btn-active-bg: #c6c7c8;
--bs-btn-active-border-color: #babbbc;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #000;
--bs-btn-disabled-bg: #f8f9fa;
--bs-btn-disabled-border-color: #f8f9fa;
}
:host([variant='dark']) {
--bs-btn-color: #fff;
--bs-btn-bg: #212529;
--bs-btn-border-color: #212529;
--bs-btn-hover-color: #fff;
--bs-btn-hover-bg: #424649;
--bs-btn-hover-border-color: #373b3e;
--bs-btn-focus-shadow-rgb: 66, 70, 73;
--bs-btn-active-color: #fff;
--bs-btn-active-bg: #4d5154;
--bs-btn-active-border-color: #373b3e;
--bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);
--bs-btn-disabled-color: #fff;
--bs-btn-disabled-bg: #212529;
--bs-btn-disabled-border-color: #212529;
}
:host([variant='link']) {
--bs-btn-font-weight: 400;
--bs-btn-color: var(--bs-link-color);
--bs-btn-bg: transparent;
--bs-btn-border-color: transparent;
--bs-btn-hover-color: var(--bs-link-hover-color);
--bs-btn-hover-border-color: transparent;
--bs-btn-active-color: var(--bs-link-hover-color);
--bs-btn-active-border-color: transparent;
--bs-btn-disabled-color: #6c757d;
--bs-btn-disabled-border-color: transparent;
--bs-btn-box-shadow: 0 0 0 #000;
--bs-btn-focus-shadow-rgb: 49, 132, 253;
text-decoration: underline;
}
`,
];
constructor() {
super();
/** @type {BootstrapButtonVariant} */
this.variant = 'primary';
}
}
customElements.define('bootstrap-button', BootstrapButton);

View file

@ -1,4 +1,4 @@
# Combobox >> Examples ||30
# Combobox >> Extensions ||30
```js script
import { html } from '@mdjs/mdjs-preview';
@ -46,7 +46,14 @@ export const Github = () => html`
## Whatsapp
```js preview-story
export const Whatsapp = () => html`
export const Whatsapp = () => {
const obamaImgUrl = new URL('../src/wa-combobox/assets/obama.jpeg', import.meta.url).href;
const trumpImgUrl = new URL('../src/wa-combobox/assets/trump.jpeg', import.meta.url).href;
const bidenImgUrl = new URL('../src/wa-combobox/assets/biden.jpeg', import.meta.url).href;
const bushImgUrl = new URL('../src/wa-combobox/assets/bush.jpeg', import.meta.url).href;
const clintonImgUrl = new URL('../src/wa-combobox/assets/clinton.jpeg', import.meta.url).href;
return html`
<wa-combobox name="combo" label="Filter chats">
<wa-option
title="Barack Obama"
@ -54,7 +61,7 @@ export const Whatsapp = () => html`
time="15:02"
is-user-text
is-user-text-read
image="https://pbs.twimg.com/profile_images/822547732376207360/5g0FC8XX_400x400.jpg"
image="${obamaImgUrl}"
.choiceValue=${'Barack Obama'}
></wa-option>
<wa-option
@ -62,32 +69,33 @@ export const Whatsapp = () => html`
text="Take care!"
time="14:59"
is-user-text
image="https://pbs.twimg.com/profile_images/874276197357596672/kUuht00m_400x400.jpg"
image="${trumpImgUrl}"
.choiceValue=${'Donald Trump'}
></wa-option>
<wa-option
title="Joe Biden"
text="Hehe😅. You too, man, you too..."
time="yesterday"
image="https://pbs.twimg.com/profile_images/1308769664240160770/AfgzWVE7_400x400.jpg"
image="${bidenImgUrl}"
.choiceValue=${'Joe Biden'}
></wa-option>
<wa-option
title="George W. Bush"
time="friday"
text="You bet I will. Let's catch up soon!"
image="https://pbs.twimg.com/profile_images/828483922266877954/ljYUWUCu_400x400.jpg"
image="${bushImgUrl}"
.choiceValue=${'George W. Bush'}
></wa-option>
<wa-option
title="Bill Clinton"
time="thursday"
text="Dude...😂 😂 😂"
image="https://pbs.twimg.com/profile_images/1239440892664086529/iY0Z83Dr_400x400.jpg"
image="${clintonImgUrl}"
.choiceValue=${'Bill Clinton'}
></wa-option>
</wa-combobox>
`;
};
```
**Whatsapp example shows:**

View file

@ -33,7 +33,7 @@ export const main = () => html`
`;
```
[...show more](./examples.md)
[...show more](./extensions.md)
## Features

View file

@ -397,7 +397,10 @@ export class GoogleCombobox extends LionCombobox {
get slots() {
return {
...super.slots,
label: () => renderLitAsNode(html` <img alt="Google Search" src="${googleSearchLogoUrl}" />`),
label: () =>
renderLitAsNode(
html` <img alt="Google Search" src="${googleSearchLogoUrl}" style="width:auto; " />`,
),
prefix: () => renderLitAsNode(html` <span>${googleSearchIcon}</span> `),
suffix: () =>
renderLitAsNode(

View file

@ -7,8 +7,7 @@ import './style/load-roboto.js';
// TODO: insert ink wc here
export class MdOption extends LionOption {
static get styles() {
return [
static styles = [
...super.styles,
css`
:host {
@ -31,7 +30,6 @@ export class MdOption extends LionOption {
}
`,
];
}
/**
* @override
@ -67,8 +65,7 @@ export class MdOption extends LionOption {
customElements.define('md-option', MdOption);
export class MdCombobox extends MdFieldMixin(LionCombobox) {
static get styles() {
return [
static styles = [
...super.styles,
css`
.input-group__container {
@ -84,6 +81,11 @@ export class MdCombobox extends MdFieldMixin(LionCombobox) {
}
`,
];
constructor() {
super();
this.showAllOnEmpty = true;
}
}
customElements.define('md-combobox', MdCombobox);

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

View file

@ -15,8 +15,7 @@ class WaOption extends LionOption {
};
}
static get styles() {
return [
static styles = [
...super.styles,
css`
:host {
@ -172,7 +171,6 @@ class WaOption extends LionOption {
} */
`,
];
}
render() {
return html`<div class="wa-option">
@ -285,14 +283,12 @@ class WaOption extends LionOption {
customElements.define('wa-option', WaOption);
class WaCombobox extends LionCombobox {
static get styles() {
return [
static styles = [
...super.styles,
css`
:host {
font-family: SF Pro Text, SF Pro Icons, system, -apple-system, system-ui,
BlinkMacSystemFont, Helvetica Neue, Helvetica, Lucida Grande, Kohinoor Devanagari,
sans-serif;
font-family: SF Pro Text, SF Pro Icons, system, -apple-system, system-ui, BlinkMacSystemFont,
Helvetica Neue, Helvetica, Lucida Grande, Kohinoor Devanagari, sans-serif;
}
.input-group__container {
@ -337,7 +333,6 @@ class WaCombobox extends LionCombobox {
}
`,
];
}
get slots() {
return {
@ -360,7 +355,7 @@ class WaCombobox extends LionCombobox {
/** @configure OverlayMixin */
this.opened = true;
/** @configure LionCombobox */
this.showAllOnEmpty = true;
this.showAllOnEmpty = false;
/** @configure LionCombobox */
this.rotateKeyboardNavigation = false;
}

View file

@ -1,4 +1,4 @@
# Input Tel Dropdown >> Examples ||30
# Input Tel Dropdown >> Extensions ||30
```js script
import { html } from '@mdjs/mdjs-preview';

View file

@ -47,7 +47,7 @@ export class LionButton extends DisabledWithTabIndexMixin(LitElement) {
box-sizing: border-box;
vertical-align: middle;
line-height: 24px;
background: #eee; /* minimal styling to make it recognizable as btn */
background-color: #eee; /* minimal styling to make it recognizable as btn */
padding: 8px; /* padding to fix with min-height */
outline: none; /* focus style handled below */
cursor: default; /* we should always see the default arrow, never a caret */