@fluentui/react-tabster 9.16.1 → 9.17.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/CHANGELOG.md CHANGED
@@ -1,12 +1,36 @@
1
1
  # Change Log - @fluentui/react-tabster
2
2
 
3
- This log was last generated on Wed, 03 Jan 2024 09:22:10 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 16 Jan 2024 13:07:04 GMT and should not be manually modified.
4
4
 
5
5
  <!-- Start content -->
6
6
 
7
+ ## [9.17.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabster_v9.17.1)
8
+
9
+ Tue, 16 Jan 2024 13:07:04 GMT
10
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tabster_v9.17.0..@fluentui/react-tabster_v9.17.1)
11
+
12
+ ### Patches
13
+
14
+ - fix: memoize tabster attributes ([PR #30289](https://github.com/microsoft/fluentui/pull/30289) by lingfangao@hotmail.com)
15
+ - fix: correct version of @types/react-dom peer dep that matches for 16.x ([PR #30259](https://github.com/microsoft/fluentui/pull/30259) by mgodbolt@microsoft.com)
16
+
17
+ ## [9.17.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabster_v9.17.0)
18
+
19
+ Mon, 08 Jan 2024 16:24:26 GMT
20
+ [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tabster_v9.16.1..@fluentui/react-tabster_v9.17.0)
21
+
22
+ ### Minor changes
23
+
24
+ - feat: `useOnKeyboardNavigationChange` to subscribe to changes in keyboard navigation mode ([PR #30219](https://github.com/microsoft/fluentui/pull/30219) by lingfangao@hotmail.com)
25
+ - Bump @fluentui/react-utilities to v9.15.6 ([PR #30179](https://github.com/microsoft/fluentui/pull/30179) by beachball)
26
+
27
+ ### Patches
28
+
29
+ - fix(useArrowNavigationGroup): should always memorize last focused element ([PR #30112](https://github.com/microsoft/fluentui/pull/30112) by lingfangao@hotmail.com)
30
+
7
31
  ## [9.16.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabster_v9.16.1)
8
32
 
9
- Wed, 03 Jan 2024 09:22:10 GMT
33
+ Wed, 03 Jan 2024 09:26:44 GMT
10
34
  [Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tabster_v9.16.0..@fluentui/react-tabster_v9.16.1)
11
35
 
12
36
  ### Patches
package/dist/index.d.ts CHANGED
@@ -122,6 +122,7 @@ export declare interface UseArrowNavigationGroupOptions {
122
122
  /**
123
123
  * Last focused element in the group will be remembered and focused (if still
124
124
  * available) when tabbing from outside of the group
125
+ * @default true
125
126
  */
126
127
  memorizeCurrent?: boolean;
127
128
  /**
@@ -251,6 +252,14 @@ export declare interface UseModalAttributesOptions {
251
252
 
252
253
  export declare function useObservedElement(name: string | string[]): Types.TabsterDOMAttribute;
253
254
 
255
+ /**
256
+ * Instantiates [keyborg](https://github.com/microsoft/keyborg) and subscribes to changes
257
+ * in the keyboard navigation mode.
258
+ *
259
+ * @param callback - called every time the keyboard navigation state changes
260
+ */
261
+ export declare function useOnKeyboardNavigationChange(callback: (isNavigatingWithKeyboard: boolean) => void): void;
262
+
254
263
  /**
255
264
  * Focus will be restored to the most recent target element when it is lost from a source
256
265
  * @returns Attribute to apply to the element that might lose focus
@@ -4,6 +4,7 @@ export * from './useFocusFinders';
4
4
  export * from './useFocusVisible';
5
5
  export * from './useFocusWithin';
6
6
  export * from './useKeyboardNavAttribute';
7
+ export * from './useOnKeyboardNavigationChange';
7
8
  export * from './useModalAttributes';
8
9
  export * from './useTabsterAttributes';
9
10
  export * from './useObservedElement';
@@ -1 +1 @@
1
- {"version":3,"sources":["index.ts"],"sourcesContent":["export * from './useArrowNavigationGroup';\nexport * from './useFocusableGroup';\nexport * from './useFocusFinders';\nexport * from './useFocusVisible';\nexport * from './useFocusWithin';\nexport * from './useKeyboardNavAttribute';\nexport * from './useModalAttributes';\nexport * from './useTabsterAttributes';\nexport * from './useObservedElement';\nexport * from './useMergeTabsterAttributes';\nexport * from './useFocusObserved';\nexport * from './useRestoreFocus';\nexport * from './useUncontrolledFocus';\n"],"names":[],"mappings":"AAAA,cAAc,4BAA4B;AAC1C,cAAc,sBAAsB;AACpC,cAAc,oBAAoB;AAClC,cAAc,oBAAoB;AAClC,cAAc,mBAAmB;AACjC,cAAc,4BAA4B;AAC1C,cAAc,uBAAuB;AACrC,cAAc,yBAAyB;AACvC,cAAc,uBAAuB;AACrC,cAAc,8BAA8B;AAC5C,cAAc,qBAAqB;AACnC,cAAc,oBAAoB;AAClC,cAAc,yBAAyB"}
1
+ {"version":3,"sources":["index.ts"],"sourcesContent":["export * from './useArrowNavigationGroup';\nexport * from './useFocusableGroup';\nexport * from './useFocusFinders';\nexport * from './useFocusVisible';\nexport * from './useFocusWithin';\nexport * from './useKeyboardNavAttribute';\nexport * from './useOnKeyboardNavigationChange';\nexport * from './useModalAttributes';\nexport * from './useTabsterAttributes';\nexport * from './useObservedElement';\nexport * from './useMergeTabsterAttributes';\nexport * from './useFocusObserved';\nexport * from './useRestoreFocus';\nexport * from './useUncontrolledFocus';\n"],"names":[],"mappings":"AAAA,cAAc,4BAA4B;AAC1C,cAAc,sBAAsB;AACpC,cAAc,oBAAoB;AAClC,cAAc,oBAAoB;AAClC,cAAc,mBAAmB;AACjC,cAAc,4BAA4B;AAC1C,cAAc,kCAAkC;AAChD,cAAc,uBAAuB;AACrC,cAAc,yBAAyB;AACvC,cAAc,uBAAuB;AACrC,cAAc,8BAA8B;AAC5C,cAAc,qBAAqB;AACnC,cAAc,oBAAoB;AAClC,cAAc,yBAAyB"}
@@ -5,7 +5,7 @@ import { useTabster } from './useTabster';
5
5
  * A hook that returns the necessary tabster attributes to support arrow key navigation
6
6
  * @param options - Options to configure keyboard navigation
7
7
  */ export const useArrowNavigationGroup = (options = {})=>{
8
- const { circular, axis, memorizeCurrent, tabbable, ignoreDefaultKeydown, // eslint-disable-next-line @typescript-eslint/naming-convention
8
+ const { circular, axis, memorizeCurrent = true, tabbable, ignoreDefaultKeydown, // eslint-disable-next-line @typescript-eslint/naming-convention
9
9
  unstable_hasDefault } = options;
10
10
  const tabster = useTabster();
11
11
  if (tabster) {
@@ -1 +1 @@
1
- {"version":3,"sources":["useArrowNavigationGroup.ts"],"sourcesContent":["import { Types, getMover } from 'tabster';\nimport { useTabsterAttributes } from './useTabsterAttributes';\nimport { useTabster } from './useTabster';\n\nexport interface UseArrowNavigationGroupOptions {\n /**\n * Focus will navigate vertically, horizontally or in both directions (grid), defaults to horizontally\n * @defaultValue vertical\n */\n axis?: 'vertical' | 'horizontal' | 'grid' | 'grid-linear' | 'both';\n /**\n * Focus will cycle to the first/last elements of the group without stopping\n */\n circular?: boolean;\n /**\n * Last focused element in the group will be remembered and focused (if still\n * available) when tabbing from outside of the group\n */\n memorizeCurrent?: boolean;\n /**\n * Allow tabbing within the arrow navigation group items.\n */\n tabbable?: boolean;\n /**\n * Tabster should ignore default handling of keydown events\n */\n ignoreDefaultKeydown?: Types.FocusableProps['ignoreKeydown'];\n /**\n * The default focusable item in the group will be an element with Focusable.isDefault property.\n * Note that there is no way in \\@fluentui/react-tabster to set default focusable element,\n * and this option is currently for internal testing purposes only.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n unstable_hasDefault?: boolean;\n}\n\n/**\n * A hook that returns the necessary tabster attributes to support arrow key navigation\n * @param options - Options to configure keyboard navigation\n */\nexport const useArrowNavigationGroup = (options: UseArrowNavigationGroupOptions = {}): Types.TabsterDOMAttribute => {\n const {\n circular,\n axis,\n memorizeCurrent,\n tabbable,\n ignoreDefaultKeydown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n unstable_hasDefault,\n } = options;\n const tabster = useTabster();\n\n if (tabster) {\n getMover(tabster);\n }\n\n return useTabsterAttributes({\n mover: {\n cyclic: !!circular,\n direction: axisToMoverDirection(axis ?? 'vertical'),\n memorizeCurrent,\n tabbable,\n hasDefault: unstable_hasDefault,\n },\n ...(ignoreDefaultKeydown && {\n focusable: {\n ignoreKeydown: ignoreDefaultKeydown,\n },\n }),\n });\n};\n\nfunction axisToMoverDirection(axis: UseArrowNavigationGroupOptions['axis']): Types.MoverDirection {\n switch (axis) {\n case 'horizontal':\n return Types.MoverDirections.Horizontal;\n case 'grid':\n return Types.MoverDirections.Grid;\n case 'grid-linear':\n return Types.MoverDirections.GridLinear;\n case 'both':\n return Types.MoverDirections.Both;\n\n case 'vertical':\n default:\n return Types.MoverDirections.Vertical;\n }\n}\n"],"names":["Types","getMover","useTabsterAttributes","useTabster","useArrowNavigationGroup","options","circular","axis","memorizeCurrent","tabbable","ignoreDefaultKeydown","unstable_hasDefault","tabster","mover","cyclic","direction","axisToMoverDirection","hasDefault","focusable","ignoreKeydown","MoverDirections","Horizontal","Grid","GridLinear","Both","Vertical"],"mappings":"AAAA,SAASA,KAAK,EAAEC,QAAQ,QAAQ,UAAU;AAC1C,SAASC,oBAAoB,QAAQ,yBAAyB;AAC9D,SAASC,UAAU,QAAQ,eAAe;AAkC1C;;;CAGC,GACD,OAAO,MAAMC,0BAA0B,CAACC,UAA0C,CAAC,CAAC;IAClF,MAAM,EACJC,QAAQ,EACRC,IAAI,EACJC,eAAe,EACfC,QAAQ,EACRC,oBAAoB,EACpB,gEAAgE;IAChEC,mBAAmB,EACpB,GAAGN;IACJ,MAAMO,UAAUT;IAEhB,IAAIS,SAAS;QACXX,SAASW;IACX;IAEA,OAAOV,qBAAqB;QAC1BW,OAAO;YACLC,QAAQ,CAAC,CAACR;YACVS,WAAWC,qBAAqBT,iBAAAA,kBAAAA,OAAQ;YACxCC;YACAC;YACAQ,YAAYN;QACd;QACA,GAAID,wBAAwB;YAC1BQ,WAAW;gBACTC,eAAeT;YACjB;QACF,CAAC;IACH;AACF,EAAE;AAEF,SAASM,qBAAqBT,IAA4C;IACxE,OAAQA;QACN,KAAK;YACH,OAAOP,MAAMoB,eAAe,CAACC,UAAU;QACzC,KAAK;YACH,OAAOrB,MAAMoB,eAAe,CAACE,IAAI;QACnC,KAAK;YACH,OAAOtB,MAAMoB,eAAe,CAACG,UAAU;QACzC,KAAK;YACH,OAAOvB,MAAMoB,eAAe,CAACI,IAAI;QAEnC,KAAK;QACL;YACE,OAAOxB,MAAMoB,eAAe,CAACK,QAAQ;IACzC;AACF"}
1
+ {"version":3,"sources":["useArrowNavigationGroup.ts"],"sourcesContent":["import { Types, getMover } from 'tabster';\nimport { useTabsterAttributes } from './useTabsterAttributes';\nimport { useTabster } from './useTabster';\n\nexport interface UseArrowNavigationGroupOptions {\n /**\n * Focus will navigate vertically, horizontally or in both directions (grid), defaults to horizontally\n * @defaultValue vertical\n */\n axis?: 'vertical' | 'horizontal' | 'grid' | 'grid-linear' | 'both';\n /**\n * Focus will cycle to the first/last elements of the group without stopping\n */\n circular?: boolean;\n /**\n * Last focused element in the group will be remembered and focused (if still\n * available) when tabbing from outside of the group\n * @default true\n */\n memorizeCurrent?: boolean;\n /**\n * Allow tabbing within the arrow navigation group items.\n */\n tabbable?: boolean;\n /**\n * Tabster should ignore default handling of keydown events\n */\n ignoreDefaultKeydown?: Types.FocusableProps['ignoreKeydown'];\n /**\n * The default focusable item in the group will be an element with Focusable.isDefault property.\n * Note that there is no way in \\@fluentui/react-tabster to set default focusable element,\n * and this option is currently for internal testing purposes only.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n unstable_hasDefault?: boolean;\n}\n\n/**\n * A hook that returns the necessary tabster attributes to support arrow key navigation\n * @param options - Options to configure keyboard navigation\n */\nexport const useArrowNavigationGroup = (options: UseArrowNavigationGroupOptions = {}): Types.TabsterDOMAttribute => {\n const {\n circular,\n axis,\n memorizeCurrent = true,\n tabbable,\n ignoreDefaultKeydown,\n // eslint-disable-next-line @typescript-eslint/naming-convention\n unstable_hasDefault,\n } = options;\n const tabster = useTabster();\n\n if (tabster) {\n getMover(tabster);\n }\n\n return useTabsterAttributes({\n mover: {\n cyclic: !!circular,\n direction: axisToMoverDirection(axis ?? 'vertical'),\n memorizeCurrent,\n tabbable,\n hasDefault: unstable_hasDefault,\n },\n ...(ignoreDefaultKeydown && {\n focusable: {\n ignoreKeydown: ignoreDefaultKeydown,\n },\n }),\n });\n};\n\nfunction axisToMoverDirection(axis: UseArrowNavigationGroupOptions['axis']): Types.MoverDirection {\n switch (axis) {\n case 'horizontal':\n return Types.MoverDirections.Horizontal;\n case 'grid':\n return Types.MoverDirections.Grid;\n case 'grid-linear':\n return Types.MoverDirections.GridLinear;\n case 'both':\n return Types.MoverDirections.Both;\n\n case 'vertical':\n default:\n return Types.MoverDirections.Vertical;\n }\n}\n"],"names":["Types","getMover","useTabsterAttributes","useTabster","useArrowNavigationGroup","options","circular","axis","memorizeCurrent","tabbable","ignoreDefaultKeydown","unstable_hasDefault","tabster","mover","cyclic","direction","axisToMoverDirection","hasDefault","focusable","ignoreKeydown","MoverDirections","Horizontal","Grid","GridLinear","Both","Vertical"],"mappings":"AAAA,SAASA,KAAK,EAAEC,QAAQ,QAAQ,UAAU;AAC1C,SAASC,oBAAoB,QAAQ,yBAAyB;AAC9D,SAASC,UAAU,QAAQ,eAAe;AAmC1C;;;CAGC,GACD,OAAO,MAAMC,0BAA0B,CAACC,UAA0C,CAAC,CAAC;IAClF,MAAM,EACJC,QAAQ,EACRC,IAAI,EACJC,kBAAkB,IAAI,EACtBC,QAAQ,EACRC,oBAAoB,EACpB,gEAAgE;IAChEC,mBAAmB,EACpB,GAAGN;IACJ,MAAMO,UAAUT;IAEhB,IAAIS,SAAS;QACXX,SAASW;IACX;IAEA,OAAOV,qBAAqB;QAC1BW,OAAO;YACLC,QAAQ,CAAC,CAACR;YACVS,WAAWC,qBAAqBT,iBAAAA,kBAAAA,OAAQ;YACxCC;YACAC;YACAQ,YAAYN;QACd;QACA,GAAID,wBAAwB;YAC1BQ,WAAW;gBACTC,eAAeT;YACjB;QACF,CAAC;IACH;AACF,EAAE;AAEF,SAASM,qBAAqBT,IAA4C;IACxE,OAAQA;QACN,KAAK;YACH,OAAOP,MAAMoB,eAAe,CAACC,UAAU;QACzC,KAAK;YACH,OAAOrB,MAAMoB,eAAe,CAACE,IAAI;QACnC,KAAK;YACH,OAAOtB,MAAMoB,eAAe,CAACG,UAAU;QACzC,KAAK;YACH,OAAOvB,MAAMoB,eAAe,CAACI,IAAI;QAEnC,KAAK;QACL;YACE,OAAOxB,MAAMoB,eAAe,CAACK,QAAQ;IACzC;AACF"}
@@ -9,18 +9,17 @@ import { Types } from 'tabster';
9
9
  * @returns single merged tabster attribute
10
10
  */ export const useMergedTabsterAttributes_unstable = (...attributes)=>{
11
11
  const stringAttributes = attributes.map((attribute)=>attribute[Types.TabsterAttributeName]).filter(Boolean);
12
- const mergedStrigAttribute = React.useMemo(()=>{
12
+ return React.useMemo(()=>{
13
13
  let attribute = stringAttributes[0];
14
14
  attributes.shift();
15
15
  for (const attr of stringAttributes){
16
16
  attribute = mergeAttributes(attribute, attr);
17
17
  }
18
- return attribute;
18
+ return {
19
+ [Types.TabsterAttributeName]: attribute
20
+ };
19
21
  // eslint-disable-next-line react-hooks/exhaustive-deps
20
22
  }, stringAttributes);
21
- return {
22
- [Types.TabsterAttributeName]: mergedStrigAttribute
23
- };
24
23
  };
25
24
  function mergeAttributes(a, b) {
26
25
  if (!b) {
@@ -1 +1 @@
1
- {"version":3,"sources":["useMergeTabsterAttributes.ts"],"sourcesContent":["import * as React from 'react';\nimport { Types } from 'tabster';\n\n/**\n * Merges a collection of tabster attributes.\n *\n * ⚠️The attributes passed as arguments to this hook cannot change at runtime.\n * @internal\n * @param attributes - collection of tabster attributes from other react-tabster hooks\n * @returns single merged tabster attribute\n */\nexport const useMergedTabsterAttributes_unstable: (\n ...attributes: Types.TabsterDOMAttribute[]\n) => Types.TabsterDOMAttribute = (...attributes) => {\n const stringAttributes = attributes\n .map(attribute => attribute[Types.TabsterAttributeName])\n .filter(Boolean) as string[];\n\n const mergedStrigAttribute = React.useMemo(() => {\n let attribute = stringAttributes[0];\n attributes.shift();\n\n for (const attr of stringAttributes) {\n attribute = mergeAttributes(attribute, attr);\n }\n\n return attribute;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, stringAttributes);\n\n return { [Types.TabsterAttributeName]: mergedStrigAttribute };\n};\n\nfunction mergeAttributes(a: string, b?: string): string {\n if (!b) {\n return a;\n }\n\n let aParsed = {};\n let bParsed = {};\n if (a) {\n try {\n aParsed = JSON.parse(a);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n if (b) {\n try {\n bParsed = JSON.parse(b);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return JSON.stringify({ ...aParsed, ...bParsed });\n}\n"],"names":["React","Types","useMergedTabsterAttributes_unstable","attributes","stringAttributes","map","attribute","TabsterAttributeName","filter","Boolean","mergedStrigAttribute","useMemo","shift","attr","mergeAttributes","a","b","aParsed","bParsed","JSON","parse","stringify"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,KAAK,QAAQ,UAAU;AAEhC;;;;;;;CAOC,GACD,OAAO,MAAMC,sCAEoB,CAAC,GAAGC;IACnC,MAAMC,mBAAmBD,WACtBE,GAAG,CAACC,CAAAA,YAAaA,SAAS,CAACL,MAAMM,oBAAoB,CAAC,EACtDC,MAAM,CAACC;IAEV,MAAMC,uBAAuBV,MAAMW,OAAO,CAAC;QACzC,IAAIL,YAAYF,gBAAgB,CAAC,EAAE;QACnCD,WAAWS,KAAK;QAEhB,KAAK,MAAMC,QAAQT,iBAAkB;YACnCE,YAAYQ,gBAAgBR,WAAWO;QACzC;QAEA,OAAOP;IACP,uDAAuD;IACzD,GAAGF;IAEH,OAAO;QAAE,CAACH,MAAMM,oBAAoB,CAAC,EAAEG;IAAqB;AAC9D,EAAE;AAEF,SAASI,gBAAgBC,CAAS,EAAEC,CAAU;IAC5C,IAAI,CAACA,GAAG;QACN,OAAOD;IACT;IAEA,IAAIE,UAAU,CAAC;IACf,IAAIC,UAAU,CAAC;IACf,IAAIH,GAAG;QACL,IAAI;YACFE,UAAUE,KAAKC,KAAK,CAACL;QACrB,oCAAoC;QACtC,EAAE,OAAM,CAAC;IACX;IAEA,IAAIC,GAAG;QACL,IAAI;YACFE,UAAUC,KAAKC,KAAK,CAACJ;QACrB,oCAAoC;QACtC,EAAE,OAAM,CAAC;IACX;IAEA,OAAOG,KAAKE,SAAS,CAAC;QAAE,GAAGJ,OAAO;QAAE,GAAGC,OAAO;IAAC;AACjD"}
1
+ {"version":3,"sources":["useMergeTabsterAttributes.ts"],"sourcesContent":["import * as React from 'react';\nimport { Types } from 'tabster';\n\n/**\n * Merges a collection of tabster attributes.\n *\n * ⚠️The attributes passed as arguments to this hook cannot change at runtime.\n * @internal\n * @param attributes - collection of tabster attributes from other react-tabster hooks\n * @returns single merged tabster attribute\n */\nexport const useMergedTabsterAttributes_unstable: (\n ...attributes: Types.TabsterDOMAttribute[]\n) => Types.TabsterDOMAttribute = (...attributes) => {\n const stringAttributes = attributes\n .map(attribute => attribute[Types.TabsterAttributeName])\n .filter(Boolean) as string[];\n\n return React.useMemo(() => {\n let attribute = stringAttributes[0];\n attributes.shift();\n\n for (const attr of stringAttributes) {\n attribute = mergeAttributes(attribute, attr);\n }\n\n return { [Types.TabsterAttributeName]: attribute };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, stringAttributes);\n};\n\nfunction mergeAttributes(a: string, b?: string): string {\n if (!b) {\n return a;\n }\n\n let aParsed = {};\n let bParsed = {};\n if (a) {\n try {\n aParsed = JSON.parse(a);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n if (b) {\n try {\n bParsed = JSON.parse(b);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n\n return JSON.stringify({ ...aParsed, ...bParsed });\n}\n"],"names":["React","Types","useMergedTabsterAttributes_unstable","attributes","stringAttributes","map","attribute","TabsterAttributeName","filter","Boolean","useMemo","shift","attr","mergeAttributes","a","b","aParsed","bParsed","JSON","parse","stringify"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,KAAK,QAAQ,UAAU;AAEhC;;;;;;;CAOC,GACD,OAAO,MAAMC,sCAEoB,CAAC,GAAGC;IACnC,MAAMC,mBAAmBD,WACtBE,GAAG,CAACC,CAAAA,YAAaA,SAAS,CAACL,MAAMM,oBAAoB,CAAC,EACtDC,MAAM,CAACC;IAEV,OAAOT,MAAMU,OAAO,CAAC;QACnB,IAAIJ,YAAYF,gBAAgB,CAAC,EAAE;QACnCD,WAAWQ,KAAK;QAEhB,KAAK,MAAMC,QAAQR,iBAAkB;YACnCE,YAAYO,gBAAgBP,WAAWM;QACzC;QAEA,OAAO;YAAE,CAACX,MAAMM,oBAAoB,CAAC,EAAED;QAAU;IACjD,uDAAuD;IACzD,GAAGF;AACL,EAAE;AAEF,SAASS,gBAAgBC,CAAS,EAAEC,CAAU;IAC5C,IAAI,CAACA,GAAG;QACN,OAAOD;IACT;IAEA,IAAIE,UAAU,CAAC;IACf,IAAIC,UAAU,CAAC;IACf,IAAIH,GAAG;QACL,IAAI;YACFE,UAAUE,KAAKC,KAAK,CAACL;QACrB,oCAAoC;QACtC,EAAE,OAAM,CAAC;IACX;IAEA,IAAIC,GAAG;QACL,IAAI;YACFE,UAAUC,KAAKC,KAAK,CAACJ;QACrB,oCAAoC;QACtC,EAAE,OAAM,CAAC;IACX;IAEA,OAAOG,KAAKE,SAAS,CAAC;QAAE,GAAGJ,OAAO;QAAE,GAAGC,OAAO;IAAC;AACjD"}
@@ -0,0 +1,33 @@
1
+ import * as React from 'react';
2
+ import { createKeyborg, disposeKeyborg } from 'keyborg';
3
+ import { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';
4
+ import { useEventCallback } from '@fluentui/react-utilities';
5
+ /**
6
+ * Instantiates [keyborg](https://github.com/microsoft/keyborg) and subscribes to changes
7
+ * in the keyboard navigation mode.
8
+ *
9
+ * @param callback - called every time the keyboard navigation state changes
10
+ */ export function useOnKeyboardNavigationChange(callback) {
11
+ const { targetDocument } = useFluent();
12
+ const keyborg = React.useMemo(()=>targetDocument && createKeyborg(targetDocument.defaultView), [
13
+ targetDocument
14
+ ]);
15
+ const eventCallback = useEventCallback(callback);
16
+ React.useEffect(()=>{
17
+ if (keyborg) {
18
+ const cb = (next)=>{
19
+ eventCallback(next);
20
+ };
21
+ keyborg.subscribe(cb);
22
+ return ()=>keyborg.unsubscribe(cb);
23
+ }
24
+ }, [
25
+ keyborg,
26
+ eventCallback
27
+ ]);
28
+ React.useEffect(()=>{
29
+ return ()=>keyborg && disposeKeyborg(keyborg);
30
+ }, [
31
+ keyborg
32
+ ]);
33
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useOnKeyboardNavigationChange.ts"],"sourcesContent":["import * as React from 'react';\nimport { createKeyborg, disposeKeyborg } from 'keyborg';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport type { KeyborgCallback } from 'keyborg';\nimport { useEventCallback } from '@fluentui/react-utilities';\n\n/**\n * Instantiates [keyborg](https://github.com/microsoft/keyborg) and subscribes to changes\n * in the keyboard navigation mode.\n *\n * @param callback - called every time the keyboard navigation state changes\n */\nexport function useOnKeyboardNavigationChange(callback: (isNavigatingWithKeyboard: boolean) => void) {\n const { targetDocument } = useFluent();\n const keyborg = React.useMemo(() => targetDocument && createKeyborg(targetDocument.defaultView!), [targetDocument]);\n const eventCallback = useEventCallback(callback);\n React.useEffect(() => {\n if (keyborg) {\n const cb: KeyborgCallback = next => {\n eventCallback(next);\n };\n keyborg.subscribe(cb);\n return () => keyborg.unsubscribe(cb);\n }\n }, [keyborg, eventCallback]);\n\n React.useEffect(() => {\n return () => keyborg && disposeKeyborg(keyborg);\n }, [keyborg]);\n}\n"],"names":["React","createKeyborg","disposeKeyborg","useFluent_unstable","useFluent","useEventCallback","useOnKeyboardNavigationChange","callback","targetDocument","keyborg","useMemo","defaultView","eventCallback","useEffect","cb","next","subscribe","unsubscribe"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,aAAa,EAAEC,cAAc,QAAQ,UAAU;AACxD,SAASC,sBAAsBC,SAAS,QAAQ,kCAAkC;AAElF,SAASC,gBAAgB,QAAQ,4BAA4B;AAE7D;;;;;CAKC,GACD,OAAO,SAASC,8BAA8BC,QAAqD;IACjG,MAAM,EAAEC,cAAc,EAAE,GAAGJ;IAC3B,MAAMK,UAAUT,MAAMU,OAAO,CAAC,IAAMF,kBAAkBP,cAAcO,eAAeG,WAAW,GAAI;QAACH;KAAe;IAClH,MAAMI,gBAAgBP,iBAAiBE;IACvCP,MAAMa,SAAS,CAAC;QACd,IAAIJ,SAAS;YACX,MAAMK,KAAsBC,CAAAA;gBAC1BH,cAAcG;YAChB;YACAN,QAAQO,SAAS,CAACF;YAClB,OAAO,IAAML,QAAQQ,WAAW,CAACH;QACnC;IACF,GAAG;QAACL;QAASG;KAAc;IAE3BZ,MAAMa,SAAS,CAAC;QACd,OAAO,IAAMJ,WAAWP,eAAeO;IACzC,GAAG;QAACA;KAAQ;AACd"}
@@ -1,5 +1,6 @@
1
1
  import { getTabsterAttribute } from 'tabster';
2
2
  import { useTabster } from './useTabster';
3
+ import * as React from 'react';
3
4
  /**
4
5
  * @internal
5
6
  * Hook that returns tabster attributes while ensuring tabster exists
@@ -7,5 +8,10 @@ import { useTabster } from './useTabster';
7
8
  // A tabster instance is not necessary to generate tabster attributes
8
9
  // but calling the hook will ensure that a tabster instance exists internally and avoids consumers doing the same
9
10
  useTabster();
10
- return getTabsterAttribute(props);
11
+ const strAttr = getTabsterAttribute(props, true);
12
+ return React.useMemo(()=>({
13
+ 'data-tabster': strAttr
14
+ }), [
15
+ strAttr
16
+ ]);
11
17
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["useTabsterAttributes.ts"],"sourcesContent":["import { getTabsterAttribute, Types as TabsterTypes } from 'tabster';\nimport { useTabster } from './useTabster';\n\n/**\n * @internal\n * Hook that returns tabster attributes while ensuring tabster exists\n */\nexport const useTabsterAttributes = (props: TabsterTypes.TabsterAttributeProps): TabsterTypes.TabsterDOMAttribute => {\n // A tabster instance is not necessary to generate tabster attributes\n // but calling the hook will ensure that a tabster instance exists internally and avoids consumers doing the same\n useTabster();\n\n return getTabsterAttribute(props);\n};\n"],"names":["getTabsterAttribute","useTabster","useTabsterAttributes","props"],"mappings":"AAAA,SAASA,mBAAmB,QAA+B,UAAU;AACrE,SAASC,UAAU,QAAQ,eAAe;AAE1C;;;CAGC,GACD,OAAO,MAAMC,uBAAuB,CAACC;IACnC,qEAAqE;IACrE,iHAAiH;IACjHF;IAEA,OAAOD,oBAAoBG;AAC7B,EAAE"}
1
+ {"version":3,"sources":["useTabsterAttributes.ts"],"sourcesContent":["import { getTabsterAttribute, Types as TabsterTypes } from 'tabster';\nimport { useTabster } from './useTabster';\nimport * as React from 'react';\n\n/**\n * @internal\n * Hook that returns tabster attributes while ensuring tabster exists\n */\nexport const useTabsterAttributes = (props: TabsterTypes.TabsterAttributeProps): TabsterTypes.TabsterDOMAttribute => {\n // A tabster instance is not necessary to generate tabster attributes\n // but calling the hook will ensure that a tabster instance exists internally and avoids consumers doing the same\n useTabster();\n\n const strAttr = getTabsterAttribute(props, true);\n return React.useMemo(\n () => ({\n 'data-tabster': strAttr,\n }),\n [strAttr],\n );\n};\n"],"names":["getTabsterAttribute","useTabster","React","useTabsterAttributes","props","strAttr","useMemo"],"mappings":"AAAA,SAASA,mBAAmB,QAA+B,UAAU;AACrE,SAASC,UAAU,QAAQ,eAAe;AAC1C,YAAYC,WAAW,QAAQ;AAE/B;;;CAGC,GACD,OAAO,MAAMC,uBAAuB,CAACC;IACnC,qEAAqE;IACrE,iHAAiH;IACjHH;IAEA,MAAMI,UAAUL,oBAAoBI,OAAO;IAC3C,OAAOF,MAAMI,OAAO,CAClB,IAAO,CAAA;YACL,gBAAgBD;QAClB,CAAA,GACA;QAACA;KAAQ;AAEb,EAAE"}
package/lib/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { useArrowNavigationGroup, useFocusableGroup, useFocusFinders, useFocusVisible, useFocusWithin, useKeyboardNavAttribute, useModalAttributes, useTabsterAttributes, useObservedElement, useFocusObserved, useMergedTabsterAttributes_unstable, useRestoreFocusSource, useRestoreFocusTarget, useUncontrolledFocus } from './hooks/index';
1
+ export { useArrowNavigationGroup, useFocusableGroup, useFocusFinders, useFocusVisible, useFocusWithin, useKeyboardNavAttribute, useModalAttributes, useTabsterAttributes, useObservedElement, useFocusObserved, useMergedTabsterAttributes_unstable, useRestoreFocusSource, useRestoreFocusTarget, useUncontrolledFocus, useOnKeyboardNavigationChange } from './hooks/index';
2
2
  export { createCustomFocusIndicatorStyle, createFocusOutlineStyle } from './focus/index';
3
3
  export { applyFocusVisiblePolyfill } from './focus/index';
4
4
  export { KEYBORG_FOCUSIN } from 'keyborg';
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["index.ts"],"sourcesContent":["export {\n useArrowNavigationGroup,\n useFocusableGroup,\n useFocusFinders,\n useFocusVisible,\n useFocusWithin,\n useKeyboardNavAttribute,\n useModalAttributes,\n useTabsterAttributes,\n useObservedElement,\n useFocusObserved,\n useMergedTabsterAttributes_unstable,\n useRestoreFocusSource,\n useRestoreFocusTarget,\n useUncontrolledFocus,\n} from './hooks/index';\nexport type {\n UseArrowNavigationGroupOptions,\n UseFocusableGroupOptions,\n UseModalAttributesOptions,\n} from './hooks/index';\n\nexport { createCustomFocusIndicatorStyle, createFocusOutlineStyle } from './focus/index';\n\nexport type {\n CreateCustomFocusIndicatorStyleOptions,\n CreateFocusOutlineStyleOptions,\n FocusOutlineOffset,\n FocusOutlineStyleOptions,\n} from './focus/index';\n\nexport { applyFocusVisiblePolyfill } from './focus/index';\nimport { Types as TabsterTypes } from 'tabster';\n\nexport type TabsterDOMAttribute = TabsterTypes.TabsterDOMAttribute;\n\nexport type { KeyborgFocusInEvent } from 'keyborg';\nexport { KEYBORG_FOCUSIN } from 'keyborg';\n"],"names":["useArrowNavigationGroup","useFocusableGroup","useFocusFinders","useFocusVisible","useFocusWithin","useKeyboardNavAttribute","useModalAttributes","useTabsterAttributes","useObservedElement","useFocusObserved","useMergedTabsterAttributes_unstable","useRestoreFocusSource","useRestoreFocusTarget","useUncontrolledFocus","createCustomFocusIndicatorStyle","createFocusOutlineStyle","applyFocusVisiblePolyfill","KEYBORG_FOCUSIN"],"mappings":"AAAA,SACEA,uBAAuB,EACvBC,iBAAiB,EACjBC,eAAe,EACfC,eAAe,EACfC,cAAc,EACdC,uBAAuB,EACvBC,kBAAkB,EAClBC,oBAAoB,EACpBC,kBAAkB,EAClBC,gBAAgB,EAChBC,mCAAmC,EACnCC,qBAAqB,EACrBC,qBAAqB,EACrBC,oBAAoB,QACf,gBAAgB;AAOvB,SAASC,+BAA+B,EAAEC,uBAAuB,QAAQ,gBAAgB;AASzF,SAASC,yBAAyB,QAAQ,gBAAgB;AAM1D,SAASC,eAAe,QAAQ,UAAU"}
1
+ {"version":3,"sources":["index.ts"],"sourcesContent":["export {\n useArrowNavigationGroup,\n useFocusableGroup,\n useFocusFinders,\n useFocusVisible,\n useFocusWithin,\n useKeyboardNavAttribute,\n useModalAttributes,\n useTabsterAttributes,\n useObservedElement,\n useFocusObserved,\n useMergedTabsterAttributes_unstable,\n useRestoreFocusSource,\n useRestoreFocusTarget,\n useUncontrolledFocus,\n useOnKeyboardNavigationChange,\n} from './hooks/index';\nexport type {\n UseArrowNavigationGroupOptions,\n UseFocusableGroupOptions,\n UseModalAttributesOptions,\n} from './hooks/index';\n\nexport { createCustomFocusIndicatorStyle, createFocusOutlineStyle } from './focus/index';\n\nexport type {\n CreateCustomFocusIndicatorStyleOptions,\n CreateFocusOutlineStyleOptions,\n FocusOutlineOffset,\n FocusOutlineStyleOptions,\n} from './focus/index';\n\nexport { applyFocusVisiblePolyfill } from './focus/index';\nimport { Types as TabsterTypes } from 'tabster';\n\nexport type TabsterDOMAttribute = TabsterTypes.TabsterDOMAttribute;\n\nexport type { KeyborgFocusInEvent } from 'keyborg';\nexport { KEYBORG_FOCUSIN } from 'keyborg';\n"],"names":["useArrowNavigationGroup","useFocusableGroup","useFocusFinders","useFocusVisible","useFocusWithin","useKeyboardNavAttribute","useModalAttributes","useTabsterAttributes","useObservedElement","useFocusObserved","useMergedTabsterAttributes_unstable","useRestoreFocusSource","useRestoreFocusTarget","useUncontrolledFocus","useOnKeyboardNavigationChange","createCustomFocusIndicatorStyle","createFocusOutlineStyle","applyFocusVisiblePolyfill","KEYBORG_FOCUSIN"],"mappings":"AAAA,SACEA,uBAAuB,EACvBC,iBAAiB,EACjBC,eAAe,EACfC,eAAe,EACfC,cAAc,EACdC,uBAAuB,EACvBC,kBAAkB,EAClBC,oBAAoB,EACpBC,kBAAkB,EAClBC,gBAAgB,EAChBC,mCAAmC,EACnCC,qBAAqB,EACrBC,qBAAqB,EACrBC,oBAAoB,EACpBC,6BAA6B,QACxB,gBAAgB;AAOvB,SAASC,+BAA+B,EAAEC,uBAAuB,QAAQ,gBAAgB;AASzF,SAASC,yBAAyB,QAAQ,gBAAgB;AAM1D,SAASC,eAAe,QAAQ,UAAU"}
@@ -9,6 +9,7 @@ _export_star._(require("./useFocusFinders"), exports);
9
9
  _export_star._(require("./useFocusVisible"), exports);
10
10
  _export_star._(require("./useFocusWithin"), exports);
11
11
  _export_star._(require("./useKeyboardNavAttribute"), exports);
12
+ _export_star._(require("./useOnKeyboardNavigationChange"), exports);
12
13
  _export_star._(require("./useModalAttributes"), exports);
13
14
  _export_star._(require("./useTabsterAttributes"), exports);
14
15
  _export_star._(require("./useObservedElement"), exports);
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"sourcesContent":["export * from './useArrowNavigationGroup';\nexport * from './useFocusableGroup';\nexport * from './useFocusFinders';\nexport * from './useFocusVisible';\nexport * from './useFocusWithin';\nexport * from './useKeyboardNavAttribute';\nexport * from './useModalAttributes';\nexport * from './useTabsterAttributes';\nexport * from './useObservedElement';\nexport * from './useMergeTabsterAttributes';\nexport * from './useFocusObserved';\nexport * from './useRestoreFocus';\nexport * from './useUncontrolledFocus';\n"],"names":[],"mappings":";;;;;uBAAc;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA"}
1
+ {"version":3,"sources":["index.js"],"sourcesContent":["export * from './useArrowNavigationGroup';\nexport * from './useFocusableGroup';\nexport * from './useFocusFinders';\nexport * from './useFocusVisible';\nexport * from './useFocusWithin';\nexport * from './useKeyboardNavAttribute';\nexport * from './useOnKeyboardNavigationChange';\nexport * from './useModalAttributes';\nexport * from './useTabsterAttributes';\nexport * from './useObservedElement';\nexport * from './useMergeTabsterAttributes';\nexport * from './useFocusObserved';\nexport * from './useRestoreFocus';\nexport * from './useUncontrolledFocus';\n"],"names":[],"mappings":";;;;;uBAAc;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA;uBACA"}
@@ -12,7 +12,7 @@ const _tabster = require("tabster");
12
12
  const _useTabsterAttributes = require("./useTabsterAttributes");
13
13
  const _useTabster = require("./useTabster");
14
14
  const useArrowNavigationGroup = (options = {})=>{
15
- const { circular, axis, memorizeCurrent, tabbable, ignoreDefaultKeydown, unstable_hasDefault } = options;
15
+ const { circular, axis, memorizeCurrent = true, tabbable, ignoreDefaultKeydown, unstable_hasDefault } = options;
16
16
  const tabster = (0, _useTabster.useTabster)();
17
17
  if (tabster) {
18
18
  (0, _tabster.getMover)(tabster);
@@ -1 +1 @@
1
- {"version":3,"sources":["useArrowNavigationGroup.js"],"sourcesContent":["import { Types, getMover } from 'tabster';\nimport { useTabsterAttributes } from './useTabsterAttributes';\nimport { useTabster } from './useTabster';\n/**\n * A hook that returns the necessary tabster attributes to support arrow key navigation\n * @param options - Options to configure keyboard navigation\n */ export const useArrowNavigationGroup = (options = {})=>{\n const { circular, axis, memorizeCurrent, tabbable, ignoreDefaultKeydown, // eslint-disable-next-line @typescript-eslint/naming-convention\n unstable_hasDefault } = options;\n const tabster = useTabster();\n if (tabster) {\n getMover(tabster);\n }\n return useTabsterAttributes({\n mover: {\n cyclic: !!circular,\n direction: axisToMoverDirection(axis !== null && axis !== void 0 ? axis : 'vertical'),\n memorizeCurrent,\n tabbable,\n hasDefault: unstable_hasDefault\n },\n ...ignoreDefaultKeydown && {\n focusable: {\n ignoreKeydown: ignoreDefaultKeydown\n }\n }\n });\n};\nfunction axisToMoverDirection(axis) {\n switch(axis){\n case 'horizontal':\n return Types.MoverDirections.Horizontal;\n case 'grid':\n return Types.MoverDirections.Grid;\n case 'grid-linear':\n return Types.MoverDirections.GridLinear;\n case 'both':\n return Types.MoverDirections.Both;\n case 'vertical':\n default:\n return Types.MoverDirections.Vertical;\n }\n}\n"],"names":["useArrowNavigationGroup","options","circular","axis","memorizeCurrent","tabbable","ignoreDefaultKeydown","unstable_hasDefault","tabster","useTabster","getMover","useTabsterAttributes","mover","cyclic","direction","axisToMoverDirection","hasDefault","focusable","ignoreKeydown","Types","MoverDirections","Horizontal","Grid","GridLinear","Both","Vertical"],"mappings":";;;;+BAMiBA;;;eAAAA;;;yBANe;sCACK;4BACV;AAIhB,MAAMA,0BAA0B,CAACC,UAAU,CAAC,CAAC;IACpD,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,oBAAoB,EACvEC,mBAAmB,EAAE,GAAGN;IACxB,MAAMO,UAAUC,IAAAA,sBAAU;IAC1B,IAAID,SAAS;QACTE,IAAAA,iBAAQ,EAACF;IACb;IACA,OAAOG,IAAAA,0CAAoB,EAAC;QACxBC,OAAO;YACHC,QAAQ,CAAC,CAACX;YACVY,WAAWC,qBAAqBZ,SAAS,QAAQA,SAAS,KAAK,IAAIA,OAAO;YAC1EC;YACAC;YACAW,YAAYT;QAChB;QACA,GAAGD,wBAAwB;YACvBW,WAAW;gBACPC,eAAeZ;YACnB;QACJ,CAAC;IACL;AACJ;AACA,SAASS,qBAAqBZ,IAAI;IAC9B,OAAOA;QACH,KAAK;YACD,OAAOgB,cAAK,CAACC,eAAe,CAACC,UAAU;QAC3C,KAAK;YACD,OAAOF,cAAK,CAACC,eAAe,CAACE,IAAI;QACrC,KAAK;YACD,OAAOH,cAAK,CAACC,eAAe,CAACG,UAAU;QAC3C,KAAK;YACD,OAAOJ,cAAK,CAACC,eAAe,CAACI,IAAI;QACrC,KAAK;QACL;YACI,OAAOL,cAAK,CAACC,eAAe,CAACK,QAAQ;IAC7C;AACJ"}
1
+ {"version":3,"sources":["useArrowNavigationGroup.js"],"sourcesContent":["import { Types, getMover } from 'tabster';\nimport { useTabsterAttributes } from './useTabsterAttributes';\nimport { useTabster } from './useTabster';\n/**\n * A hook that returns the necessary tabster attributes to support arrow key navigation\n * @param options - Options to configure keyboard navigation\n */ export const useArrowNavigationGroup = (options = {})=>{\n const { circular, axis, memorizeCurrent = true, tabbable, ignoreDefaultKeydown, // eslint-disable-next-line @typescript-eslint/naming-convention\n unstable_hasDefault } = options;\n const tabster = useTabster();\n if (tabster) {\n getMover(tabster);\n }\n return useTabsterAttributes({\n mover: {\n cyclic: !!circular,\n direction: axisToMoverDirection(axis !== null && axis !== void 0 ? axis : 'vertical'),\n memorizeCurrent,\n tabbable,\n hasDefault: unstable_hasDefault\n },\n ...ignoreDefaultKeydown && {\n focusable: {\n ignoreKeydown: ignoreDefaultKeydown\n }\n }\n });\n};\nfunction axisToMoverDirection(axis) {\n switch(axis){\n case 'horizontal':\n return Types.MoverDirections.Horizontal;\n case 'grid':\n return Types.MoverDirections.Grid;\n case 'grid-linear':\n return Types.MoverDirections.GridLinear;\n case 'both':\n return Types.MoverDirections.Both;\n case 'vertical':\n default:\n return Types.MoverDirections.Vertical;\n }\n}\n"],"names":["useArrowNavigationGroup","options","circular","axis","memorizeCurrent","tabbable","ignoreDefaultKeydown","unstable_hasDefault","tabster","useTabster","getMover","useTabsterAttributes","mover","cyclic","direction","axisToMoverDirection","hasDefault","focusable","ignoreKeydown","Types","MoverDirections","Horizontal","Grid","GridLinear","Both","Vertical"],"mappings":";;;;+BAMiBA;;;eAAAA;;;yBANe;sCACK;4BACV;AAIhB,MAAMA,0BAA0B,CAACC,UAAU,CAAC,CAAC;IACpD,MAAM,EAAEC,QAAQ,EAAEC,IAAI,EAAEC,kBAAkB,IAAI,EAAEC,QAAQ,EAAEC,oBAAoB,EAC9EC,mBAAmB,EAAE,GAAGN;IACxB,MAAMO,UAAUC,IAAAA,sBAAU;IAC1B,IAAID,SAAS;QACTE,IAAAA,iBAAQ,EAACF;IACb;IACA,OAAOG,IAAAA,0CAAoB,EAAC;QACxBC,OAAO;YACHC,QAAQ,CAAC,CAACX;YACVY,WAAWC,qBAAqBZ,SAAS,QAAQA,SAAS,KAAK,IAAIA,OAAO;YAC1EC;YACAC;YACAW,YAAYT;QAChB;QACA,GAAGD,wBAAwB;YACvBW,WAAW;gBACPC,eAAeZ;YACnB;QACJ,CAAC;IACL;AACJ;AACA,SAASS,qBAAqBZ,IAAI;IAC9B,OAAOA;QACH,KAAK;YACD,OAAOgB,cAAK,CAACC,eAAe,CAACC,UAAU;QAC3C,KAAK;YACD,OAAOF,cAAK,CAACC,eAAe,CAACE,IAAI;QACrC,KAAK;YACD,OAAOH,cAAK,CAACC,eAAe,CAACG,UAAU;QAC3C,KAAK;YACD,OAAOJ,cAAK,CAACC,eAAe,CAACI,IAAI;QACrC,KAAK;QACL;YACI,OAAOL,cAAK,CAACC,eAAe,CAACK,QAAQ;IAC7C;AACJ"}
@@ -13,18 +13,17 @@ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
13
13
  const _tabster = require("tabster");
14
14
  const useMergedTabsterAttributes_unstable = (...attributes)=>{
15
15
  const stringAttributes = attributes.map((attribute)=>attribute[_tabster.Types.TabsterAttributeName]).filter(Boolean);
16
- const mergedStrigAttribute = _react.useMemo(()=>{
16
+ return _react.useMemo(()=>{
17
17
  let attribute = stringAttributes[0];
18
18
  attributes.shift();
19
19
  for (const attr of stringAttributes){
20
20
  attribute = mergeAttributes(attribute, attr);
21
21
  }
22
- return attribute;
22
+ return {
23
+ [_tabster.Types.TabsterAttributeName]: attribute
24
+ };
23
25
  // eslint-disable-next-line react-hooks/exhaustive-deps
24
26
  }, stringAttributes);
25
- return {
26
- [_tabster.Types.TabsterAttributeName]: mergedStrigAttribute
27
- };
28
27
  };
29
28
  function mergeAttributes(a, b) {
30
29
  if (!b) {
@@ -1 +1 @@
1
- {"version":3,"sources":["useMergeTabsterAttributes.js"],"sourcesContent":["import * as React from 'react';\nimport { Types } from 'tabster';\n/**\n * Merges a collection of tabster attributes.\n *\n * ⚠️The attributes passed as arguments to this hook cannot change at runtime.\n * @internal\n * @param attributes - collection of tabster attributes from other react-tabster hooks\n * @returns single merged tabster attribute\n */ export const useMergedTabsterAttributes_unstable = (...attributes)=>{\n const stringAttributes = attributes.map((attribute)=>attribute[Types.TabsterAttributeName]).filter(Boolean);\n const mergedStrigAttribute = React.useMemo(()=>{\n let attribute = stringAttributes[0];\n attributes.shift();\n for (const attr of stringAttributes){\n attribute = mergeAttributes(attribute, attr);\n }\n return attribute;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, stringAttributes);\n return {\n [Types.TabsterAttributeName]: mergedStrigAttribute\n };\n};\nfunction mergeAttributes(a, b) {\n if (!b) {\n return a;\n }\n let aParsed = {};\n let bParsed = {};\n if (a) {\n try {\n aParsed = JSON.parse(a);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n if (b) {\n try {\n bParsed = JSON.parse(b);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n return JSON.stringify({\n ...aParsed,\n ...bParsed\n });\n}\n"],"names":["useMergedTabsterAttributes_unstable","attributes","stringAttributes","map","attribute","Types","TabsterAttributeName","filter","Boolean","mergedStrigAttribute","React","useMemo","shift","attr","mergeAttributes","a","b","aParsed","bParsed","JSON","parse","stringify"],"mappings":";;;;+BASiBA;;;eAAAA;;;;iEATM;yBACD;AAQX,MAAMA,sCAAsC,CAAC,GAAGC;IACvD,MAAMC,mBAAmBD,WAAWE,GAAG,CAAC,CAACC,YAAYA,SAAS,CAACC,cAAK,CAACC,oBAAoB,CAAC,EAAEC,MAAM,CAACC;IACnG,MAAMC,uBAAuBC,OAAMC,OAAO,CAAC;QACvC,IAAIP,YAAYF,gBAAgB,CAAC,EAAE;QACnCD,WAAWW,KAAK;QAChB,KAAK,MAAMC,QAAQX,iBAAiB;YAChCE,YAAYU,gBAAgBV,WAAWS;QAC3C;QACA,OAAOT;IACX,uDAAuD;IACvD,GAAGF;IACH,OAAO;QACH,CAACG,cAAK,CAACC,oBAAoB,CAAC,EAAEG;IAClC;AACJ;AACA,SAASK,gBAAgBC,CAAC,EAAEC,CAAC;IACzB,IAAI,CAACA,GAAG;QACJ,OAAOD;IACX;IACA,IAAIE,UAAU,CAAC;IACf,IAAIC,UAAU,CAAC;IACf,IAAIH,GAAG;QACH,IAAI;YACAE,UAAUE,KAAKC,KAAK,CAACL;QACzB,oCAAoC;QACpC,EAAE,OAAO,CAAC;IACd;IACA,IAAIC,GAAG;QACH,IAAI;YACAE,UAAUC,KAAKC,KAAK,CAACJ;QACzB,oCAAoC;QACpC,EAAE,OAAO,CAAC;IACd;IACA,OAAOG,KAAKE,SAAS,CAAC;QAClB,GAAGJ,OAAO;QACV,GAAGC,OAAO;IACd;AACJ"}
1
+ {"version":3,"sources":["useMergeTabsterAttributes.js"],"sourcesContent":["import * as React from 'react';\nimport { Types } from 'tabster';\n/**\n * Merges a collection of tabster attributes.\n *\n * ⚠️The attributes passed as arguments to this hook cannot change at runtime.\n * @internal\n * @param attributes - collection of tabster attributes from other react-tabster hooks\n * @returns single merged tabster attribute\n */ export const useMergedTabsterAttributes_unstable = (...attributes)=>{\n const stringAttributes = attributes.map((attribute)=>attribute[Types.TabsterAttributeName]).filter(Boolean);\n return React.useMemo(()=>{\n let attribute = stringAttributes[0];\n attributes.shift();\n for (const attr of stringAttributes){\n attribute = mergeAttributes(attribute, attr);\n }\n return {\n [Types.TabsterAttributeName]: attribute\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, stringAttributes);\n};\nfunction mergeAttributes(a, b) {\n if (!b) {\n return a;\n }\n let aParsed = {};\n let bParsed = {};\n if (a) {\n try {\n aParsed = JSON.parse(a);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n if (b) {\n try {\n bParsed = JSON.parse(b);\n // eslint-disable-next-line no-empty\n } catch {}\n }\n return JSON.stringify({\n ...aParsed,\n ...bParsed\n });\n}\n"],"names":["useMergedTabsterAttributes_unstable","attributes","stringAttributes","map","attribute","Types","TabsterAttributeName","filter","Boolean","React","useMemo","shift","attr","mergeAttributes","a","b","aParsed","bParsed","JSON","parse","stringify"],"mappings":";;;;+BASiBA;;;eAAAA;;;;iEATM;yBACD;AAQX,MAAMA,sCAAsC,CAAC,GAAGC;IACvD,MAAMC,mBAAmBD,WAAWE,GAAG,CAAC,CAACC,YAAYA,SAAS,CAACC,cAAK,CAACC,oBAAoB,CAAC,EAAEC,MAAM,CAACC;IACnG,OAAOC,OAAMC,OAAO,CAAC;QACjB,IAAIN,YAAYF,gBAAgB,CAAC,EAAE;QACnCD,WAAWU,KAAK;QAChB,KAAK,MAAMC,QAAQV,iBAAiB;YAChCE,YAAYS,gBAAgBT,WAAWQ;QAC3C;QACA,OAAO;YACH,CAACP,cAAK,CAACC,oBAAoB,CAAC,EAAEF;QAClC;IACJ,uDAAuD;IACvD,GAAGF;AACP;AACA,SAASW,gBAAgBC,CAAC,EAAEC,CAAC;IACzB,IAAI,CAACA,GAAG;QACJ,OAAOD;IACX;IACA,IAAIE,UAAU,CAAC;IACf,IAAIC,UAAU,CAAC;IACf,IAAIH,GAAG;QACH,IAAI;YACAE,UAAUE,KAAKC,KAAK,CAACL;QACzB,oCAAoC;QACpC,EAAE,OAAO,CAAC;IACd;IACA,IAAIC,GAAG;QACH,IAAI;YACAE,UAAUC,KAAKC,KAAK,CAACJ;QACzB,oCAAoC;QACpC,EAAE,OAAO,CAAC;IACd;IACA,OAAOG,KAAKE,SAAS,CAAC;QAClB,GAAGJ,OAAO;QACV,GAAGC,OAAO;IACd;AACJ"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "useOnKeyboardNavigationChange", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return useOnKeyboardNavigationChange;
9
+ }
10
+ });
11
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
12
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
13
+ const _keyborg = require("keyborg");
14
+ const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
15
+ const _reactutilities = require("@fluentui/react-utilities");
16
+ function useOnKeyboardNavigationChange(callback) {
17
+ const { targetDocument } = (0, _reactsharedcontexts.useFluent_unstable)();
18
+ const keyborg = _react.useMemo(()=>targetDocument && (0, _keyborg.createKeyborg)(targetDocument.defaultView), [
19
+ targetDocument
20
+ ]);
21
+ const eventCallback = (0, _reactutilities.useEventCallback)(callback);
22
+ _react.useEffect(()=>{
23
+ if (keyborg) {
24
+ const cb = (next)=>{
25
+ eventCallback(next);
26
+ };
27
+ keyborg.subscribe(cb);
28
+ return ()=>keyborg.unsubscribe(cb);
29
+ }
30
+ }, [
31
+ keyborg,
32
+ eventCallback
33
+ ]);
34
+ _react.useEffect(()=>{
35
+ return ()=>keyborg && (0, _keyborg.disposeKeyborg)(keyborg);
36
+ }, [
37
+ keyborg
38
+ ]);
39
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useOnKeyboardNavigationChange.js"],"sourcesContent":["import * as React from 'react';\nimport { createKeyborg, disposeKeyborg } from 'keyborg';\nimport { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport { useEventCallback } from '@fluentui/react-utilities';\n/**\n * Instantiates [keyborg](https://github.com/microsoft/keyborg) and subscribes to changes\n * in the keyboard navigation mode.\n *\n * @param callback - called every time the keyboard navigation state changes\n */ export function useOnKeyboardNavigationChange(callback) {\n const { targetDocument } = useFluent();\n const keyborg = React.useMemo(()=>targetDocument && createKeyborg(targetDocument.defaultView), [\n targetDocument\n ]);\n const eventCallback = useEventCallback(callback);\n React.useEffect(()=>{\n if (keyborg) {\n const cb = (next)=>{\n eventCallback(next);\n };\n keyborg.subscribe(cb);\n return ()=>keyborg.unsubscribe(cb);\n }\n }, [\n keyborg,\n eventCallback\n ]);\n React.useEffect(()=>{\n return ()=>keyborg && disposeKeyborg(keyborg);\n }, [\n keyborg\n ]);\n}\n"],"names":["useOnKeyboardNavigationChange","callback","targetDocument","useFluent","keyborg","React","useMemo","createKeyborg","defaultView","eventCallback","useEventCallback","useEffect","cb","next","subscribe","unsubscribe","disposeKeyborg"],"mappings":";;;;+BASoBA;;;eAAAA;;;;iEATG;yBACuB;qCACE;gCACf;AAMtB,SAASA,8BAA8BC,QAAQ;IACtD,MAAM,EAAEC,cAAc,EAAE,GAAGC,IAAAA,uCAAS;IACpC,MAAMC,UAAUC,OAAMC,OAAO,CAAC,IAAIJ,kBAAkBK,IAAAA,sBAAa,EAACL,eAAeM,WAAW,GAAG;QAC3FN;KACH;IACD,MAAMO,gBAAgBC,IAAAA,gCAAgB,EAACT;IACvCI,OAAMM,SAAS,CAAC;QACZ,IAAIP,SAAS;YACT,MAAMQ,KAAK,CAACC;gBACRJ,cAAcI;YAClB;YACAT,QAAQU,SAAS,CAACF;YAClB,OAAO,IAAIR,QAAQW,WAAW,CAACH;QACnC;IACJ,GAAG;QACCR;QACAK;KACH;IACDJ,OAAMM,SAAS,CAAC;QACZ,OAAO,IAAIP,WAAWY,IAAAA,uBAAc,EAACZ;IACzC,GAAG;QACCA;KACH;AACL"}
@@ -8,11 +8,18 @@ Object.defineProperty(exports, "useTabsterAttributes", {
8
8
  return useTabsterAttributes;
9
9
  }
10
10
  });
11
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
11
12
  const _tabster = require("tabster");
12
13
  const _useTabster = require("./useTabster");
14
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
13
15
  const useTabsterAttributes = (props)=>{
14
16
  // A tabster instance is not necessary to generate tabster attributes
15
17
  // but calling the hook will ensure that a tabster instance exists internally and avoids consumers doing the same
16
18
  (0, _useTabster.useTabster)();
17
- return (0, _tabster.getTabsterAttribute)(props);
19
+ const strAttr = (0, _tabster.getTabsterAttribute)(props, true);
20
+ return _react.useMemo(()=>({
21
+ 'data-tabster': strAttr
22
+ }), [
23
+ strAttr
24
+ ]);
18
25
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["useTabsterAttributes.js"],"sourcesContent":["import { getTabsterAttribute } from 'tabster';\nimport { useTabster } from './useTabster';\n/**\n * @internal\n * Hook that returns tabster attributes while ensuring tabster exists\n */ export const useTabsterAttributes = (props)=>{\n // A tabster instance is not necessary to generate tabster attributes\n // but calling the hook will ensure that a tabster instance exists internally and avoids consumers doing the same\n useTabster();\n return getTabsterAttribute(props);\n};\n"],"names":["useTabsterAttributes","props","useTabster","getTabsterAttribute"],"mappings":";;;;+BAKiBA;;;eAAAA;;;yBALmB;4BACT;AAIhB,MAAMA,uBAAuB,CAACC;IACrC,qEAAqE;IACrE,iHAAiH;IACjHC,IAAAA,sBAAU;IACV,OAAOC,IAAAA,4BAAmB,EAACF;AAC/B"}
1
+ {"version":3,"sources":["useTabsterAttributes.js"],"sourcesContent":["import { getTabsterAttribute } from 'tabster';\nimport { useTabster } from './useTabster';\nimport * as React from 'react';\n/**\n * @internal\n * Hook that returns tabster attributes while ensuring tabster exists\n */ export const useTabsterAttributes = (props)=>{\n // A tabster instance is not necessary to generate tabster attributes\n // but calling the hook will ensure that a tabster instance exists internally and avoids consumers doing the same\n useTabster();\n const strAttr = getTabsterAttribute(props, true);\n return React.useMemo(()=>({\n 'data-tabster': strAttr\n }), [\n strAttr\n ]);\n};\n"],"names":["useTabsterAttributes","props","useTabster","strAttr","getTabsterAttribute","React","useMemo"],"mappings":";;;;+BAMiBA;;;eAAAA;;;;yBANmB;4BACT;iEACJ;AAIZ,MAAMA,uBAAuB,CAACC;IACrC,qEAAqE;IACrE,iHAAiH;IACjHC,IAAAA,sBAAU;IACV,MAAMC,UAAUC,IAAAA,4BAAmB,EAACH,OAAO;IAC3C,OAAOI,OAAMC,OAAO,CAAC,IAAK,CAAA;YAClB,gBAAgBH;QACpB,CAAA,GAAI;QACJA;KACH;AACL"}
@@ -51,6 +51,9 @@ _export(exports, {
51
51
  useUncontrolledFocus: function() {
52
52
  return _index.useUncontrolledFocus;
53
53
  },
54
+ useOnKeyboardNavigationChange: function() {
55
+ return _index.useOnKeyboardNavigationChange;
56
+ },
54
57
  createCustomFocusIndicatorStyle: function() {
55
58
  return _index1.createCustomFocusIndicatorStyle;
56
59
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["index.js"],"sourcesContent":["export { useArrowNavigationGroup, useFocusableGroup, useFocusFinders, useFocusVisible, useFocusWithin, useKeyboardNavAttribute, useModalAttributes, useTabsterAttributes, useObservedElement, useFocusObserved, useMergedTabsterAttributes_unstable, useRestoreFocusSource, useRestoreFocusTarget, useUncontrolledFocus } from './hooks/index';\nexport { createCustomFocusIndicatorStyle, createFocusOutlineStyle } from './focus/index';\nexport { applyFocusVisiblePolyfill } from './focus/index';\nexport { KEYBORG_FOCUSIN } from 'keyborg';\n"],"names":["useArrowNavigationGroup","useFocusableGroup","useFocusFinders","useFocusVisible","useFocusWithin","useKeyboardNavAttribute","useModalAttributes","useTabsterAttributes","useObservedElement","useFocusObserved","useMergedTabsterAttributes_unstable","useRestoreFocusSource","useRestoreFocusTarget","useUncontrolledFocus","createCustomFocusIndicatorStyle","createFocusOutlineStyle","applyFocusVisiblePolyfill","KEYBORG_FOCUSIN"],"mappings":";;;;;;;;;;;IAASA,uBAAuB;eAAvBA,8BAAuB;;IAAEC,iBAAiB;eAAjBA,wBAAiB;;IAAEC,eAAe;eAAfA,sBAAe;;IAAEC,eAAe;eAAfA,sBAAe;;IAAEC,cAAc;eAAdA,qBAAc;;IAAEC,uBAAuB;eAAvBA,8BAAuB;;IAAEC,kBAAkB;eAAlBA,yBAAkB;;IAAEC,oBAAoB;eAApBA,2BAAoB;;IAAEC,kBAAkB;eAAlBA,yBAAkB;;IAAEC,gBAAgB;eAAhBA,uBAAgB;;IAAEC,mCAAmC;eAAnCA,0CAAmC;;IAAEC,qBAAqB;eAArBA,4BAAqB;;IAAEC,qBAAqB;eAArBA,4BAAqB;;IAAEC,oBAAoB;eAApBA,2BAAoB;;IAC9SC,+BAA+B;eAA/BA,uCAA+B;;IAAEC,uBAAuB;eAAvBA,+BAAuB;;IACxDC,yBAAyB;eAAzBA,iCAAyB;;IACzBC,eAAe;eAAfA,wBAAe;;;uBAHuS;wBACtP;yBAEzC"}
1
+ {"version":3,"sources":["index.js"],"sourcesContent":["export { useArrowNavigationGroup, useFocusableGroup, useFocusFinders, useFocusVisible, useFocusWithin, useKeyboardNavAttribute, useModalAttributes, useTabsterAttributes, useObservedElement, useFocusObserved, useMergedTabsterAttributes_unstable, useRestoreFocusSource, useRestoreFocusTarget, useUncontrolledFocus, useOnKeyboardNavigationChange } from './hooks/index';\nexport { createCustomFocusIndicatorStyle, createFocusOutlineStyle } from './focus/index';\nexport { applyFocusVisiblePolyfill } from './focus/index';\nexport { KEYBORG_FOCUSIN } from 'keyborg';\n"],"names":["useArrowNavigationGroup","useFocusableGroup","useFocusFinders","useFocusVisible","useFocusWithin","useKeyboardNavAttribute","useModalAttributes","useTabsterAttributes","useObservedElement","useFocusObserved","useMergedTabsterAttributes_unstable","useRestoreFocusSource","useRestoreFocusTarget","useUncontrolledFocus","useOnKeyboardNavigationChange","createCustomFocusIndicatorStyle","createFocusOutlineStyle","applyFocusVisiblePolyfill","KEYBORG_FOCUSIN"],"mappings":";;;;;;;;;;;IAASA,uBAAuB;eAAvBA,8BAAuB;;IAAEC,iBAAiB;eAAjBA,wBAAiB;;IAAEC,eAAe;eAAfA,sBAAe;;IAAEC,eAAe;eAAfA,sBAAe;;IAAEC,cAAc;eAAdA,qBAAc;;IAAEC,uBAAuB;eAAvBA,8BAAuB;;IAAEC,kBAAkB;eAAlBA,yBAAkB;;IAAEC,oBAAoB;eAApBA,2BAAoB;;IAAEC,kBAAkB;eAAlBA,yBAAkB;;IAAEC,gBAAgB;eAAhBA,uBAAgB;;IAAEC,mCAAmC;eAAnCA,0CAAmC;;IAAEC,qBAAqB;eAArBA,4BAAqB;;IAAEC,qBAAqB;eAArBA,4BAAqB;;IAAEC,oBAAoB;eAApBA,2BAAoB;;IAAEC,6BAA6B;eAA7BA,oCAA6B;;IAC7UC,+BAA+B;eAA/BA,uCAA+B;;IAAEC,uBAAuB;eAAvBA,+BAAuB;;IACxDC,yBAAyB;eAAzBA,iCAAyB;;IACzBC,eAAe;eAAfA,wBAAe;;;uBAHsU;wBACrR;yBAEzC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fluentui/react-tabster",
3
- "version": "9.16.1",
3
+ "version": "9.17.1",
4
4
  "description": "Utilities for focus management and facade for tabster",
5
5
  "main": "lib-commonjs/index.js",
6
6
  "module": "lib/index.js",
@@ -33,7 +33,7 @@
33
33
  "dependencies": {
34
34
  "@fluentui/react-shared-contexts": "^9.13.2",
35
35
  "@fluentui/react-theme": "^9.1.16",
36
- "@fluentui/react-utilities": "^9.15.5",
36
+ "@fluentui/react-utilities": "^9.15.6",
37
37
  "@griffel/react": "^1.5.14",
38
38
  "@swc/helpers": "^0.5.1",
39
39
  "keyborg": "^2.3.0",
@@ -41,7 +41,7 @@
41
41
  },
42
42
  "peerDependencies": {
43
43
  "@types/react": ">=16.14.0 <19.0.0",
44
- "@types/react-dom": ">=16.14.0 <19.0.0",
44
+ "@types/react-dom": ">=16.9.0 <19.0.0",
45
45
  "react": ">=16.14.0 <19.0.0",
46
46
  "react-dom": ">=16.14.0 <19.0.0"
47
47
  },