@salt-ds/core 1.59.1 → 1.60.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 (43) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/css/salt-core.css +1 -1
  3. package/dist-cjs/aria-announcer/AriaAnnounce.js +15 -3
  4. package/dist-cjs/aria-announcer/AriaAnnounce.js.map +1 -1
  5. package/dist-cjs/aria-announcer/AriaAnnouncerContext.js.map +1 -1
  6. package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js +65 -43
  7. package/dist-cjs/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
  8. package/dist-cjs/aria-announcer/announcementRegistry.js +31 -0
  9. package/dist-cjs/aria-announcer/announcementRegistry.js.map +1 -0
  10. package/dist-cjs/aria-announcer/useAriaAnnouncer.js +44 -16
  11. package/dist-cjs/aria-announcer/useAriaAnnouncer.js.map +1 -1
  12. package/dist-cjs/index.js +1 -1
  13. package/dist-cjs/pagination/Pagination.js +1 -0
  14. package/dist-cjs/pagination/Pagination.js.map +1 -1
  15. package/dist-cjs/salt-provider/SaltProvider.js +3 -1
  16. package/dist-cjs/salt-provider/SaltProvider.js.map +1 -1
  17. package/dist-cjs/spinner/Spinner.js +1 -0
  18. package/dist-cjs/spinner/Spinner.js.map +1 -1
  19. package/dist-cjs/tooltip/useAriaAnnounce.js +1 -0
  20. package/dist-cjs/tooltip/useAriaAnnounce.js.map +1 -1
  21. package/dist-es/aria-announcer/AriaAnnounce.js +15 -3
  22. package/dist-es/aria-announcer/AriaAnnounce.js.map +1 -1
  23. package/dist-es/aria-announcer/AriaAnnouncerContext.js.map +1 -1
  24. package/dist-es/aria-announcer/AriaAnnouncerProvider.js +67 -45
  25. package/dist-es/aria-announcer/AriaAnnouncerProvider.js.map +1 -1
  26. package/dist-es/aria-announcer/announcementRegistry.js +28 -0
  27. package/dist-es/aria-announcer/announcementRegistry.js.map +1 -0
  28. package/dist-es/aria-announcer/useAriaAnnouncer.js +45 -17
  29. package/dist-es/aria-announcer/useAriaAnnouncer.js.map +1 -1
  30. package/dist-es/index.js +1 -1
  31. package/dist-es/pagination/Pagination.js +1 -0
  32. package/dist-es/pagination/Pagination.js.map +1 -1
  33. package/dist-es/salt-provider/SaltProvider.js +3 -1
  34. package/dist-es/salt-provider/SaltProvider.js.map +1 -1
  35. package/dist-es/spinner/Spinner.js +1 -0
  36. package/dist-es/spinner/Spinner.js.map +1 -1
  37. package/dist-es/tooltip/useAriaAnnounce.js +1 -0
  38. package/dist-es/tooltip/useAriaAnnounce.js.map +1 -1
  39. package/dist-types/aria-announcer/AriaAnnounce.d.ts +9 -2
  40. package/dist-types/aria-announcer/AriaAnnouncerContext.d.ts +26 -2
  41. package/dist-types/aria-announcer/AriaAnnouncerProvider.d.ts +6 -7
  42. package/dist-types/aria-announcer/announcementRegistry.d.ts +5 -0
  43. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"useAriaAnnounce.js","sources":["../src/tooltip/useAriaAnnounce.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { type PointerEvent, useEffect, useRef } from \"react\";\nimport { useAriaAnnouncer } from \"../aria-announcer\";\nimport { useIsomorphicLayoutEffect } from \"../utils\";\n\nfunction getDocument(floating: HTMLElement | null) {\n return floating?.ownerDocument ?? document;\n}\n\n// TODO: Check whether can be anything more restrictive than `any`\n// biome-ignore lint/suspicious/noExplicitAny: see comment above\nfunction getWindow(value: any) {\n return getDocument(value).defaultView ?? window;\n}\n\nfunction isElement(value: unknown): value is HTMLElement {\n return value ? value instanceof getWindow(value).Element : false;\n}\n\nfunction getDelay(\n value: Props[\"delay\"],\n prop: \"open\" | \"close\",\n pointerType?: PointerEvent[\"pointerType\"],\n) {\n if (pointerType && pointerType !== \"mouse\") {\n return 0;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n return value?.[prop];\n}\n\ntype Props = {\n delay?: number | Partial<{ open: number; close: number }>;\n};\n\nexport const useAriaAnnounce = (\n context: FloatingContext,\n { delay = 0 }: Props,\n): ElementProps => {\n const { open, dataRef, refs } = context;\n\n const pointerTypeRef = useRef<PointerEvent[\"pointerType\"]>();\n const timeoutRef = useRef<number>();\n const blockMouseMoveRef = useRef(true);\n const { announce } = useAriaAnnouncer();\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n pointerTypeRef.current = undefined;\n }\n });\n\n useEffect(() => {\n const reference = refs.reference.current;\n function announceFloating() {\n const tooltipContent = refs.floating.current?.innerText;\n\n if (tooltipContent) {\n announce(tooltipContent);\n }\n }\n\n function onMouseEnter(event: MouseEvent) {\n clearTimeout(timeoutRef.current);\n\n if (open) {\n return;\n }\n\n blockMouseMoveRef.current = false;\n dataRef.current.openEvent = event;\n\n if (delay) {\n timeoutRef.current = window.setTimeout(\n () => {\n announceFloating();\n },\n getDelay(delay, \"open\", pointerTypeRef.current),\n );\n } else {\n announceFloating();\n }\n }\n\n if (isElement(reference)) {\n reference.addEventListener(\"mouseenter\", onMouseEnter);\n return () => {\n reference.removeEventListener(\"mouseenter\", onMouseEnter);\n };\n }\n }, [dataRef, delay, open, refs.reference, refs.floating, announce]);\n\n function setPointerRef(event: PointerEvent) {\n pointerTypeRef.current = event.pointerType;\n }\n\n return {\n reference: {\n onPointerDown: setPointerRef,\n onPointerEnter: setPointerRef,\n },\n floating: {\n onMouseEnter() {\n clearTimeout(timeoutRef.current);\n },\n },\n };\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useAriaAnnounce.js","sources":["../src/tooltip/useAriaAnnounce.ts"],"sourcesContent":["import type { ElementProps, FloatingContext } from \"@floating-ui/react\";\nimport { type PointerEvent, useEffect, useRef } from \"react\";\nimport { useAriaAnnouncer } from \"../aria-announcer\";\nimport { useIsomorphicLayoutEffect } from \"../utils\";\n\nfunction getDocument(floating: HTMLElement | null) {\n return floating?.ownerDocument ?? document;\n}\n\n// TODO: Check whether can be anything more restrictive than `any`\n// biome-ignore lint/suspicious/noExplicitAny: see comment above\nfunction getWindow(value: any) {\n return getDocument(value).defaultView ?? window;\n}\n\nfunction isElement(value: unknown): value is HTMLElement {\n return value ? value instanceof getWindow(value).Element : false;\n}\n\nfunction getDelay(\n value: Props[\"delay\"],\n prop: \"open\" | \"close\",\n pointerType?: PointerEvent[\"pointerType\"],\n) {\n if (pointerType && pointerType !== \"mouse\") {\n return 0;\n }\n\n if (typeof value === \"number\") {\n return value;\n }\n\n return value?.[prop];\n}\n\ntype Props = {\n delay?: number | Partial<{ open: number; close: number }>;\n};\n\nexport const useAriaAnnounce = (\n context: FloatingContext,\n { delay = 0 }: Props,\n): ElementProps => {\n const { open, dataRef, refs } = context;\n\n const pointerTypeRef = useRef<PointerEvent[\"pointerType\"]>();\n const timeoutRef = useRef<number>();\n const blockMouseMoveRef = useRef(true);\n const { announce } = useAriaAnnouncer();\n\n useIsomorphicLayoutEffect(() => {\n if (!open) {\n pointerTypeRef.current = undefined;\n }\n });\n\n useEffect(() => {\n const reference = refs.reference.current;\n function announceFloating() {\n const tooltipContent = refs.floating.current?.innerText;\n\n if (tooltipContent) {\n announce(tooltipContent);\n }\n }\n\n function onMouseEnter(event: MouseEvent) {\n clearTimeout(timeoutRef.current);\n\n if (open) {\n return;\n }\n\n blockMouseMoveRef.current = false;\n dataRef.current.openEvent = event;\n\n if (delay) {\n timeoutRef.current = window.setTimeout(\n () => {\n announceFloating();\n },\n getDelay(delay, \"open\", pointerTypeRef.current),\n );\n } else {\n announceFloating();\n }\n }\n\n if (isElement(reference)) {\n reference.addEventListener(\"mouseenter\", onMouseEnter);\n return () => {\n reference.removeEventListener(\"mouseenter\", onMouseEnter);\n };\n }\n }, [dataRef, delay, open, refs.reference, refs.floating, announce]);\n\n function setPointerRef(event: PointerEvent) {\n pointerTypeRef.current = event.pointerType;\n }\n\n return {\n reference: {\n onPointerDown: setPointerRef,\n onPointerEnter: setPointerRef,\n },\n floating: {\n onMouseEnter() {\n clearTimeout(timeoutRef.current);\n },\n },\n };\n};\n"],"names":[],"mappings":"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"}
@@ -1,8 +1,15 @@
1
1
  import { type ComponentType } from "react";
2
- export interface AriaAnnounceProps {
2
+ import type { AnnounceFnOptions } from "./AriaAnnouncerContext";
3
+ export interface AriaAnnounceProps extends AnnounceFnOptions {
3
4
  /**
4
- * String which will be announced by screen readers on change
5
+ * String to be announced by screenreader.
5
6
  */
6
7
  announcement?: string;
8
+ /**
9
+ * Legacy option, precede the announcement with a delay.
10
+ * @deprecated
11
+ * useAriaAnnouncer `delay` arg is deprecated, use your own `setTimeout` or consider using `duration` through `AnnounceFnOptions` instead.
12
+ */
13
+ delay?: number;
7
14
  }
8
15
  export declare const AriaAnnounce: ComponentType<AriaAnnounceProps>;
@@ -1,5 +1,29 @@
1
- export type AnnounceFn = (announcement: string, delay?: number) => void;
1
+ import { type AriaAttributes } from "react";
2
+ export type AnnounceFnOptions = {
3
+ /**
4
+ * Assertiveness
5
+ */
6
+ ariaLive?: Exclude<AriaAttributes["aria-live"], "off">;
7
+ /**
8
+ * How long (ms) the announcement should remain in the DOM before being removed.
9
+ * Defaults to the provider's ANNOUNCEMENT_TIME_IN_DOM.
10
+ */
11
+ duration?: number;
12
+ /**
13
+ * Optional named target live region.
14
+ * When set, announcements can be routed to a provider registered with the same target.
15
+ */
16
+ target?: string;
17
+ };
2
18
  export type AriaAnnouncer = {
3
- announce: AnnounceFn;
19
+ /**
20
+ * TODO remove legacy `delay` arg (number) in favour of `options` (AnnounceFnOptions) as a breaking change
21
+ */
22
+ /**
23
+ * Announcer function
24
+ * @param announcement - announcement to queue for screenreader.
25
+ * @param legacyDelayOrOptions, deprecated `delay` or `options` for announcement
26
+ */
27
+ announce: (announcement: string, legacyDelayOrOptions?: number | AnnounceFnOptions) => void;
4
28
  };
5
29
  export declare const AriaAnnouncerContext: import("react").Context<AriaAnnouncer | undefined>;
@@ -1,10 +1,9 @@
1
- import { type CSSProperties, type ReactNode } from "react";
2
- export declare const ARIA_ANNOUNCE_DELAY = 150;
3
- export interface AriaAnnouncerProviderProps {
4
- children?: ReactNode;
1
+ import { type ComponentPropsWithRef } from "react";
2
+ export declare const ANNOUNCEMENT_TIME_IN_DOM = 300;
3
+ export interface AriaAnnouncerProviderProps extends ComponentPropsWithRef<"div"> {
5
4
  /**
6
- * Style overrides for the aria-live element
5
+ * Optional target key used to route announcements to this provider.
7
6
  */
8
- style?: CSSProperties;
7
+ target?: string;
9
8
  }
10
- export declare function AriaAnnouncerProvider({ children, style, }: AriaAnnouncerProviderProps): import("react/jsx-runtime").JSX.Element;
9
+ export declare const AriaAnnouncerProvider: import("react").ForwardRefExoticComponent<Omit<AriaAnnouncerProviderProps, "ref"> & import("react").RefAttributes<HTMLDivElement>>;
@@ -0,0 +1,5 @@
1
+ import type { AnnounceFnOptions } from "./AriaAnnouncerContext";
2
+ type Announcer = (announcement: string, options?: AnnounceFnOptions) => void;
3
+ export declare function registerAnnouncementTarget(target: string, announce: Announcer): () => void;
4
+ export declare function getAnnouncementTarget(target: string): Announcer | undefined;
5
+ export {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@salt-ds/core",
3
- "version": "1.59.1",
3
+ "version": "1.60.0",
4
4
  "license": "Apache-2.0",
5
5
  "repository": {
6
6
  "type": "git",