@ringcentral/spring-base 1.11.2 → 1.13.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.
package/index.js CHANGED
@@ -1,16 +1,15 @@
1
- export { configure, rcConfiguration } from './config.js';
2
- export { RcResponsiveContext, WindowContext, breakpointList, getMatchDetail, useResponsiveContext, useWindowContext } from './contexts.js';
3
- export { createGlobalListener, globalListenerEventMap, isElmEqualOrContain, isTouchEvent, moveIndexInTwoDimension, teardown, useA11yKeyEvent, useActive, useAnnouncer, useAriaHideOutside, useAudio, useBodyScrollLock, useButton, useChange, useClickAway, useDebounce, useDepsChange, useEventCallback, useEventListener, useEver, useFocusVisible, useFontLoaded, useForceUpdate, useForkRef, useGlobalListener, useHiddenTabindex, useHover, useHoverDirty, useId, useImgLoaded, useInterval, useIsFocusVisible, useKeyDownOnce, useKeyboardMoveFocus, useLongPress, useMountState, useOnLayoutReRender, useOnReRender, useOnlyOneFocusable, useOverflow, usePrevious, useRefState, useResizeObserver, useResponsiveMatch, useResultRef, useRetry, useSleep, useTabOut, useTestRunnerDetection, useThrottle, useTimeout, useTouchMouseEvent, useVirtuosoExternalWindow, visuallyHiddenStyles } from './hooks.js';
4
- export { unstable_ownerDocument as ownerDocument, unstable_useControlled as useControlled } from '@mui/utils';
5
- export { a11yKeyboard, capitalize, checkDefaultPrevented, checkElementName, clearWindowSelection, getSelectionPosition, getTitle, globalStateClasses, isDeleteKeyboardEvent, isSuiElement, isUrl, isWebKit154, omit, outerSize, pick, preloadImg, removeClassName, runKeyHandler, setSelectionPosition, useClasses } from './utils.js';
6
- export { a as ariaHideOutside, b as combineClasses, c as combineProps, g as getRefElement, i as isRef, l as logInDev, o as ownerWindow, t as twMerge } from './chunks/twMerge.js';
7
- import 'react';
8
- import 'lodash/uniqueId';
9
- import '@mui/base/useButton';
10
- import 'lodash/omit';
11
- import 'lodash/pick';
12
- import 'lodash/isPlainObject';
13
- import 'lodash/debounce';
14
- import 'lodash/noop';
15
- import 'lodash/throttle';
16
- import 'tailwind-merge';
1
+
2
+
3
+
4
+
5
+
6
+
7
+
8
+
9
+ var src_LIVEREGION_TIMEOUT_DELAY = (/* inlined export .LIVEREGION_TIMEOUT_DELAY */7000);
10
+ export { src_LIVEREGION_TIMEOUT_DELAY as LIVEREGION_TIMEOUT_DELAY };
11
+ export { RcResponsiveContext, WindowContext, breakpointList, getMatchDetail, useResponsiveContext, useWindowContext } from "./contexts.js";
12
+ export { a11yKeyboard, ariaHideOutside, capitalize, checkDefaultPrevented, checkElementName, clearWindowSelection, combineClasses, combineProps, getRefElement, getSelectionPosition, getTitle, globalStateClasses, isDeleteKeyboardEvent, isRef, isSuiElement, isUrl, isWebKit154, logInDev, omit, outerSize, ownerDocument, ownerWindow, pick, preloadImg, removeClassName, runKeyHandler, setSelectionPosition, twMerge, useClasses } from "./utils.js";
13
+ export { announce, clearAnnouncer, destroyAnnouncer } from "./liveAnnouncer.js";
14
+ export { configure, rcConfiguration } from "./config.js";
15
+ export { createGlobalListener, globalListenerEventMap, isElmEqualOrContain, isTouchEvent, moveIndexInTwoDimension, teardown, useA11yKeyEvent, useActive, useAnnouncer, useAriaHideOutside, useAudio, useBodyScrollLock, useButton, useChange, useClickAway, useControlled, useDebounce, useDepsChange, useEventCallback, useEventListener, useEver, useFocusVisible, useFontLoaded, useForceUpdate, useForkRef, useGlobalAnnouncer, useGlobalListener, useHiddenTabindex, useHover, useHoverDirty, useId, useImgLoaded, useInterval, useIsFocusVisible, useKeyDownOnce, useKeyboardMoveFocus, useLongPress, useMountState, useOnLayoutReRender, useOnReRender, useOnlyOneFocusable, useOverflow, usePrevious, useRefState, useResizeObserver, useResponsiveMatch, useResultRef, useRetry, useSleep, useTabOut, useTestRunnerDetection, useThrottle, useTimeout, useTouchMouseEvent, useVirtuosoExternalWindow } from "./hooks.js";
@@ -0,0 +1,303 @@
1
+ /** Matches `[data-live-announcer="true"]` used by `ariaHideOutside`. */ const LIVE_ANNOUNCER_ATTR = 'data-live-announcer';
2
+ /**
3
+ * Visually hidden styles for live-announcer regions.
4
+ * Matches `@react-aria/live-announcer` / React Aria VisuallyHidden so the
5
+ * region stays off-screen without depending on Tailwind `sr-only`.
6
+ */ const visuallyHiddenStyleProperties = {
7
+ border: '0',
8
+ clip: 'rect(0 0 0 0)',
9
+ clipPath: 'inset(50%)',
10
+ height: '1px',
11
+ margin: '-1px',
12
+ overflow: 'hidden',
13
+ padding: '0',
14
+ position: 'absolute',
15
+ width: '1px',
16
+ whiteSpace: 'nowrap'
17
+ };
18
+ const applyVisuallyHiddenStyles = (el)=>{
19
+ Object.assign(el.style, visuallyHiddenStyleProperties);
20
+ };
21
+
22
+
23
+ /**
24
+ * Screen reader will not re-speak an identical live-region addition. Alternate a
25
+ * leading zero-width space so a repeated string is a new change (same idea as
26
+ * `useAnnouncer`).
27
+ */ class RepeatStringText {
28
+ next(politeness, message) {
29
+ const useZwsp = this.last[politeness] === message ? !this.usedZwsp[politeness] : false;
30
+ this.last[politeness] = message;
31
+ this.usedZwsp[politeness] = useZwsp;
32
+ return useZwsp ? `\u200B${message}` : message;
33
+ }
34
+ reset(politeness) {
35
+ const channels = politeness ? [
36
+ politeness
37
+ ] : [
38
+ 'assertive',
39
+ 'polite'
40
+ ];
41
+ for (const channel of channels){
42
+ this.last[channel] = undefined;
43
+ this.usedZwsp[channel] = false;
44
+ }
45
+ }
46
+ constructor(){
47
+ this.last = {};
48
+ this.usedZwsp = {
49
+ assertive: false,
50
+ polite: false
51
+ };
52
+ }
53
+ }
54
+ /**
55
+ * Inspired by `@react-aria/live-announcer`.
56
+ * Extended for Spring multi-document / detached-window support.
57
+ *
58
+ * Vanilla DOM (not React): same rationale as React Aria — avoid ReactDOM
59
+ * render/createRoot coupling for a global imperative API.
60
+ */ class LiveAnnouncer {
61
+ constructor(doc){
62
+ this.node = null;
63
+ this.assertiveLog = null;
64
+ this.politeLog = null;
65
+ this.repeatText = new RepeatStringText();
66
+ this.ready = false;
67
+ this.pending = [];
68
+ this.firstDelayTimerId = null;
69
+ this.doc = doc;
70
+ if (typeof doc === 'undefined' || !doc.body) {
71
+ return;
72
+ }
73
+ this.node = doc.createElement('div');
74
+ this.node.setAttribute(LIVE_ANNOUNCER_ATTR, 'true');
75
+ applyVisuallyHiddenStyles(this.node);
76
+ this.assertiveLog = this.createLog('assertive');
77
+ this.node.appendChild(this.assertiveLog);
78
+ this.politeLog = this.createLog('polite');
79
+ this.node.appendChild(this.politeLog);
80
+ doc.body.prepend(this.node);
81
+ }
82
+ isAttached() {
83
+ return Boolean(this.node?.isConnected);
84
+ }
85
+ createLog(ariaLive) {
86
+ const node = this.doc.createElement('div');
87
+ node.setAttribute('role', 'log');
88
+ node.setAttribute('aria-live', ariaLive);
89
+ node.setAttribute('aria-relevant', 'additions');
90
+ return node;
91
+ }
92
+ destroy() {
93
+ this.cancelFirstDelay();
94
+ if (!this.node) {
95
+ return;
96
+ }
97
+ const parent = this.node.parentNode;
98
+ if (parent) {
99
+ parent.removeChild(this.node);
100
+ }
101
+ this.node = null;
102
+ this.assertiveLog = null;
103
+ this.politeLog = null;
104
+ this.repeatText.reset();
105
+ }
106
+ /**
107
+ * Queue until the first-announce delay elapses so later calls cannot
108
+ * overtake the first message.
109
+ */ schedule(message, politeness = 'assertive', timeout = LIVEREGION_TIMEOUT_DELAY) {
110
+ if (this.ready || isTestAnnounceEnvironment()) {
111
+ this.announce(message, politeness, timeout);
112
+ return;
113
+ }
114
+ this.pending.push({
115
+ message,
116
+ politeness,
117
+ timeout
118
+ });
119
+ if (this.firstDelayTimerId != null) {
120
+ return;
121
+ }
122
+ const win = this.doc.defaultView ?? globalThis;
123
+ this.firstDelayTimerId = win.setTimeout(()=>{
124
+ this.firstDelayTimerId = null;
125
+ this.ready = true;
126
+ const queued = this.pending;
127
+ this.pending = [];
128
+ for (const item of queued){
129
+ this.announce(item.message, item.politeness, item.timeout);
130
+ }
131
+ }, FIRST_ANNOUNCE_DELAY_MS);
132
+ }
133
+ announce(message, politeness = 'assertive', timeout = LIVEREGION_TIMEOUT_DELAY) {
134
+ if (!this.node) {
135
+ return;
136
+ }
137
+ const node = this.doc.createElement('div');
138
+ if (typeof message === 'object') {
139
+ // A generic `div` cannot take `aria-labelledby` (name-from prohibited).
140
+ // React Aria uses `role="img"` so assistive technology treats the node
141
+ // as a named object and reads the referenced accessible name.
142
+ node.setAttribute('role', 'img');
143
+ node.setAttribute('aria-labelledby', message['aria-labelledby']);
144
+ } else {
145
+ node.textContent = this.repeatText.next(politeness, message);
146
+ }
147
+ if (politeness === 'assertive') {
148
+ this.assertiveLog?.appendChild(node);
149
+ } else {
150
+ this.politeLog?.appendChild(node);
151
+ }
152
+ if (message !== '') {
153
+ const win = this.doc.defaultView ?? globalThis;
154
+ win.setTimeout(()=>{
155
+ node.remove();
156
+ }, timeout);
157
+ }
158
+ }
159
+ clear(politeness) {
160
+ this.pending = politeness ? this.pending.filter((item)=>item.politeness !== politeness) : [];
161
+ if (!this.node) {
162
+ return;
163
+ }
164
+ if ((!politeness || politeness === 'assertive') && this.assertiveLog) {
165
+ this.assertiveLog.innerHTML = '';
166
+ this.repeatText.reset('assertive');
167
+ }
168
+ if ((!politeness || politeness === 'polite') && this.politeLog) {
169
+ this.politeLog.innerHTML = '';
170
+ this.repeatText.reset('polite');
171
+ }
172
+ }
173
+ cancelFirstDelay() {
174
+ if (this.firstDelayTimerId != null) {
175
+ const win = this.doc.defaultView ?? globalThis;
176
+ win.clearTimeout(this.firstDelayTimerId);
177
+ this.firstDelayTimerId = null;
178
+ }
179
+ this.pending = [];
180
+ }
181
+ }
182
+ /** Clear announced nodes after this many ms (React Aria default). */ const LIVEREGION_TIMEOUT_DELAY = 7000;
183
+ /** Delay before first message after creating regions (Safari consistency). */ const FIRST_ANNOUNCE_DELAY_MS = 100;
184
+ const announcersByDocument = new WeakMap();
185
+ const getLiveAnnouncer = (doc)=>{
186
+ return announcersByDocument.get(doc) ?? null;
187
+ };
188
+ const ensureLiveAnnouncer = (doc)=>{
189
+ const existing = announcersByDocument.get(doc);
190
+ if (existing?.isAttached()) {
191
+ return existing;
192
+ }
193
+ existing?.destroy();
194
+ const announcer = new LiveAnnouncer(doc);
195
+ announcersByDocument.set(doc, announcer);
196
+ return announcer;
197
+ };
198
+ const clearLiveAnnouncerRegistry = (doc)=>{
199
+ if (doc) {
200
+ const announcer = announcersByDocument.get(doc);
201
+ announcer?.destroy();
202
+ announcersByDocument.delete(doc);
203
+ return;
204
+ }
205
+ };
206
+ const isTestAnnounceEnvironment = ()=>{
207
+ // React Aria: skip first-announce delay under React act / Jest.
208
+ // https://github.com/reactwg/react-18/discussions/102
209
+ const globalObj = globalThis;
210
+ if (typeof globalObj.IS_REACT_ACT_ENVIRONMENT === 'boolean') {
211
+ return globalObj.IS_REACT_ACT_ENVIRONMENT;
212
+ }
213
+ return typeof jest !== 'undefined';
214
+ };
215
+
216
+
217
+ const resolveDocument = (doc)=>{
218
+ if (doc) {
219
+ return doc;
220
+ }
221
+ if (typeof document !== 'undefined') {
222
+ return document;
223
+ }
224
+ return undefined;
225
+ };
226
+ const resolveTimeoutAndDocument = (timeoutOrOptions)=>{
227
+ if (typeof timeoutOrOptions === 'number') {
228
+ return {
229
+ timeout: timeoutOrOptions
230
+ };
231
+ }
232
+ if (timeoutOrOptions && typeof timeoutOrOptions === 'object') {
233
+ return {
234
+ timeout: timeoutOrOptions.timeout ?? (/* inlined export .LIVEREGION_TIMEOUT_DELAY */7000),
235
+ document: timeoutOrOptions.document
236
+ };
237
+ }
238
+ return {
239
+ timeout: (/* inlined export .LIVEREGION_TIMEOUT_DELAY */7000)
240
+ };
241
+ };
242
+ /**
243
+ * Announces a message to screen readers via a document-scoped live region pair
244
+ * (polite + assertive). Prefer this over `useAnnouncer` so the page shares one
245
+ * pair per document.
246
+ *
247
+ * In a pop-out window, `useGlobalAnnouncer` is the more convenient way to
248
+ * automatically detect and target that window.
249
+ * Imperative callers can pass `{ document }` manually.
250
+ * Both should call `destroyAnnouncer(win.document)` on close.
251
+ *
252
+ * Based on `@react-aria/live-announcer`.
253
+ *
254
+ * @example
255
+ * ```ts
256
+ * import { announce, destroyAnnouncer } from '@ringcentral/spring-base';
257
+ *
258
+ * // Preferred for saved / completed / non-urgent status
259
+ * announce('Saved', 'polite');
260
+ * // Use for time-sensitive / critical / urgent status
261
+ * announce('Session expiring', 'assertive');
262
+ *
263
+ * // Pop-out window
264
+ * announce('Saved', 'polite', { document: externalWindow.document });
265
+ * externalWindow.addEventListener('beforeunload', () => {
266
+ * destroyAnnouncer(externalWindow.document);
267
+ * });
268
+ * ```
269
+ */ function announce(message, politeness = 'assertive', timeoutOrOptions) {
270
+ const { timeout, document: optionDocument } = resolveTimeoutAndDocument(timeoutOrOptions);
271
+ const doc = resolveDocument(optionDocument);
272
+ if (!doc?.body) {
273
+ return;
274
+ }
275
+ const liveAnnouncer = ensureLiveAnnouncer(doc);
276
+ liveAnnouncer.schedule(message, politeness, timeout);
277
+ }
278
+ /**
279
+ * Clears pending announcement nodes for the given politeness (or both).
280
+ */ function clearAnnouncer(politeness, doc) {
281
+ const target = resolveDocument(doc);
282
+ if (!target) {
283
+ return;
284
+ }
285
+ getLiveAnnouncer(target)?.clear(politeness);
286
+ }
287
+ /**
288
+ * Removes the document-scoped live-region tree and cancels a pending
289
+ * first-announce delay. Does not clear per-message remove timeouts.
290
+ * Call this when closing a pop-out window that used
291
+ * `announce(..., { document })` or `useGlobalAnnouncer`.
292
+ */ function destroyAnnouncer(doc) {
293
+ const target = resolveDocument(doc);
294
+ if (!target) {
295
+ return;
296
+ }
297
+ clearLiveAnnouncerRegistry(target);
298
+ }
299
+
300
+
301
+
302
+
303
+ export { LIVEREGION_TIMEOUT_DELAY, LIVE_ANNOUNCER_ATTR, announce, applyVisuallyHiddenStyles, clearAnnouncer, destroyAnnouncer };
package/package.json CHANGED
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "name": "@ringcentral/spring-base",
3
- "version": "1.11.2",
3
+ "version": "1.13.0",
4
4
  "author": "RingCentral",
5
5
  "description": "Core utilities, hooks, and foundational functionality for Spring UI components, providing essential building blocks for React applications",
6
6
  "main": "./index.js",
7
7
  "module": "./index.js",
8
8
  "types": "./index.d.ts",
9
9
  "dependencies": {
10
+ "@mui/base": "5.0.0-beta.70",
10
11
  "@mui/utils": "^6.0.2",
11
12
  "@types/lodash": "^4.14.182",
12
- "clsx": "^1.2.1",
13
13
  "framer-motion": "^6.5.1",
14
14
  "lodash": "^4.17.21",
15
15
  "tailwind-merge": "^2.5.4",
16
16
  "type-fest": "^2.12.2"
17
17
  },
18
18
  "peerDependencies": {
19
- "@types/react": ">=17.0.3",
20
- "react": ">=17.0.2",
21
- "react-dom": ">=17.0.2"
19
+ "@types/react": "^17.0.3 || ^18.0.0 || ^19.0.0",
20
+ "react": "^17.0.2 || ^18.0.0 || ^19.0.0",
21
+ "react-dom": "^17.0.2 || ^18.0.0 || ^19.0.0"
22
22
  },
23
23
  "sideEffects": false,
24
24
  "license": "MIT",
@@ -1,6 +1,7 @@
1
1
  export * from './useA11yKeyEvent';
2
2
  export * from './useActive';
3
3
  export * from './useAnnouncer';
4
+ export * from './useGlobalAnnouncer';
4
5
  export * from './useButton';
5
6
  export * from './useAriaHideOutside';
6
7
  export * from './useAudio';
@@ -1,2 +1,5 @@
1
- export declare const visuallyHiddenStyles = "\n clip-path: inset(100%);\n clip: rect(1px, 1px, 1px, 1px);\n height: 1px;\n overflow: hidden;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n";
2
- export declare const useAnnouncer: (id?: string) => (message?: string) => void;
1
+ import type { AnnouncerPoliteness } from '../../liveAnnouncer';
2
+ export type UseAnnouncerOptions = {
3
+ politeness?: AnnouncerPoliteness;
4
+ };
5
+ export declare function useAnnouncer(idOrOptions?: string | UseAnnouncerOptions, maybeOptions?: UseAnnouncerOptions): (message?: string) => void;
@@ -1,2 +1,2 @@
1
- import { UseButtonParameters, UseButtonReturnValue } from '@mui/base/useButton';
1
+ import { UseButtonParameters, UseButtonReturnValue } from '@mui/base';
2
2
  export declare function useButton(parameters: UseButtonParameters): UseButtonReturnValue;
@@ -0,0 +1 @@
1
+ export * from './useGlobalAnnouncer';
@@ -0,0 +1,5 @@
1
+ import type { AnnounceMessage, AnnouncerPoliteness } from '../../liveAnnouncer/types';
2
+ export type GlobalAnnounceOptions = {
3
+ timeout?: number;
4
+ };
5
+ export declare function useGlobalAnnouncer(): (message: AnnounceMessage, politeness?: AnnouncerPoliteness, timeoutOrOptions?: number | GlobalAnnounceOptions) => void;
@@ -1 +1,3 @@
1
- export declare function useId(id?: string, prefixMode?: boolean): string;
1
+ declare function useReactId(id?: string, prefixMode?: boolean): string;
2
+ export declare const useId: typeof useReactId;
3
+ export {};
@@ -1,11 +1,14 @@
1
1
  /// <reference types="react" />
2
+ import type { HTMLDataAttribute } from '../../typings';
2
3
  export type UseOnlyOneFocusableParams = {
3
4
  focusedIndexRef: React.MutableRefObject<number>;
4
5
  containerRef: React.RefObject<HTMLElement>;
5
6
  };
7
+ type MoveFocusedItemProps = Omit<React.HTMLAttributes<HTMLElement>, 'children'> & HTMLDataAttribute;
6
8
  export declare const useOnlyOneFocusable: ({ focusedIndexRef, containerRef, }: UseOnlyOneFocusableParams) => {
7
9
  moveFocusedId: string;
8
10
  focusIndex: (toIndex: number) => void;
9
11
  setIndexTabIndex: (toIndex: number) => void;
10
- getItemProps: (index: number, options?: Omit<React.HTMLAttributes<HTMLElement>, 'children'>) => Omit<import("react").HTMLAttributes<HTMLElement>, "children">;
12
+ getItemProps: (index: number, options?: Omit<React.HTMLAttributes<HTMLElement>, 'children'>) => NonNullable<MoveFocusedItemProps>;
11
13
  };
14
+ export {};
package/src/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './config';
2
2
  export * from './contexts';
3
3
  export * from './hooks';
4
+ export * from './liveAnnouncer';
4
5
  export * from './typings';
5
6
  export * from './utils';
@@ -0,0 +1,25 @@
1
+ import type { AnnounceMessage, AnnouncerPoliteness } from './types';
2
+ export declare class LiveAnnouncer {
3
+ node: HTMLElement | null;
4
+ assertiveLog: HTMLElement | null;
5
+ politeLog: HTMLElement | null;
6
+ private readonly doc;
7
+ private readonly repeatText;
8
+ private ready;
9
+ private pending;
10
+ private firstDelayTimerId;
11
+ constructor(doc: Document);
12
+ isAttached(): boolean;
13
+ createLog(ariaLive: AnnouncerPoliteness): HTMLElement;
14
+ destroy(): void;
15
+ schedule(message: AnnounceMessage, politeness?: AnnouncerPoliteness, timeout?: number): void;
16
+ announce(message: AnnounceMessage, politeness?: AnnouncerPoliteness, timeout?: number): void;
17
+ clear(politeness?: AnnouncerPoliteness): void;
18
+ private cancelFirstDelay;
19
+ }
20
+ export declare const LIVEREGION_TIMEOUT_DELAY = 7000;
21
+ export declare const FIRST_ANNOUNCE_DELAY_MS = 100;
22
+ export declare const getLiveAnnouncer: (doc: Document) => LiveAnnouncer | null;
23
+ export declare const ensureLiveAnnouncer: (doc: Document) => LiveAnnouncer;
24
+ export declare const clearLiveAnnouncerRegistry: (doc?: Document) => void;
25
+ export declare const isTestAnnounceEnvironment: () => boolean;
@@ -0,0 +1,4 @@
1
+ import type { AnnounceMessage, AnnounceOptions, AnnouncerPoliteness } from './types';
2
+ export declare function announce(message: AnnounceMessage, politeness?: AnnouncerPoliteness, timeoutOrOptions?: number | AnnounceOptions): void;
3
+ export declare function clearAnnouncer(politeness?: AnnouncerPoliteness, doc?: Document): void;
4
+ export declare function destroyAnnouncer(doc?: Document): void;
@@ -0,0 +1,3 @@
1
+ export type { AnnounceMessage, AnnounceOptions, AnnouncerPoliteness, } from './types';
2
+ export { announce, clearAnnouncer, destroyAnnouncer } from './announce';
3
+ export { LIVEREGION_TIMEOUT_DELAY } from './LiveAnnouncer';
@@ -0,0 +1,8 @@
1
+ export type AnnouncerPoliteness = 'assertive' | 'polite';
2
+ export type AnnounceMessage = string | {
3
+ 'aria-labelledby': string;
4
+ };
5
+ export type AnnounceOptions = {
6
+ timeout?: number;
7
+ document?: Document;
8
+ };
@@ -0,0 +1,3 @@
1
+ export declare const LIVE_ANNOUNCER_ATTR = "data-live-announcer";
2
+ export declare const visuallyHiddenStyleProperties: Partial<CSSStyleDeclaration>;
3
+ export declare const applyVisuallyHiddenStyles: (el: HTMLElement) => void;
package/typings.js CHANGED
@@ -1 +1,8 @@
1
1
 
2
+
3
+
4
+
5
+
6
+
7
+
8
+