Private
Public Access
1
0

feat: Fluent UI Outlook Lite + connections mockup

This commit is contained in:
2026-04-14 18:52:25 +00:00
parent 1199eff6c3
commit dfa4010406
34820 changed files with 1003813 additions and 205 deletions

View File

@@ -0,0 +1 @@
export { useSelection } from './useSelection';

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/selection/index.ts"],"sourcesContent":["export type {\n OnSelectionChangeCallback,\n OnSelectionChangeData,\n SelectionHookParams,\n SelectionItemId,\n SelectionMethods,\n SelectionMode,\n} from './types';\nexport { useSelection } from './useSelection';\n"],"names":["useSelection"],"mappings":"AAQA,SAASA,YAAY,QAAQ,iBAAiB"}

View File

@@ -0,0 +1 @@
import * as React from 'react';

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/selection/types.ts"],"sourcesContent":["import * as React from 'react';\n\nexport type SelectionMode = 'single' | 'multiselect';\n\nexport interface SelectionMethods {\n toggleItem(event: React.SyntheticEvent, id: SelectionItemId): void;\n selectItem(event: React.SyntheticEvent, id: SelectionItemId): void;\n deselectItem(event: React.SyntheticEvent, id: SelectionItemId): void;\n clearItems(event: React.SyntheticEvent): void;\n isSelected(id: SelectionItemId): boolean;\n toggleAllItems(event: React.SyntheticEvent, itemIds: SelectionItemId[]): void;\n}\n\nexport type SelectionItemId = string | number;\n\nexport type OnSelectionChangeCallback = (event: React.SyntheticEvent, selectedItems: Set<SelectionItemId>) => void;\n\nexport type OnSelectionChangeData = {\n selectedItems: Set<SelectionItemId>;\n};\n\nexport type SelectionHookParams = {\n selectionMode: SelectionMode;\n /**\n * Used in uncontrolled mode to set initial selected items on mount\n */\n defaultSelectedItems?: Iterable<SelectionItemId>;\n /**\n * Used to control selected items\n */\n selectedItems?: Iterable<SelectionItemId>;\n /**\n * Called when selection changes\n */\n onSelectionChange?(event: React.SyntheticEvent, data: OnSelectionChangeData): void;\n};\n"],"names":["React"],"mappings":"AAAA,YAAYA,WAAW,QAAQ"}

View File

@@ -0,0 +1,105 @@
'use client';
import * as React from 'react';
import { useControllableState } from '../hooks/useControllableState';
import { createSetFromIterable } from '../utils/createSetFromIterable';
function useSelectionState(params) {
const [selected, setSelected] = useControllableState({
initialState: new Set(),
defaultState: React.useMemo(()=>params.defaultSelectedItems && createSetFromIterable(params.defaultSelectedItems), [
params.defaultSelectedItems
]),
state: React.useMemo(()=>params.selectedItems && createSetFromIterable(params.selectedItems), [
params.selectedItems
])
});
const changeSelection = (event, nextSelectedItems)=>{
var _params_onSelectionChange;
(_params_onSelectionChange = params.onSelectionChange) === null || _params_onSelectionChange === void 0 ? void 0 : _params_onSelectionChange.call(params, event, {
selectedItems: nextSelectedItems
});
setSelected(nextSelectedItems);
};
return [
selected,
changeSelection
];
}
function useSingleSelection(params) {
const [selected, changeSelection] = useSelectionState(params);
const methods = {
deselectItem: (event)=>changeSelection(event, new Set()),
selectItem: (event, itemId)=>changeSelection(event, new Set([
itemId
])),
toggleAllItems: ()=>{
if (process.env.NODE_ENV !== 'production') {
throw new Error('[react-utilities]: `toggleAllItems` should not be used in single selection mode');
}
},
toggleItem: (event, itemId)=>changeSelection(event, new Set([
itemId
])),
clearItems: (event)=>changeSelection(event, new Set()),
isSelected: (itemId)=>{
var _selected_has;
return (_selected_has = selected.has(itemId)) !== null && _selected_has !== void 0 ? _selected_has : false;
}
};
return [
selected,
methods
];
}
function useMultipleSelection(params) {
const [selected, changeSelection] = useSelectionState(params);
const methods = {
toggleItem: (event, itemId)=>{
const nextSelectedItems = new Set(selected);
if (selected.has(itemId)) {
nextSelectedItems.delete(itemId);
} else {
nextSelectedItems.add(itemId);
}
changeSelection(event, nextSelectedItems);
},
selectItem: (event, itemId)=>{
const nextSelectedItems = new Set(selected);
nextSelectedItems.add(itemId);
changeSelection(event, nextSelectedItems);
},
deselectItem: (event, itemId)=>{
const nextSelectedItems = new Set(selected);
nextSelectedItems.delete(itemId);
changeSelection(event, nextSelectedItems);
},
clearItems: (event)=>{
changeSelection(event, new Set());
},
isSelected: (itemId)=>selected.has(itemId),
toggleAllItems: (event, itemIds)=>{
const allItemsSelected = itemIds.every((itemId)=>selected.has(itemId));
const nextSelectedItems = new Set(selected);
if (allItemsSelected) {
nextSelectedItems.clear();
} else {
itemIds.forEach((itemId)=>nextSelectedItems.add(itemId));
}
changeSelection(event, nextSelectedItems);
}
};
return [
selected,
methods
];
}
export function useSelection(params) {
'use no memo';
if (params.selectionMode === 'multiselect') {
// selectionMode is a static value, so we can safely ignore rules-of-hooks
// eslint-disable-next-line react-hooks/rules-of-hooks
return useMultipleSelection(params);
}
// selectionMode is a static value, so we can safely ignore rules-of-hooks
// eslint-disable-next-line react-hooks/rules-of-hooks
return useSingleSelection(params);
}

File diff suppressed because one or more lines are too long