@redvars/peacock 3.2.3 → 3.2.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/dist/BaseButton.js.map +1 -1
  2. package/dist/asciidoc-pJfx9Q5g.js +8 -0
  3. package/dist/asciidoc-pJfx9Q5g.js.map +1 -0
  4. package/dist/ayu-dark-B_QwGMx7.js +5 -0
  5. package/dist/ayu-dark-B_QwGMx7.js.map +1 -0
  6. package/dist/ayu-light-D3FWc2Ex.js +5 -0
  7. package/dist/ayu-light-D3FWc2Ex.js.map +1 -0
  8. package/dist/ayu-mirage-BmOeqvbN.js +5 -0
  9. package/dist/ayu-mirage-BmOeqvbN.js.map +1 -0
  10. package/dist/bird2-K3o4L1QD.js +8 -0
  11. package/dist/bird2-K3o4L1QD.js.map +1 -0
  12. package/dist/c3-B07AahKi.js +8 -0
  13. package/dist/c3-B07AahKi.js.map +1 -0
  14. package/dist/code-highlighter.js +46 -22
  15. package/dist/code-highlighter.js.map +1 -1
  16. package/dist/custom-elements-jsdocs.json +29 -2
  17. package/dist/custom-elements.json +89 -3
  18. package/dist/{erb-m-j2vBLm.js → erb-ChJ68mCV.js} +2 -2
  19. package/dist/{erb-m-j2vBLm.js.map → erb-ChJ68mCV.js.map} +1 -1
  20. package/dist/focus-ring.js +32 -17
  21. package/dist/focus-ring.js.map +1 -1
  22. package/dist/horizon-bright-BLApERHE.js +5 -0
  23. package/dist/horizon-bright-BLApERHE.js.map +1 -0
  24. package/dist/icon.js +1 -1
  25. package/dist/index.js +2 -2
  26. package/dist/just-B9LTc0LG.js +36 -0
  27. package/dist/just-B9LTc0LG.js.map +1 -0
  28. package/dist/latex-BlSVCRS1.js +12 -0
  29. package/dist/latex-BlSVCRS1.js.map +1 -0
  30. package/dist/llvm-DmXvUVfA.js +8 -0
  31. package/dist/llvm-DmXvUVfA.js.map +1 -0
  32. package/dist/marko-BmJxIfAg.js +17 -0
  33. package/dist/marko-BmJxIfAg.js.map +1 -0
  34. package/dist/{mdc-BrYnGSXv.js → mdc-C7Ba-c77.js} +2 -2
  35. package/dist/{mdc-BrYnGSXv.js.map → mdc-C7Ba-c77.js.map} +1 -1
  36. package/dist/menu-item.js +70 -20
  37. package/dist/menu-item.js.map +1 -1
  38. package/dist/mojo-DYU6y2W9.js +8 -0
  39. package/dist/{mojo-u5OgFbxC.js.map → mojo-DYU6y2W9.js.map} +1 -1
  40. package/dist/moonbit-CV1yN8C9.js +8 -0
  41. package/dist/moonbit-CV1yN8C9.js.map +1 -0
  42. package/dist/{nextflow-u9s9iK4L.js → nextflow-Dg6qlPoG.js} +5 -2
  43. package/dist/nextflow-Dg6qlPoG.js.map +1 -0
  44. package/dist/nextflow-groovy-CORam5Fa.js +8 -0
  45. package/dist/nextflow-groovy-CORam5Fa.js.map +1 -0
  46. package/dist/nushell-CljK3mss.js +8 -0
  47. package/dist/nushell-CljK3mss.js.map +1 -0
  48. package/dist/peacock-loader.js +2 -2
  49. package/dist/ron-BdzR44AN.js +8 -0
  50. package/dist/ron-BdzR44AN.js.map +1 -0
  51. package/dist/{rst-DF3hmW_x.js → rst-CFS_KoQV.js} +2 -2
  52. package/dist/{rst-DF3hmW_x.js.map → rst-CFS_KoQV.js.map} +1 -1
  53. package/dist/ruby-D6iviT7z.js +39 -0
  54. package/dist/ruby-D6iviT7z.js.map +1 -0
  55. package/dist/src/button/BaseButton.d.ts +1 -1
  56. package/dist/src/focus-ring/focus-ring.d.ts +4 -0
  57. package/dist/src/menu/menu-item/menu-item.d.ts +10 -0
  58. package/dist/svelte-BkSXBbLu.js +17 -0
  59. package/dist/svelte-BkSXBbLu.js.map +1 -0
  60. package/dist/{swift-BCgZrEcl.js → swift-DyFZxOd-.js} +2 -2
  61. package/dist/{swift-BCgZrEcl.js.map → swift-DyFZxOd-.js.map} +1 -1
  62. package/dist/{switch-CSs3KDGd.js → switch-CC-S5fbc.js} +5 -4
  63. package/dist/switch-CC-S5fbc.js.map +1 -0
  64. package/dist/tex-BbUv4agS.js +11 -0
  65. package/dist/tex-BbUv4agS.js.map +1 -0
  66. package/dist/tooltip.js +72 -64
  67. package/dist/tooltip.js.map +1 -1
  68. package/dist/tsconfig.tsbuildinfo +1 -1
  69. package/dist/{twig-VqT-e9DI.js → twig-B60fOxJY.js} +2 -2
  70. package/dist/{twig-VqT-e9DI.js.map → twig-B60fOxJY.js.map} +1 -1
  71. package/dist/typedoc.json +73816 -73545
  72. package/dist/{unsafe-html-BIBrxtsS.js → unsafe-html-BS8X6Gto.js} +2 -2
  73. package/dist/{unsafe-html-BIBrxtsS.js.map → unsafe-html-BS8X6Gto.js.map} +1 -1
  74. package/package.json +5 -1
  75. package/readme.md +1 -1
  76. package/src/button/BaseButton.ts +1 -1
  77. package/src/button/button/button.scss +1 -0
  78. package/src/button/button/button.ts +1 -1
  79. package/src/button/icon-button/icon-button.ts +1 -1
  80. package/src/focus-ring/focus-ring.ts +34 -17
  81. package/src/menu/demo/index.html +36 -0
  82. package/src/menu/menu-item/menu-item.scss +13 -0
  83. package/src/menu/menu-item/menu-item.ts +65 -21
  84. package/dist/asciidoc-BDJTg1PM.js +0 -8
  85. package/dist/asciidoc-BDJTg1PM.js.map +0 -1
  86. package/dist/ayu-dark-ygzj7KbW.js +0 -5
  87. package/dist/ayu-dark-ygzj7KbW.js.map +0 -1
  88. package/dist/ayu-light-DsUL6vCY.js +0 -5
  89. package/dist/ayu-light-DsUL6vCY.js.map +0 -1
  90. package/dist/ayu-mirage-CyHYB1Vf.js +0 -5
  91. package/dist/ayu-mirage-CyHYB1Vf.js.map +0 -1
  92. package/dist/c3-CmLsUuAG.js +0 -8
  93. package/dist/c3-CmLsUuAG.js.map +0 -1
  94. package/dist/latex-Dym6_5Jv.js +0 -12
  95. package/dist/latex-Dym6_5Jv.js.map +0 -1
  96. package/dist/llvm-CPhCWK2d.js +0 -8
  97. package/dist/llvm-CPhCWK2d.js.map +0 -1
  98. package/dist/marko-C4cA5Esr.js +0 -17
  99. package/dist/marko-C4cA5Esr.js.map +0 -1
  100. package/dist/mojo-u5OgFbxC.js +0 -8
  101. package/dist/moonbit-aQWdlyG4.js +0 -8
  102. package/dist/moonbit-aQWdlyG4.js.map +0 -1
  103. package/dist/nextflow-u9s9iK4L.js.map +0 -1
  104. package/dist/nushell-Lv1Ave7e.js +0 -8
  105. package/dist/nushell-Lv1Ave7e.js.map +0 -1
  106. package/dist/ron-BKVA_67x.js +0 -8
  107. package/dist/ron-BKVA_67x.js.map +0 -1
  108. package/dist/ruby-w0WL1wp4.js +0 -39
  109. package/dist/ruby-w0WL1wp4.js.map +0 -1
  110. package/dist/svelte-CwlnTKtO.js +0 -17
  111. package/dist/svelte-CwlnTKtO.js.map +0 -1
  112. package/dist/switch-CSs3KDGd.js.map +0 -1
  113. package/dist/tex-C5wdBdOa.js +0 -11
  114. package/dist/tex-C5wdBdOa.js.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { A, E } from './lit-element-CA46RFZ_.js';
2
- import { i, t, e as e$1 } from './directive-Cuw6h7YA.js';
2
+ import { e as e$1, i, t } from './directive-Cuw6h7YA.js';
3
3
 
4
4
  /**
5
5
  * @license
@@ -8,4 +8,4 @@ import { i, t, e as e$1 } from './directive-Cuw6h7YA.js';
8
8
  */class e extends i{constructor(i){if(super(i),this.it=A,i.type!==t.CHILD)throw Error(this.constructor.directiveName+"() can only be used in child bindings")}render(r){if(r===A||null==r)return this._t=void 0,this.it=r;if(r===E)return r;if("string"!=typeof r)throw Error(this.constructor.directiveName+"() called with a non-string value");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName="unsafeHTML",e.resultType=1;const o=e$1(e);
9
9
 
10
10
  export { e, o };
11
- //# sourceMappingURL=unsafe-html-BIBrxtsS.js.map
11
+ //# sourceMappingURL=unsafe-html-BS8X6Gto.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"unsafe-html-BIBrxtsS.js","sources":["../node_modules/lit-html/directives/unsafe-html.js"],"sourcesContent":["import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n"],"names":["s","t","n","i","r"],"mappings":";;;AACA;AACA;AACA;AACA;AACA,GAAG,MAAM,CAAC,SAASA,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAACC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAGC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,uCAAuC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAGD,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAGE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAM,MAAC,CAAC,CAACC,GAAC,CAAC,CAAC;;;;","x_google_ignoreList":[0]}
1
+ {"version":3,"file":"unsafe-html-BS8X6Gto.js","sources":["../node_modules/lit-html/directives/unsafe-html.js"],"sourcesContent":["import{nothing as t,noChange as i}from\"../lit-html.js\";import{directive as r,Directive as s,PartType as n}from\"../directive.js\";\n/**\n * @license\n * Copyright 2017 Google LLC\n * SPDX-License-Identifier: BSD-3-Clause\n */class e extends s{constructor(i){if(super(i),this.it=t,i.type!==n.CHILD)throw Error(this.constructor.directiveName+\"() can only be used in child bindings\")}render(r){if(r===t||null==r)return this._t=void 0,this.it=r;if(r===i)return r;if(\"string\"!=typeof r)throw Error(this.constructor.directiveName+\"() called with a non-string value\");if(r===this.it)return this._t;this.it=r;const s=[r];return s.raw=s,this._t={_$litType$:this.constructor.resultType,strings:s,values:[]}}}e.directiveName=\"unsafeHTML\",e.resultType=1;const o=r(e);export{e as UnsafeHTMLDirective,o as unsafeHTML};\n//# sourceMappingURL=unsafe-html.js.map\n"],"names":["s","t","n","i","r"],"mappings":";;;AACA;AACA;AACA;AACA;AACA,GAAG,MAAM,CAAC,SAASA,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAACC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAGC,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,uCAAuC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAGD,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,GAAGE,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,QAAQ,EAAE,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,mCAAmC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAM,MAAC,CAAC,CAACC,GAAC,CAAC,CAAC;;;;","x_google_ignoreList":[0]}
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@redvars/peacock",
3
3
  "description": "The foundation for beautiful user interfaces",
4
4
  "license": "Apache-2.0",
5
- "version": "3.2.3",
5
+ "version": "3.2.4",
6
6
  "type": "module",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
@@ -11,6 +11,10 @@
11
11
  "lit",
12
12
  "web components"
13
13
  ],
14
+ "repository": {
15
+ "url": "https://github.com/redvars/peacock"
16
+ },
17
+ "private": false,
14
18
  "exports": {
15
19
  ".": "./dist/src/index.js",
16
20
  "./icon.js": "./dist/src/index.js"
package/readme.md CHANGED
@@ -45,7 +45,7 @@ Visit [https://peacock.redvars.com](https://goatui.com) to view the documentatio
45
45
  <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Mono:wght@100..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
46
46
 
47
47
  <script type='module'
48
- src='https://cdn.jsdelivr.net/npm/@redvars/peacock@3.2.1/dist/peacock-loader.js'></script>
48
+ src='https://cdn.jsdelivr.net/npm/@redvars/peacock@3.2.2/dist/peacock-loader.js'></script>
49
49
  </head>
50
50
 
51
51
  <p-avatar name="Shivaji Varma"></p-avatar>
@@ -97,7 +97,7 @@ export class BaseButton extends LitElement {
97
97
  @state()
98
98
  isPressed = false;
99
99
 
100
- @query('.button') private readonly buttonElement!: HTMLElement | null;
100
+ @query('.button') readonly buttonElement!: HTMLElement | null;
101
101
 
102
102
  override focus() {
103
103
  this.buttonElement?.focus();
@@ -85,6 +85,7 @@ slot::slotted(*) {
85
85
  Background layers
86
86
  */
87
87
  .focus-ring {
88
+ z-index: 2;
88
89
  --focus-ring-container-shape-start-start: var(--_container-shape-start-start);
89
90
  --focus-ring-container-shape-start-end: var(--_container-shape-start-end);
90
91
  --focus-ring-container-shape-end-start: var(--_container-shape-end-start);
@@ -136,7 +136,7 @@ export class Button extends BaseButton {
136
136
 
137
137
  renderButtonContent() {
138
138
  return html`
139
- <focus-ring class="focus-ring" .control=${this}></focus-ring>
139
+ <focus-ring class="focus-ring" .control=${this} element="buttonElement"></focus-ring>
140
140
  <base-elevation class="elevation"></base-elevation>
141
141
  <div class="neo-background"></div>
142
142
  <div class="background"></div>
@@ -133,7 +133,7 @@ export class IconButton extends BaseButton {
133
133
 
134
134
  renderButtonContent() {
135
135
  return html`
136
- <focus-ring class="focus-ring" .control=${this}></focus-ring>
136
+ <focus-ring class="focus-ring" .control=${this} element="buttonElement"></focus-ring>
137
137
  <base-elevation class="elevation"></base-elevation>
138
138
  <div class="neo-background"></div>
139
139
  <div class="background"></div>
@@ -18,6 +18,9 @@ export class FocusRing extends LitElement {
18
18
 
19
19
  @property({ type: Boolean, reflect: true }) visible: boolean = false;
20
20
 
21
+ @property({ type: String}) element = '';
22
+
23
+
21
24
  render() {
22
25
  return nothing;
23
26
  }
@@ -46,27 +49,41 @@ export class FocusRing extends LitElement {
46
49
  super.disconnectedCallback();
47
50
  }
48
51
 
52
+ __focusin() {
53
+ // @ts-ignore
54
+ this.visible = this._control[this.element].matches(':focus-visible') ?? false;
55
+ }
56
+
57
+ __focusout() {
58
+ this.visible = false;
59
+ }
60
+
61
+ __pointerdown() {
62
+ this.visible = false;
63
+ }
64
+
49
65
  attach() {
50
- // @ts-ignore - buttonElement is not defined on the base class
51
- this._control?.buttonElement?.addEventListener('focusin', () => {
52
- this.visible =
53
- // @ts-ignore - buttonElement is not defined on the base class
54
- this._control?.buttonElement?.matches(':focus-visible') ?? false;
55
- });
56
- // @ts-ignore - buttonElement is not defined on the base class
57
- this._control?.buttonElement?.addEventListener('focusout', () => {
58
- this.visible = false;
59
- });
60
- // @ts-ignore - buttonElement is not defined on the base class
61
- this._control?.buttonElement?.addEventListener('pointerdown', () => {
62
- this.visible = false;
63
- });
66
+ // @ts-ignore
67
+ if (this._control && this._control[this.element]) {
68
+ // @ts-ignore
69
+ this._control[this.element].addEventListener('focusin', this.__focusin.bind(this));
70
+ // @ts-ignore
71
+ this._control[this.element].addEventListener('focusout', this.__focusin.bind(this));
72
+ // @ts-ignore
73
+ this._control[this.element].addEventListener('pointerdown', this.__focusin.bind(this));
74
+ }
64
75
  }
65
76
 
66
77
  detach() {
67
- this._control?.removeEventListener('focusin', () => {});
68
- this._control?.removeEventListener('focusout', () => {});
69
- this._control?.removeEventListener('pointerdown', () => {});
78
+ // @ts-ignore
79
+ if (this._control && this._control[this.element]) {
80
+ // @ts-ignore
81
+ this._control[this.element].removeEventListener('focusin', this.__focusin);
82
+ // @ts-ignore
83
+ this._control[this.element].removeEventListener('focusout', this.__focusout);
84
+ // @ts-ignore
85
+ this._control[this.element].removeEventListener('pointerdown', this.__pointerdown);
86
+ }
70
87
  this._control = undefined;
71
88
  }
72
89
  }
@@ -0,0 +1,36 @@
1
+ <!doctype html>
2
+ <html lang='en-GB'>
3
+ <head>
4
+ <meta charset='utf-8'>
5
+ <meta name='viewport' content='width=device-width, initial-scale=1.0, viewport-fit=cover' />
6
+
7
+ <link rel='stylesheet' href='/dist/assets/styles/tokens.css' />
8
+ <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Mono:wght@100..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet">
9
+
10
+
11
+ <style>
12
+ body {
13
+ background: #fafafa;
14
+ }
15
+ </style>
16
+
17
+ </head>
18
+ <body>
19
+
20
+
21
+ <p class='text-body'>
22
+ <p-link href='#' class='with-icon'><p-icon name='home'></p-icon> link</p-link>
23
+ </p>
24
+
25
+ <p class='text-body'>
26
+ <p-link href='#' class='inherit'> Testing No Style</p-link>
27
+ </p>
28
+
29
+
30
+ <script type='module'>
31
+ import { MenuList, MenuItem } from '/dist/index.js';
32
+ window.customElements.define('menu-list', MenuList);
33
+ window.customElements.define('menu-item', MenuItem);
34
+ </script>
35
+ </body>
36
+ </html>
@@ -12,6 +12,7 @@
12
12
  display: flex;
13
13
  align-items: center;
14
14
  padding-inline: 0.75rem;
15
+ outline: 0;
15
16
 
16
17
  @include mixin.get-typography(label-large);
17
18
 
@@ -51,6 +52,18 @@
51
52
  pointer-events: none;
52
53
  }
53
54
 
55
+ /*
56
+ Background layers
57
+ */
58
+ .focus-ring {
59
+ z-index: 2;
60
+ --focus-ring-container-shape-start-start: var(--_container-shape-start-start);
61
+ --focus-ring-container-shape-start-end: var(--_container-shape-start-end);
62
+ --focus-ring-container-shape-end-start: var(--_container-shape-end-start);
63
+ --focus-ring-container-shape-end-end: var(--_container-shape-end-end);
64
+ --focus-ring-container-shape-variant: var(--_container-corner-shape-variant);
65
+ }
66
+
54
67
  .ripple {
55
68
  --ripple-state-opacity: var(--_container-state-opacity, 0);
56
69
  --ripple-pressed-color: var(--_container-state-color);
@@ -1,5 +1,5 @@
1
1
  import { html, LitElement } from 'lit';
2
- import { property } from 'lit/decorators.js';
2
+ import { property, query } from 'lit/decorators.js';
3
3
  import { classMap } from 'lit/directives/class-map.js';
4
4
  import styles from './menu-item.scss';
5
5
  import colorStyles from './menu-item-colors.scss';
@@ -11,6 +11,17 @@ export class MenuItem extends LitElement {
11
11
 
12
12
  @property({ type: Boolean }) selected = false;
13
13
 
14
+ /*
15
+ * Hyperlink to navigate to on click.
16
+ */
17
+ @property({ reflect: true }) href?: string;
18
+
19
+ /**
20
+ * Sets or retrieves the window or frame at which to target content.
21
+ */
22
+ @property() target: string = '_self';
23
+
24
+
14
25
  @property({ type: String, reflect: true }) variant: 'standard' | 'vibrant' =
15
26
  'standard';
16
27
 
@@ -22,9 +33,6 @@ export class MenuItem extends LitElement {
22
33
  if (!this.hasAttribute('role')) {
23
34
  this.setAttribute('role', 'menuitem');
24
35
  }
25
- if (!this.hasAttribute('tabindex') && !this.disabled) {
26
- this.setAttribute('tabindex', '0');
27
- }
28
36
  }
29
37
 
30
38
  // Handle keyboard activation (Enter/Space)
@@ -35,30 +43,66 @@ export class MenuItem extends LitElement {
35
43
  }
36
44
  }
37
45
 
46
+ __isLink() {
47
+ return !!this.href;
48
+ }
49
+
50
+ @query('.menu-item') private readonly menuItemElement!: HTMLElement | null;
51
+
52
+ override focus() {
53
+ this.menuItemElement?.focus();
54
+ }
55
+
56
+ override blur() {
57
+ this.menuItemElement?.blur();
58
+ }
59
+
38
60
  render() {
39
- return html`
40
- <div
41
- class=${classMap({
61
+
62
+ const isLink = this.__isLink();
63
+
64
+ const cssClasses = {
42
65
  'menu-item': true,
43
66
  disabled: this.disabled,
44
67
  selected: this.selected,
45
- })}
68
+ };
69
+
70
+ if (isLink) {
71
+ return html`<a
72
+ class=${classMap(cssClasses)}
73
+ href=${this.href}
74
+ target=${this.target}
75
+ >
76
+ ${this.renderContent()}
77
+ </a>
78
+ `;
79
+ }
80
+
81
+
82
+ return html`<div
83
+ class=${classMap(cssClasses)}
84
+ tabindex=${!this.disabled ? 0 : -1}
46
85
  @keydown="${this._handleKeyDown}"
47
86
  >
48
- <div class="background"></div>
49
- <base-ripple class="ripple"></base-ripple>
50
-
51
- <div class="menu-item-content">
52
- <slot name="leading-icon"></slot>
53
- <base-icon name="home"></base-icon>
54
- <div class="slot-container">
55
- <slot></slot>
56
- </div>
57
- <slot
58
- name="trailing-supporting-text"
59
- slot="trailing-supporting-text"
60
- ></slot>
87
+ ${this.renderContent()}
88
+ </div>
89
+ `;
90
+ }
91
+
92
+ renderContent() {
93
+ return html`
94
+ <focus-ring class="focus-ring" .control=${this} element="menuItemElement"></focus-ring>
95
+ <div class="background"></div>
96
+ <base-ripple class="ripple"></base-ripple>
97
+
98
+ <div class="menu-item-content">
99
+ <slot name="leading-icon"></slot>
100
+ <div class="slot-container">
101
+ <slot></slot>
61
102
  </div>
103
+ <slot
104
+ name="trailing-supporting-text"
105
+ ></slot>
62
106
  </div>
63
107
  `;
64
108
  }