@crowdstrike/glide-core 0.26.1 → 0.28.0

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/accordion.d.ts +2 -2
  2. package/dist/accordion.js +1 -1
  3. package/dist/button-group.button.d.ts +2 -2
  4. package/dist/button-group.button.js +1 -1
  5. package/dist/button-group.d.ts +3 -3
  6. package/dist/button-group.js +1 -1
  7. package/dist/button.d.ts +2 -2
  8. package/dist/button.js +1 -1
  9. package/dist/checkbox-group.d.ts +3 -3
  10. package/dist/checkbox-group.js +9 -9
  11. package/dist/checkbox.d.ts +2 -3
  12. package/dist/checkbox.js +3 -3
  13. package/dist/checkbox.styles.js +8 -16
  14. package/dist/drawer.d.ts +2 -2
  15. package/dist/drawer.js +1 -1
  16. package/dist/dropdown.d.ts +17 -22
  17. package/dist/dropdown.js +102 -107
  18. package/dist/dropdown.option.d.ts +9 -9
  19. package/dist/dropdown.option.js +1 -1
  20. package/dist/dropdown.option.styles.js +16 -79
  21. package/dist/dropdown.styles.js +57 -74
  22. package/dist/form-controls-layout.d.ts +3 -3
  23. package/dist/form-controls-layout.js +1 -1
  24. package/dist/icon-button.d.ts +2 -2
  25. package/dist/icon-button.js +1 -1
  26. package/dist/icons/checked.js +1 -1
  27. package/dist/inline-alert.d.ts +2 -2
  28. package/dist/inline-alert.js +1 -1
  29. package/dist/input.d.ts +2 -2
  30. package/dist/input.js +2 -2
  31. package/dist/input.styles.js +9 -7
  32. package/dist/label.d.ts +2 -2
  33. package/dist/label.js +1 -1
  34. package/dist/label.styles.js +5 -1
  35. package/dist/library/assert-slot.d.ts +1 -1
  36. package/dist/library/assert-slot.test.js +22 -22
  37. package/dist/library/expect-window-error.js +1 -1
  38. package/dist/library/final.test.js +9 -9
  39. package/dist/library/form-control.d.ts +1 -1
  40. package/dist/library/localize.d.ts +5 -0
  41. package/dist/library/localize.test.js +6 -6
  42. package/dist/library/required.test.js +5 -5
  43. package/dist/library/unique-id.d.ts +2 -0
  44. package/dist/library/unique-id.js +1 -0
  45. package/dist/link.d.ts +2 -3
  46. package/dist/link.js +1 -1
  47. package/dist/link.styles.js +1 -1
  48. package/dist/menu.button.d.ts +2 -2
  49. package/dist/menu.button.js +1 -1
  50. package/dist/menu.button.styles.js +3 -3
  51. package/dist/menu.d.ts +3 -9
  52. package/dist/menu.js +1 -1
  53. package/dist/menu.link.d.ts +2 -2
  54. package/dist/menu.link.js +1 -1
  55. package/dist/menu.link.styles.js +3 -3
  56. package/dist/menu.options.d.ts +3 -4
  57. package/dist/menu.options.js +1 -1
  58. package/dist/menu.options.styles.js +3 -20
  59. package/dist/modal.d.ts +6 -6
  60. package/dist/modal.icon-button.d.ts +2 -2
  61. package/dist/modal.icon-button.js +1 -1
  62. package/dist/modal.js +1 -1
  63. package/dist/popover.d.ts +2 -2
  64. package/dist/popover.js +1 -1
  65. package/dist/radio-group.d.ts +3 -3
  66. package/dist/radio-group.js +6 -6
  67. package/dist/radio-group.radio.d.ts +2 -2
  68. package/dist/radio-group.radio.js +1 -1
  69. package/dist/slider.d.ts +116 -0
  70. package/dist/slider.js +168 -0
  71. package/dist/slider.styles.d.ts +2 -0
  72. package/dist/slider.styles.js +168 -0
  73. package/dist/spinner.d.ts +2 -2
  74. package/dist/spinner.js +1 -1
  75. package/dist/split-button.d.ts +4 -10
  76. package/dist/split-button.js +1 -1
  77. package/dist/split-button.primary-button.d.ts +2 -2
  78. package/dist/split-button.primary-button.js +1 -1
  79. package/dist/split-button.primary-button.styles.js +4 -14
  80. package/dist/split-button.primary-link.d.ts +2 -2
  81. package/dist/split-button.primary-link.js +1 -1
  82. package/dist/split-button.secondary-button.d.ts +3 -4
  83. package/dist/split-button.secondary-button.js +1 -1
  84. package/dist/split-button.secondary-button.styles.js +4 -15
  85. package/dist/styles/variables.css +1 -1
  86. package/dist/tab.d.ts +12 -4
  87. package/dist/tab.group.d.ts +4 -5
  88. package/dist/tab.group.js +1 -1
  89. package/dist/tab.group.styles.js +14 -16
  90. package/dist/tab.js +1 -1
  91. package/dist/tab.panel.d.ts +12 -5
  92. package/dist/tab.panel.js +1 -1
  93. package/dist/tag.d.ts +2 -4
  94. package/dist/tag.js +1 -1
  95. package/dist/tag.styles.js +7 -52
  96. package/dist/textarea.d.ts +2 -2
  97. package/dist/textarea.js +7 -7
  98. package/dist/textarea.styles.js +17 -2
  99. package/dist/toast.d.ts +3 -3
  100. package/dist/toast.js +1 -1
  101. package/dist/toast.toasts.d.ts +9 -9
  102. package/dist/toast.toasts.js +17 -17
  103. package/dist/toggle.d.ts +2 -2
  104. package/dist/toggle.js +1 -1
  105. package/dist/tooltip.container.d.ts +2 -2
  106. package/dist/tooltip.container.js +1 -1
  107. package/dist/tooltip.d.ts +3 -3
  108. package/dist/tooltip.js +1 -1
  109. package/dist/translations/en.js +1 -1
  110. package/dist/translations/fr.d.ts +1 -1
  111. package/dist/translations/fr.js +1 -1
  112. package/dist/translations/ja.d.ts +1 -1
  113. package/dist/translations/ja.js +1 -1
  114. package/package.json +19 -18
@@ -1,7 +1,7 @@
1
1
  import{css,unsafeCSS}from"lit";import visuallyHidden from"./styles/visually-hidden.js";const fieldSizingContent=unsafeCSS("\n field-sizing: content;\n");export default[css`
2
2
  ${visuallyHidden(".character-count .hidden")}
3
3
  `,css`
4
- glide-core-private-label::part(private-tooltips) {
4
+ glide-core-private-label[orientation='horizontal']::part(private-tooltips) {
5
5
  align-items: flex-start;
6
6
  margin-block-start: var(--glide-core-spacing-base-sm);
7
7
  }
@@ -36,11 +36,27 @@ import{css,unsafeCSS}from"lit";import visuallyHidden from"./styles/visually-hidd
36
36
  font-weight: var(--glide-core-typography-weight-regular);
37
37
  max-block-size: 5lh;
38
38
  min-block-size: 3lh;
39
+ min-inline-size: 3.75rem;
39
40
  padding: var(--glide-core-spacing-base-xs)
40
41
  var(--glide-core-spacing-base-sm);
41
42
  resize: vertical;
42
43
  transition: border-color 200ms ease-in-out;
43
44
 
45
+ /*
46
+ Because 'field-sizing: content' is used, it allows the
47
+ element to grow to fill the content. This is problematic in
48
+ our case because it means our textarea could force its
49
+ container to scroll when a user enters long, unbroken text.
50
+ This issue was discussed at https://issues.chromium.org/issues/340291325,
51
+ but for the select element. Using 'max-width: 100%' won't
52
+ solve the issue, and we can't use a fixed max-width, as we
53
+ won't know the layouts our consumers will use our components
54
+ in. So setting this CSS property allows for the textarea to
55
+ naturally break the value up by words and prevent horizontal
56
+ scrolling.
57
+ */
58
+ word-break: break-word;
59
+
44
60
  ${fieldSizingContent};
45
61
 
46
62
  &:focus {
@@ -48,7 +64,6 @@ import{css,unsafeCSS}from"lit";import visuallyHidden from"./styles/visually-hidd
48
64
  }
49
65
 
50
66
  &:focus-visible,
51
- &:focus-visible[readonly],
52
67
  &:hover {
53
68
  border-color: var(--glide-core-color-interactive-stroke-primary--hover);
54
69
  }
package/dist/toast.d.ts CHANGED
@@ -2,7 +2,7 @@ import './icon-button.js';
2
2
  import { LitElement } from 'lit';
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
5
- 'glide-core-toast': GlideCoreToast;
5
+ 'glide-core-toast': Toast;
6
6
  }
7
7
  }
8
8
  /**
@@ -13,13 +13,13 @@ declare global {
13
13
  * @readonly
14
14
  * @attr {string} [version]
15
15
  *
16
- * @slot {GlideCoreLink | string} - A description
16
+ * @slot {Link | string} - A description
17
17
  *
18
18
  * @fires {Event} dismiss
19
19
  *
20
20
  * @method dismiss
21
21
  */
22
- export default class GlideCoreToast extends LitElement {
22
+ export default class Toast extends LitElement {
23
23
  static shadowRootOptions: ShadowRootInit;
24
24
  label?: string;
25
25
  privateDescription?: string;
package/dist/toast.js CHANGED
@@ -1 +1 @@
1
- var __decorate=this&&this.__decorate||function(e,t,o,r){var i,s=arguments.length,a=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,o,r);else for(var p=e.length-1;p>=0;p--)(i=e[p])&&(a=(s<3?i(a):s>3?i(t,o,a):i(t,o))||a);return s>3&&a&&Object.defineProperty(t,o,a),a};import"./icon-button.js";import{LitElement,html}from"lit";import{customElement,property}from"lit/decorators.js";import{nanoid}from"nanoid";import packageJson from"../package.json"with{type:"json"};import GlideCoreToasts from"./toast.toasts.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import required from"./library/required.js";import GlideCoreLink from"./link.js";import assertSlot from"./library/assert-slot.js";let GlideCoreToast=class GlideCoreToast extends LitElement{constructor(){super(...arguments),this.duration=5e3,this.privateDismissing=!1,this.privateDismissingViaButton=!1,this.privateId=nanoid(),this.privateShow=!1,this.variant="informational",this.version=packageJson.version}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}dismiss(){this.dispatchEvent(new Event("dismiss",{bubbles:!0,composed:!0})),this.remove()}firstUpdated(){GlideCoreToasts.show(this)}render(){return html`<slot hidden ${assertSlot([GlideCoreLink,Text],!0)}></slot>`}};__decorate([property({reflect:!0}),required],GlideCoreToast.prototype,"label",void 0),__decorate([property()],GlideCoreToast.prototype,"privateDescription",void 0),__decorate([property({reflect:!0,type:Number,useDefault:!0})],GlideCoreToast.prototype,"duration",void 0),__decorate([property({type:Boolean})],GlideCoreToast.prototype,"privateDismissing",void 0),__decorate([property({type:Boolean})],GlideCoreToast.prototype,"privateDismissingViaButton",void 0),__decorate([property()],GlideCoreToast.prototype,"privateId",void 0),__decorate([property({type:Boolean})],GlideCoreToast.prototype,"privateShow",void 0),__decorate([property({attribute:!1})],GlideCoreToast.prototype,"privateTimeoutId",void 0),__decorate([property({reflect:!0,useDefault:!0})],GlideCoreToast.prototype,"variant",void 0),__decorate([property({reflect:!0})],GlideCoreToast.prototype,"version",void 0),GlideCoreToast=__decorate([customElement("glide-core-toast"),final],GlideCoreToast);export default GlideCoreToast;
1
+ var __decorate=this&&this.__decorate||function(t,e,o,r){var i,s=arguments.length,a=s<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,o,r);else for(var p=t.length-1;p>=0;p--)(i=t[p])&&(a=(s<3?i(a):s>3?i(e,o,a):i(e,o))||a);return s>3&&a&&Object.defineProperty(e,o,a),a};import"./icon-button.js";import{LitElement,html}from"lit";import{customElement,property}from"lit/decorators.js";import packageJson from"../package.json"with{type:"json"};import Toasts from"./toast.toasts.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import required from"./library/required.js";import Link from"./link.js";import assertSlot from"./library/assert-slot.js";import uniqueId from"./library/unique-id.js";let Toast=class Toast extends LitElement{constructor(){super(...arguments),this.duration=5e3,this.privateDismissing=!1,this.privateDismissingViaButton=!1,this.privateId=uniqueId(),this.privateShow=!1,this.variant="informational",this.version=packageJson.version}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}dismiss(){this.dispatchEvent(new Event("dismiss",{bubbles:!0,composed:!0})),this.remove()}firstUpdated(){(async()=>{await(this.querySelector("glide-core-link")?.updateComplete),Toasts.show(this)})()}render(){return html`<slot hidden ${assertSlot([Link,Text],!0)}></slot>`}};__decorate([property({reflect:!0}),required],Toast.prototype,"label",void 0),__decorate([property()],Toast.prototype,"privateDescription",void 0),__decorate([property({reflect:!0,type:Number,useDefault:!0})],Toast.prototype,"duration",void 0),__decorate([property({type:Boolean})],Toast.prototype,"privateDismissing",void 0),__decorate([property({type:Boolean})],Toast.prototype,"privateDismissingViaButton",void 0),__decorate([property()],Toast.prototype,"privateId",void 0),__decorate([property({type:Boolean})],Toast.prototype,"privateShow",void 0),__decorate([property({attribute:!1})],Toast.prototype,"privateTimeoutId",void 0),__decorate([property({reflect:!0,useDefault:!0})],Toast.prototype,"variant",void 0),__decorate([property({reflect:!0})],Toast.prototype,"version",void 0),Toast=__decorate([customElement("glide-core-toast"),final],Toast);export default Toast;
@@ -1,31 +1,31 @@
1
1
  import './icon-button.js';
2
2
  import { LitElement } from 'lit';
3
- import GlideCoreToast from './toast.js';
3
+ import Toast from './toast.js';
4
4
  declare global {
5
5
  interface HTMLElementTagNameMap {
6
- 'glide-core-private-toasts': GlideCoreToasts;
6
+ 'glide-core-private-toasts': Toasts;
7
7
  }
8
8
  }
9
9
  /**
10
- * @attr {GlideCoreToast[]} [toasts=[]]
10
+ * @attr {Toast[]} [toasts=[]]
11
11
  *
12
12
  * @method dismiss
13
- * @param {GlideCoreToast} toast
13
+ * @param {Toast} toast
14
14
  *
15
15
  * @method show
16
- * @param {GlideCoreToast} toast
16
+ * @param {Toast} toast
17
17
  * @returns Promise<void>
18
18
  *
19
19
  * @method showPopover
20
20
  */
21
- export default class GlideCoreToasts extends LitElement {
21
+ export default class Toasts extends LitElement {
22
22
  #private;
23
23
  static shadowRootOptions: ShadowRootInit;
24
24
  static styles: import("lit").CSSResult[];
25
- toasts: GlideCoreToast[];
26
- dismiss(toast: GlideCoreToast): void;
25
+ toasts: Toast[];
26
+ dismiss(toast: Toast): void;
27
27
  firstUpdated(): void;
28
28
  render(): import("lit").TemplateResult<1>;
29
29
  showPopover(): void;
30
- static show(toast: GlideCoreToast): Promise<void>;
30
+ static show(toast: Toast): Promise<void>;
31
31
  }
@@ -1,54 +1,54 @@
1
- var __decorate=this&&this.__decorate||function(e,t,i,s){var o,r=arguments.length,a=r<3?t:null===s?s=Object.getOwnPropertyDescriptor(t,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(e,t,i,s);else for(var n=e.length-1;n>=0;n--)(o=e[n])&&(a=(r<3?o(a):r>3?o(t,i,a):o(t,i))||a);return r>3&&a&&Object.defineProperty(t,i,a),a};import"./icon-button.js";import{html,LitElement}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{classMap}from"lit/directives/class-map.js";import{styleMap}from"lit/directives/style-map.js";import{choose}from"lit/directives/choose.js";import{when}from"lit/directives/when.js";import{unsafeHTML}from"lit/directives/unsafe-html.js";import xIcon from"./icons/x.js";import{LocalizeController}from"./library/localize.js";import styles from"./toast.toasts.styles.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import GlideCoreToast from"./toast.js";import GlideCoreLink from"./link.js";let GlideCoreToasts=class GlideCoreToasts extends LitElement{constructor(){super(...arguments),this.toasts=[],this.#e=createRef(),this.#t=new LocalizeController(this)}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}static{this.styles=styles}dismiss(e){const t=this.toasts.indexOf(e);this.toasts=[...this.toasts.slice(0,t),...this.toasts.slice(t+1)],e.dismiss(),0===this.toasts.length&&this.remove()}firstUpdated(){this.#e.value&&(this.#e.value.popover="manual")}render(){return html`<div
2
- aria-label=${this.#t.term("notifications")}
1
+ var __decorate=this&&this.__decorate||function(t,e,i,s){var o,r=arguments.length,a=r<3?e:null===s?s=Object.getOwnPropertyDescriptor(e,i):s;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,i,s);else for(var n=t.length-1;n>=0;n--)(o=t[n])&&(a=(r<3?o(a):r>3?o(e,i,a):o(e,i))||a);return r>3&&a&&Object.defineProperty(e,i,a),a};import"./icon-button.js";import{html,LitElement}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{repeat}from"lit/directives/repeat.js";import{classMap}from"lit/directives/class-map.js";import{styleMap}from"lit/directives/style-map.js";import{choose}from"lit/directives/choose.js";import{when}from"lit/directives/when.js";import{unsafeHTML}from"lit/directives/unsafe-html.js";import xIcon from"./icons/x.js";import{LocalizeController}from"./library/localize.js";import styles from"./toast.toasts.styles.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import Toast from"./toast.js";import Link from"./link.js";let Toasts=class Toasts extends LitElement{constructor(){super(...arguments),this.toasts=[],this.#t=createRef(),this.#e=new LocalizeController(this)}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}static{this.styles=styles}dismiss(t){const e=this.toasts.indexOf(t);this.toasts=[...this.toasts.slice(0,e),...this.toasts.slice(e+1)],t.dismiss(),0===this.toasts.length&&this.remove()}firstUpdated(){this.#t.value&&(this.#t.value.popover="manual")}render(){return html`<div
2
+ aria-label=${this.#e.term("notifications")}
3
3
  class="component"
4
4
  data-test="component"
5
5
  role="region"
6
6
  tabindex="-1"
7
- ${ref(this.#e)}
7
+ ${ref(this.#t)}
8
8
  >
9
9
  <div class="toasts">
10
- ${repeat(this.toasts,(e=>e.privateId),(e=>html`<div
10
+ ${repeat(this.toasts,(t=>t.privateId),(t=>html`<div
11
11
  aria-labelledby="prefix label description"
12
- class=${classMap({toast:!0,error:"error"===e.variant,informational:"informational"===e.variant,success:"success"===e.variant,show:Boolean(e.privateShow),dismissing:Boolean(e.privateDismissing),"dismissing-via-button":Boolean(e.privateDismissingViaButton)})}
12
+ class=${classMap({toast:!0,error:"error"===t.variant,informational:"informational"===t.variant,success:"success"===t.variant,show:Boolean(t.privateShow),dismissing:Boolean(t.privateDismissing),"dismissing-via-button":Boolean(t.privateDismissingViaButton)})}
13
13
  data-test="toast"
14
14
  role="alert"
15
- @mouseover=${this.#i.bind(this,e)}
16
- @mouseout=${this.#s.bind(this,e)}
17
- @transitionend=${this.#o.bind(this,e)}
15
+ @mouseover=${this.#i.bind(this,t)}
16
+ @mouseout=${this.#s.bind(this,t)}
17
+ @transitionend=${this.#o.bind(this,t)}
18
18
  >
19
19
  <span class="prefix" id="prefix">
20
- ${this.#t.term(e.variant)}
20
+ ${this.#e.term(t.variant)}
21
21
  </span>
22
22
 
23
- ${choose(e.variant,[["success",()=>icons.success],["error",()=>icons.error]],(()=>icons.warningInformational))}
23
+ ${choose(t.variant,[["success",()=>icons.success],["error",()=>icons.error]],(()=>icons.warningInformational))}
24
24
 
25
25
  <div class="label" data-test="label" id="label">
26
- ${e.label}
26
+ ${t.label}
27
27
  </div>
28
28
 
29
29
  <glide-core-icon-button
30
30
  class="dismiss-button"
31
31
  data-test="dismiss-button"
32
- label=${this.#t.term("dismiss")}
32
+ label=${this.#e.term("dismiss")}
33
33
  variant="tertiary"
34
- @click=${this.#r.bind(this,e)}
34
+ @click=${this.#r.bind(this,t)}
35
35
  >
36
36
  ${xIcon}
37
37
  </glide-core-icon-button>
38
38
 
39
- ${when(e.privateDescription,(()=>html`
39
+ ${when(t.privateDescription,(()=>html`
40
40
  <div
41
41
  class="description"
42
42
  data-test="description"
43
43
  id="description"
44
- @click=${this.#a.bind(this,e)}
44
+ @click=${this.#a.bind(this,t)}
45
45
  >
46
- ${unsafeHTML(e.privateDescription)}
46
+ ${unsafeHTML(t.privateDescription)}
47
47
  </div>
48
48
  `))}
49
49
  </div>`))}
50
50
  </div>
51
- </div>`}showPopover(){this.#e.value?.showPopover()}static async show(e){let t=document.querySelector("glide-core-private-toasts");if(t||(t=document.createElement("glide-core-private-toasts"),document.body.append(t)),e.childNodes.length>0){let t="";for(const i of e.childNodes)i instanceof Element?t+=i.outerHTML:i instanceof Text&&(t+=i.textContent);e.privateDescription=t.trim()}t.toasts=[e,...t.toasts],await t.updateComplete,t.showPopover(),e.privateShow=!0,setTimeout((()=>{t.requestUpdate()})),e.duration<Number.POSITIVE_INFINITY&&(e.privateTimeoutId=setTimeout((()=>{window.matchMedia("(prefers-reduced-motion: reduce)").matches?t?.dismiss(e):(e.privateDismissing=!0,t.requestUpdate())}),e.duration))}#e;#t;#a(e,t){t.target instanceof GlideCoreLink&&t.preventDefault();const i=[...e.querySelectorAll("*")].find((e=>{if(t.target instanceof GlideCoreLink)return e instanceof GlideCoreLink&&e.label===t.target.label&&e.href===t.target.href}));i instanceof GlideCoreLink&&i.click()}#r(e){window.matchMedia("(prefers-reduced-motion: reduce)").matches?this.dismiss(e):(e.privateDismissing=!0,e.privateDismissingViaButton=!0,this.requestUpdate())}#s(e){e.duration<Number.POSITIVE_INFINITY&&(e.privateTimeoutId=setTimeout((()=>{window.matchMedia("(prefers-reduced-motion: reduce)").matches?this.dismiss(e):(e.privateDismissing=!0,this.requestUpdate())}),e.duration))}#i(e){clearTimeout(e.privateTimeoutId)}#o(e){document.querySelector("glide-core-private-toasts")&&e.privateDismissing&&this.dismiss(e)}};__decorate([property({type:Array})],GlideCoreToasts.prototype,"toasts",void 0),GlideCoreToasts=__decorate([customElement("glide-core-private-toasts"),final],GlideCoreToasts);export default GlideCoreToasts;const icons={error:html`<svg
51
+ </div>`}showPopover(){this.#t.value?.showPopover()}static async show(t){let e=document.querySelector("glide-core-private-toasts");if(e||(e=document.createElement("glide-core-private-toasts"),document.body.append(e)),t.childNodes.length>0){let e="";for(const i of t.childNodes)i instanceof Element?e+=i.outerHTML:i instanceof Text&&(e+=i.textContent);t.privateDescription=e.trim()}e.toasts=[t,...e.toasts],await e.updateComplete,e.showPopover(),t.privateShow=!0,setTimeout((()=>{e.requestUpdate()})),t.duration<Number.POSITIVE_INFINITY&&(t.privateTimeoutId=setTimeout((()=>{window.matchMedia("(prefers-reduced-motion: reduce)").matches?e?.dismiss(t):(t.privateDismissing=!0,e.requestUpdate())}),t.duration))}#t;#e;#a(t,e){e.target instanceof Link&&e.preventDefault();const i=[...t.querySelectorAll("*")].find((t=>{if(e.target instanceof Link)return t instanceof Link&&t.label===e.target.label&&t.href===e.target.href}));i instanceof Link&&i.click()}#r(t){window.matchMedia("(prefers-reduced-motion: reduce)").matches?this.dismiss(t):(t.privateDismissing=!0,t.privateDismissingViaButton=!0,this.requestUpdate())}#s(t){t.duration<Number.POSITIVE_INFINITY&&(t.privateTimeoutId=setTimeout((()=>{window.matchMedia("(prefers-reduced-motion: reduce)").matches?this.dismiss(t):(t.privateDismissing=!0,this.requestUpdate())}),t.duration))}#i(t){clearTimeout(t.privateTimeoutId)}#o(t){document.querySelector("glide-core-private-toasts")&&t.privateDismissing&&this.dismiss(t)}};__decorate([property({type:Array})],Toasts.prototype,"toasts",void 0),Toasts=__decorate([customElement("glide-core-private-toasts"),final],Toasts);export default Toasts;const icons={error:html`<svg
52
52
  aria-hidden="true"
53
53
  class="icon error"
54
54
  fill="none"
package/dist/toggle.d.ts CHANGED
@@ -2,7 +2,7 @@ import './label.js';
2
2
  import { LitElement } from 'lit';
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
5
- 'glide-core-toggle': GlideCoreToggle;
5
+ 'glide-core-toggle': Toggle;
6
6
  }
7
7
  }
8
8
  /**
@@ -21,7 +21,7 @@ declare global {
21
21
  *
22
22
  * @fires {Event} change
23
23
  */
24
- export default class GlideCoreToggle extends LitElement {
24
+ export default class Toggle extends LitElement {
25
25
  #private;
26
26
  static shadowRootOptions: ShadowRootInit;
27
27
  static styles: import("lit").CSSResult[];
package/dist/toggle.js CHANGED
@@ -1 +1 @@
1
- var __decorate=this&&this.__decorate||function(e,t,o,i){var r,l=arguments.length,s=l<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,o,i);else for(var d=e.length-1;d>=0;d--)(r=e[d])&&(s=(l<3?r(s):l>3?r(t,o,s):r(t,o))||s);return l>3&&s&&Object.defineProperty(t,o,s),s};import"./label.js";import{html,LitElement}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{when}from"lit/directives/when.js";import packageJson from"../package.json"with{type:"json"};import styles from"./toggle.styles.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import required from"./library/required.js";let GlideCoreToggle=class GlideCoreToggle extends LitElement{constructor(){super(...arguments),this.checked=!1,this.disabled=!1,this.hideLabel=!1,this.orientation="horizontal",this.version=packageJson.version,this.#e=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}static{this.styles=styles}click(){this.#e.value?.click()}focus(e){this.#e.value?.focus(e)}render(){return html`<div data-test="component"><glide-core-private-label label="${ifDefined(this.label)}" orientation="${this.orientation}" split="${ifDefined(this.privateSplit??void 0)}" tooltip="${ifDefined(this.tooltip)}" ?disabled="${this.disabled}" ?hide="${this.hideLabel}"><label for="input">${this.label}</label><div class="toggle-and-input" slot="control"><input aria-checked="${this.checked}" aria-describedby="summary description" data-test="input" id="input" role="switch" type="checkbox" .checked="${this.checked}" ?disabled="${this.disabled}" @change="${this.#t}" @input="${this.#t}" ${ref(this.#e)}></div>${when(this.summary,(()=>html`<div id="summary" slot="summary">${this.summary}</div>`))}<slot class="description" id="description" name="description" slot="description"></slot></glide-core-private-label></div>`}#e;#t(e){e.target instanceof HTMLInputElement&&(this.checked=e.target.checked),"change"===e.type&&this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0}))}};__decorate([property({reflect:!0}),required],GlideCoreToggle.prototype,"label",void 0),__decorate([property({type:Boolean})],GlideCoreToggle.prototype,"checked",void 0),__decorate([property({reflect:!0,type:Boolean})],GlideCoreToggle.prototype,"disabled",void 0),__decorate([property({attribute:"hide-label",type:Boolean})],GlideCoreToggle.prototype,"hideLabel",void 0),__decorate([property({reflect:!0,useDefault:!0})],GlideCoreToggle.prototype,"orientation",void 0),__decorate([property()],GlideCoreToggle.prototype,"privateSplit",void 0),__decorate([property({reflect:!0})],GlideCoreToggle.prototype,"summary",void 0),__decorate([property({reflect:!0})],GlideCoreToggle.prototype,"tooltip",void 0),__decorate([property({reflect:!0})],GlideCoreToggle.prototype,"version",void 0),GlideCoreToggle=__decorate([customElement("glide-core-toggle"),final],GlideCoreToggle);export default GlideCoreToggle;
1
+ var __decorate=this&&this.__decorate||function(e,t,o,i){var r,l=arguments.length,s=l<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,o,i);else for(var n=e.length-1;n>=0;n--)(r=e[n])&&(s=(l<3?r(s):l>3?r(t,o,s):r(t,o))||s);return l>3&&s&&Object.defineProperty(t,o,s),s};import"./label.js";import{html,LitElement}from"lit";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property}from"lit/decorators.js";import{ifDefined}from"lit/directives/if-defined.js";import{when}from"lit/directives/when.js";import packageJson from"../package.json"with{type:"json"};import styles from"./toggle.styles.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import required from"./library/required.js";let Toggle=class Toggle extends LitElement{constructor(){super(...arguments),this.checked=!1,this.disabled=!1,this.hideLabel=!1,this.orientation="horizontal",this.version=packageJson.version,this.#e=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}static{this.styles=styles}click(){this.#e.value?.click()}focus(e){this.#e.value?.focus(e)}render(){return html`<div data-test="component"><glide-core-private-label label="${ifDefined(this.label)}" orientation="${this.orientation}" split="${ifDefined(this.privateSplit??void 0)}" tooltip="${ifDefined(this.tooltip)}" ?disabled="${this.disabled}" ?hide="${this.hideLabel}"><label for="input">${this.label}</label><div class="toggle-and-input" slot="control"><input aria-checked="${this.checked}" aria-describedby="summary description" data-test="input" id="input" role="switch" type="checkbox" .checked="${this.checked}" ?disabled="${this.disabled}" @change="${this.#t}" @input="${this.#t}" ${ref(this.#e)}></div>${when(this.summary,(()=>html`<div id="summary" slot="summary">${this.summary}</div>`))}<slot class="description" id="description" name="description" slot="description"></slot></glide-core-private-label></div>`}#e;#t(e){e.target instanceof HTMLInputElement&&(this.checked=e.target.checked),"change"===e.type&&this.dispatchEvent(new Event("change",{bubbles:!0,composed:!0}))}};__decorate([property({reflect:!0}),required],Toggle.prototype,"label",void 0),__decorate([property({type:Boolean})],Toggle.prototype,"checked",void 0),__decorate([property({reflect:!0,type:Boolean})],Toggle.prototype,"disabled",void 0),__decorate([property({attribute:"hide-label",type:Boolean})],Toggle.prototype,"hideLabel",void 0),__decorate([property({reflect:!0,useDefault:!0})],Toggle.prototype,"orientation",void 0),__decorate([property()],Toggle.prototype,"privateSplit",void 0),__decorate([property({reflect:!0})],Toggle.prototype,"summary",void 0),__decorate([property({reflect:!0})],Toggle.prototype,"tooltip",void 0),__decorate([property({reflect:!0})],Toggle.prototype,"version",void 0),Toggle=__decorate([customElement("glide-core-toggle"),final],Toggle);export default Toggle;
@@ -1,7 +1,7 @@
1
1
  import { LitElement } from 'lit';
2
2
  declare global {
3
3
  interface HTMLElementTagNameMap {
4
- 'glide-core-private-tooltip-container': GlideCoreTooltipContainer;
4
+ 'glide-core-private-tooltip-container': TooltipContainer;
5
5
  }
6
6
  }
7
7
  /**
@@ -11,7 +11,7 @@ declare global {
11
11
  * @attr {boolean} [screenreader-hidden=false]
12
12
  * @attr {string[]} [shortcut=[]]
13
13
  */
14
- export default class GlideCoreTooltipContainer extends LitElement {
14
+ export default class TooltipContainer extends LitElement {
15
15
  #private;
16
16
  static shadowRootOptions: ShadowRootInit;
17
17
  static styles: import("lit").CSSResult[];
@@ -1 +1 @@
1
- var __decorate=this&&this.__decorate||function(e,t,o,r){var i,s=arguments.length,l=s<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,r);else for(var a=e.length-1;a>=0;a--)(i=e[a])&&(l=(s<3?i(l):s>3?i(t,o,l):i(t,o))||l);return s>3&&l&&Object.defineProperty(t,o,l),l};import{html,LitElement}from"lit";import{customElement,property}from"lit/decorators.js";import{nanoid}from"nanoid";import{classMap}from"lit/directives/class-map.js";import{map}from"lit/directives/map.js";import styles from"./tooltip.container.styles.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";let GlideCoreTooltipContainer=class GlideCoreTooltipContainer extends LitElement{constructor(){super(...arguments),this.screenreaderHidden=!1,this.shortcut=[],this.#e=!1}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}static{this.styles=styles}get disabled(){return this.#e}set disabled(e){this.#e=e,this.role=e||this.screenreaderHidden?"none":"tooltip"}connectedCallback(){super.connectedCallback(),this.id=nanoid(),this.role=this.role=this.disabled||this.screenreaderHidden?"none":"tooltip",this.slot="private"}render(){return html`<div aria-hidden="${this.screenreaderHidden}" class="${classMap({component:!0,reversed:"left"===this.placement})}"><div class="label">${this.label}</div><kbd class="${classMap({shortcut:!0,reversed:"left"===this.placement,visible:this.shortcut.length>0})}" data-test="shortcut">${1===this.shortcut.length?this.shortcut.at(0):map(this.shortcut,((e,t)=>html`<kbd>${e}</kbd> ${t===this.shortcut.length-1?"":" + "}`))}</kbd></div>`}#e};__decorate([property({type:Boolean})],GlideCoreTooltipContainer.prototype,"disabled",null),__decorate([property()],GlideCoreTooltipContainer.prototype,"label",void 0),__decorate([property()],GlideCoreTooltipContainer.prototype,"placement",void 0),__decorate([property({attribute:"screenreader-hidden",type:Boolean})],GlideCoreTooltipContainer.prototype,"screenreaderHidden",void 0),__decorate([property({type:Array})],GlideCoreTooltipContainer.prototype,"shortcut",void 0),GlideCoreTooltipContainer=__decorate([customElement("glide-core-private-tooltip-container"),final],GlideCoreTooltipContainer);export default GlideCoreTooltipContainer;
1
+ var __decorate=this&&this.__decorate||function(t,e,o,r){var i,s=arguments.length,a=s<3?e:null===r?r=Object.getOwnPropertyDescriptor(e,o):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)a=Reflect.decorate(t,e,o,r);else for(var l=t.length-1;l>=0;l--)(i=t[l])&&(a=(s<3?i(a):s>3?i(e,o,a):i(e,o))||a);return s>3&&a&&Object.defineProperty(e,o,a),a};import{html,LitElement}from"lit";import{customElement,property}from"lit/decorators.js";import{classMap}from"lit/directives/class-map.js";import{map}from"lit/directives/map.js";import styles from"./tooltip.container.styles.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import uniqueId from"./library/unique-id.js";let TooltipContainer=class TooltipContainer extends LitElement{constructor(){super(...arguments),this.screenreaderHidden=!1,this.shortcut=[],this.#t=!1}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}static{this.styles=styles}get disabled(){return this.#t}set disabled(t){this.#t=t,this.role=t||this.screenreaderHidden?"none":"tooltip"}connectedCallback(){super.connectedCallback(),this.id=uniqueId(),this.role=this.role=this.disabled||this.screenreaderHidden?"none":"tooltip",this.slot="private"}render(){return html`<div aria-hidden="${this.screenreaderHidden}" class="${classMap({component:!0,reversed:"left"===this.placement})}"><div class="label">${this.label}</div><kbd class="${classMap({shortcut:!0,reversed:"left"===this.placement,visible:this.shortcut.length>0})}" data-test="shortcut">${1===this.shortcut.length?this.shortcut.at(0):map(this.shortcut,((t,e)=>html`<kbd>${t}</kbd> ${e===this.shortcut.length-1?"":" + "}`))}</kbd></div>`}#t};__decorate([property({type:Boolean})],TooltipContainer.prototype,"disabled",null),__decorate([property()],TooltipContainer.prototype,"label",void 0),__decorate([property()],TooltipContainer.prototype,"placement",void 0),__decorate([property({attribute:"screenreader-hidden",type:Boolean})],TooltipContainer.prototype,"screenreaderHidden",void 0),__decorate([property({type:Array})],TooltipContainer.prototype,"shortcut",void 0),TooltipContainer=__decorate([customElement("glide-core-private-tooltip-container"),final],TooltipContainer);export default TooltipContainer;
package/dist/tooltip.d.ts CHANGED
@@ -2,7 +2,7 @@ import { LitElement } from 'lit';
2
2
  import './tooltip.container.js';
3
3
  declare global {
4
4
  interface HTMLElementTagNameMap {
5
- 'glide-core-tooltip': GlideCoreTooltip;
5
+ 'glide-core-tooltip': Tooltip;
6
6
  }
7
7
  }
8
8
  /**
@@ -17,12 +17,12 @@ declare global {
17
17
  * @readonly
18
18
  * @attr {string} [version]
19
19
  *
20
- * @slot {GlideCoreTooltipContainer} [private]
20
+ * @slot {TooltipContainer} [private]
21
21
  * @slot {Element} target - The element to which the tooltip will anchor. Can be any element with an implicit or explicit ARIA role.
22
22
  *
23
23
  * @fires {Event} toggle
24
24
  */
25
- export default class GlideCoreTooltip extends LitElement {
25
+ export default class Tooltip extends LitElement {
26
26
  #private;
27
27
  static shadowRootOptions: ShadowRootInit;
28
28
  static styles: import("lit").CSSResult[];
package/dist/tooltip.js CHANGED
@@ -1 +1 @@
1
- var __decorate=this&&this.__decorate||function(e,t,o,i){var r,l=arguments.length,s=l<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,o,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(s=(l<3?r(s):l>3?r(t,o,s):r(t,o))||s);return l>3&&s&&Object.defineProperty(t,o,s),s};import{html,LitElement}from"lit";import{arrow,autoUpdate,computePosition,flip,limitShift,offset,shift}from"@floating-ui/dom";import{choose}from"lit/directives/choose.js";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property,state}from"lit/decorators.js";import packageJson from"../package.json"with{type:"json"};import styles from"./tooltip.styles.js";import"./tooltip.container.js";import assertSlot from"./library/assert-slot.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import required from"./library/required.js";let GlideCoreTooltip=class GlideCoreTooltip extends LitElement{constructor(){super(...arguments),this.version=packageJson.version,this.effectivePlacement=this.placement??"bottom",this.#e=createRef(),this.#t=!1,this.#o=!1,this.#i=!1,this.#r=[],this.#l=createRef(),this.#s=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}static{this.styles=styles}get label(){return this.#a}set label(e){this.#a=e;const t=this.querySelector("glide-core-private-tooltip-container");t&&(t.label=e)}get disabled(){return this.#t}set disabled(e){this.#t=e,this.open&&!e?this.#n():this.#d();const t=this.querySelector("glide-core-private-tooltip-container");t&&(t.disabled=e);const o=this.#l.value?.assignedElements().at(0);t&&o&&!this.disabled&&!this.screenreaderHidden?o.setAttribute("aria-describedby",t.id):t&&o&&o.removeAttribute("aria-describedby")}get offset(){return this.#c??Number.parseFloat(window.getComputedStyle(document.body).getPropertyValue("--glide-core-spacing-base-xxs"))*Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize)}set offset(e){this.#c=e}get open(){return this.#o}set open(e){const t=e!==this.#o;this.#o=e,e&&t&&!this.disabled?(this.#n(),this.dispatchEvent(new Event("toggle",{bubbles:!0,composed:!0}))):t&&!this.disabled&&(this.#d(),this.dispatchEvent(new Event("toggle",{bubbles:!0,composed:!0})))}get screenreaderHidden(){return this.#i}set screenreaderHidden(e){this.#i=e;const t=this.querySelector("glide-core-private-tooltip-container");t&&(t.screenreaderHidden=e);const o=this.#l.value?.assignedElements().at(0);t&&o&&!this.disabled&&!this.screenreaderHidden?o.setAttribute("aria-describedby",t.id):t&&o&&o.removeAttribute("aria-describedby")}get shortcut(){return this.#r}set shortcut(e){this.#r=e;const t=this.querySelector("glide-core-private-tooltip-container");t&&(t.shortcut=e)}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this.#p),clearTimeout(this.#h)}firstUpdated(){this.#s.value&&(this.#s.value.popover="manual"),this.open&&!this.disabled&&this.#n();const e=document.createElement("glide-core-private-tooltip-container");e.label=this.label,e.screenreaderHidden=this.screenreaderHidden,e.shortcut=this.shortcut,this.append(e)}render(){return html`<div class="component" data-test="component" @mouseover="${this.#m}" @mouseout="${this.#f}"><div class="target-slot-container"><slot class="target-slot" data-test="target-slot" name="target" @focusin="${this.#u}" @focusout="${this.#v}" @keydown="${this.#g}" @slotchange="${this.#b}" ${assertSlot()} ${ref(this.#l)}></slot></div><div class="${classMap({tooltip:!0,[this.effectivePlacement]:!0})}" id="tooltip" data-test="tooltip" data-open-delay="300" data-close-delay="200" ${ref(this.#s)}><div class="${classMap({arrow:!0,[this.effectivePlacement]:!0})}" data-test="arrow" ${ref(this.#e)}>${choose(this.effectivePlacement,[["top",()=>icons.topArrow],["right",()=>icons.rightArrow],["bottom",()=>icons.bottomArrow],["left",()=>icons.leftArrow]])}</div><div class="${classMap({content:!0,reversed:"left"===this.effectivePlacement})}"><slot class="default-slot" name="private"></slot></div></div></div>`}#e;#y;#p;#t;#o;#i;#a;#c;#h;#r;#l;#s;#w(){clearTimeout(this.#p)}#d(){this.#s.value?.hidePopover(),this.#y?.()}#f(){this.#E(),clearTimeout(this.#h)}#m(){this.#w(),this.#h=setTimeout((()=>{this.open=!0}),Number(this.#s.value?.dataset.openDelay))}#b(){const e=this.querySelector("glide-core-private-tooltip-container"),t=this.#l.value?.assignedElements().at(0);e&&t&&!this.disabled&&!this.screenreaderHidden&&t.setAttribute("aria-describedby",e.id)}#u(){this.open=!0}#v(){this.open=!1}#g(e){"Escape"===e.key&&(e.preventDefault(),this.open=!1)}#E(){this.#p=setTimeout((()=>{this.open=!1}),Number(this.#s.value?.dataset.closeDelay))}#n(){this.disabled||(this.#y?.(),this.#l.value&&this.#s.value&&(this.#y=autoUpdate(this.#l.value,this.#s.value,(()=>{(async()=>{if(this.#l.value&&this.#s.value&&this.#e.value){const{x:e,y:t,placement:o,middlewareData:i}=await computePosition(this.#l.value,this.#s.value,{placement:this.placement,middleware:[offset(this.offset),flip({fallbackStrategy:"initialPlacement"}),shift({crossAxis:!0,limiter:limitShift({offset:20})}),arrow({element:this.#e.value})]});Object.assign(this.#s.value.style,{left:`${e}px`,top:`${t}px`}),Object.assign(this.#e.value.style,{left:i.arrow?.x?`${i.arrow.x}px`:null,top:i.arrow?.y?`${i.arrow.y}px`:null}),this.effectivePlacement=o,this.#s.value.showPopover();const r=this.querySelector("glide-core-private-tooltip-container");r&&("bottom"===o||"left"===o||"right"===o||"top"===o)&&(r.placement=o)}})()}))))}};__decorate([property({reflect:!0}),required],GlideCoreTooltip.prototype,"label",null),__decorate([property({reflect:!0,type:Boolean})],GlideCoreTooltip.prototype,"disabled",null),__decorate([property({reflect:!0,type:Number})],GlideCoreTooltip.prototype,"offset",null),__decorate([property({reflect:!0,type:Boolean})],GlideCoreTooltip.prototype,"open",null),__decorate([property({reflect:!0})],GlideCoreTooltip.prototype,"placement",void 0),__decorate([property({attribute:"screenreader-hidden",reflect:!0,type:Boolean})],GlideCoreTooltip.prototype,"screenreaderHidden",null),__decorate([property({reflect:!0,type:Array})],GlideCoreTooltip.prototype,"shortcut",null),__decorate([property({reflect:!0})],GlideCoreTooltip.prototype,"version",void 0),__decorate([state()],GlideCoreTooltip.prototype,"effectivePlacement",void 0),GlideCoreTooltip=__decorate([customElement("glide-core-tooltip"),final],GlideCoreTooltip);export default GlideCoreTooltip;const icons={topArrow:html`<svg aria-hidden="true" viewBox="0 0 10 6" fill="none"><path d="M4.23178 5.07814C4.63157 5.55789 5.36843 5.55789 5.76822 5.07813L10 -7.9486e-08L-2.62268e-07 3.57628e-07L4.23178 5.07814Z" fill="currentColor"/></svg>`,rightArrow:html`<svg aria-hidden="true" viewBox="0 0 6 10" fill="none"><path d="M0.921865 4.23178C0.442111 4.63157 0.442112 5.36843 0.921866 5.76822L6 10L6 -2.62268e-07L0.921865 4.23178Z" fill="currentColor"/></svg>`,bottomArrow:html`<svg aria-hidden="true" viewBox="0 0 10 6" fill="none"><path d="M4.23178 0.921865C4.63157 0.442111 5.36843 0.442112 5.76822 0.921866L10 6L-2.62268e-07 6L4.23178 0.921865Z" fill="currentColor"/></svg>`,leftArrow:html`<svg aria-hidden="true" viewBox="0 0 6 10" fill="none"><path d="M5.07814 4.23178C5.55789 4.63157 5.55789 5.36843 5.07813 5.76822L-4.37114e-07 10L0 -2.62268e-07L5.07814 4.23178Z" fill="currentColor"/></svg>`};
1
+ var __decorate=this&&this.__decorate||function(e,t,o,i){var r,s=arguments.length,l=s<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,o):i;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(e,t,o,i);else for(var a=e.length-1;a>=0;a--)(r=e[a])&&(l=(s<3?r(l):s>3?r(t,o,l):r(t,o))||l);return s>3&&l&&Object.defineProperty(t,o,l),l};import{html,LitElement}from"lit";import{arrow,autoUpdate,computePosition,flip,limitShift,offset,shift}from"@floating-ui/dom";import{choose}from"lit/directives/choose.js";import{classMap}from"lit/directives/class-map.js";import{createRef,ref}from"lit/directives/ref.js";import{customElement,property,state}from"lit/decorators.js";import packageJson from"../package.json"with{type:"json"};import styles from"./tooltip.styles.js";import"./tooltip.container.js";import assertSlot from"./library/assert-slot.js";import shadowRootMode from"./library/shadow-root-mode.js";import final from"./library/final.js";import required from"./library/required.js";let Tooltip=class Tooltip extends LitElement{constructor(){super(...arguments),this.version=packageJson.version,this.effectivePlacement=this.placement??"bottom",this.#e=createRef(),this.#t=!1,this.#o=!1,this.#i=!1,this.#r=[],this.#s=createRef(),this.#l=createRef()}static{this.shadowRootOptions={...LitElement.shadowRootOptions,mode:shadowRootMode}}static{this.styles=styles}get label(){return this.#a}set label(e){this.#a=e;const t=this.querySelector("glide-core-private-tooltip-container");t&&(t.label=e)}get disabled(){return this.#t}set disabled(e){this.#t=e,this.open&&!e?this.#n():this.#c();const t=this.querySelector("glide-core-private-tooltip-container");t&&(t.disabled=e);const o=this.#s.value?.assignedElements().at(0);t&&o&&!this.disabled&&!this.screenreaderHidden?o.setAttribute("aria-describedby",t.id):t&&o&&o.removeAttribute("aria-describedby")}get offset(){return this.#d??Number.parseFloat(window.getComputedStyle(document.body).getPropertyValue("--glide-core-spacing-base-xxs"))*Number.parseFloat(window.getComputedStyle(document.documentElement).fontSize)}set offset(e){this.#d=e}get open(){return this.#o}set open(e){const t=e!==this.#o;this.#o=e,e&&t&&!this.disabled?(this.#n(),this.dispatchEvent(new Event("toggle",{bubbles:!0,composed:!0}))):t&&!this.disabled&&(this.#c(),this.dispatchEvent(new Event("toggle",{bubbles:!0,composed:!0})))}get screenreaderHidden(){return this.#i}set screenreaderHidden(e){this.#i=e;const t=this.querySelector("glide-core-private-tooltip-container");t&&(t.screenreaderHidden=e);const o=this.#s.value?.assignedElements().at(0);t&&o&&!this.disabled&&!this.screenreaderHidden?o.setAttribute("aria-describedby",t.id):t&&o&&o.removeAttribute("aria-describedby")}get shortcut(){return this.#r}set shortcut(e){this.#r=e;const t=this.querySelector("glide-core-private-tooltip-container");t&&(t.shortcut=e)}disconnectedCallback(){super.disconnectedCallback(),clearTimeout(this.#p),clearTimeout(this.#h)}firstUpdated(){this.#l.value&&(this.#l.value.popover="manual"),this.open&&!this.disabled&&this.#n();const e=document.createElement("glide-core-private-tooltip-container");e.label=this.label,e.screenreaderHidden=this.screenreaderHidden,e.shortcut=this.shortcut,this.append(e)}render(){return html`<div class="component" data-test="component" @mouseover="${this.#m}" @mouseout="${this.#f}"><div class="target-slot-container"><slot class="target-slot" data-test="target-slot" name="target" @focusin="${this.#u}" @focusout="${this.#v}" @keydown="${this.#g}" @slotchange="${this.#b}" ${assertSlot()} ${ref(this.#s)}></slot></div><div class="${classMap({tooltip:!0,[this.effectivePlacement]:!0})}" id="tooltip" data-test="tooltip" data-open-delay="300" data-close-delay="200" ${ref(this.#l)}><div class="${classMap({arrow:!0,[this.effectivePlacement]:!0})}" data-test="arrow" ${ref(this.#e)}>${choose(this.effectivePlacement,[["top",()=>icons.topArrow],["right",()=>icons.rightArrow],["bottom",()=>icons.bottomArrow],["left",()=>icons.leftArrow]])}</div><div class="${classMap({content:!0,reversed:"left"===this.effectivePlacement})}"><slot class="default-slot" name="private"></slot></div></div></div>`}#e;#y;#p;#t;#o;#i;#a;#d;#h;#r;#s;#l;#w(){clearTimeout(this.#p)}#c(){this.#l.value?.hidePopover(),this.#y?.()}#f(){this.#E(),clearTimeout(this.#h)}#m(){this.#w(),this.#h=setTimeout((()=>{this.open=!0}),Number(this.#l.value?.dataset.openDelay))}#b(){const e=this.querySelector("glide-core-private-tooltip-container"),t=this.#s.value?.assignedElements().at(0);e&&t&&!this.disabled&&!this.screenreaderHidden&&t.setAttribute("aria-describedby",e.id)}#u(){this.open=!0}#v(){this.open=!1}#g(e){"Escape"===e.key&&(e.preventDefault(),this.open=!1)}#E(){this.#p=setTimeout((()=>{this.open=!1}),Number(this.#l.value?.dataset.closeDelay))}#n(){this.disabled||(this.#y?.(),this.#s.value&&this.#l.value&&(this.#y=autoUpdate(this.#s.value,this.#l.value,(()=>{(async()=>{if(this.#s.value&&this.#l.value&&this.#e.value){const{x:e,y:t,placement:o,middlewareData:i}=await computePosition(this.#s.value,this.#l.value,{placement:this.placement,middleware:[offset(this.offset),flip({fallbackStrategy:"initialPlacement"}),shift({crossAxis:!0,limiter:limitShift({offset:20})}),arrow({element:this.#e.value})]});Object.assign(this.#l.value.style,{left:`${e}px`,top:`${t}px`}),Object.assign(this.#e.value.style,{left:i.arrow?.x?`${i.arrow.x}px`:null,top:i.arrow?.y?`${i.arrow.y}px`:null}),this.effectivePlacement=o,this.#l.value.showPopover();const r=this.querySelector("glide-core-private-tooltip-container");r&&("bottom"===o||"left"===o||"right"===o||"top"===o)&&(r.placement=o)}})()}))))}};__decorate([property({reflect:!0}),required],Tooltip.prototype,"label",null),__decorate([property({reflect:!0,type:Boolean})],Tooltip.prototype,"disabled",null),__decorate([property({reflect:!0,type:Number})],Tooltip.prototype,"offset",null),__decorate([property({reflect:!0,type:Boolean})],Tooltip.prototype,"open",null),__decorate([property({reflect:!0})],Tooltip.prototype,"placement",void 0),__decorate([property({attribute:"screenreader-hidden",reflect:!0,type:Boolean})],Tooltip.prototype,"screenreaderHidden",null),__decorate([property({reflect:!0,type:Array})],Tooltip.prototype,"shortcut",null),__decorate([property({reflect:!0})],Tooltip.prototype,"version",void 0),__decorate([state()],Tooltip.prototype,"effectivePlacement",void 0),Tooltip=__decorate([customElement("glide-core-tooltip"),final],Tooltip);export default Tooltip;const icons={topArrow:html`<svg aria-hidden="true" viewBox="0 0 10 6" fill="none"><path d="M4.23178 5.07814C4.63157 5.55789 5.36843 5.55789 5.76822 5.07813L10 -7.9486e-08L-2.62268e-07 3.57628e-07L4.23178 5.07814Z" fill="currentColor"/></svg>`,rightArrow:html`<svg aria-hidden="true" viewBox="0 0 6 10" fill="none"><path d="M0.921865 4.23178C0.442111 4.63157 0.442112 5.36843 0.921866 5.76822L6 10L6 -2.62268e-07L0.921865 4.23178Z" fill="currentColor"/></svg>`,bottomArrow:html`<svg aria-hidden="true" viewBox="0 0 10 6" fill="none"><path d="M4.23178 0.921865C4.63157 0.442111 5.36843 0.442112 5.76822 0.921866L10 6L-2.62268e-07 6L4.23178 0.921865Z" fill="currentColor"/></svg>`,leftArrow:html`<svg aria-hidden="true" viewBox="0 0 6 10" fill="none"><path d="M5.07814 4.23178C5.55789 4.63157 5.55789 5.36843 5.07813 5.76822L-4.37114e-07 10L0 -2.62268e-07L5.07814 4.23178Z" fill="currentColor"/></svg>`};
@@ -1 +1 @@
1
- const translation={$code:"en",$name:"English",$dir:"ltr",close:"Close",dismiss:"Dismiss",selectAll:"Select all",notifications:"Notifications",nextTab:"Next tab",previousTab:"Previous tab",noAvailableOptions:"No options available",noMatchingOptions:"No matching options",tooltip:"Tooltip:",severityInformational:"Severity: Informational",severityCritical:"Severity: Critical",severityMedium:"Severity: Medium",success:"Success:",error:"Error:",informational:"Informational:",loading:"Loading",announcedCharacterCount:(t,i)=>`Character count ${t} of ${i}`,displayedCharacterCount:(t,i)=>`${t}/${i}`,clearEntry:t=>`Clear ${t} entry`,editOption:t=>`Edit option: ${t}`,editTag:t=>`Edit tag: ${t}`,removeTag:t=>`Remove tag: ${t}`,itemCount:t=>`${t} items`};export default translation;
1
+ const translation={$code:"en",$name:"English",$dir:"ltr",close:"Close",dismiss:"Dismiss",selectAll:"Select all",notifications:"Notifications",nextTab:"Next tab",previousTab:"Previous tab",noAvailableOptions:"No options available",noMatchingOptions:"No matching options",tooltip:"Tooltip:",severityInformational:"Severity: Informational",severityCritical:"Severity: Critical",severityMedium:"Severity: Medium",success:"Success:",error:"Error:",informational:"Informational:",loading:"Loading",add:"Add",announcedCharacterCount:(i,t)=>`Character count ${i} of ${t}`,displayedCharacterCount:(i,t)=>`${i}/${t}`,clearEntry:i=>`Clear ${i} entry`,editOption:i=>`Edit option: ${i}`,editTag:i=>`Edit tag: ${i}`,removeTag:i=>`Remove tag: ${i}`,itemCount:i=>`${i} items`,maximum:i=>`Maximum ${i}`,setMaximum:i=>`Set maximum ${i}`,minimum:i=>`Minimum ${i}`,setMinimum:i=>`Set minimum ${i}`};export default translation;
@@ -1,5 +1,5 @@
1
1
  import type { Translation } from '../library/localize.js';
2
- export declare const PENDING_STRINGS: readonly ["severityInformational", "severityCritical", "severityMedium", "success", "error", "informational", "loading", "noAvailableOptions", "noMatchingOptions"];
2
+ export declare const PENDING_STRINGS: readonly ["severityInformational", "severityCritical", "severityMedium", "success", "error", "informational", "loading", "noAvailableOptions", "noMatchingOptions", "maximum", "setMaximum", "minimum", "setMinimum", "add"];
3
3
  type PendingTranslation = (typeof PENDING_STRINGS)[number];
4
4
  declare const translation: Omit<Translation, PendingTranslation>;
5
5
  export default translation;
@@ -1 +1 @@
1
- export const PENDING_STRINGS=["severityInformational","severityCritical","severityMedium","success","error","informational","loading","noAvailableOptions","noMatchingOptions"];const translation={$code:"fr",$name:"French",$dir:"ltr",close:"FERMER",dismiss:"Ignorer",selectAll:"Tout sélectionner",notifications:"Notifications",nextTab:"Onglet suivant",previousTab:"Onglet précédent",tooltip:"Info-bulle :",announcedCharacterCount:(e,t)=>`Nombre de caractères ${e} sur ${t}`,displayedCharacterCount:(e,t)=>`${e}/${t}`,clearEntry:e=>`Effacer l'entrée ${e}`,editOption:e=>`Modifier l'option : ${e}`,editTag:e=>`Modifier la balise : ${e}`,removeTag:e=>`Enlever la balise : ${e}`,itemCount:e=>`${e} éléments`};export default translation;
1
+ export const PENDING_STRINGS=["severityInformational","severityCritical","severityMedium","success","error","informational","loading","noAvailableOptions","noMatchingOptions","maximum","setMaximum","minimum","setMinimum","add"];const translation={$code:"fr",$name:"French",$dir:"ltr",close:"FERMER",dismiss:"Ignorer",selectAll:"Tout sélectionner",notifications:"Notifications",nextTab:"Onglet suivant",previousTab:"Onglet précédent",tooltip:"Info-bulle :",announcedCharacterCount:(e,t)=>`Nombre de caractères ${e} sur ${t}`,displayedCharacterCount:(e,t)=>`${e}/${t}`,clearEntry:e=>`Effacer l'entrée ${e}`,editOption:e=>`Modifier l'option : ${e}`,editTag:e=>`Modifier la balise : ${e}`,removeTag:e=>`Enlever la balise : ${e}`,itemCount:e=>`${e} éléments`};export default translation;
@@ -1,5 +1,5 @@
1
1
  import type { Translation } from '../library/localize.js';
2
- export declare const PENDING_STRINGS: readonly ["severityInformational", "severityCritical", "severityMedium", "success", "error", "informational", "loading", "noAvailableOptions", "noMatchingOptions"];
2
+ export declare const PENDING_STRINGS: readonly ["severityInformational", "severityCritical", "severityMedium", "success", "error", "informational", "loading", "noAvailableOptions", "noMatchingOptions", "maximum", "setMaximum", "minimum", "setMinimum", "add"];
3
3
  type PendingTranslation = (typeof PENDING_STRINGS)[number];
4
4
  declare const translation: Omit<Translation, PendingTranslation>;
5
5
  export default translation;
@@ -1 +1 @@
1
- export const PENDING_STRINGS=["severityInformational","severityCritical","severityMedium","success","error","informational","loading","noAvailableOptions","noMatchingOptions"];const translation={$code:"ja",$name:"Japanese",$dir:"ltr",close:"閉じる",dismiss:"閉じる",selectAll:"すべて選択",notifications:"通知",nextTab:"Onglet suivant",previousTab:"Onglet précédent",tooltip:"ツールチップ:",announcedCharacterCount:(t,e)=>`文字数 ${t}/${e}`,displayedCharacterCount:(t,e)=>`${t}/${e}`,clearEntry:t=>`${t}入力をクリア`,editOption:t=>`編集オプション:${t}`,editTag:t=>`タグの編集:${t}`,removeTag:t=>`タグの削除:${t}`,itemCount:t=>`${t}件`};export default translation;
1
+ export const PENDING_STRINGS=["severityInformational","severityCritical","severityMedium","success","error","informational","loading","noAvailableOptions","noMatchingOptions","maximum","setMaximum","minimum","setMinimum","add"];const translation={$code:"ja",$name:"Japanese",$dir:"ltr",close:"閉じる",dismiss:"閉じる",selectAll:"すべて選択",notifications:"通知",nextTab:"Onglet suivant",previousTab:"Onglet précédent",tooltip:"ツールチップ:",announcedCharacterCount:(t,e)=>`文字数 ${t}/${e}`,displayedCharacterCount:(t,e)=>`${t}/${e}`,clearEntry:t=>`${t}入力をクリア`,editOption:t=>`編集オプション:${t}`,editTag:t=>`タグの編集:${t}`,removeTag:t=>`タグの削除:${t}`,itemCount:t=>`${t}件`};export default translation;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crowdstrike/glide-core",
3
- "version": "0.26.1",
3
+ "version": "0.28.0",
4
4
  "description": "A Web Component design system",
5
5
  "author": "CrowdStrike UX Team",
6
6
  "license": "Apache-2.0",
@@ -52,8 +52,7 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@floating-ui/dom": "^1.6.12",
55
- "@shoelace-style/localize": "^3.2.1",
56
- "nanoid": "^5.0.9"
55
+ "@shoelace-style/localize": "^3.2.1"
57
56
  },
58
57
  "peerDependencies": {
59
58
  "lit": "^3.2.1"
@@ -62,9 +61,10 @@
62
61
  "@changesets/changelog-github": "^0.5.0",
63
62
  "@changesets/cli": "^2.27.10",
64
63
  "@custom-elements-manifest/analyzer": "^0.10.4",
65
- "@eslint/eslintrc": "^3.3.0",
66
- "@eslint/js": "^9.22.0",
64
+ "@eslint/eslintrc": "^3.3.1",
65
+ "@eslint/js": "^9.28.0",
67
66
  "@figma/rest-api-spec": "^0.27.0",
67
+ "@html-eslint/eslint-plugin": "^0.41.0",
68
68
  "@open-wc/testing": "^4.0.0",
69
69
  "@playwright/test": "^1.52.0",
70
70
  "@rollup/plugin-commonjs": "^28.0.2",
@@ -82,12 +82,12 @@
82
82
  "@types/eslint": "^8.56.12",
83
83
  "@types/mocha": "^10.0.10",
84
84
  "@types/sinon": "^17.0.3",
85
- "@typescript-eslint/rule-tester": "^8.29.0",
86
- "@typescript-eslint/types": "^8.29.0",
87
- "@typescript-eslint/utils": "^8.29.0",
85
+ "@typescript-eslint/rule-tester": "^8.33.0",
86
+ "@typescript-eslint/types": "^8.33.0",
87
+ "@typescript-eslint/utils": "^8.33.0",
88
88
  "@web/dev-server-esbuild": "^1.0.4",
89
89
  "@web/dev-server-rollup": "^0.6.4",
90
- "@web/test-runner": "^0.19.0",
90
+ "@web/test-runner": "^0.20.2",
91
91
  "@web/test-runner-commands": "^0.9.0",
92
92
  "@web/test-runner-playwright": "^0.11.0",
93
93
  "chalk": "^5.3.0",
@@ -95,8 +95,8 @@
95
95
  "comment-parser": "^1.4.1",
96
96
  "custom-elements-manifest": "^2.1.0",
97
97
  "esbuild": "^0.25.0",
98
- "eslint": "^9.22.0",
99
- "eslint-config-prettier": "^10.1.1",
98
+ "eslint": "^9.28.0",
99
+ "eslint-config-prettier": "^10.1.5",
100
100
  "eslint-plugin-import": "^2.31.0",
101
101
  "eslint-plugin-lit": "^1.15.0",
102
102
  "eslint-plugin-lit-a11y": "^4.1.4",
@@ -118,8 +118,8 @@
118
118
  "postcss": "^8.4.49",
119
119
  "postcss-lit": "^1.1.1",
120
120
  "prettier": "^3.5.3",
121
- "react": "^19.0.0",
122
- "react-dom": "^19.0.0",
121
+ "react": "^19.1.0",
122
+ "react-dom": "^19.1.0",
123
123
  "rimraf": "^6.0.1",
124
124
  "sinon": "^19.0.2",
125
125
  "storybook": "^8.6.3",
@@ -133,8 +133,8 @@
133
133
  "ts-lit-plugin": "^2.0.2",
134
134
  "ts-morph": "^25.0.1",
135
135
  "tsx": "^4.19.2",
136
- "typescript": "^5.8.2",
137
- "typescript-eslint": "^8.29.0",
136
+ "typescript": "^5.8.3",
137
+ "typescript-eslint": "^8.33.0",
138
138
  "vite": "^6.3.2",
139
139
  "vitest": "^3.0.8",
140
140
  "yocto-spinner": "^0.2.0"
@@ -154,7 +154,8 @@
154
154
  "start:production": "rimraf ./dist && npm-run-all --aggregate-output --print-label --parallel start:production:typescript start:production:storybook start:production:esbuild",
155
155
  "start:production:esbuild": "node ./esbuild.js",
156
156
  "start:production:cem-analyze": "tsc --noCheck --outDir ./dist && NODE_OPTIONS=--no-warnings=ExperimentalWarning cem analyze --config ./custom-elements.config.js --quiet && git diff --quiet -- || { echo ERROR: Uncommitted elements manifest changes. Run this command locally and commit the changes.; exit 1; }",
157
- "start:production:figma": "tsx ./src/figma/run.ts",
157
+ "start:production:figma:dev-resources": "tsx ./src/figma/dev-resources/run.ts",
158
+ "start:production:figma:variables": "tsx ./src/figma/variables/run.ts",
158
159
  "start:production:storybook": "storybook build --config-dir .storybook --disable-telemetry --output-dir ./dist/storybook",
159
160
  "start:production:ts-morph": "tsx ./src/ts-morph/run.ts && git diff --quiet -- || { echo ERROR: Uncommitted code modifications. Run this command locally and commit the changes.; exit 1; }",
160
161
  "start:production:typescript": "tsc --noCheck --outDir ./dist && node ./terser.js",
@@ -172,8 +173,8 @@
172
173
  "lint:production:stylelint": "tsc --noCheck --outDir ./dist && stylelint '**/*.styles.ts' --custom-syntax postcss-lit --no-color",
173
174
  "test": "per-env",
174
175
  "test:development": "npm-run-all --parallel test:development:web-test-runner test:development:web-test-runner:serve-coverage",
175
- "test:development:playwright": "playwright test --quiet --ui-port 6007 --update-snapshots",
176
- "test:development:playwright:update": "rimraf ./src/aria-snapshots && playwright test --quiet --project aria --update-snapshots --workers 100%",
176
+ "test:development:playwright": "playwright test --quiet --ui-port 6007 --update-snapshots --update-source-method=overwrite",
177
+ "test:development:playwright:update": "rimraf ./src/aria-snapshots && playwright test --quiet --project aria --update-snapshots --update-source-method=overwrite --workers 100%",
177
178
  "test:development:vitest": "vitest --config ./vitest.config.js & chokidar './src/eslint/**' './src/stylelint/**' --ignore './src/eslint/rules/*.test.ts' './src/stylelint/*.test.ts' --initial --silent --command 'tsc --noCheck --outDir ./dist'",
178
179
  "test:development:vitest:comment": "Excluded from `test:development` because Vitest muddies the console when running alongside Web Test Runner.",
179
180
  "test:development:web-test-runner": "web-test-runner --watch",