@fluentui/react-list 0.0.0-nightly-20250107-0406.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.
Files changed (113) hide show
  1. package/CHANGELOG.md +352 -0
  2. package/LICENSE +15 -0
  3. package/README.md +5 -0
  4. package/dist/index.d.ts +148 -0
  5. package/lib/List.js +1 -0
  6. package/lib/List.js.map +1 -0
  7. package/lib/ListItem.js +1 -0
  8. package/lib/ListItem.js.map +1 -0
  9. package/lib/components/List/List.js +14 -0
  10. package/lib/components/List/List.js.map +1 -0
  11. package/lib/components/List/List.types.js +1 -0
  12. package/lib/components/List/List.types.js.map +1 -0
  13. package/lib/components/List/index.js +4 -0
  14. package/lib/components/List/index.js.map +1 -0
  15. package/lib/components/List/listContext.js +11 -0
  16. package/lib/components/List/listContext.js.map +1 -0
  17. package/lib/components/List/renderList.js +12 -0
  18. package/lib/components/List/renderList.js.map +1 -0
  19. package/lib/components/List/useList.js +75 -0
  20. package/lib/components/List/useList.js.map +1 -0
  21. package/lib/components/List/useListContextValues.js +12 -0
  22. package/lib/components/List/useListContextValues.js.map +1 -0
  23. package/lib/components/List/useListStyles.styles.js +15 -0
  24. package/lib/components/List/useListStyles.styles.js.map +1 -0
  25. package/lib/components/ListItem/ListItem.js +12 -0
  26. package/lib/components/ListItem/ListItem.js.map +1 -0
  27. package/lib/components/ListItem/ListItem.types.js +3 -0
  28. package/lib/components/ListItem/ListItem.types.js.map +1 -0
  29. package/lib/components/ListItem/index.js +4 -0
  30. package/lib/components/ListItem/index.js.map +1 -0
  31. package/lib/components/ListItem/renderListItem.js +13 -0
  32. package/lib/components/ListItem/renderListItem.js.map +1 -0
  33. package/lib/components/ListItem/useListItem.js +185 -0
  34. package/lib/components/ListItem/useListItem.js.map +1 -0
  35. package/lib/components/ListItem/useListItemStyles.styles.js +48 -0
  36. package/lib/components/ListItem/useListItemStyles.styles.js.map +1 -0
  37. package/lib/events/ListItemActionEvent.js +9 -0
  38. package/lib/events/ListItemActionEvent.js.map +1 -0
  39. package/lib/hooks/index.js +1 -0
  40. package/lib/hooks/index.js.map +1 -0
  41. package/lib/hooks/types.js +1 -0
  42. package/lib/hooks/types.js.map +1 -0
  43. package/lib/hooks/useListSelection.js +41 -0
  44. package/lib/hooks/useListSelection.js.map +1 -0
  45. package/lib/index.js +2 -0
  46. package/lib/index.js.map +1 -0
  47. package/lib/utils/calculateListItemRoleForListRole.js +16 -0
  48. package/lib/utils/calculateListItemRoleForListRole.js.map +1 -0
  49. package/lib/utils/calculateListRole.js +14 -0
  50. package/lib/utils/calculateListRole.js.map +1 -0
  51. package/lib/utils/index.js +5 -0
  52. package/lib/utils/index.js.map +1 -0
  53. package/lib/utils/validateGridCellsArePresent.js +16 -0
  54. package/lib/utils/validateGridCellsArePresent.js.map +1 -0
  55. package/lib/utils/validateProperElementTypes.js +12 -0
  56. package/lib/utils/validateProperElementTypes.js.map +1 -0
  57. package/lib/utils/validateProperRolesAreUsed.js +36 -0
  58. package/lib/utils/validateProperRolesAreUsed.js.map +1 -0
  59. package/lib-commonjs/List.js +28 -0
  60. package/lib-commonjs/List.js.map +1 -0
  61. package/lib-commonjs/ListItem.js +28 -0
  62. package/lib-commonjs/ListItem.js.map +1 -0
  63. package/lib-commonjs/components/List/List.js +25 -0
  64. package/lib-commonjs/components/List/List.js.map +1 -0
  65. package/lib-commonjs/components/List/List.types.js +6 -0
  66. package/lib-commonjs/components/List/List.types.js.map +1 -0
  67. package/lib-commonjs/components/List/index.js +31 -0
  68. package/lib-commonjs/components/List/index.js.map +1 -0
  69. package/lib-commonjs/components/List/listContext.js +32 -0
  70. package/lib-commonjs/components/List/listContext.js.map +1 -0
  71. package/lib-commonjs/components/List/renderList.js +20 -0
  72. package/lib-commonjs/components/List/renderList.js.map +1 -0
  73. package/lib-commonjs/components/List/useList.js +78 -0
  74. package/lib-commonjs/components/List/useList.js.map +1 -0
  75. package/lib-commonjs/components/List/useListContextValues.js +22 -0
  76. package/lib-commonjs/components/List/useListContextValues.js.map +1 -0
  77. package/lib-commonjs/components/List/useListStyles.styles.js +31 -0
  78. package/lib-commonjs/components/List/useListStyles.styles.js.map +1 -0
  79. package/lib-commonjs/components/ListItem/ListItem.js +23 -0
  80. package/lib-commonjs/components/ListItem/ListItem.js.map +1 -0
  81. package/lib-commonjs/components/ListItem/ListItem.types.js +6 -0
  82. package/lib-commonjs/components/ListItem/ListItem.types.js.map +1 -0
  83. package/lib-commonjs/components/ListItem/index.js +31 -0
  84. package/lib-commonjs/components/ListItem/index.js.map +1 -0
  85. package/lib-commonjs/components/ListItem/renderListItem.js +21 -0
  86. package/lib-commonjs/components/ListItem/renderListItem.js.map +1 -0
  87. package/lib-commonjs/components/ListItem/useListItem.js +188 -0
  88. package/lib-commonjs/components/ListItem/useListItem.js.map +1 -0
  89. package/lib-commonjs/components/ListItem/useListItemStyles.styles.js +71 -0
  90. package/lib-commonjs/components/ListItem/useListItemStyles.styles.js.map +1 -0
  91. package/lib-commonjs/events/ListItemActionEvent.js +28 -0
  92. package/lib-commonjs/events/ListItemActionEvent.js.map +1 -0
  93. package/lib-commonjs/hooks/index.js +11 -0
  94. package/lib-commonjs/hooks/index.js.map +1 -0
  95. package/lib-commonjs/hooks/types.js +6 -0
  96. package/lib-commonjs/hooks/types.js.map +1 -0
  97. package/lib-commonjs/hooks/useListSelection.js +52 -0
  98. package/lib-commonjs/hooks/useListSelection.js.map +1 -0
  99. package/lib-commonjs/index.js +44 -0
  100. package/lib-commonjs/index.js.map +1 -0
  101. package/lib-commonjs/utils/calculateListItemRoleForListRole.js +26 -0
  102. package/lib-commonjs/utils/calculateListItemRoleForListRole.js.map +1 -0
  103. package/lib-commonjs/utils/calculateListRole.js +24 -0
  104. package/lib-commonjs/utils/calculateListRole.js.map +1 -0
  105. package/lib-commonjs/utils/index.js +32 -0
  106. package/lib-commonjs/utils/index.js.map +1 -0
  107. package/lib-commonjs/utils/validateGridCellsArePresent.js +26 -0
  108. package/lib-commonjs/utils/validateGridCellsArePresent.js.map +1 -0
  109. package/lib-commonjs/utils/validateProperElementTypes.js +22 -0
  110. package/lib-commonjs/utils/validateProperElementTypes.js.map +1 -0
  111. package/lib-commonjs/utils/validateProperRolesAreUsed.js +46 -0
  112. package/lib-commonjs/utils/validateProperRolesAreUsed.js.map +1 -0
  113. package/package.json +56 -0
@@ -0,0 +1,188 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "useListItem_unstable", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return useListItem_unstable;
9
+ }
10
+ });
11
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
12
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
13
+ const _reacttabster = require("@fluentui/react-tabster");
14
+ const _reactutilities = require("@fluentui/react-utilities");
15
+ const _listContext = require("../List/listContext");
16
+ const _keyboardkeys = require("@fluentui/keyboard-keys");
17
+ const _reactcheckbox = require("@fluentui/react-checkbox");
18
+ const _ListItemActionEvent = require("../../events/ListItemActionEvent");
19
+ const DEFAULT_ROOT_EL_TYPE = 'li';
20
+ const useListItem_unstable = (props, ref)=>{
21
+ const id = (0, _reactutilities.useId)('listItem');
22
+ const { value = id, onKeyDown, onClick, tabIndex, role, onAction } = props;
23
+ const toggleItem = (0, _listContext.useListContext_unstable)((ctx)=>{
24
+ var _ctx_selection;
25
+ return (_ctx_selection = ctx.selection) === null || _ctx_selection === void 0 ? void 0 : _ctx_selection.toggleItem;
26
+ });
27
+ const navigationMode = (0, _listContext.useListContext_unstable)((ctx)=>ctx.navigationMode);
28
+ const isSelectionEnabled = (0, _listContext.useListContext_unstable)((ctx)=>!!ctx.selection);
29
+ const isSelected = (0, _listContext.useListContext_unstable)((ctx)=>{
30
+ var _ctx_selection;
31
+ return (_ctx_selection = ctx.selection) === null || _ctx_selection === void 0 ? void 0 : _ctx_selection.isSelected(value);
32
+ });
33
+ const listItemRole = (0, _listContext.useListContext_unstable)((ctx)=>ctx.listItemRole);
34
+ const validateListItem = (0, _listContext.useListContext_unstable)((ctx)=>ctx.validateListItem);
35
+ const as = props.as || navigationMode === 'composite' ? 'div' : DEFAULT_ROOT_EL_TYPE;
36
+ const finalListItemRole = role || listItemRole;
37
+ const focusableItems = Boolean(isSelectionEnabled || navigationMode || tabIndex === 0);
38
+ const rootRef = _react.useRef(null);
39
+ const checkmarkRef = _react.useRef(null);
40
+ const handleAction = (0, _reactutilities.useEventCallback)((event)=>{
41
+ onAction === null || onAction === void 0 ? void 0 : onAction(event, {
42
+ event,
43
+ value,
44
+ type: _ListItemActionEvent.ListItemActionEventName
45
+ });
46
+ if (event.defaultPrevented) {
47
+ return;
48
+ }
49
+ if (isSelectionEnabled) {
50
+ toggleItem === null || toggleItem === void 0 ? void 0 : toggleItem(event.detail.originalEvent, value);
51
+ }
52
+ });
53
+ _react.useEffect(()=>{
54
+ if (rootRef.current) {
55
+ validateListItem(rootRef.current);
56
+ }
57
+ }, [
58
+ validateListItem
59
+ ]);
60
+ const triggerAction = (e)=>{
61
+ const actionEvent = (0, _ListItemActionEvent.createListItemActionEvent)(e);
62
+ handleAction(actionEvent);
63
+ e.target.dispatchEvent(actionEvent);
64
+ };
65
+ const focusableGroupAttrs = (0, _reacttabster.useFocusableGroup)({
66
+ ignoreDefaultKeydown: {
67
+ Enter: true
68
+ },
69
+ tabBehavior: 'limited-trap-focus'
70
+ });
71
+ const handleClick = (0, _reactutilities.useEventCallback)((e)=>{
72
+ onClick === null || onClick === void 0 ? void 0 : onClick(e);
73
+ if (e.defaultPrevented) {
74
+ return;
75
+ }
76
+ const isFromCheckbox = (0, _reactutilities.elementContains)(checkmarkRef.current, e.target);
77
+ if (isFromCheckbox) {
78
+ return;
79
+ }
80
+ triggerAction(e);
81
+ });
82
+ const handleKeyDown = (0, _reactutilities.useEventCallback)((e)=>{
83
+ onKeyDown === null || onKeyDown === void 0 ? void 0 : onKeyDown(e);
84
+ if (e.defaultPrevented) {
85
+ return;
86
+ }
87
+ // If the event is fired from an element inside the list item
88
+ if (e.target !== e.currentTarget) {
89
+ if (focusableItems) {
90
+ // If the items are focusable, we need to handle the arrow keys to move focus to them
91
+ switch(e.key){
92
+ // If it's one of the Arrows defined, jump out of the list item to focus on the ListItem itself
93
+ // The ArrowLeft will only trigger if the target element is the leftmost, otherwise the
94
+ // arrowNavigationAttributes handles it and prevents it from bubbling here.
95
+ case _keyboardkeys.ArrowLeft:
96
+ e.target.dispatchEvent(new _reacttabster.GroupperMoveFocusEvent({
97
+ action: _reacttabster.GroupperMoveFocusActions.Escape
98
+ }));
99
+ break;
100
+ case _keyboardkeys.ArrowDown:
101
+ case _keyboardkeys.ArrowUp:
102
+ e.preventDefault();
103
+ // Press ESC on the original target to get focus to the parent group (List)
104
+ e.target.dispatchEvent(new _reacttabster.GroupperMoveFocusEvent({
105
+ action: _reacttabster.GroupperMoveFocusActions.Escape
106
+ }));
107
+ // Now dispatch the original key to move up or down in the list
108
+ e.currentTarget.dispatchEvent(new _reacttabster.MoverMoveFocusEvent({
109
+ key: _reacttabster.MoverKeys[e.key]
110
+ }));
111
+ }
112
+ return;
113
+ }
114
+ return;
115
+ }
116
+ switch(e.key){
117
+ case _keyboardkeys.Space:
118
+ // we have to prevent default here otherwise the space key will scroll the page
119
+ e.preventDefault();
120
+ // Space always toggles selection (if enabled)
121
+ if (isSelectionEnabled) {
122
+ toggleItem === null || toggleItem === void 0 ? void 0 : toggleItem(e, value);
123
+ } else {
124
+ triggerAction(e);
125
+ }
126
+ break;
127
+ case _keyboardkeys.Enter:
128
+ triggerAction(e);
129
+ break;
130
+ case _keyboardkeys.ArrowRight:
131
+ if (navigationMode === 'composite') {
132
+ e.target.dispatchEvent(new _reacttabster.GroupperMoveFocusEvent({
133
+ action: _reacttabster.GroupperMoveFocusActions.Enter
134
+ }));
135
+ }
136
+ break;
137
+ }
138
+ });
139
+ const onCheckboxChange = (0, _reactutilities.useEventCallback)((e, data)=>{
140
+ if (!isSelectionEnabled || e.defaultPrevented) {
141
+ return;
142
+ }
143
+ toggleItem === null || toggleItem === void 0 ? void 0 : toggleItem(e, value);
144
+ });
145
+ const arrowNavigationAttributes = (0, _reacttabster.useArrowNavigationGroup)({
146
+ axis: 'horizontal'
147
+ });
148
+ const tabsterAttributes = (0, _reacttabster.useMergedTabsterAttributes_unstable)(focusableItems ? arrowNavigationAttributes : {}, focusableGroupAttrs);
149
+ const root = _reactutilities.slot.always((0, _reactutilities.getIntrinsicElementProps)(as, {
150
+ ref: (0, _reactutilities.useMergedRefs)(rootRef, ref),
151
+ tabIndex: focusableItems ? 0 : undefined,
152
+ role: finalListItemRole,
153
+ id: String(value),
154
+ ...isSelectionEnabled && {
155
+ 'aria-selected': isSelected
156
+ },
157
+ ...tabsterAttributes,
158
+ ...props,
159
+ onKeyDown: handleKeyDown,
160
+ onClick: isSelectionEnabled || onClick || onAction ? handleClick : undefined
161
+ }), {
162
+ elementType: as
163
+ });
164
+ const checkmark = _reactutilities.slot.optional(props.checkmark, {
165
+ defaultProps: {
166
+ checked: isSelected,
167
+ tabIndex: -1
168
+ },
169
+ renderByDefault: isSelectionEnabled,
170
+ elementType: _reactcheckbox.Checkbox
171
+ });
172
+ const mergedCheckmarkRef = (0, _reactutilities.useMergedRefs)(checkmark === null || checkmark === void 0 ? void 0 : checkmark.ref, checkmarkRef);
173
+ if (checkmark) {
174
+ checkmark.onChange = (0, _reactutilities.mergeCallbacks)(checkmark.onChange, onCheckboxChange);
175
+ checkmark.ref = mergedCheckmarkRef;
176
+ }
177
+ const state = {
178
+ components: {
179
+ root: as,
180
+ checkmark: _reactcheckbox.Checkbox
181
+ },
182
+ root,
183
+ checkmark,
184
+ selectable: isSelectionEnabled,
185
+ navigable: focusableItems
186
+ };
187
+ return state;
188
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/components/ListItem/useListItem.tsx"],"sourcesContent":["import * as React from 'react';\nimport {\n GroupperMoveFocusEvent,\n MoverMoveFocusEvent,\n GroupperMoveFocusActions,\n MoverKeys,\n useArrowNavigationGroup,\n useFocusableGroup,\n useMergedTabsterAttributes_unstable,\n} from '@fluentui/react-tabster';\nimport {\n elementContains,\n getIntrinsicElementProps,\n mergeCallbacks,\n slot,\n useEventCallback,\n useId,\n useMergedRefs,\n} from '@fluentui/react-utilities';\nimport type { ListItemProps, ListItemState } from './ListItem.types';\nimport { useListContext_unstable } from '../List/listContext';\nimport { Enter, Space, ArrowUp, ArrowDown, ArrowRight, ArrowLeft } from '@fluentui/keyboard-keys';\nimport { Checkbox, CheckboxOnChangeData } from '@fluentui/react-checkbox';\nimport {\n createListItemActionEvent,\n ListItemActionEvent,\n ListItemActionEventName,\n} from '../../events/ListItemActionEvent';\n\nconst DEFAULT_ROOT_EL_TYPE = 'li';\n\n/**\n * Create the state required to render ListItem.\n *\n * The returned state can be modified with hooks such as useListItemStyles_unstable,\n * before being passed to renderListItem_unstable.\n *\n * @param props - props from this instance of ListItem\n * @param ref - reference to root HTMLLIElement | HTMLDivElementof ListItem\n */\nexport const useListItem_unstable = (\n props: ListItemProps,\n ref: React.Ref<HTMLLIElement | HTMLDivElement>,\n): ListItemState => {\n const id = useId('listItem');\n const { value = id, onKeyDown, onClick, tabIndex, role, onAction } = props;\n\n const toggleItem = useListContext_unstable(ctx => ctx.selection?.toggleItem);\n const navigationMode = useListContext_unstable(ctx => ctx.navigationMode);\n const isSelectionEnabled = useListContext_unstable(ctx => !!ctx.selection);\n const isSelected = useListContext_unstable(ctx => ctx.selection?.isSelected(value));\n const listItemRole = useListContext_unstable(ctx => ctx.listItemRole);\n const validateListItem = useListContext_unstable(ctx => ctx.validateListItem);\n\n const as = props.as || navigationMode === 'composite' ? 'div' : DEFAULT_ROOT_EL_TYPE;\n\n const finalListItemRole = role || listItemRole;\n\n const focusableItems = Boolean(isSelectionEnabled || navigationMode || tabIndex === 0);\n\n const rootRef = React.useRef<HTMLLIElement | HTMLDivElement>(null);\n const checkmarkRef = React.useRef<HTMLInputElement | null>(null);\n\n const handleAction: (event: ListItemActionEvent) => void = useEventCallback(event => {\n onAction?.(event, { event, value, type: ListItemActionEventName });\n\n if (event.defaultPrevented) {\n return;\n }\n\n if (isSelectionEnabled) {\n toggleItem?.(event.detail.originalEvent, value);\n }\n });\n\n React.useEffect(() => {\n if (rootRef.current) {\n validateListItem(rootRef.current);\n }\n }, [validateListItem]);\n\n const triggerAction = (e: React.MouseEvent | React.KeyboardEvent) => {\n const actionEvent = createListItemActionEvent(e);\n handleAction(actionEvent);\n e.target.dispatchEvent(actionEvent);\n };\n\n const focusableGroupAttrs = useFocusableGroup({\n ignoreDefaultKeydown: { Enter: true },\n tabBehavior: 'limited-trap-focus',\n });\n\n const handleClick: React.MouseEventHandler<HTMLLIElement & HTMLDivElement> = useEventCallback(e => {\n onClick?.(e);\n\n if (e.defaultPrevented) {\n return;\n }\n\n const isFromCheckbox = elementContains(checkmarkRef.current, e.target as Node);\n if (isFromCheckbox) {\n return;\n }\n\n triggerAction(e);\n });\n\n const handleKeyDown: React.KeyboardEventHandler<HTMLLIElement & HTMLDivElement> = useEventCallback(e => {\n onKeyDown?.(e);\n\n if (e.defaultPrevented) {\n return;\n }\n\n // If the event is fired from an element inside the list item\n if (e.target !== e.currentTarget) {\n if (focusableItems) {\n // If the items are focusable, we need to handle the arrow keys to move focus to them\n switch (e.key) {\n // If it's one of the Arrows defined, jump out of the list item to focus on the ListItem itself\n // The ArrowLeft will only trigger if the target element is the leftmost, otherwise the\n // arrowNavigationAttributes handles it and prevents it from bubbling here.\n case ArrowLeft:\n e.target.dispatchEvent(new GroupperMoveFocusEvent({ action: GroupperMoveFocusActions.Escape }));\n break;\n\n case ArrowDown:\n case ArrowUp:\n e.preventDefault();\n // Press ESC on the original target to get focus to the parent group (List)\n e.target.dispatchEvent(new GroupperMoveFocusEvent({ action: GroupperMoveFocusActions.Escape }));\n // Now dispatch the original key to move up or down in the list\n e.currentTarget.dispatchEvent(new MoverMoveFocusEvent({ key: MoverKeys[e.key] }));\n }\n return;\n }\n return;\n }\n\n switch (e.key) {\n case Space:\n // we have to prevent default here otherwise the space key will scroll the page\n e.preventDefault();\n\n // Space always toggles selection (if enabled)\n if (isSelectionEnabled) {\n toggleItem?.(e, value);\n } else {\n triggerAction(e);\n }\n\n break;\n\n case Enter:\n triggerAction(e);\n break;\n\n case ArrowRight:\n if (navigationMode === 'composite') {\n e.target.dispatchEvent(new GroupperMoveFocusEvent({ action: GroupperMoveFocusActions.Enter }));\n }\n\n break;\n }\n });\n\n const onCheckboxChange = useEventCallback((e: React.ChangeEvent<HTMLInputElement>, data: CheckboxOnChangeData) => {\n if (!isSelectionEnabled || e.defaultPrevented) {\n return;\n }\n\n toggleItem?.(e, value);\n });\n\n const arrowNavigationAttributes = useArrowNavigationGroup({\n axis: 'horizontal',\n });\n\n const tabsterAttributes = useMergedTabsterAttributes_unstable(\n focusableItems ? arrowNavigationAttributes : {},\n focusableGroupAttrs,\n );\n\n const root = slot.always(\n getIntrinsicElementProps(as, {\n ref: useMergedRefs(rootRef, ref) as React.Ref<HTMLLIElement & HTMLDivElement>,\n tabIndex: focusableItems ? 0 : undefined,\n role: finalListItemRole,\n id: String(value),\n ...(isSelectionEnabled && {\n 'aria-selected': isSelected,\n }),\n ...tabsterAttributes,\n ...props,\n onKeyDown: handleKeyDown,\n onClick: isSelectionEnabled || onClick || onAction ? handleClick : undefined,\n }),\n { elementType: as },\n );\n\n const checkmark = slot.optional(props.checkmark, {\n defaultProps: {\n checked: isSelected,\n tabIndex: -1,\n },\n renderByDefault: isSelectionEnabled,\n elementType: Checkbox,\n });\n\n const mergedCheckmarkRef = useMergedRefs(checkmark?.ref, checkmarkRef);\n if (checkmark) {\n checkmark.onChange = mergeCallbacks(checkmark.onChange, onCheckboxChange);\n checkmark.ref = mergedCheckmarkRef;\n }\n\n const state: ListItemState = {\n components: {\n root: as,\n checkmark: Checkbox,\n },\n root,\n checkmark,\n selectable: isSelectionEnabled,\n navigable: focusableItems,\n };\n\n return state;\n};\n"],"names":["useListItem_unstable","DEFAULT_ROOT_EL_TYPE","props","ref","id","useId","value","onKeyDown","onClick","tabIndex","role","onAction","toggleItem","useListContext_unstable","ctx","selection","navigationMode","isSelectionEnabled","isSelected","listItemRole","validateListItem","as","finalListItemRole","focusableItems","Boolean","rootRef","React","useRef","checkmarkRef","handleAction","useEventCallback","event","type","ListItemActionEventName","defaultPrevented","detail","originalEvent","useEffect","current","triggerAction","e","actionEvent","createListItemActionEvent","target","dispatchEvent","focusableGroupAttrs","useFocusableGroup","ignoreDefaultKeydown","Enter","tabBehavior","handleClick","isFromCheckbox","elementContains","handleKeyDown","currentTarget","key","ArrowLeft","GroupperMoveFocusEvent","action","GroupperMoveFocusActions","Escape","ArrowDown","ArrowUp","preventDefault","MoverMoveFocusEvent","MoverKeys","Space","ArrowRight","onCheckboxChange","data","arrowNavigationAttributes","useArrowNavigationGroup","axis","tabsterAttributes","useMergedTabsterAttributes_unstable","root","slot","always","getIntrinsicElementProps","useMergedRefs","undefined","String","elementType","checkmark","optional","defaultProps","checked","renderByDefault","Checkbox","mergedCheckmarkRef","onChange","mergeCallbacks","state","components","selectable","navigable"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"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"}
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ listItemClassNames: function() {
13
+ return listItemClassNames;
14
+ },
15
+ useListItemStyles_unstable: function() {
16
+ return useListItemStyles_unstable;
17
+ }
18
+ });
19
+ const _react = require("@griffel/react");
20
+ const listItemClassNames = {
21
+ root: 'fui-ListItem',
22
+ checkmark: 'fui-ListItem__checkmark'
23
+ };
24
+ const useRootBaseStyles = /*#__PURE__*/ (0, _react.__resetStyles)("rikgcmv", null, [
25
+ ".rikgcmv{padding:0;margin:0;text-indent:0;list-style-type:none;}",
26
+ ".rikgcmv[data-fui-focus-visible]{outline:var(--strokeWidthThick) solid var(--colorStrokeFocus2);border-radius:var(--borderRadiusMedium);}"
27
+ ]);
28
+ const useCheckmarkBaseStyles = /*#__PURE__*/ (0, _react.__styles)({
29
+ root: {
30
+ qb2dma: "f7nlbp4",
31
+ Bpb5tq4: 0,
32
+ Biccaaf: 0,
33
+ Gaeyjg: 0,
34
+ ldoezw: 0,
35
+ B6gmeee: "f1bgo3o3"
36
+ }
37
+ }, {
38
+ d: [
39
+ ".f7nlbp4{align-self:center;}",
40
+ [
41
+ ".f1bgo3o3 .fui-Checkbox__indicator{margin:4px;}",
42
+ {
43
+ p: -1
44
+ }
45
+ ]
46
+ ]
47
+ });
48
+ /**
49
+ * Styles for the root slot
50
+ */ const useStyles = /*#__PURE__*/ (0, _react.__styles)({
51
+ rootClickableOrSelectable: {
52
+ mc9l5x: "f22iagw",
53
+ Bceei9c: "f1k6fduh"
54
+ }
55
+ }, {
56
+ d: [
57
+ ".f22iagw{display:flex;}",
58
+ ".f1k6fduh{cursor:pointer;}"
59
+ ]
60
+ });
61
+ const useListItemStyles_unstable = (state)=>{
62
+ 'use no memo';
63
+ const rootBaseStyles = useRootBaseStyles();
64
+ const checkmarkBaseStyles = useCheckmarkBaseStyles();
65
+ const styles = useStyles();
66
+ state.root.className = (0, _react.mergeClasses)(listItemClassNames.root, rootBaseStyles, (state.selectable || state.navigable) && styles.rootClickableOrSelectable, state.root.className);
67
+ if (state.checkmark) {
68
+ state.checkmark.className = (0, _react.mergeClasses)(listItemClassNames.checkmark, checkmarkBaseStyles.root, state.checkmark.className);
69
+ }
70
+ return state;
71
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["useListItemStyles.styles.js"],"sourcesContent":["import { makeStyles, makeResetStyles, mergeClasses } from '@griffel/react';\nimport { createCustomFocusIndicatorStyle } from '@fluentui/react-tabster';\nimport { tokens } from '@fluentui/react-theme';\nexport const listItemClassNames = {\n root: 'fui-ListItem',\n checkmark: 'fui-ListItem__checkmark'\n};\nconst useRootBaseStyles = makeResetStyles({\n padding: 0,\n margin: 0,\n textIndent: 0,\n listStyleType: 'none',\n ...createCustomFocusIndicatorStyle({\n outline: `${tokens.strokeWidthThick} solid ${tokens.colorStrokeFocus2}`,\n borderRadius: tokens.borderRadiusMedium\n }, {\n selector: 'focus'\n })\n});\nconst useCheckmarkBaseStyles = makeStyles({\n root: {\n alignSelf: 'center',\n '& .fui-Checkbox__indicator': {\n margin: '4px'\n }\n }\n});\n/**\n * Styles for the root slot\n */ const useStyles = makeStyles({\n rootClickableOrSelectable: {\n display: 'flex',\n cursor: 'pointer'\n }\n});\n/**\n * Apply styling to the ListItem slots based on the state\n */ export const useListItemStyles_unstable = (state)=>{\n 'use no memo';\n const rootBaseStyles = useRootBaseStyles();\n const checkmarkBaseStyles = useCheckmarkBaseStyles();\n const styles = useStyles();\n state.root.className = mergeClasses(listItemClassNames.root, rootBaseStyles, (state.selectable || state.navigable) && styles.rootClickableOrSelectable, state.root.className);\n if (state.checkmark) {\n state.checkmark.className = mergeClasses(listItemClassNames.checkmark, checkmarkBaseStyles.root, state.checkmark.className);\n }\n return state;\n};\n"],"names":["listItemClassNames","useListItemStyles_unstable","root","checkmark","useRootBaseStyles","__resetStyles","useCheckmarkBaseStyles","__styles","qb2dma","Bpb5tq4","Biccaaf","Gaeyjg","ldoezw","B6gmeee","d","p","useStyles","rootClickableOrSelectable","mc9l5x","Bceei9c","state","rootBaseStyles","checkmarkBaseStyles","styles","className","mergeClasses","selectable","navigable"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;;;;;;;;IAGaA,kBAAkB;eAAlBA;;IAkCIC,0BAA0B;eAA1BA;;;uBArCyC;AAGnD,MAAMD,qBAAqB;IAC9BE,MAAM;IACNC,WAAW;AACf;AACA,MAAMC,oBAAiB,WAAA,GAAGC,IAAAA,oBAAA,EAAA,WAAA,MAAA;IAAA;IAAA;CAWzB;AACD,MAAMC,yBAAsB,WAAA,GAAGC,IAAAA,eAAA,EAAA;IAAAL,MAAA;QAAAM,QAAA;QAAAC,SAAA;QAAAC,SAAA;QAAAC,QAAA;QAAAC,QAAA;QAAAC,SAAA;IAAA;AAAA,GAAA;IAAAC,GAAA;QAAA;QAAA;YAAA;YAAA;gBAAAC,GAAA,CAAA;YAAA;SAAA;KAAA;AAAA;AAQ/B;;CAEA,GAAI,MAAMC,YAAS,WAAA,GAAGT,IAAAA,eAAA,EAAA;IAAAU,2BAAA;QAAAC,QAAA;QAAAC,SAAA;IAAA;AAAA,GAAA;IAAAL,GAAA;QAAA;QAAA;KAAA;AAAA;AAQX,MAAMb,6BAA8BmB,CAAAA;IAC3C;IACA,MAAMC,iBAAiBjB;IACvB,MAAMkB,sBAAsBhB;IAC5B,MAAMiB,SAASP;IACfI,MAAMlB,IAAI,CAACsB,SAAS,GAAGC,IAAAA,mBAAY,EAACzB,mBAAmBE,IAAI,EAAEmB,gBAAgB,AAACD,CAAAA,MAAMM,UAAU,IAAIN,MAAMO,SAAS,AAATA,KAAcJ,OAAON,yBAAyB,EAAEG,MAAMlB,IAAI,CAACsB,SAAS;IAC5K,IAAIJ,MAAMjB,SAAS,EAAE;QACjBiB,MAAMjB,SAAS,CAACqB,SAAS,GAAGC,IAAAA,mBAAY,EAACzB,mBAAmBG,SAAS,EAAEmB,oBAAoBpB,IAAI,EAAEkB,MAAMjB,SAAS,CAACqB,SAAS;IAC9H;IACA,OAAOJ;AACX"}
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ ListItemActionEventName: function() {
13
+ return ListItemActionEventName;
14
+ },
15
+ createListItemActionEvent: function() {
16
+ return createListItemActionEvent;
17
+ }
18
+ });
19
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
20
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
21
+ const ListItemActionEventName = 'ListItemAction';
22
+ const createListItemActionEvent = (originalEvent)=>new CustomEvent(ListItemActionEventName, {
23
+ cancelable: true,
24
+ bubbles: true,
25
+ detail: {
26
+ originalEvent
27
+ }
28
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/events/ListItemActionEvent.ts"],"sourcesContent":["import * as React from 'react';\n\nexport const ListItemActionEventName = 'ListItemAction';\n\nexport interface ListItemActionEventDetail {\n originalEvent: React.MouseEvent | React.KeyboardEvent;\n}\n\nexport type ListItemActionEvent = CustomEvent<ListItemActionEventDetail>;\n\nexport const createListItemActionEvent = (\n originalEvent: React.MouseEvent | React.KeyboardEvent,\n): CustomEvent<ListItemActionEventDetail> =>\n new CustomEvent<ListItemActionEventDetail>(ListItemActionEventName, {\n cancelable: true,\n bubbles: true,\n detail: { originalEvent },\n });\n"],"names":["ListItemActionEventName","createListItemActionEvent","originalEvent","CustomEvent","cancelable","bubbles","detail"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;;;;;;;;IAEaA,uBAAAA;eAAAA;;IAQAC,yBAAAA;eAAAA;;;;iEAVU;AAEhB,MAAMD,0BAA0B;AAQhC,MAAMC,4BAA4B,CACvCC,gBAEA,IAAIC,YAAuCH,yBAAyB;QAClEI,YAAY;QACZC,SAAS;QACTC,QAAQ;YAAEJ;QAAc;IAC1B"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "useListSelection", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return _useListSelection.useListSelection;
9
+ }
10
+ });
11
+ const _useListSelection = require("./useListSelection");
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/index.ts"],"sourcesContent":["export { useListSelection } from './useListSelection';\n"],"names":["useListSelection"],"rangeMappings":";;;;;;;;;;","mappings":";;;;+BAASA;;;eAAAA,kCAAgB;;;kCAAQ"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
6
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/types.ts"],"sourcesContent":["import { SelectionItemId } from '@fluentui/react-utilities';\nimport * as React from 'react';\n\nexport type ListSelectionState = {\n isSelected: (item: string | number) => boolean;\n toggleItem: (e: React.SyntheticEvent, id: string | number) => void;\n deselectItem: (e: React.SyntheticEvent, id: string | number) => void;\n selectItem: (e: React.SyntheticEvent, id: string | number) => void;\n clearSelection: (e: React.SyntheticEvent) => void;\n toggleAllItems: (e: React.SyntheticEvent, itemIds: string[] | number[]) => void;\n setSelectedItems: React.Dispatch<React.SetStateAction<Iterable<SelectionItemId>>>;\n selectedItems: SelectionItemId[];\n};\n"],"names":[],"rangeMappings":";;;;;","mappings":";;;;;iEACuB"}
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "useListSelection", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return useListSelection;
9
+ }
10
+ });
11
+ const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
12
+ const _reactutilities = require("@fluentui/react-utilities");
13
+ const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
14
+ function useListSelection(options = {
15
+ selectionMode: 'multiselect'
16
+ }) {
17
+ const { selectionMode, defaultSelectedItems, onSelectionChange } = options;
18
+ const [selectedItems, setSelectedItems] = (0, _reactutilities.useControllableState)({
19
+ state: options.selectedItems,
20
+ defaultState: defaultSelectedItems,
21
+ initialState: []
22
+ });
23
+ const [selected, selectionMethods] = (0, _reactutilities.useSelection)({
24
+ selectionMode,
25
+ defaultSelectedItems,
26
+ selectedItems,
27
+ onSelectionChange: (e, data)=>{
28
+ setSelectedItems(data.selectedItems);
29
+ onSelectionChange === null || onSelectionChange === void 0 ? void 0 : onSelectionChange(e, data);
30
+ }
31
+ });
32
+ const toggleItem = (0, _reactutilities.useEventCallback)((e, itemId)=>selectionMethods.toggleItem(e, itemId));
33
+ const toggleAllItems = (0, _reactutilities.useEventCallback)((e, itemIds)=>{
34
+ selectionMethods.toggleAllItems(e, itemIds);
35
+ });
36
+ const deselectItem = (0, _reactutilities.useEventCallback)((e, itemId)=>selectionMethods.deselectItem(e, itemId));
37
+ const selectItem = (0, _reactutilities.useEventCallback)((e, itemId)=>selectionMethods.selectItem(e, itemId));
38
+ const clearSelection = (0, _reactutilities.useEventCallback)((e)=>selectionMethods.clearItems(e));
39
+ const selectedArray = _react.useMemo(()=>Array.from(selected), [
40
+ selected
41
+ ]);
42
+ return {
43
+ selectedItems: selectedArray,
44
+ toggleItem,
45
+ toggleAllItems,
46
+ deselectItem,
47
+ selectItem,
48
+ setSelectedItems,
49
+ isSelected: (id)=>selectionMethods.isSelected(id),
50
+ clearSelection
51
+ };
52
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/hooks/useListSelection.tsx"],"sourcesContent":["import { SelectionHookParams, useControllableState, useEventCallback, useSelection } from '@fluentui/react-utilities';\nimport * as React from 'react';\nimport type { ListSelectionState } from './types';\n\nexport function useListSelection(options: SelectionHookParams = { selectionMode: 'multiselect' }): ListSelectionState {\n const { selectionMode, defaultSelectedItems, onSelectionChange } = options;\n\n const [selectedItems, setSelectedItems] = useControllableState({\n state: options.selectedItems,\n defaultState: defaultSelectedItems,\n initialState: [],\n });\n\n const [selected, selectionMethods] = useSelection({\n selectionMode,\n defaultSelectedItems,\n selectedItems,\n onSelectionChange: (e, data) => {\n setSelectedItems(data.selectedItems);\n onSelectionChange?.(e, data);\n },\n });\n\n const toggleItem: ListSelectionState['toggleItem'] = useEventCallback((e, itemId) =>\n selectionMethods.toggleItem(e, itemId),\n );\n\n const toggleAllItems: ListSelectionState['toggleAllItems'] = useEventCallback((e, itemIds) => {\n selectionMethods.toggleAllItems(e, itemIds);\n });\n\n const deselectItem: ListSelectionState['deselectItem'] = useEventCallback((e, itemId: string | number) =>\n selectionMethods.deselectItem(e, itemId),\n );\n\n const selectItem: ListSelectionState['selectItem'] = useEventCallback((e, itemId: string | number) =>\n selectionMethods.selectItem(e, itemId),\n );\n\n const clearSelection: ListSelectionState['clearSelection'] = useEventCallback(e => selectionMethods.clearItems(e));\n\n const selectedArray = React.useMemo(() => Array.from(selected), [selected]);\n\n return {\n selectedItems: selectedArray,\n toggleItem,\n toggleAllItems,\n deselectItem,\n selectItem,\n setSelectedItems,\n isSelected: (id: string | number) => selectionMethods.isSelected(id),\n clearSelection,\n };\n}\n"],"names":["useListSelection","options","selectionMode","defaultSelectedItems","onSelectionChange","selectedItems","setSelectedItems","useControllableState","state","defaultState","initialState","selected","selectionMethods","useSelection","e","data","toggleItem","useEventCallback","itemId","toggleAllItems","itemIds","deselectItem","selectItem","clearSelection","clearItems","selectedArray","React","useMemo","Array","from","isSelected","id"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;+BAIgBA;;;eAAAA;;;;gCAJ0E;iEACnE;AAGhB,SAASA,iBAAiBC,UAA+B;IAAEC,eAAe;AAAc,CAAC;IAC9F,MAAM,EAAEA,aAAa,EAAEC,oBAAoB,EAAEC,iBAAiB,EAAE,GAAGH;IAEnE,MAAM,CAACI,eAAeC,iBAAiB,GAAGC,IAAAA,oCAAAA,EAAqB;QAC7DC,OAAOP,QAAQI,aAAa;QAC5BI,cAAcN;QACdO,cAAc,EAAE;IAClB;IAEA,MAAM,CAACC,UAAUC,iBAAiB,GAAGC,IAAAA,4BAAAA,EAAa;QAChDX;QACAC;QACAE;QACAD,mBAAmB,CAACU,GAAGC;YACrBT,iBAAiBS,KAAKV,aAAa;YACnCD,sBAAAA,QAAAA,sBAAAA,KAAAA,IAAAA,KAAAA,IAAAA,kBAAoBU,GAAGC;QACzB;IACF;IAEA,MAAMC,aAA+CC,IAAAA,gCAAAA,EAAiB,CAACH,GAAGI,SACxEN,iBAAiBI,UAAU,CAACF,GAAGI;IAGjC,MAAMC,iBAAuDF,IAAAA,gCAAAA,EAAiB,CAACH,GAAGM;QAChFR,iBAAiBO,cAAc,CAACL,GAAGM;IACrC;IAEA,MAAMC,eAAmDJ,IAAAA,gCAAAA,EAAiB,CAACH,GAAGI,SAC5EN,iBAAiBS,YAAY,CAACP,GAAGI;IAGnC,MAAMI,aAA+CL,IAAAA,gCAAAA,EAAiB,CAACH,GAAGI,SACxEN,iBAAiBU,UAAU,CAACR,GAAGI;IAGjC,MAAMK,iBAAuDN,IAAAA,gCAAAA,EAAiBH,CAAAA,IAAKF,iBAAiBY,UAAU,CAACV;IAE/G,MAAMW,gBAAgBC,OAAMC,OAAO,CAAC,IAAMC,MAAMC,IAAI,CAAClB,WAAW;QAACA;KAAS;IAE1E,OAAO;QACLN,eAAeoB;QACfT;QACAG;QACAE;QACAC;QACAhB;QACAwB,YAAY,CAACC,KAAwBnB,iBAAiBkB,UAAU,CAACC;QACjER;IACF;AACF"}
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ List: function() {
13
+ return _List.List;
14
+ },
15
+ ListItem: function() {
16
+ return _ListItem.ListItem;
17
+ },
18
+ listClassNames: function() {
19
+ return _List.listClassNames;
20
+ },
21
+ listItemClassNames: function() {
22
+ return _ListItem.listItemClassNames;
23
+ },
24
+ renderListItem_unstable: function() {
25
+ return _ListItem.renderListItem_unstable;
26
+ },
27
+ renderList_unstable: function() {
28
+ return _List.renderList_unstable;
29
+ },
30
+ useListItemStyles_unstable: function() {
31
+ return _ListItem.useListItemStyles_unstable;
32
+ },
33
+ useListItem_unstable: function() {
34
+ return _ListItem.useListItem_unstable;
35
+ },
36
+ useListStyles_unstable: function() {
37
+ return _List.useListStyles_unstable;
38
+ },
39
+ useList_unstable: function() {
40
+ return _List.useList_unstable;
41
+ }
42
+ });
43
+ const _List = require("./List");
44
+ const _ListItem = require("./ListItem");
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { List, listClassNames, renderList_unstable, useListStyles_unstable, useList_unstable } from './List';\n\nexport type { ListProps, ListSlots, ListState } from './List';\nexport {\n ListItem,\n listItemClassNames,\n renderListItem_unstable,\n useListItemStyles_unstable,\n useListItem_unstable,\n} from './ListItem';\nexport type { ListItemProps, ListItemSlots, ListItemState } from './ListItem';\n"],"names":["List","ListItem","listClassNames","listItemClassNames","renderListItem_unstable","renderList_unstable","useListItemStyles_unstable","useListItem_unstable","useListStyles_unstable","useList_unstable"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;;;;;;;;IAASA,IAAI;eAAJA,UAAI;;IAIXC,QAAQ;eAARA,kBAAQ;;IAJKC,cAAc;eAAdA,oBAAc;;IAK3BC,kBAAkB;eAAlBA,4BAAkB;;IAClBC,uBAAuB;eAAvBA,iCAAuB;;IANMC,mBAAmB;eAAnBA,yBAAmB;;IAOhDC,0BAA0B;eAA1BA,oCAA0B;;IAC1BC,oBAAoB;eAApBA,8BAAoB;;IAR8BC,sBAAsB;eAAtBA,4BAAsB;;IAAEC,gBAAgB;eAAhBA,sBAAgB;;;sBAAQ;0BAS7F"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Calculate the role for the list item based on the list role.
3
+ * @param listRole - the role of the list
4
+ * @returns proper role for the list item
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ Object.defineProperty(exports, "calculateListItemRoleForListRole", {
10
+ enumerable: true,
11
+ get: function() {
12
+ return calculateListItemRoleForListRole;
13
+ }
14
+ });
15
+ const calculateListItemRoleForListRole = (listRole)=>{
16
+ switch(listRole){
17
+ case 'list':
18
+ return 'listitem';
19
+ case 'listbox':
20
+ return 'option';
21
+ case 'grid':
22
+ return 'row';
23
+ default:
24
+ return 'listitem';
25
+ }
26
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/calculateListItemRoleForListRole.ts"],"sourcesContent":["/**\n * Calculate the role for the list item based on the list role.\n * @param listRole - the role of the list\n * @returns proper role for the list item\n */\nexport const calculateListItemRoleForListRole = (listRole: string): string => {\n switch (listRole) {\n case 'list':\n return 'listitem';\n case 'listbox':\n return 'option';\n case 'grid':\n return 'row';\n default:\n return 'listitem';\n }\n};\n"],"names":["calculateListItemRoleForListRole","listRole"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;;;;CAIC;;;;+BACYA;;;eAAAA;;;AAAN,MAAMA,mCAAmC,CAACC;IAC/C,OAAQA;QACN,KAAK;YACH,OAAO;QACT,KAAK;YACH,OAAO;QACT,KAAK;YACH,OAAO;QACT;YACE,OAAO;IACX;AACF"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Calculate the role for the list based on the navigation mode and selectable state
3
+ * @param navigationMode - the navigation mode of the list
4
+ * @param selectable - whether the list is selectable
5
+ * @returns 'grid' if navigationMode is 'composite', otherwise 'listbox' if selectable or 'list' if not
6
+ */ "use strict";
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ Object.defineProperty(exports, "calculateListRole", {
11
+ enumerable: true,
12
+ get: function() {
13
+ return calculateListRole;
14
+ }
15
+ });
16
+ const calculateListRole = (navigationMode, selectable)=>{
17
+ if (navigationMode === 'composite') {
18
+ return 'grid';
19
+ } else if (selectable) {
20
+ return 'listbox';
21
+ } else {
22
+ return 'list';
23
+ }
24
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/calculateListRole.ts"],"sourcesContent":["import { ListNavigationMode } from '../List';\n\n/**\n * Calculate the role for the list based on the navigation mode and selectable state\n * @param navigationMode - the navigation mode of the list\n * @param selectable - whether the list is selectable\n * @returns 'grid' if navigationMode is 'composite', otherwise 'listbox' if selectable or 'list' if not\n */\n\nexport const calculateListRole = (navigationMode: ListNavigationMode | undefined, selectable: boolean) => {\n if (navigationMode === 'composite') {\n return 'grid';\n } else if (selectable) {\n return 'listbox';\n } else {\n return 'list';\n }\n};\n"],"names":["calculateListRole","navigationMode","selectable"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAEA;;;;;CAKC;;;;+BAEYA;;;eAAAA;;;AAAN,MAAMA,oBAAoB,CAACC,gBAAgDC;IAChF,IAAID,mBAAmB,aAAa;QAClC,OAAO;IACT,OAAO,IAAIC,YAAY;QACrB,OAAO;IACT,OAAO;QACL,OAAO;IACT;AACF"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: all[name]
9
+ });
10
+ }
11
+ _export(exports, {
12
+ calculateListItemRoleForListRole: function() {
13
+ return _calculateListItemRoleForListRole.calculateListItemRoleForListRole;
14
+ },
15
+ calculateListRole: function() {
16
+ return _calculateListRole.calculateListRole;
17
+ },
18
+ validateGridCellsArePresent: function() {
19
+ return _validateGridCellsArePresent.validateGridCellsArePresent;
20
+ },
21
+ validateProperElementTypes: function() {
22
+ return _validateProperElementTypes.validateProperElementTypes;
23
+ },
24
+ validateProperRolesAreUsed: function() {
25
+ return _validateProperRolesAreUsed.validateProperRolesAreUsed;
26
+ }
27
+ });
28
+ const _calculateListRole = require("./calculateListRole");
29
+ const _validateProperElementTypes = require("./validateProperElementTypes");
30
+ const _validateProperRolesAreUsed = require("./validateProperRolesAreUsed");
31
+ const _calculateListItemRoleForListRole = require("./calculateListItemRoleForListRole");
32
+ const _validateGridCellsArePresent = require("./validateGridCellsArePresent");
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/index.ts"],"sourcesContent":["export { calculateListRole } from './calculateListRole';\nexport { validateProperElementTypes } from './validateProperElementTypes';\nexport { validateProperRolesAreUsed } from './validateProperRolesAreUsed';\nexport { calculateListItemRoleForListRole } from './calculateListItemRoleForListRole';\nexport { validateGridCellsArePresent } from './validateGridCellsArePresent';\n"],"names":["calculateListItemRoleForListRole","calculateListRole","validateGridCellsArePresent","validateProperElementTypes","validateProperRolesAreUsed"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","mappings":";;;;;;;;;;;IAGSA,gCAAgC;eAAhCA,kEAAgC;;IAHhCC,iBAAiB;eAAjBA,oCAAiB;;IAIjBC,2BAA2B;eAA3BA,wDAA2B;;IAH3BC,0BAA0B;eAA1BA,sDAA0B;;IAC1BC,0BAA0B;eAA1BA,sDAA0B;;;mCAFD;4CACS;4CACA;kDACM;6CACL"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Validates that grid cells are present in a grid list item. This is necessary for proper screen reader support.
3
+ * If grid cells are not present and we're not running in production mode, a warning will be logged to the console.
4
+ * @param listRole - The role of the list
5
+ * @param listItemEl - The list item element
6
+ * @returns
7
+ */ "use strict";
8
+ Object.defineProperty(exports, "__esModule", {
9
+ value: true
10
+ });
11
+ Object.defineProperty(exports, "validateGridCellsArePresent", {
12
+ enumerable: true,
13
+ get: function() {
14
+ return validateGridCellsArePresent;
15
+ }
16
+ });
17
+ const validateGridCellsArePresent = (listRole, listItemEl)=>{
18
+ if (listRole !== 'grid') {
19
+ return;
20
+ }
21
+ const gridCells = listItemEl.querySelectorAll(':scope > [role="gridcell"]');
22
+ if (gridCells.length === 0) {
23
+ //eslint-disable-next-line no-console
24
+ console.warn(`@fluentui/react-list [useList]:\nList items in List with "grid" role (which is automatically assigned when navigationMode is set to "composite") must contain at least one "gridcell" as direct child of <ListItem /> for proper screen reader support.`, `Ideally, each focus target should be in it's own "gridcell", which is a direct child of <ListItem />.\n`);
25
+ }
26
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/validateGridCellsArePresent.ts"],"sourcesContent":["/**\n * Validates that grid cells are present in a grid list item. This is necessary for proper screen reader support.\n * If grid cells are not present and we're not running in production mode, a warning will be logged to the console.\n * @param listRole - The role of the list\n * @param listItemEl - The list item element\n * @returns\n */\nexport const validateGridCellsArePresent = (listRole: string, listItemEl: HTMLElement) => {\n if (listRole !== 'grid') {\n return;\n }\n\n const gridCells = listItemEl.querySelectorAll(':scope > [role=\"gridcell\"]');\n if (gridCells.length === 0) {\n //eslint-disable-next-line no-console\n console.warn(\n `@fluentui/react-list [useList]:\\nList items in List with \"grid\" role (which is automatically assigned when navigationMode is set to \"composite\") must contain at least one \"gridcell\" as direct child of <ListItem /> for proper screen reader support.`,\n `Ideally, each focus target should be in it's own \"gridcell\", which is a direct child of <ListItem />.\\n`,\n );\n }\n};\n"],"names":["validateGridCellsArePresent","listRole","listItemEl","gridCells","querySelectorAll","length","console","warn"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;;;;;;CAMC;;;;+BACYA;;;eAAAA;;;AAAN,MAAMA,8BAA8B,CAACC,UAAkBC;IAC5D,IAAID,aAAa,QAAQ;QACvB;IACF;IAEA,MAAME,YAAYD,WAAWE,gBAAgB,CAAC;IAC9C,IAAID,UAAUE,MAAM,KAAK,GAAG;QAC1B,qCAAqC;QACrCC,QAAQC,IAAI,CACV,CAAC,uPAAuP,CAAC,EACzP,CAAC,uGAAuG,CAAC;IAE7G;AACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Validates that the List and ListItem elements are compatible
3
+ * @param listRenderedAs - the type of the parent element
4
+ * @param listItemRenderedAs - the type of the child element
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ Object.defineProperty(exports, "validateProperElementTypes", {
10
+ enumerable: true,
11
+ get: function() {
12
+ return validateProperElementTypes;
13
+ }
14
+ });
15
+ function validateProperElementTypes(listRenderedAs, listItemRenderedAs) {
16
+ if (listItemRenderedAs === 'div' && listRenderedAs !== 'div') {
17
+ throw new Error('ListItem cannot be rendered as a div when its parent is not a div.');
18
+ }
19
+ if (listItemRenderedAs === 'li' && listRenderedAs === 'div') {
20
+ throw new Error('ListItem cannot be rendered as a li when its parent is a div.');
21
+ }
22
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/validateProperElementTypes.ts"],"sourcesContent":["/**\n * Validates that the List and ListItem elements are compatible\n * @param listRenderedAs - the type of the parent element\n * @param listItemRenderedAs - the type of the child element\n */\nexport function validateProperElementTypes(listRenderedAs?: string, listItemRenderedAs?: string) {\n if (listItemRenderedAs === 'div' && listRenderedAs !== 'div') {\n throw new Error('ListItem cannot be rendered as a div when its parent is not a div.');\n }\n if (listItemRenderedAs === 'li' && listRenderedAs === 'div') {\n throw new Error('ListItem cannot be rendered as a li when its parent is a div.');\n }\n}\n"],"names":["validateProperElementTypes","listRenderedAs","listItemRenderedAs","Error"],"rangeMappings":";;;;;;;;;;;;;;;;;;;;;","mappings":"AAAA;;;;CAIC;;;;+BACeA;;;eAAAA;;;AAAT,SAASA,2BAA2BC,cAAuB,EAAEC,kBAA2B;IAC7F,IAAIA,uBAAuB,SAASD,mBAAmB,OAAO;QAC5D,MAAM,IAAIE,MAAM;IAClB;IACA,IAAID,uBAAuB,QAAQD,mBAAmB,OAAO;QAC3D,MAAM,IAAIE,MAAM;IAClB;AACF"}