@crowdstrike/glide-core 0.34.0 → 0.34.1

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.
package/dist/accordion.js CHANGED
@@ -42,13 +42,13 @@ let Accordion = class Accordion extends LitElement {
42
42
  this.#suffixIconsSlotElementRef = createRef();
43
43
  this.#summaryElementRef = createRef();
44
44
  }
45
- /* c8 ignore start */
45
+ /* v8 ignore start */
46
46
  static { this.shadowRootOptions = {
47
47
  ...LitElement.shadowRootOptions,
48
48
  delegatesFocus: true,
49
49
  mode: window.navigator.webdriver ? 'open' : 'closed',
50
50
  }; }
51
- /* c8 ignore end */
51
+ /* v8 ignore stop */
52
52
  static { this.styles = styles; }
53
53
  /**
54
54
  * @default false
@@ -209,13 +209,13 @@ let Accordion = class Accordion extends LitElement {
209
209
  const assignedNodes = this.#prefixIconSlotElementRef.value?.assignedNodes();
210
210
  this.hasPrefixIcon = Boolean(assignedNodes && assignedNodes.length > 0);
211
211
  }
212
- /* v8 ignore end */
212
+ /* v8 ignore stop */
213
213
  /* v8 ignore start */
214
214
  #onSuffixIconsSlotChange() {
215
215
  const assignedNodes = this.#suffixIconsSlotElementRef.value?.assignedNodes();
216
216
  this.hasSuffixIcons = Boolean(assignedNodes && assignedNodes.length > 0);
217
217
  }
218
- /* v8 ignore end */
218
+ /* v8 ignore stop */
219
219
  #onSummaryClick(event) {
220
220
  // Canceling it prevents `details` from immediately showing and hiding
221
221
  // the default slot on open and close, letting us animate it when we're ready.
package/dist/button.js CHANGED
@@ -35,13 +35,13 @@ import required from './library/required.js';
35
35
  */
36
36
  let Button = class Button extends LitElement {
37
37
  static { this.formAssociated = true; }
38
- /* c8 ignore start */
38
+ /* v8 ignore start */
39
39
  static { this.shadowRootOptions = {
40
40
  ...LitElement.shadowRootOptions,
41
41
  delegatesFocus: true,
42
42
  mode: window.navigator.webdriver ? 'open' : 'closed',
43
43
  }; }
44
- /* c8 ignore end */
44
+ /* v8 ignore stop */
45
45
  static { this.styles = styles; }
46
46
  // A getter and setter because Lit Analzyer doesn't recognize "aria-description"
47
47
  // as a valid attribute on the `<button>` and doesn't provide a way to selectively
@@ -162,7 +162,7 @@ let Button = class Button extends LitElement {
162
162
  const assignedNodes = this.#prefixIconSlotElementRef.value?.assignedNodes();
163
163
  this.hasPrefixIcon = Boolean(assignedNodes && assignedNodes.length > 0);
164
164
  }
165
- /* v8 ignore end */
165
+ /* v8 ignore stop */
166
166
  /* v8 ignore start */
167
167
  #onSuffixIconSlotChange() {
168
168
  const assignedNodes = this.#suffixIconSlotElementRef.value?.assignedNodes();
@@ -84,7 +84,11 @@ export default class Checkbox extends LitElement implements FormControl {
84
84
  privateDisableLabelTooltip: boolean;
85
85
  privateSplit?: 'left' | 'middle' | 'right';
86
86
  privateVariant?: 'minimal';
87
- required: boolean;
87
+ /**
88
+ * @default false
89
+ */
90
+ get required(): boolean;
91
+ set required(isRequired: boolean);
88
92
  summary?: string;
89
93
  tooltip?: string;
90
94
  /**
package/dist/checkbox.js CHANGED
@@ -68,12 +68,12 @@ import required from './library/required.js';
68
68
  */
69
69
  let Checkbox = class Checkbox extends LitElement {
70
70
  static { this.formAssociated = true; }
71
- /* c8 ignore start */
71
+ /* v8 ignore start */
72
72
  static { this.shadowRootOptions = {
73
73
  ...LitElement.shadowRootOptions,
74
74
  mode: window.navigator.webdriver ? 'open' : 'closed',
75
75
  }; }
76
- /* c8 ignore end */
76
+ /* v8 ignore stop */
77
77
  static { this.styles = styles; }
78
78
  /**
79
79
  * @default undefined
@@ -99,6 +99,7 @@ let Checkbox = class Checkbox extends LitElement {
99
99
  set checked(isChecked) {
100
100
  const hasChanged = isChecked !== this.#isChecked;
101
101
  this.#isChecked = isChecked;
102
+ this.#setValidity();
102
103
  if (hasChanged) {
103
104
  this.dispatchEvent(new Event('private-checked-change', { bubbles: true }));
104
105
  }
@@ -113,6 +114,16 @@ let Checkbox = class Checkbox extends LitElement {
113
114
  this.#isDisabled = isDisabled;
114
115
  this.dispatchEvent(new Event('private-disabled-change', { bubbles: true }));
115
116
  }
117
+ /**
118
+ * @default false
119
+ */
120
+ get required() {
121
+ return this.#isRequired;
122
+ }
123
+ set required(isRequired) {
124
+ this.#isRequired = isRequired;
125
+ this.#setValidity();
126
+ }
116
127
  /**
117
128
  * @default ''
118
129
  */
@@ -166,32 +177,8 @@ let Checkbox = class Checkbox extends LitElement {
166
177
  this.form?.removeEventListener('formdata', this.#onFormdata);
167
178
  this.#intersectionObserver?.disconnect();
168
179
  }
169
- /* v8 ignore end */
180
+ /* v8 ignore stop */
170
181
  get validity() {
171
- // If we're in a Checkbox Group, `disabled`, `required`, and whether or not
172
- // the form has been submitted don't apply because Checkbox Group handles those
173
- // states for the group as a whole.
174
- if (this.privateVariant === 'minimal') {
175
- return this.#internals.validity;
176
- }
177
- if (this.required && !this.checked) {
178
- // A validation message is required but unused because we disable native validation
179
- // feedback. And an empty string isn't allowed. Thus a single space.
180
- this.#internals.setValidity({ customError: Boolean(this.validityMessage), valueMissing: true }, ' ', this.#inputElementRef.value);
181
- return this.#internals.validity;
182
- }
183
- if (this.required &&
184
- this.#internals.validity.valueMissing &&
185
- this.checked) {
186
- this.#internals.setValidity({});
187
- return this.#internals.validity;
188
- }
189
- if (!this.required &&
190
- this.#internals.validity.valueMissing &&
191
- !this.checked) {
192
- this.#internals.setValidity({});
193
- return this.#internals.validity;
194
- }
195
182
  return this.#internals.validity;
196
183
  }
197
184
  focus(options) {
@@ -379,6 +366,7 @@ let Checkbox = class Checkbox extends LitElement {
379
366
  }
380
367
  }
381
368
  setValidity(flags, message) {
369
+ this.#hasCustomValidity = true;
382
370
  this.validityMessage = message;
383
371
  this.#internals.setValidity(flags, ' ', this.#inputElementRef.value);
384
372
  }
@@ -403,16 +391,17 @@ let Checkbox = class Checkbox extends LitElement {
403
391
  this.privateShowLabelTooltip = false;
404
392
  // Private because it's only meant to be used by Dropdown Option.
405
393
  this.privateDisableLabelTooltip = false;
406
- this.required = false;
407
394
  // Used by Checkbox Group.
408
395
  this.privateIsReportValidityOrSubmit = false;
409
396
  this.version = packageJson.version;
410
397
  this.isBlurring = false;
411
398
  this.isCheckingValidity = false;
412
399
  this.isLabelOverflow = false;
400
+ this.#hasCustomValidity = false;
413
401
  this.#inputElementRef = createRef();
414
402
  this.#isChecked = false;
415
403
  this.#isDisabled = false;
404
+ this.#isRequired = false;
416
405
  this.#labelElementRef = createRef();
417
406
  this.#value = '';
418
407
  // An arrow function field instead of a method so `this` is closed over and
@@ -457,11 +446,13 @@ let Checkbox = class Checkbox extends LitElement {
457
446
  }
458
447
  });
459
448
  }
449
+ #hasCustomValidity;
460
450
  #inputElementRef;
461
451
  #internals;
462
452
  #intersectionObserver;
463
453
  #isChecked;
464
454
  #isDisabled;
455
+ #isRequired;
465
456
  #label;
466
457
  #labelElementRef;
467
458
  #value;
@@ -469,10 +460,9 @@ let Checkbox = class Checkbox extends LitElement {
469
460
  // set to the component instead of `document`.
470
461
  #onFormdata;
471
462
  get #isShowValidationFeedback() {
472
- // If minimal, `disabled`, `required`, and whether the form has been submitted
473
- // don't apply because the parent component handles those states itself.
463
+ // When minimal, Checkbox Group handles validation feedback for the group.
474
464
  if (this.privateVariant === 'minimal') {
475
- return !this.validity.valid && this.privateIsReportValidityOrSubmit;
465
+ return false;
476
466
  }
477
467
  return (!this.disabled &&
478
468
  !this.validity.valid &&
@@ -525,6 +515,17 @@ let Checkbox = class Checkbox extends LitElement {
525
515
  this.form?.requestSubmit();
526
516
  }
527
517
  }
518
+ #setValidity() {
519
+ if (this.#hasCustomValidity) {
520
+ return;
521
+ }
522
+ // When minimal, Checkbox Group handles validation for the group.
523
+ if (this.required && !this.checked && this.privateVariant !== 'minimal') {
524
+ this.#internals.setValidity({ customError: Boolean(this.validityMessage), valueMissing: true }, ' ', this.#inputElementRef.value);
525
+ return;
526
+ }
527
+ this.#internals.setValidity({});
528
+ }
528
529
  #updateLabelOverflow() {
529
530
  if (this.#labelElementRef.value) {
530
531
  this.isLabelOverflow =
@@ -588,7 +589,7 @@ __decorate([
588
589
  ], Checkbox.prototype, "privateVariant", void 0);
589
590
  __decorate([
590
591
  property({ reflect: true, type: Boolean })
591
- ], Checkbox.prototype, "required", void 0);
592
+ ], Checkbox.prototype, "required", null);
592
593
  __decorate([
593
594
  property({ reflect: true })
594
595
  ], Checkbox.prototype, "summary", void 0);
package/dist/dropdown.js CHANGED
@@ -566,6 +566,7 @@ let Dropdown = class Dropdown extends LitElement {
566
566
  data-id=${option.id}
567
567
  label=${ifDefined(option.label)}
568
568
  removable
569
+ style="--max-inline-size: none"
569
570
  ?disabled=${this.disabled || this.readonly}
570
571
  ?private-editable=${option.editable}
571
572
  ?private-readonly=${this.readonly}
@@ -124,16 +124,13 @@ export default [
124
124
  ) {
125
125
  &:not(.error) {
126
126
  border-color: var(--glide-core-color-interactive-stroke-focus);
127
- box-shadow:
128
- 0 0 0 1px var(--glide-core-color-interactive-stroke-focus),
129
- 1px 1px 4px -1px var(--glide-core-color-interactive-stroke-focus);
127
+ box-shadow: inset 0 0 0 1px
128
+ var(--glide-core-color-interactive-stroke-focus);
130
129
  }
131
130
 
132
131
  &.error {
133
- box-shadow:
134
- 0 0 0 1px var(--glide-core-color-advisory-stroke-error-primary),
135
- 1px 1px 4px -1px
136
- var(--glide-core-color-advisory-stroke-error-primary);
132
+ box-shadow: inset 0 0 0 1px
133
+ var(--glide-core-color-advisory-stroke-error-primary);
137
134
  }
138
135
  }
139
136
  }
@@ -215,17 +212,11 @@ export default [
215
212
  gap: var(--glide-core-spacing-base-xs);
216
213
 
217
214
  /*
218
- Tags will shrink down to zero and never overflow if they don't have a minimum
219
- width. If they don't overflow, they'll remain visible and additionally won't be
220
- included in the overflow count text. Thus a minimum width.
221
-
222
- "3.5rem" is the size of a tag with only a single character. Ideally, its
223
- minimum would be wider so a few characters are always visible. But a single-
224
- character tag is possible and even likely. Setting a higher minimum width
225
- would mean single or double-character tags would have whitespace between them.
226
- It's equally unfortunate that Dropdown has to know anything about Tag's width.
215
+ Tags will overflow their columns if they don't have a minimum width. "5.5rem"
216
+ is roughly the size of a Tag with a few characters in it. That Dropdown has
217
+ to know anything about Tag's internal width is unfortunate.
227
218
  */
228
- grid-auto-columns: minmax(3.5rem, auto);
219
+ grid-auto-columns: minmax(5.5rem, auto);
229
220
  grid-auto-flow: column;
230
221
  list-style-type: none;
231
222
  margin-block: 0;
@@ -338,7 +329,7 @@ export default [
338
329
  font-family: var(--glide-core-typography-family-primary);
339
330
  font-size: inherit;
340
331
  inline-size: 100%;
341
- min-inline-size: 3.75rem;
332
+ min-inline-size: 3.125rem;
342
333
  padding-block-end: 0;
343
334
  padding-inline: 0;
344
335
 
@@ -41,12 +41,13 @@ let IconButton = class IconButton extends LitElement {
41
41
  this.#buttonElementRef = createRef();
42
42
  this.#defaultSlotElementRef = createRef();
43
43
  }
44
- /* c8 ignore start */
44
+ /* v8 ignore start */
45
45
  static { this.shadowRootOptions = {
46
46
  ...LitElement.shadowRootOptions,
47
47
  delegatesFocus: true,
48
48
  mode: window.navigator.webdriver ? 'open' : 'closed',
49
49
  }; }
50
+ /* v8 ignore stop */
50
51
  static { this.styles = styles; }
51
52
  // A getter and setter because Lit Analzyer doesn't recognize "aria-description"
52
53
  // as a valid attribute on the `<button>` and doesn't provide a way to selectively
@@ -68,16 +68,13 @@ export default [
68
68
  &.focused:not(.readonly) {
69
69
  &:not(.error) {
70
70
  border-color: var(--glide-core-color-interactive-stroke-focus);
71
- box-shadow:
72
- 0 0 0 1px var(--glide-core-color-interactive-stroke-focus),
73
- 1px 1px 4px -1px var(--glide-core-color-interactive-stroke-focus);
71
+ box-shadow: inset 0 0 0 1px
72
+ var(--glide-core-color-interactive-stroke-focus);
74
73
  }
75
74
 
76
75
  &.error {
77
- box-shadow:
78
- 0 0 0 1px var(--glide-core-color-advisory-stroke-error-primary),
79
- 1px 1px 4px -1px
80
- var(--glide-core-color-advisory-stroke-error-primary);
76
+ box-shadow: inset 0 0 0 1px
77
+ var(--glide-core-color-advisory-stroke-error-primary);
81
78
  }
82
79
  }
83
80
 
package/dist/link.js CHANGED
@@ -37,6 +37,7 @@ let Link = class Link extends LitElement {
37
37
  delegatesFocus: true,
38
38
  mode: window.navigator.webdriver ? 'open' : 'closed',
39
39
  }; }
40
+ /* c8 ignore end */
40
41
  static { this.styles = styles; }
41
42
  click() {
42
43
  this.#componentElementRef.value?.click();
package/dist/menu.js CHANGED
@@ -665,7 +665,8 @@ let Menu = class Menu extends LitElement {
665
665
  // On both slots because VoiceOver can focus Options, causing them to emit
666
666
  // "keydown" events.
667
667
  #onTargetAndDefaultSlotKeyDown(event) {
668
- const isOwnTarget = event.target === this.#targetElement;
668
+ const isOwnTarget = event.target instanceof Element &&
669
+ this.#targetElement?.contains(event.target);
669
670
  const isChildOfOptions = event.target instanceof Element &&
670
671
  event.target.closest('glide-core-options');
671
672
  const isArbitraryContent = !isOwnTarget && !isChildOfOptions;
package/dist/select.js CHANGED
@@ -54,12 +54,12 @@ import OptionsGroup from './options.group.js';
54
54
  */
55
55
  let Select = class Select extends LitElement {
56
56
  static { this.formAssociated = true; }
57
- /* c8 ignore start */
57
+ /* v8 ignore start */
58
58
  static { this.shadowRootOptions = {
59
59
  ...LitElement.shadowRootOptions,
60
60
  mode: window.navigator.webdriver ? 'open' : 'closed',
61
61
  }; }
62
- /* c8 ignore end */
62
+ /* v8 ignore end */
63
63
  static { this.styles = styles; }
64
64
  /**
65
65
  * @default 4
package/dist/slider.js CHANGED
@@ -73,6 +73,7 @@ let Slider = class Slider extends LitElement {
73
73
  mode: window.navigator.webdriver ? 'open' : 'closed',
74
74
  delegatesFocus: true,
75
75
  }; }
76
+ /* c8 ignore end */
76
77
  static { this.styles = styles; }
77
78
  // Intentionally not reflected to match native.
78
79
  /**
package/dist/spinner.js CHANGED
@@ -25,12 +25,13 @@ let Spinner = class Spinner extends LitElement {
25
25
  this.size = 'medium';
26
26
  this.version = packageJson.version;
27
27
  }
28
- /* c8 ignore start */
28
+ /* v8 ignore start */
29
29
  static { this.shadowRootOptions = {
30
30
  ...LitElement.shadowRootOptions,
31
31
  delegatesFocus: true,
32
32
  mode: window.navigator.webdriver ? 'open' : 'closed',
33
33
  }; }
34
+ /* v8 ignore stop */
34
35
  static { this.styles = styles; }
35
36
  render() {
36
37
  return html `<div
@@ -41,6 +41,7 @@ let SplitButtonPrimaryButton = class SplitButtonPrimaryButton extends LitElement
41
41
  delegatesFocus: true,
42
42
  mode: window.navigator.webdriver ? 'open' : 'closed',
43
43
  }; }
44
+ /* c8 ignore end */
44
45
  static { this.styles = styles; }
45
46
  render() {
46
47
  return html `<button
@@ -36,6 +36,7 @@ let SplitButtonPrimaryLink = class SplitButtonPrimaryLink extends LitElement {
36
36
  delegatesFocus: true,
37
37
  mode: window.navigator.webdriver ? 'open' : 'closed',
38
38
  }; }
39
+ /* c8 ignore end */
39
40
  static { this.styles = styles; }
40
41
  render() {
41
42
  if (this.disabled) {
@@ -47,6 +47,7 @@ let SplitButtonSecondaryButton = class SplitButtonSecondaryButton extends LitEle
47
47
  delegatesFocus: true,
48
48
  mode: window.navigator.webdriver ? 'open' : 'closed',
49
49
  }; }
50
+ /* c8 ignore end */
50
51
  static { this.styles = styles; }
51
52
  click() {
52
53
  this.#buttonElementRef.value?.click();
package/dist/tab.group.js CHANGED
@@ -103,6 +103,7 @@ let TabGroup = class TabGroup extends LitElement {
103
103
  animated: this.hasUpdated,
104
104
  })}
105
105
  data-test="selected-tab-indicator"
106
+ @transitionstart=${this.#onSelectedTabIndicatorTransition}
106
107
  ${ref(this.#selectedTabIndicatorElementRef)}
107
108
  ></div>
108
109
  </div>
@@ -260,6 +261,9 @@ let TabGroup = class TabGroup extends LitElement {
260
261
  });
261
262
  }
262
263
  }
264
+ #onSelectedTabIndicatorTransition() {
265
+ this.#setOverflowButtonsState();
266
+ }
263
267
  #onTabListFocusout() {
264
268
  // Set the last selected tab as tabbable so that when pressing Shift + Tab on the
265
269
  // Tab Panel focus goes back to the last selected tab.
package/dist/tag.d.ts CHANGED
@@ -14,6 +14,8 @@ declare global {
14
14
  *
15
15
  * @slot {Element} [icon]
16
16
  *
17
+ * @cssprop [--max-inline-size=max-content]
18
+ *
17
19
  * @fires {Event} edit
18
20
  * @fires {Event} remove
19
21
  */
package/dist/tag.js CHANGED
@@ -26,6 +26,8 @@ import required from './library/required.js';
26
26
  *
27
27
  * @slot {Element} [icon]
28
28
  *
29
+ * @cssprop [--max-inline-size=max-content]
30
+ *
29
31
  * @fires {Event} edit
30
32
  * @fires {Event} remove
31
33
  */
@@ -55,12 +57,13 @@ let Tag = class Tag extends LitElement {
55
57
  this.#localize = new LocalizeController(this);
56
58
  this.#removalButtonElementRef = createRef();
57
59
  }
58
- /* c8 ignore start */
60
+ /* v8 ignore start */
59
61
  static { this.shadowRootOptions = {
60
62
  ...LitElement.shadowRootOptions,
61
63
  delegatesFocus: true,
62
64
  mode: window.navigator.webdriver ? 'open' : 'closed',
63
65
  }; }
66
+ /* v8 ignore stop */
64
67
  static { this.styles = styles; }
65
68
  click() {
66
69
  this.#removalButtonElementRef.value?.click();
@@ -26,6 +26,10 @@ export default [
26
26
  }
27
27
  }
28
28
 
29
+ :host {
30
+ --max-inline-size: max-content;
31
+ }
32
+
29
33
  .component {
30
34
  align-items: center;
31
35
  background-color: var(
@@ -43,7 +47,7 @@ export default [
43
47
  font-weight: var(--glide-core-typography-weight-regular);
44
48
  justify-content: center;
45
49
  line-height: 1;
46
- max-inline-size: max-content;
50
+ max-inline-size: var(--max-inline-size);
47
51
  opacity: 1;
48
52
  padding-inline: var(--glide-core-spacing-base-sm);
49
53
 
@@ -79,6 +83,7 @@ export default [
79
83
 
80
84
  .label {
81
85
  overflow: hidden;
86
+ text-align: center;
82
87
  text-overflow: ellipsis;
83
88
  white-space: nowrap;
84
89
  }
@@ -88,16 +88,13 @@ export default [
88
88
  &:focus-visible:not([readonly]) {
89
89
  &:not(.error) {
90
90
  border-color: var(--glide-core-color-interactive-stroke-focus);
91
- box-shadow:
92
- 0 0 0 1px var(--glide-core-color-interactive-stroke-focus),
93
- 1px 1px 4px -1px var(--glide-core-color-interactive-stroke-focus);
91
+ box-shadow: inset 0 0 0 1px
92
+ var(--glide-core-color-interactive-stroke-focus);
94
93
  }
95
94
 
96
95
  &.error {
97
- box-shadow:
98
- 0 0 0 1px var(--glide-core-color-advisory-stroke-error-primary),
99
- 1px 1px 4px -1px
100
- var(--glide-core-color-advisory-stroke-error-primary);
96
+ box-shadow: inset 0 0 0 1px
97
+ var(--glide-core-color-advisory-stroke-error-primary);
101
98
  }
102
99
  }
103
100
 
@@ -80,7 +80,7 @@ let Toasts = class Toasts extends LitElement {
80
80
  <div class="toasts">
81
81
  ${repeat(this.toasts, (toast) => toast.privateId, (toast) => {
82
82
  return html `<div
83
- aria-labelledby="prefix label description"
83
+ aria-describedby="description"
84
84
  class=${classMap({
85
85
  toast: true,
86
86
  error: toast.variant === 'error',
@@ -96,7 +96,7 @@ let Toasts = class Toasts extends LitElement {
96
96
  @mouseout=${this.#onToastMouseOut.bind(this, toast)}
97
97
  @transitionend=${this.#onToastTransitionEnd.bind(this, toast)}
98
98
  >
99
- <span class="prefix" id="prefix">
99
+ <span class="prefix">
100
100
  ${this.#localize.term(toast.variant)}
101
101
  </span>
102
102
 
@@ -105,9 +105,7 @@ let Toasts = class Toasts extends LitElement {
105
105
  ['error', () => icons.error],
106
106
  ], () => icons.warningInformational)}
107
107
 
108
- <div class="label" data-test="label" id="label">
109
- ${toast.label}
110
- </div>
108
+ <div class="label" data-test="label">${toast.label}</div>
111
109
 
112
110
  <glide-core-icon-button
113
111
  class="dismiss-button"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@crowdstrike/glide-core",
3
- "version": "0.34.0",
3
+ "version": "0.34.1",
4
4
  "description": "A Web Component design system",
5
5
  "author": "CrowdStrike UX Team",
6
6
  "license": "Apache-2.0",
@@ -91,8 +91,8 @@
91
91
  "@types/mocha": "^10.0.10",
92
92
  "@types/serialize-javascript": "^5.0.4",
93
93
  "@types/sinon": "^17.0.3",
94
- "@typescript-eslint/types": "^8.33.0",
95
- "@typescript-eslint/utils": "^8.33.0",
94
+ "@typescript-eslint/types": "^8.42.0",
95
+ "@typescript-eslint/utils": "^8.42.0",
96
96
  "@web/dev-server-esbuild": "^1.0.4",
97
97
  "@web/dev-server-rollup": "^0.6.4",
98
98
  "@web/test-runner": "^0.20.2",
@@ -114,7 +114,7 @@
114
114
  "globals": "^15.13.0",
115
115
  "globby": "^14.0.2",
116
116
  "http-server": "^14.1.1",
117
- "husky": "^8.0.3",
117
+ "husky": "^9.1.7",
118
118
  "is-ci": "^4.1.0",
119
119
  "istanbul-lib-coverage": "^3.2.2",
120
120
  "istanbul-lib-report": "^3.0.1",
@@ -125,7 +125,7 @@
125
125
  "matcher": "^5.0.0",
126
126
  "minify-literals": "^1.0.10",
127
127
  "node-html-parser": "^7.0.1",
128
- "npm-run-all2": "^7.0.2",
128
+ "npm-run-all2": "^8.0.4",
129
129
  "per-env": "^1.0.2",
130
130
  "playwright": "^1.54.2",
131
131
  "postcss": "^8.5.6",
@@ -144,10 +144,10 @@
144
144
  "stylelint-use-logical": "^2.1.2",
145
145
  "stylelint-use-nesting": "^6.0.0",
146
146
  "ts-lit-plugin": "^2.0.2",
147
- "ts-morph": "^25.0.1",
147
+ "ts-morph": "^26.0.0",
148
148
  "tsx": "^4.19.2",
149
149
  "typescript": "^5.8.3",
150
- "typescript-eslint": "^8.33.0",
150
+ "typescript-eslint": "^8.42.0",
151
151
  "v8-to-istanbul": "^9.3.0",
152
152
  "vite": "^6.3.2",
153
153
  "yocto-spinner": "^0.2.0"