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,11 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "useTypingAnnounce", {
enumerable: true,
get: function() {
return _useTypingAnnounce.useTypingAnnounce;
}
});
const _useTypingAnnounce = require("./useTypingAnnounce");

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/useTypingAnnounce/index.ts"],"sourcesContent":["export { useTypingAnnounce } from './useTypingAnnounce';\n"],"names":["useTypingAnnounce"],"mappings":";;;;+BAASA;;;eAAAA,oCAAiB;;;mCAAQ"}

View File

@@ -0,0 +1,83 @@
'use client';
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "useTypingAnnounce", {
enumerable: true,
get: function() {
return useTypingAnnounce;
}
});
const _interop_require_wildcard = require("@swc/helpers/_/_interop_require_wildcard");
const _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
const _reactutilities = require("@fluentui/react-utilities");
const _reactsharedcontexts = require("@fluentui/react-shared-contexts");
const valueMutationOptions = {
attributes: true,
subtree: true,
characterData: true,
attributeFilter: [
'value'
]
};
function useTypingAnnounce() {
const { targetDocument } = (0, _reactsharedcontexts.useFluent_unstable)();
const { announce } = (0, _reactsharedcontexts.useAnnounce)();
const inputRef = _react.useRef(null);
const observer = _react.useRef(undefined);
const [setTypingTimeout, clearTypingTimeout] = (0, _reactutilities.useTimeout)();
const messageQueue = _react.useRef([]);
const callback = _react.useCallback((mutationList, mutationObserver)=>{
setTypingTimeout(()=>{
messageQueue.current.forEach(({ message, options })=>{
announce(message, options);
});
messageQueue.current.length = 0;
mutationObserver.disconnect();
}, 500);
}, [
announce,
setTypingTimeout
]);
const typingAnnounce = _react.useCallback((message, options = {})=>{
messageQueue.current.push({
message,
options
});
if (inputRef.current && observer.current) {
observer.current.observe(inputRef.current, valueMutationOptions);
}
setTypingTimeout(()=>{
observer.current && callback([], observer.current);
}, 500);
}, [
callback,
inputRef,
setTypingTimeout
]);
_react.useEffect(()=>{
const win = targetDocument === null || targetDocument === void 0 ? void 0 : targetDocument.defaultView;
if (!win) {
return;
}
if (!observer.current) {
observer.current = new win.MutationObserver(callback);
}
return ()=>{
// Clean up the observer when the component unmounts
if (observer.current) {
observer.current.disconnect();
clearTypingTimeout();
}
};
}, [
callback,
clearTypingTimeout,
targetDocument
]);
return {
typingAnnounce,
inputRef
};
}

View File

@@ -0,0 +1 @@
{"version":3,"sources":["../src/useTypingAnnounce/useTypingAnnounce.ts"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { useTimeout } from '@fluentui/react-utilities';\nimport { useAnnounce, useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';\nimport type { AnnounceOptions } from '@fluentui/react-shared-contexts';\nimport { AriaLiveAnnounceFn } from '../AriaLiveAnnouncer/AriaLiveAnnouncer.types';\n\ntype Message = {\n message: string;\n options: AnnounceOptions;\n};\n\nconst valueMutationOptions = {\n attributes: true,\n subtree: true,\n characterData: true,\n attributeFilter: ['value'],\n};\n\ninterface TypingAnnounceReturn<TInputElement extends HTMLElement = HTMLElement> {\n typingAnnounce: AriaLiveAnnounceFn;\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n inputRef: React.MutableRefObject<TInputElement | null>;\n}\n\nexport function useTypingAnnounce<\n TInputElement extends HTMLElement = HTMLElement,\n>(): TypingAnnounceReturn<TInputElement> {\n const { targetDocument } = useFluent();\n const { announce } = useAnnounce();\n\n const inputRef = React.useRef<TInputElement | null>(null);\n const observer = React.useRef<MutationObserver>(undefined);\n const [setTypingTimeout, clearTypingTimeout] = useTimeout();\n const messageQueue = React.useRef<Message[]>([]);\n\n const callback: MutationCallback = React.useCallback(\n (mutationList, mutationObserver) => {\n setTypingTimeout(() => {\n messageQueue.current.forEach(({ message, options }) => {\n announce(message, options);\n });\n messageQueue.current.length = 0;\n mutationObserver.disconnect();\n }, 500);\n },\n [announce, setTypingTimeout],\n );\n\n const typingAnnounce: AriaLiveAnnounceFn = React.useCallback(\n (message: string, options: AnnounceOptions = {}) => {\n messageQueue.current.push({ message, options });\n\n if (inputRef.current && observer.current) {\n observer.current.observe(inputRef.current, valueMutationOptions);\n }\n\n setTypingTimeout(() => {\n observer.current && callback([], observer.current);\n }, 500);\n },\n [callback, inputRef, setTypingTimeout],\n );\n\n React.useEffect(() => {\n const win = targetDocument?.defaultView;\n if (!win) {\n return;\n }\n\n if (!observer.current) {\n observer.current = new win.MutationObserver(callback);\n }\n\n return () => {\n // Clean up the observer when the component unmounts\n if (observer.current) {\n observer.current.disconnect();\n clearTypingTimeout();\n }\n };\n }, [callback, clearTypingTimeout, targetDocument]);\n\n return { typingAnnounce, inputRef };\n}\n"],"names":["useTypingAnnounce","valueMutationOptions","attributes","subtree","characterData","attributeFilter","targetDocument","useFluent","announce","useAnnounce","inputRef","React","useRef","observer","undefined","setTypingTimeout","clearTypingTimeout","useTimeout","messageQueue","callback","useCallback","mutationList","mutationObserver","current","forEach","message","options","length","disconnect","typingAnnounce","push","observe","useEffect","win","defaultView","MutationObserver"],"mappings":"AAAA;;;;;+BA0BgBA;;;eAAAA;;;;iEAxBO;gCACI;qCACkC;AAS7D,MAAMC,uBAAuB;IAC3BC,YAAY;IACZC,SAAS;IACTC,eAAe;IACfC,iBAAiB;QAAC;KAAQ;AAC5B;AAQO,SAASL;IAGd,MAAM,EAAEM,cAAc,EAAE,GAAGC,IAAAA,uCAAS;IACpC,MAAM,EAAEC,QAAQ,EAAE,GAAGC,IAAAA,gCAAW;IAEhC,MAAMC,WAAWC,OAAMC,MAAM,CAAuB;IACpD,MAAMC,WAAWF,OAAMC,MAAM,CAAmBE;IAChD,MAAM,CAACC,kBAAkBC,mBAAmB,GAAGC,IAAAA,0BAAU;IACzD,MAAMC,eAAeP,OAAMC,MAAM,CAAY,EAAE;IAE/C,MAAMO,WAA6BR,OAAMS,WAAW,CAClD,CAACC,cAAcC;QACbP,iBAAiB;YACfG,aAAaK,OAAO,CAACC,OAAO,CAAC,CAAC,EAAEC,OAAO,EAAEC,OAAO,EAAE;gBAChDlB,SAASiB,SAASC;YACpB;YACAR,aAAaK,OAAO,CAACI,MAAM,GAAG;YAC9BL,iBAAiBM,UAAU;QAC7B,GAAG;IACL,GACA;QAACpB;QAAUO;KAAiB;IAG9B,MAAMc,iBAAqClB,OAAMS,WAAW,CAC1D,CAACK,SAAiBC,UAA2B,CAAC,CAAC;QAC7CR,aAAaK,OAAO,CAACO,IAAI,CAAC;YAAEL;YAASC;QAAQ;QAE7C,IAAIhB,SAASa,OAAO,IAAIV,SAASU,OAAO,EAAE;YACxCV,SAASU,OAAO,CAACQ,OAAO,CAACrB,SAASa,OAAO,EAAEtB;QAC7C;QAEAc,iBAAiB;YACfF,SAASU,OAAO,IAAIJ,SAAS,EAAE,EAAEN,SAASU,OAAO;QACnD,GAAG;IACL,GACA;QAACJ;QAAUT;QAAUK;KAAiB;IAGxCJ,OAAMqB,SAAS,CAAC;QACd,MAAMC,MAAM3B,2BAAAA,qCAAAA,eAAgB4B,WAAW;QACvC,IAAI,CAACD,KAAK;YACR;QACF;QAEA,IAAI,CAACpB,SAASU,OAAO,EAAE;YACrBV,SAASU,OAAO,GAAG,IAAIU,IAAIE,gBAAgB,CAAChB;QAC9C;QAEA,OAAO;YACL,oDAAoD;YACpD,IAAIN,SAASU,OAAO,EAAE;gBACpBV,SAASU,OAAO,CAACK,UAAU;gBAC3BZ;YACF;QACF;IACF,GAAG;QAACG;QAAUH;QAAoBV;KAAe;IAEjD,OAAO;QAAEuB;QAAgBnB;IAAS;AACpC"}