@brightspace-ui/core 3.261.0 → 3.262.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.
@@ -1,9 +1,6 @@
1
1
  import { addResizeNoopEventListener, findComposedAncestor, getComposedParent, isComposedAncestor, removeResizeNoopEventListener } from '../../helpers/dom.js';
2
2
  import { getNextFocusable, getPreviousFocusable } from '../../helpers/focus.js';
3
3
  import { css } from 'lit';
4
- import { getFlag } from '../../helpers/flags.js';
5
-
6
- const ignoreNoopResizeEventsFlag = getFlag('GAUD-9520-ignore-no-op-resize-events', true);
7
4
 
8
5
  const reduceMotion = matchMedia('(prefers-reduced-motion: reduce)').matches;
9
6
  const __nativeFocus = document.createElement('div').focus;
@@ -144,11 +141,7 @@ export const HierarchicalViewMixin = superclass => class extends superclass {
144
141
  this.addEventListener('focus', this.__focusCapture, true);
145
142
  this.addEventListener('focusout', this.__focusOutCapture, true);
146
143
  this.__onWindowResize = this.__onWindowResize.bind(this);
147
- if (ignoreNoopResizeEventsFlag) {
148
- addResizeNoopEventListener(this.__onWindowResize);
149
- } else {
150
- window.addEventListener('resize', this.__onWindowResize);
151
- }
144
+ addResizeNoopEventListener(this.__onWindowResize);
152
145
  }
153
146
  });
154
147
  }
@@ -158,11 +151,7 @@ export const HierarchicalViewMixin = superclass => class extends superclass {
158
151
 
159
152
  this.removeEventListener('focus', this.__focusCapture);
160
153
  this.removeEventListener('focusout', this.__focusOutCapture);
161
- if (ignoreNoopResizeEventsFlag) {
162
- removeResizeNoopEventListener(this.__onWindowResize);
163
- } else {
164
- window.removeEventListener('resize', this.__onWindowResize);
165
- }
154
+ removeResizeNoopEventListener(this.__onWindowResize);
166
155
 
167
156
  if (this.__intersectionObserver) {
168
157
  this.__intersectionObserver.disconnect();
@@ -1,6 +1,10 @@
1
- import { css } from 'lit';
1
+ import { css, unsafeCSS } from 'lit';
2
+ import { _isValidCssSelector } from '../../helpers/internal/css.js';
3
+ import { getFlag } from '../../helpers/flags.js';
2
4
  import { registerSemanticVariableForSvgImageUrl } from '../colors/colors.js';
3
5
 
6
+ export const useGeneratedStyles = getFlag('GAUD-8849-Use-input-radio-generated-styles', true);
7
+
4
8
  registerSemanticVariableForSvgImageUrl(
5
9
  '--d2l-input-radio-check-image',
6
10
  `<svg width="10" height="10" viewBox="0 0 10 10" xmlns="http://www.w3.org/2000/svg">
@@ -8,7 +12,169 @@ registerSemanticVariableForSvgImageUrl(
8
12
  </svg>`
9
13
  );
10
14
 
11
- export const radioStyles = css`
15
+ function _getRadioStyleSelectors(inputSelectors) {
16
+ const parseAndJoin = selectors => unsafeCSS(selectors.map(s => s.trim()).join(',\n'));
17
+ return {
18
+ simple: parseAndJoin(inputSelectors),
19
+ checked: parseAndJoin(inputSelectors.map(s => `
20
+ ${s}[aria-checked="true"],
21
+ ${s}:checked
22
+ `)),
23
+ checkedAfter: parseAndJoin(inputSelectors.map(s => `
24
+ ${s}[aria-checked="true"]::after,
25
+ ${s}:checked::after
26
+ `)),
27
+ hoverFocus: parseAndJoin(inputSelectors.map(s => `
28
+ ${s}.d2l-hovering,
29
+ ${s}:not(.d2l-input-radio-disabled-tooltip):not(:disabled):not(.d2l-disabled):hover,
30
+ ${s}:not(.d2l-input-radio-disabled-tooltip):not(:disabled):not(.d2l-disabled):focus,
31
+ ${s}.d2l-input-radio-disabled-tooltip:hover,
32
+ ${s}.d2l-input-radio-disabled-tooltip:focus
33
+ `)),
34
+ invalid: parseAndJoin(inputSelectors.map(s => `
35
+ ${s}[aria-invalid="true"]
36
+ `)),
37
+ disabled: parseAndJoin(inputSelectors.map(s => `
38
+ ${s}:disabled,
39
+ ${s}.d2l-disabled
40
+ `)),
41
+ disabledTooltip: parseAndJoin(inputSelectors.map(s => `
42
+ ${s}.d2l-input-radio-disabled-tooltip.d2l-hovering,
43
+ ${s}.d2l-input-radio-disabled-tooltip:hover,
44
+ ${s}.d2l-input-radio-disabled-tooltip:focus
45
+ `))
46
+ };
47
+ }
48
+
49
+ /**
50
+ * A private helper method that should not be used by general consumers
51
+ */
52
+ export function _generateRadioStyles(selector, containerSelector) {
53
+ if (!_isValidCssSelector(selector) || !_isValidCssSelector(containerSelector)) return '';
54
+ const inputSelectors = [selector];
55
+ if (containerSelector) {
56
+ inputSelectors.push(`${containerSelector} > input[type="radio"]`);
57
+ containerSelector = unsafeCSS(containerSelector);
58
+ }
59
+ const selectors = _getRadioStyleSelectors(inputSelectors);
60
+
61
+ return css`
62
+ ${selectors.simple} {
63
+ -webkit-appearance: none;
64
+ -moz-appearance: none;
65
+ appearance: none;
66
+ background-color: var(--d2l-theme-background-color-interactive-faint-default);
67
+ background-position: center center;
68
+ background-repeat: no-repeat;
69
+ background-size: 0.5rem 0.5rem;
70
+ border: 1px solid var(--d2l-theme-border-color-emphasized);
71
+ border-radius: 50%;
72
+ box-sizing: border-box;
73
+ display: inline-block;
74
+ height: 1.2rem;
75
+ margin: 0;
76
+ outline: none;
77
+ padding: 0;
78
+ vertical-align: middle;
79
+ width: 1.2rem;
80
+ }
81
+ ${selectors.checked} {
82
+ background-image: var(--d2l-input-radio-check-image);
83
+ }
84
+ ${selectors.hoverFocus} {
85
+ border: 2px solid var(--d2l-input-radio-border-color-hover-focus, var(--d2l-theme-border-color-focus));
86
+ }
87
+ ${selectors.invalid} {
88
+ --d2l-input-radio-border-color-hover-focus: var(--d2l-theme-status-color-error);
89
+ border-color: var(--d2l-theme-status-color-error);
90
+ }
91
+ ${selectors.disabled} {
92
+ opacity: var(--d2l-theme-opacity-disabled-control);
93
+ }
94
+
95
+ ${selectors.disabledTooltip} {
96
+ background-blend-mode: lighten;
97
+ background-color: var(--d2l-theme-background-color-interactive-faint-disabled);
98
+ opacity: 1;
99
+ }
100
+
101
+ @media (prefers-contrast: more) {
102
+ ${selectors.simple} {
103
+ background-color: Canvas;
104
+ border-color: ButtonText;
105
+ forced-color-adjust: none;
106
+ }
107
+ ${selectors.checked} {
108
+ background-image: none;
109
+ position: relative;
110
+ }
111
+ ${selectors.checkedAfter} {
112
+ background-color: FieldText;
113
+ content: "";
114
+ display: block;
115
+ height: 1.2rem;
116
+ left: 50%;
117
+ mask-image: var(--d2l-input-radio-check-image);
118
+ mask-position: center center;
119
+ mask-repeat: no-repeat;
120
+ mask-size: 0.5rem 0.5rem;
121
+ position: absolute;
122
+ top: 50%;
123
+ transform: translate(-50%, -50%);
124
+ width: 1.2rem;
125
+ }
126
+
127
+ ${selectors.invalid} {
128
+ --d2l-input-radio-border-color-hover-focus: var(--d2l-theme-status-color-error);
129
+ border-color: var(--d2l-theme-status-color-error);
130
+ }
131
+
132
+ ${selectors.disabledTooltip} {
133
+ background-blend-mode: initial;
134
+ background-color: Canvas;
135
+ }
136
+ }
137
+
138
+ ${containerSelector ? css`
139
+ ${containerSelector} {
140
+ align-items: center;
141
+ color: var(--d2l-theme-text-color-static-standard);
142
+ display: flex;
143
+ font-size: 0.8rem;
144
+ font-weight: 400;
145
+ line-height: 1.2rem;
146
+ margin-bottom: 0.9rem;
147
+ overflow-wrap: anywhere;
148
+ padding-inline-end: 0;
149
+ padding-inline-start: 1.7rem;
150
+ vertical-align: middle;
151
+ }
152
+ ${containerSelector}:last-of-type {
153
+ margin-bottom: 0;
154
+ }
155
+
156
+ ${containerSelector}.d2l-input-radio-label-disabled {
157
+ color: var(--d2l-theme-text-color-static-disabled);
158
+ }
159
+ ${containerSelector}.d2l-input-radio-label-disabled > * {
160
+ color: var(--d2l-theme-text-color-static-standard);
161
+ opacity: var(--d2l-theme-opacity-disabled-control);
162
+ }
163
+
164
+ ${containerSelector} > .d2l-input-radio,
165
+ ${containerSelector} > input[type="radio"] {
166
+ flex: 0 0 auto;
167
+ margin-inline-end: 0.5rem;
168
+ margin-inline-start: -1.7rem;
169
+ }
170
+ ` : css``}
171
+ `;
172
+
173
+ }
174
+
175
+ export const radioStyles = useGeneratedStyles ? css`
176
+ ${_generateRadioStyles('.d2l-input-radio', '.d2l-input-radio-label')}
177
+ ` : css`
12
178
  .d2l-input-radio,
13
179
  .d2l-input-radio-label > input[type="radio"] {
14
180
  -webkit-appearance: none;
@@ -1,13 +1,13 @@
1
1
  import '../expand-collapse/expand-collapse-content.js';
2
2
  import '../tooltip/tooltip.js';
3
3
  import { css, html, LitElement, nothing } from 'lit';
4
+ import { radioStyles, useGeneratedStyles } from './input-radio-styles.js';
4
5
  import { classMap } from 'lit/directives/class-map.js';
5
6
  import { FocusMixin } from '../../mixins/focus/focus-mixin.js';
6
7
  import { getUniqueId } from '../../helpers/uniqueId.js';
7
8
  import { ifDefined } from 'lit/directives/if-defined.js';
8
9
  import { InputInlineHelpMixin } from './input-inline-help.js';
9
10
  import { PropertyRequiredMixin } from '../../mixins/property-required/property-required-mixin.js';
10
- import { radioStyles } from './input-radio-styles.js';
11
11
  import { SkeletonMixin } from '../skeleton/skeleton-mixin.js';
12
12
  import { styleMap } from 'lit/directives/style-map.js';
13
13
 
@@ -133,10 +133,11 @@ class InputRadio extends InputInlineHelpMixin(SkeletonMixin(FocusMixin(PropertyR
133
133
  const labelClasses = {
134
134
  'd2l-input-radio-label': true,
135
135
  'd2l-input-radio-label-disabled': this.disabled && !this.skeleton,
136
- 'd2l-input-radio-label-disabled-tooltip': this.disabled && this.disabledTooltip
136
+ 'd2l-input-radio-label-disabled-tooltip': !useGeneratedStyles && this.disabled && this.disabledTooltip
137
137
  };
138
138
  const radioClasses = {
139
139
  'd2l-input-radio': true,
140
+ 'd2l-input-radio-disabled-tooltip': useGeneratedStyles && this.disabled && this.disabledTooltip,
140
141
  'd2l-disabled': this.focusDisabled && !this.skeleton,
141
142
  'd2l-hovering': this._isHovered && !this.focusDisabled,
142
143
  'd2l-skeletize': true
@@ -8,12 +8,9 @@ import { css, html, nothing } from 'lit';
8
8
  import { getComposedActiveElement, getFirstFocusableDescendant, getPreviousFocusableAncestor } from '../../helpers/focus.js';
9
9
  import { _offscreenStyleDeclarations } from '../offscreen/offscreen.js';
10
10
  import { classMap } from 'lit/directives/class-map.js';
11
- import { getFlag } from '../../helpers/flags.js';
12
11
  import { styleMap } from 'lit/directives/style-map.js';
13
12
  import { tryGetIfrauBackdropService } from '../../helpers/ifrauBackdropService.js';
14
13
 
15
- const ignoreNoopResizeEventsFlag = getFlag('GAUD-9520-ignore-no-op-resize-events', true);
16
-
17
14
  export const positionLocations = Object.freeze({
18
15
  blockEnd: 'block-end',
19
16
  blockStart: 'block-start',
@@ -625,12 +622,7 @@ export const PopoverMixin = superclass => class extends superclass {
625
622
 
626
623
  this.#removeRepositionHandlers();
627
624
  this.#ancestorMutations = new Map();
628
-
629
- if (ignoreNoopResizeEventsFlag) {
630
- addResizeNoopEventListener(this.#handleResizeBound);
631
- } else {
632
- window.addEventListener('resize', this.#handleResizeBound);
633
- }
625
+ addResizeNoopEventListener(this.#handleResizeBound);
634
626
 
635
627
  this._ancestorMutationObserver ??= new MutationObserver(this.#handleAncestorMutationBound);
636
628
  const mutationConfig = { attributes: true, childList: true, subtree: true };
@@ -1204,11 +1196,7 @@ export const PopoverMixin = superclass => class extends superclass {
1204
1196
  });
1205
1197
  this._scrollablesObserved = null;
1206
1198
  this._ancestorMutationObserver?.disconnect();
1207
- if (ignoreNoopResizeEventsFlag) {
1208
- removeResizeNoopEventListener(this.#handleResizeBound);
1209
- } else {
1210
- window.removeEventListener('resize', this.#handleResizeBound);
1211
- }
1199
+ removeResizeNoopEventListener(this.#handleResizeBound);
1212
1200
  }
1213
1201
 
1214
1202
  #reposition() {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@brightspace-ui/core",
3
- "version": "3.261.0",
3
+ "version": "3.262.1",
4
4
  "description": "A collection of accessible, free, open-source web components for building Brightspace applications",
5
5
  "type": "module",
6
6
  "repository": "https://github.com/BrightspaceUI/core.git",