@astryxdesign/core 0.5.1 → 0.5.2-canary.1917581
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 +19 -0
- package/dist/BottomSheet/BottomSheet.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheet.js +1 -1
- package/dist/BottomSheet/BottomSheetEdgeTint.d.ts +2 -2
- package/dist/BottomSheet/BottomSheetEdgeTint.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetEdgeTint.js +7 -10
- package/dist/BottomSheet/BottomSheetSwitcher.d.ts.map +1 -1
- package/dist/BottomSheet/BottomSheetSwitcher.js +1 -1
- package/dist/Button/Button.d.ts +2 -1
- package/dist/Button/Button.d.ts.map +1 -1
- package/dist/Button/Button.js +11 -4
- package/dist/Chat/ChatToolCalls.d.ts.map +1 -1
- package/dist/Chat/ChatToolCalls.js +34 -17
- package/dist/Popover/Popover.d.ts +10 -6
- package/dist/Popover/Popover.d.ts.map +1 -1
- package/dist/Popover/Popover.js +141 -16
- package/dist/Popover/usePopover.d.ts +4 -0
- package/dist/Popover/usePopover.d.ts.map +1 -1
- package/dist/Popover/usePopover.js +52 -5
- package/dist/Toast/useToastGesture.d.ts.map +1 -1
- package/dist/Toast/useToastGesture.js +46 -9
- package/dist/astryx.css +10 -0
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +12 -0
- package/dist/i18n/InternationalizationContext.d.ts +2 -0
- package/dist/i18n/InternationalizationContext.d.ts.map +1 -1
- package/dist/i18n/InternationalizationContext.js +3 -1
- package/dist/i18n/InternationalizationProvider.d.ts.map +1 -1
- package/dist/i18n/InternationalizationProvider.js +3 -1
- package/dist/i18n/resolve.d.ts +1 -1
- package/dist/i18n/resolve.d.ts.map +1 -1
- package/dist/i18n/resolve.js +37 -38
- package/dist/i18n/useTranslator.d.ts.map +1 -1
- package/dist/i18n/useTranslator.js +2 -3
- package/locales/af-ZA.json +0 -4
- package/locales/ar-SA.json +0 -4
- package/locales/ca-ES.json +0 -4
- package/locales/cs-CZ.json +0 -4
- package/locales/da-DK.json +0 -4
- package/locales/de-DE.json +0 -4
- package/locales/el-GR.json +0 -4
- package/locales/en.json +16 -0
- package/locales/es-ES.json +0 -4
- package/locales/fi-FI.json +0 -4
- package/locales/fr-FR.json +0 -4
- package/locales/he-IL.json +0 -4
- package/locales/hu-HU.json +0 -4
- package/locales/it-IT.json +0 -4
- package/locales/ja-JP.json +0 -4
- package/locales/ko-KR.json +0 -4
- package/locales/nl-NL.json +0 -4
- package/locales/no-NO.json +0 -4
- package/locales/pl-PL.json +0 -4
- package/locales/pseudo.json +12 -0
- package/locales/pt-BR.json +0 -4
- package/locales/pt-PT.json +0 -4
- package/locales/ro-RO.json +0 -4
- package/locales/ru-RU.json +0 -4
- package/locales/sr-SP.json +0 -4
- package/locales/sv-SE.json +0 -4
- package/locales/tr-TR.json +0 -4
- package/locales/uk-UA.json +0 -4
- package/locales/vi-VN.json +0 -4
- package/locales/zh-CN.json +0 -4
- package/locales/zh-TW.json +0 -4
- package/package.json +3 -3
- package/src/BottomSheet/BottomSheet.tsx +1 -2
- package/src/BottomSheet/BottomSheetEdgeTint.test.tsx +4 -6
- package/src/BottomSheet/BottomSheetEdgeTint.tsx +7 -10
- package/src/BottomSheet/BottomSheetSwitcher.tsx +1 -2
- package/src/Button/Button.test.tsx +10 -0
- package/src/Button/Button.tsx +13 -5
- package/src/Calendar/Calendar.doc.mjs +1 -1
- package/src/Chat/ChatToolCalls.test.tsx +44 -0
- package/src/Chat/ChatToolCalls.tsx +36 -15
- package/src/CheckboxInput/CheckboxInput.doc.mjs +1 -1
- package/src/CheckboxList/CheckboxList.doc.mjs +1 -1
- package/src/ComplexSelector/ComplexSelector.doc.mjs +2 -2
- package/src/DateInput/DateInput.doc.mjs +1 -1
- package/src/DateRangeInput/DateRangeInput.doc.mjs +1 -1
- package/src/DateTimeInput/DateTimeInput.doc.mjs +1 -1
- package/src/Field/Field.doc.mjs +1 -1
- package/src/FieldStatus/FieldStatus.doc.mjs +1 -1
- package/src/FileInput/FileInput.doc.mjs +1 -1
- package/src/Indicator/Indicator.doc.mjs +1 -1
- package/src/InputGroup/InputGroup.doc.mjs +1 -1
- package/src/MultiSelector/MultiSelector.doc.mjs +1 -1
- package/src/NumberInput/NumberInput.doc.mjs +1 -1
- package/src/Popover/Popover.doc.mjs +11 -11
- package/src/Popover/Popover.test.tsx +397 -2
- package/src/Popover/Popover.tsx +228 -21
- package/src/Popover/usePopover.tsx +92 -15
- package/src/PowerSearch/PowerSearch.doc.mjs +1 -1
- package/src/RadioList/RadioList.doc.mjs +1 -1
- package/src/Selector/Selector.doc.mjs +1 -1
- package/src/Slider/Slider.doc.mjs +2 -2
- package/src/Switch/Switch.doc.mjs +1 -1
- package/src/TextArea/TextArea.doc.mjs +1 -1
- package/src/TextInput/TextInput.doc.mjs +1 -1
- package/src/TimeInput/TimeInput.doc.mjs +1 -1
- package/src/Toast/ToastViewport.test.tsx +118 -4
- package/src/Toast/useToastGesture.ts +61 -8
- package/src/Tokenizer/Tokenizer.doc.mjs +1 -1
- package/src/Typeahead/Typeahead.doc.mjs +1 -1
- package/src/hooks/useFocusTrap.test.tsx +40 -0
- package/src/hooks/useFocusTrap.ts +13 -0
- package/src/i18n/InternationalizationContext.ts +3 -0
- package/src/i18n/InternationalizationProvider.tsx +8 -1
- package/src/i18n/__tests__/resolve.test.ts +23 -1
- package/src/i18n/resolve.ts +46 -49
- package/src/i18n/useTranslator.ts +2 -7
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @xds/core
|
|
2
2
|
|
|
3
|
+
# 0.5.2
|
|
4
|
+
|
|
5
|
+
#### Fixes
|
|
6
|
+
|
|
7
|
+
- Rename the Data Input component category to Form Controls (#5686)
|
|
8
|
+
|
|
9
|
+
#### Performance
|
|
10
|
+
|
|
11
|
+
- Improve frequent translation lookups by pre-building locale maps (#4696)
|
|
12
|
+
|
|
13
|
+
#### Contributors
|
|
14
|
+
|
|
15
|
+
Thanks to everyone who contributed to this release:
|
|
16
|
+
|
|
17
|
+
- @ngolin
|
|
18
|
+
- @rubyycheung
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
3
22
|
# 0.5.1
|
|
4
23
|
|
|
5
24
|
#### New Features
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,WAAW,CAAC;AAe7C,YAAY,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAyEhF,UAAU,sBAAuB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB,wGAAwG;IACxG,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,wBAAyB,SAAQ,sBAAsB;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAC1B,0BAA0B,GAAG,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"BottomSheet.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheet.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,WAAW,CAAC;AAe7C,YAAY,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAChF,OAAO,KAAK,EAAC,iBAAiB,EAAE,oBAAoB,EAAC,MAAM,oBAAoB,CAAC;AAyEhF,UAAU,sBAAuB,SAAQ,SAAS,CAAC,cAAc,CAAC;IAChE,qDAAqD;IACrD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAEhC,sCAAsC;IACtC,KAAK,EAAE,MAAM,CAAC;IAEd,0EAA0E;IAC1E,QAAQ,EAAE,SAAS,CAAC;IAEpB,wGAAwG;IACxG,MAAM,CAAC,EAAE,iBAAiB,GAAG,MAAM,GAAG,MAAM,CAAC;IAE7C;;;;;;;OAOG;IACH,UAAU,CAAC,EAAE,aAAa,CAAC,oBAAoB,CAAC,CAAC;IAEjD;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAED,UAAU,0BAA2B,SAAQ,sBAAsB;IACjE,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,UAAU,wBAAyB,SAAQ,sBAAsB;IAC/D,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,KAAK,CAAC;IACf,YAAY,CAAC,EAAE,KAAK,CAAC;IACrB,QAAQ,CAAC,EAAE,KAAK,CAAC;CAClB;AAED,MAAM,MAAM,gBAAgB,GAC1B,0BAA0B,GAAG,wBAAwB,CAAC;AA2XxD;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,+BA6BlD;yBA7Be,WAAW"}
|
|
@@ -274,7 +274,7 @@ function StandaloneBottomSheet({
|
|
|
274
274
|
onMotionComplete: handleMotionComplete,
|
|
275
275
|
children: children
|
|
276
276
|
})
|
|
277
|
-
}),
|
|
277
|
+
}), /*#__PURE__*/_jsx(BottomSheetEdgeTint, {})]
|
|
278
278
|
});
|
|
279
279
|
}
|
|
280
280
|
function SwitcherBottomSheetItem({
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Colours the iOS Safari toolbar strip below a
|
|
3
|
-
*
|
|
2
|
+
* Colours the iOS Safari toolbar strip below a sheet. Renders nothing visible;
|
|
3
|
+
* see the file header for why it exists.
|
|
4
4
|
*/
|
|
5
5
|
export declare function BottomSheetEdgeTint(): import("react").JSX.Element;
|
|
6
6
|
//# sourceMappingURL=BottomSheetEdgeTint.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomSheetEdgeTint.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetEdgeTint.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BottomSheetEdgeTint.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetEdgeTint.tsx"],"names":[],"mappings":"AAkEA;;;GAGG;AACH,wBAAgB,mBAAmB,gCAQlC"}
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* @file BottomSheetEdgeTint.tsx
|
|
7
7
|
* @input Uses StyleX and core color tokens
|
|
8
8
|
* @output Exports BottomSheetEdgeTint, an internal decorative element
|
|
9
|
-
* @position Private helper rendered inside
|
|
9
|
+
* @position Private helper rendered inside every BottomSheet dialog
|
|
10
10
|
*
|
|
11
11
|
* iOS 26 Safari dropped `<meta name="theme-color">` and instead derives the
|
|
12
12
|
* colour it paints behind its translucent toolbars by sampling the page: it
|
|
@@ -14,13 +14,10 @@
|
|
|
14
14
|
* `fixed`/`sticky` ancestor, and extends that element's declared
|
|
15
15
|
* `background-color` into the browser chrome.
|
|
16
16
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* fixed
|
|
20
|
-
*
|
|
21
|
-
* candidate by *keeping the colour it already had* — the host page's. The page
|
|
22
|
-
* then shows through behind the address bar while the sheet covers the screen
|
|
23
|
-
* above it.
|
|
17
|
+
* WebKit may otherwise extend either the dialog backdrop or the host page into
|
|
18
|
+
* the browser chrome. Which one wins varies with dialog mode and the page's
|
|
19
|
+
* own fixed or sticky edge content, so relying on the backdrop makes otherwise
|
|
20
|
+
* identical BottomSheets produce different toolbar colours.
|
|
24
21
|
*
|
|
25
22
|
* This element gives the heuristic something unambiguous to sample: fixed,
|
|
26
23
|
* full width, flush with the bottom edge, taller than WebKit's 10px minimum
|
|
@@ -48,8 +45,8 @@ import { colorVars } from "../theme/tokens.stylex.js";
|
|
|
48
45
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
49
46
|
const SAMPLE_HEIGHT_PX = 12;
|
|
50
47
|
/**
|
|
51
|
-
* Colours the iOS Safari toolbar strip below a
|
|
52
|
-
*
|
|
48
|
+
* Colours the iOS Safari toolbar strip below a sheet. Renders nothing visible;
|
|
49
|
+
* see the file header for why it exists.
|
|
53
50
|
*/
|
|
54
51
|
export function BottomSheetEdgeTint() {
|
|
55
52
|
return /*#__PURE__*/_jsx("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BottomSheetSwitcher.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetSwitcher.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAQL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAqI5C,MAAM,WAAW,wBAAyB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC5E,iDAAiD;IACjD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAEnC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAE9D;;;;;OAKG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B,iEAAiE;IACjE,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEtD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,0DAA0D;IAC1D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,mBAAmB,EACnB,QAAe,EACf,QAAQ,EACR,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,GAAG,KAAK,EACT,EAAE,wBAAwB,+
|
|
1
|
+
{"version":3,"file":"BottomSheetSwitcher.d.ts","sourceRoot":"","sources":["../../src/BottomSheet/BottomSheetSwitcher.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AAEH,OAAO,EAQL,KAAK,SAAS,EACd,KAAK,cAAc,EACpB,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAqI5C,MAAM,WAAW,wBAAyB,SAAQ,SAAS,CAAC,iBAAiB,CAAC;IAC5E,iDAAiD;IACjD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAEnC,oEAAoE;IACpE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,cAAc,CAAC,iBAAiB,CAAC,KAAK,IAAI,CAAC;IAE9D;;;;;OAKG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAE3B,iEAAiE;IACjE,mBAAmB,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAEtD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,0DAA0D;IAC1D,QAAQ,EAAE,SAAS,CAAC;CACrB;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,WAAW,EACX,mBAAmB,EACnB,QAAe,EACf,QAAQ,EACR,GAAG,EACH,MAAM,EACN,SAAS,EACT,KAAK,EACL,QAAQ,EACR,OAAO,EACP,SAAS,EACT,GAAG,KAAK,EACT,EAAE,wBAAwB,+BA8Z1B;yBA3ae,mBAAmB"}
|
|
@@ -410,7 +410,7 @@ export function BottomSheetSwitcher({
|
|
|
410
410
|
...(activeSheetPurpose === 'required' ? {
|
|
411
411
|
role: 'alertdialog'
|
|
412
412
|
} : undefined),
|
|
413
|
-
children: [children,
|
|
413
|
+
children: [children, /*#__PURE__*/_jsx(BottomSheetEdgeTint, {})]
|
|
414
414
|
})
|
|
415
415
|
});
|
|
416
416
|
}
|
package/dist/Button/Button.d.ts
CHANGED
|
@@ -78,7 +78,8 @@ export interface ButtonProps extends BaseProps<HTMLButtonElement> {
|
|
|
78
78
|
*/
|
|
79
79
|
isDisabled?: boolean;
|
|
80
80
|
/**
|
|
81
|
-
* Whether the button is in a loading state.
|
|
81
|
+
* Whether the button is in a loading state. Loading prevents interaction
|
|
82
|
+
* without dimming the spinner; explicit disabled states remain dimmed.
|
|
82
83
|
* @default false
|
|
83
84
|
*/
|
|
84
85
|
isLoading?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/Button/Button.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAwB,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAC5D,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAC,SAAS,EAAE,SAAS,EAAC,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAwB3C,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,eAAe,CAAC;AAKrD,OAAO,KAAK,EAAC,gBAAgB,EAAC,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"Button.d.ts","sourceRoot":"","sources":["../../src/Button/Button.tsx"],"names":[],"mappings":"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"}
|
package/dist/Button/Button.js
CHANGED
|
@@ -66,16 +66,19 @@ const styles = {
|
|
|
66
66
|
$$css: true
|
|
67
67
|
},
|
|
68
68
|
pressable: {
|
|
69
|
-
k3aq6I: "x3oybdh
|
|
69
|
+
k3aq6I: "x3oybdh x8ppqj",
|
|
70
70
|
$$css: true
|
|
71
71
|
},
|
|
72
|
-
|
|
72
|
+
inactive: {
|
|
73
73
|
kkrTdU: "xt0e3qv",
|
|
74
|
-
kSiTet: "xbyyjgo",
|
|
75
74
|
kKwaWg: "x18o3ruo",
|
|
76
75
|
k3aq6I: "x1c071of x1pdlv7q",
|
|
77
76
|
$$css: true
|
|
78
77
|
},
|
|
78
|
+
disabled: {
|
|
79
|
+
kSiTet: "xbyyjgo",
|
|
80
|
+
$$css: true
|
|
81
|
+
},
|
|
79
82
|
ariaDisabled: {
|
|
80
83
|
kKwaWg: "x18o3ruo xuqm82a",
|
|
81
84
|
$$css: true
|
|
@@ -374,6 +377,10 @@ export function Button({
|
|
|
374
377
|
// When interruptible, the loading state drives the spinner and aria-busy but
|
|
375
378
|
// not disabled, so clicks keep landing and can interrupt the in-flight action.
|
|
376
379
|
const buttonDisabled = isDisabled || groupDisabled || isLoadingState && !isInterruptible;
|
|
380
|
+
// A loading button remains non-interactive, but its spinner communicates an
|
|
381
|
+
// active state and must retain contrast. Only explicitly disabled controls
|
|
382
|
+
// receive the visually dimmed treatment.
|
|
383
|
+
const visuallyDisabled = isDisabled || groupDisabled;
|
|
377
384
|
// isIconOnly prop is the source of truth for icon-only rendering.
|
|
378
385
|
// When false (default), label is always rendered as visible text.
|
|
379
386
|
|
|
@@ -434,7 +441,7 @@ export function Button({
|
|
|
434
441
|
} : null;
|
|
435
442
|
|
|
436
443
|
// Shared StyleX props for both button and link rendering
|
|
437
|
-
const sharedStylexProps = focusOutlineProps.focusVisible(styles.base, sizeStyles[size], isIconOnly && styles.iconOnly, interactionOverlayStyles.backgroundImage, buttonDisabled && styles.disabled, useAriaDisabled && styles.ariaDisabled, renderAsLink && styles.link, !buttonGroup && styles.pressable, buttonGroup && (buttonGroup.orientation === 'horizontal' ? groupStyles.horizontal : groupStyles.vertical), buttonGroup && (variant === 'primary' || variant === 'destructive') && (buttonGroup.orientation === 'horizontal' ? groupStyles.onSolidHorizontal : groupStyles.onSolidVertical),
|
|
444
|
+
const sharedStylexProps = focusOutlineProps.focusVisible(styles.base, sizeStyles[size], isIconOnly && styles.iconOnly, interactionOverlayStyles.backgroundImage, buttonDisabled && styles.inactive, visuallyDisabled && styles.disabled, useAriaDisabled && styles.ariaDisabled, renderAsLink && styles.link, !buttonGroup && styles.pressable, buttonGroup && (buttonGroup.orientation === 'horizontal' ? groupStyles.horizontal : groupStyles.vertical), buttonGroup && (variant === 'primary' || variant === 'destructive') && (buttonGroup.orientation === 'horizontal' ? groupStyles.onSolidHorizontal : groupStyles.onSolidVertical),
|
|
438
445
|
// Standalone floating buttons only — a grouped button's elevation is owned
|
|
439
446
|
// by the ButtonGroup so the shared surface lifts as one unit.
|
|
440
447
|
!buttonGroup && elevationStyles[elevation], width != null && dynamicStyles.width(width),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ChatToolCalls.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatToolCalls.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,EAA+B,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAC1E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAwB5C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6FAA6F;IAC7F,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,+BAA+B;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;
|
|
1
|
+
{"version":3,"file":"ChatToolCalls.d.ts","sourceRoot":"","sources":["../../src/Chat/ChatToolCalls.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,EAAE,EAA+B,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAC1E,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAwB5C,MAAM,MAAM,kBAAkB,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAE9E,MAAM,WAAW,gBAAgB;IAC/B,0BAA0B;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,oDAAoD;IACpD,MAAM,CAAC,EAAE,kBAAkB,CAAC;IAC5B,2FAA2F;IAC3F,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6DAA6D;IAC7D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,oFAAoF;IACpF,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,mFAAmF;IACnF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,6FAA6F;IAC7F,YAAY,CAAC,EAAE,SAAS,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,SAAS,CAAC,cAAc,CAAC;IACnE,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAChC,+BAA+B;IAC/B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,6EAA6E;IAC7E,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,8DAA8D;IAC9D,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,wEAAwE;IACxE,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,4CAA4C;IAC5C,gBAAgB,CAAC,EAAE,CAAC,UAAU,EAAE,OAAO,KAAK,IAAI,CAAC;CAClD;AAkbD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,4BAgKtD;yBAhKe,aAAa"}
|
|
@@ -102,6 +102,23 @@ const STATUS_STYLES = {
|
|
|
102
102
|
complete: styles.colorComplete,
|
|
103
103
|
error: styles.colorError
|
|
104
104
|
};
|
|
105
|
+
function getStatusAnnouncement(t, status, errorMessage) {
|
|
106
|
+
if (status === 'error' && errorMessage != null) {
|
|
107
|
+
return t('@astryx.chatToolCalls.error', {
|
|
108
|
+
message: errorMessage
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
switch (status) {
|
|
112
|
+
case 'pending':
|
|
113
|
+
return t('@astryx.chatToolCalls.status.pending');
|
|
114
|
+
case 'running':
|
|
115
|
+
return t('@astryx.chatToolCalls.status.running');
|
|
116
|
+
case 'complete':
|
|
117
|
+
return t('@astryx.chatToolCalls.status.complete');
|
|
118
|
+
case 'error':
|
|
119
|
+
return t('@astryx.chatToolCalls.status.error');
|
|
120
|
+
}
|
|
121
|
+
}
|
|
105
122
|
function getToolCallKey(call) {
|
|
106
123
|
return getKey(call.key, () => [call.name, call.status ?? 'complete', call.target ?? '', call.node ?? '', call.duration ?? '', call.additions?.toString() ?? '', call.deletions?.toString() ?? '', call.errorMessage ?? ''].join('\u001F'));
|
|
107
124
|
}
|
|
@@ -118,6 +135,7 @@ function CallRow({
|
|
|
118
135
|
const hasDetail = call.resultDetail != null;
|
|
119
136
|
const [isDetailOpen, setIsDetailOpen] = useState(false);
|
|
120
137
|
const detailId = useId();
|
|
138
|
+
const statusAnnouncement = getStatusAnnouncement(t, status, call.errorMessage);
|
|
121
139
|
const toggleDetail = hasDetail ? () => setIsDetailOpen(prev => !prev) : undefined;
|
|
122
140
|
const row = /*#__PURE__*/_jsxs("div", {
|
|
123
141
|
role: hasDetail ? 'button' : undefined,
|
|
@@ -144,10 +162,12 @@ function CallRow({
|
|
|
144
162
|
...stylex.props(styles.statusIcon, STATUS_STYLES[status]),
|
|
145
163
|
children: [status === 'running' ? /*#__PURE__*/_jsx(Spinner, {
|
|
146
164
|
size: "sm",
|
|
147
|
-
shade: "subtle"
|
|
165
|
+
shade: "subtle",
|
|
166
|
+
"aria-hidden": "true"
|
|
148
167
|
}) : status === 'pending' ? /*#__PURE__*/_jsx(Spinner, {
|
|
149
168
|
size: "sm",
|
|
150
|
-
shade: "subtle"
|
|
169
|
+
shade: "subtle",
|
|
170
|
+
"aria-hidden": "true"
|
|
151
171
|
}) : /*#__PURE__*/_jsxs(_Fragment, {
|
|
152
172
|
children: [/*#__PURE__*/_jsx("span", {
|
|
153
173
|
...{
|
|
@@ -163,16 +183,8 @@ function CallRow({
|
|
|
163
183
|
color: "inherit"
|
|
164
184
|
})
|
|
165
185
|
})]
|
|
166
|
-
}),
|
|
167
|
-
|
|
168
|
-
// The title attribute above is hover-only; expose the error detail
|
|
169
|
-
// as real text so it reaches screen readers, keyboard, and touch
|
|
170
|
-
// users. Rendering it inside the row also folds it into the
|
|
171
|
-
// accessible name of expandable (role="button") rows.
|
|
172
|
-
_jsx(VisuallyHidden, {
|
|
173
|
-
children: t('@astryx.chatToolCalls.error', {
|
|
174
|
-
message: call.errorMessage ?? ''
|
|
175
|
-
})
|
|
186
|
+
}), /*#__PURE__*/_jsx(VisuallyHidden, {
|
|
187
|
+
children: statusAnnouncement
|
|
176
188
|
})]
|
|
177
189
|
}), /*#__PURE__*/_jsx("span", {
|
|
178
190
|
...{
|
|
@@ -304,6 +316,7 @@ export function ChatToolCalls(props) {
|
|
|
304
316
|
// Multiple calls: latest call at surface with chevron to expand all
|
|
305
317
|
const latestCall = calls[calls.length - 1];
|
|
306
318
|
const latestStatus = latestCall.status ?? 'complete';
|
|
319
|
+
const latestStatusAnnouncement = getStatusAnnouncement(t, latestStatus, latestCall.errorMessage);
|
|
307
320
|
return /*#__PURE__*/_jsxs("div", {
|
|
308
321
|
ref: ref,
|
|
309
322
|
...mergeProps(themeProps('chat-tool-calls'), stylex.props(styles.root, xstyle), className, style),
|
|
@@ -342,14 +355,16 @@ export function ChatToolCalls(props) {
|
|
|
342
355
|
})
|
|
343
356
|
})]
|
|
344
357
|
}) : /*#__PURE__*/_jsxs(_Fragment, {
|
|
345
|
-
children: [/*#__PURE__*/
|
|
358
|
+
children: [/*#__PURE__*/_jsxs("span", {
|
|
346
359
|
...stylex.props(styles.statusIcon, STATUS_STYLES[latestStatus]),
|
|
347
|
-
children: latestStatus === 'running' ? /*#__PURE__*/_jsx(Spinner, {
|
|
360
|
+
children: [latestStatus === 'running' ? /*#__PURE__*/_jsx(Spinner, {
|
|
348
361
|
size: "sm",
|
|
349
|
-
shade: "subtle"
|
|
362
|
+
shade: "subtle",
|
|
363
|
+
"aria-hidden": "true"
|
|
350
364
|
}) : latestStatus === 'pending' ? /*#__PURE__*/_jsx(Spinner, {
|
|
351
365
|
size: "sm",
|
|
352
|
-
shade: "subtle"
|
|
366
|
+
shade: "subtle",
|
|
367
|
+
"aria-hidden": "true"
|
|
353
368
|
}) : /*#__PURE__*/_jsxs(_Fragment, {
|
|
354
369
|
children: [/*#__PURE__*/_jsx("span", {
|
|
355
370
|
...{
|
|
@@ -365,7 +380,9 @@ export function ChatToolCalls(props) {
|
|
|
365
380
|
color: "inherit"
|
|
366
381
|
})
|
|
367
382
|
})]
|
|
368
|
-
})
|
|
383
|
+
}), /*#__PURE__*/_jsx(VisuallyHidden, {
|
|
384
|
+
children: latestStatusAnnouncement
|
|
385
|
+
})]
|
|
369
386
|
}), /*#__PURE__*/_jsx("span", {
|
|
370
387
|
...{
|
|
371
388
|
className: "x141an7d x1ltkj2j x9m5x89 x1e4wzip xv1l7n4 xuxw1ft xb3r6kr xlyipyv xs83m0k x13n9wmd"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @file Popover.tsx
|
|
3
|
-
* @input Uses React
|
|
4
|
-
* @output Exports Popover
|
|
3
|
+
* @input Uses React layout measurement and the usePopover hook
|
|
4
|
+
* @output Exports Popover with viewport fitting and conditional overflow
|
|
5
5
|
* @position Layer component; declarative wrapper around usePopover hook
|
|
6
6
|
*
|
|
7
7
|
* For hover-triggered overlays, use HoverCard instead.
|
|
@@ -21,9 +21,11 @@ import type { LayerAlignment, LayerPlacement } from '../Layer/useLayer';
|
|
|
21
21
|
export interface PopoverTriggerRenderProps {
|
|
22
22
|
/** Ref callback — attach to the trigger element for anchor positioning. */
|
|
23
23
|
ref: (el: HTMLElement | null) => void;
|
|
24
|
-
/** Toggle the popover open/closed. */
|
|
25
|
-
onClick: (
|
|
26
|
-
|
|
24
|
+
/** Toggle the popover open/closed. Pass the click event through so pointer and keyboard focus behavior can differ. */
|
|
25
|
+
onClick: (event?: {
|
|
26
|
+
detail: number;
|
|
27
|
+
}) => void;
|
|
28
|
+
/** ARIA attribute: indicates the trigger opens a dialog-style popover. */
|
|
27
29
|
'aria-haspopup': 'dialog';
|
|
28
30
|
/** ARIA attribute: whether the popover is currently open. */
|
|
29
31
|
'aria-expanded': boolean;
|
|
@@ -140,7 +142,9 @@ export interface PopoverProps extends Pick<BaseProps, 'xstyle' | 'className' | '
|
|
|
140
142
|
*/
|
|
141
143
|
closeButtonLabel?: string;
|
|
142
144
|
/**
|
|
143
|
-
* Whether to
|
|
145
|
+
* Whether to move focus into the popover when it opens. Keyboard activation
|
|
146
|
+
* focuses the first content control; pointer activation focuses the labeled
|
|
147
|
+
* dialog container so an action does not appear preselected.
|
|
144
148
|
* Set to `false` for inline showcases or documentation previews.
|
|
145
149
|
* @default true
|
|
146
150
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/Popover/Popover.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Popover.d.ts","sourceRoot":"","sources":["../../src/Popover/Popover.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,EAIZ,KAAK,YAAY,EACjB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAIf,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,cAAc,CAAC;AAE5C,OAAO,KAAK,EAAC,cAAc,EAAE,cAAc,EAAC,MAAM,mBAAmB,CAAC;AAmCtE;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,2EAA2E;IAC3E,GAAG,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IACtC,sHAAsH;IACtH,OAAO,EAAE,CAAC,KAAK,CAAC,EAAE;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,KAAK,IAAI,CAAC;IAC5C,0EAA0E;IAC1E,eAAe,EAAE,QAAQ,CAAC;IAC1B,6DAA6D;IAC7D,eAAe,EAAE,OAAO,CAAC;IACzB,4DAA4D;IAC5D,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,YAAa,SAAQ,IAAI,CACxC,SAAS,EACT,QAAQ,GAAG,WAAW,GAAG,OAAO,CACjC;IACC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACH,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,yBAAyB,KAAK,SAAS,CAAC,CAAC;IAEzE;;;;;;OAMG;IACH,SAAS,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAEzC;;OAEG;IACH,OAAO,EAAE,SAAS,CAAC;IAEnB;;;;OAIG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,SAAS,CAAC,EAAE,cAAc,CAAC;IAE3B;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB;;OAEG;IACH,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAEzC;;;;OAIG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAExB;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEzB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;;;OAMG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;;OAKG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAsGD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,wBAAgB,OAAO,CAAC,EACtB,QAAQ,EACR,SAAS,EACT,OAAO,EACP,SAAmB,EACnB,SAAmB,EACnB,MAAM,EACN,YAAY,EACZ,SAAgB,EAChB,KAAK,EACL,KAAK,EACL,IAAe,EACf,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,eAAsB,EACtB,gBAAuB,EACvB,MAAM,EACN,SAAS,EACT,KAAK,EACL,aAAa,EAAE,MAAM,GACtB,EAAE,YAAY,GAAG,YAAY,CAmX7B;yBAzYe,OAAO"}
|
package/dist/Popover/Popover.js
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* @file Popover.tsx
|
|
7
|
-
* @input Uses React
|
|
8
|
-
* @output Exports Popover
|
|
7
|
+
* @input Uses React layout measurement and the usePopover hook
|
|
8
|
+
* @output Exports Popover with viewport fitting and conditional overflow
|
|
9
9
|
* @position Layer component; declarative wrapper around usePopover hook
|
|
10
10
|
*
|
|
11
11
|
* For hover-triggered overlays, use HoverCard instead.
|
|
@@ -16,11 +16,11 @@
|
|
|
16
16
|
* - /apps/storybook/stories/Popover.stories.tsx
|
|
17
17
|
* - /packages/cli/assets/templates/blocks/components/Popover/ (showcase blocks)
|
|
18
18
|
*/
|
|
19
|
-
import React, { useCallback, useRef } from 'react';
|
|
19
|
+
import React, { useCallback, useRef, useState } from 'react';
|
|
20
20
|
import { useIsomorphicLayoutEffect } from "../hooks/useIsomorphicLayoutEffect.js";
|
|
21
21
|
import * as stylex from '@stylexjs/stylex';
|
|
22
22
|
import { devWarn } from "../utils/devWarning.js";
|
|
23
|
-
import {
|
|
23
|
+
import { usePopoverInternal } from "./usePopover.js";
|
|
24
24
|
import { layerAnimations } from "../Layer/layerAnimations.stylex.js";
|
|
25
25
|
import "../theme/tokens.stylex.js";
|
|
26
26
|
import { spacingVars } from "../theme/tokens.stylex.js";
|
|
@@ -31,6 +31,14 @@ import { InteractiveRoleContext } from "../InteractiveRoleContext/InteractiveRol
|
|
|
31
31
|
// =============================================================================
|
|
32
32
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
33
33
|
const BUTTON_SELECTOR = 'button, [role="button"]';
|
|
34
|
+
const POPOVER_VIEWPORT_GUTTER = spacingVars['--spacing-4'];
|
|
35
|
+
const POPOVER_MAX_INLINE_SIZE = `calc(100vi - max(${POPOVER_VIEWPORT_GUTTER}, env(safe-area-inset-left, 0px)) - max(${POPOVER_VIEWPORT_GUTTER}, env(safe-area-inset-right, 0px)))`;
|
|
36
|
+
const POPOVER_MAX_INLINE_SIZE_FALLBACK = `calc(100vw - ${POPOVER_VIEWPORT_GUTTER} - ${POPOVER_VIEWPORT_GUTTER})`;
|
|
37
|
+
const POPOVER_MAX_BLOCK_SIZE = `calc(100dvb - max(${POPOVER_VIEWPORT_GUTTER}, env(safe-area-inset-top, 0px)) - max(${POPOVER_VIEWPORT_GUTTER}, env(safe-area-inset-bottom, 0px)))`;
|
|
38
|
+
const POPOVER_MAX_BLOCK_SIZE_FALLBACK = `calc(100vh - ${POPOVER_VIEWPORT_GUTTER} - ${POPOVER_VIEWPORT_GUTTER})`;
|
|
39
|
+
const POPOVER_POSITION_AREA_MAX_INLINE_SIZE = `calc(100% - max(${POPOVER_VIEWPORT_GUTTER}, env(safe-area-inset-left, 0px), env(safe-area-inset-right, 0px)))`;
|
|
40
|
+
const POPOVER_POSITION_AREA_MAX_INLINE_SIZE_FALLBACK = `calc(100% - ${POPOVER_VIEWPORT_GUTTER})`;
|
|
41
|
+
const POPOVER_INLINE_EDGE_GUTTER = `max(${POPOVER_VIEWPORT_GUTTER}, env(safe-area-inset-left, 0px), env(safe-area-inset-right, 0px))`;
|
|
34
42
|
|
|
35
43
|
/**
|
|
36
44
|
* Find the trigger button inside a container element.
|
|
@@ -57,6 +65,54 @@ function findTriggerButton(el) {
|
|
|
57
65
|
// =============================================================================
|
|
58
66
|
|
|
59
67
|
const styles = {
|
|
68
|
+
viewportFit: {
|
|
69
|
+
kB7OPa: "x9f619",
|
|
70
|
+
kskxy: "xtm2925",
|
|
71
|
+
$$css: true
|
|
72
|
+
},
|
|
73
|
+
viewportAligned: {
|
|
74
|
+
ks0D6T: "xbd96yr",
|
|
75
|
+
$$css: true
|
|
76
|
+
},
|
|
77
|
+
viewportStart: {
|
|
78
|
+
k71WvV: "xxeicf8",
|
|
79
|
+
$$css: true
|
|
80
|
+
},
|
|
81
|
+
viewportEnd: {
|
|
82
|
+
keTefX: "x47fqr9",
|
|
83
|
+
$$css: true
|
|
84
|
+
},
|
|
85
|
+
viewportBlockStart: {
|
|
86
|
+
k1K539: "x1kps3mo",
|
|
87
|
+
$$css: true
|
|
88
|
+
},
|
|
89
|
+
viewportBlockEnd: {
|
|
90
|
+
keoZOQ: "xsoubt3",
|
|
91
|
+
$$css: true
|
|
92
|
+
},
|
|
93
|
+
viewportCentered: {
|
|
94
|
+
keTefX: "x47fqr9",
|
|
95
|
+
k71WvV: "xxeicf8",
|
|
96
|
+
ks0D6T: "xs2v1xk",
|
|
97
|
+
$$css: true
|
|
98
|
+
},
|
|
99
|
+
viewportBlockCentered: {
|
|
100
|
+
keoZOQ: "xsoubt3",
|
|
101
|
+
k1K539: "x1kps3mo",
|
|
102
|
+
ks0D6T: "xs2v1xk",
|
|
103
|
+
$$css: true
|
|
104
|
+
},
|
|
105
|
+
surfaceViewportFit: {
|
|
106
|
+
kB7OPa: "x9f619",
|
|
107
|
+
ks0D6T: "xs2v1xk",
|
|
108
|
+
kskxy: "xtm2925",
|
|
109
|
+
$$css: true
|
|
110
|
+
},
|
|
111
|
+
surfaceScrollable: {
|
|
112
|
+
kVQacm: "xysyzu8",
|
|
113
|
+
kZeWKH: "xish69e",
|
|
114
|
+
$$css: true
|
|
115
|
+
},
|
|
60
116
|
contentPadding: {
|
|
61
117
|
kLKAdn: "x1vlblms",
|
|
62
118
|
kGO01o: "xvmdzux",
|
|
@@ -70,8 +126,12 @@ const styles = {
|
|
|
70
126
|
}, {
|
|
71
127
|
"--x-width": (val => typeof val === "number" ? val + "px" : val != null ? val : undefined)(typeof width === 'number' ? `${width}px` : width)
|
|
72
128
|
}],
|
|
73
|
-
|
|
74
|
-
k7Eaqz: "
|
|
129
|
+
matchTriggerAligned: {
|
|
130
|
+
k7Eaqz: "x1ks9poc",
|
|
131
|
+
$$css: true
|
|
132
|
+
},
|
|
133
|
+
matchTriggerCentered: {
|
|
134
|
+
k7Eaqz: "xagy28z",
|
|
75
135
|
$$css: true
|
|
76
136
|
}
|
|
77
137
|
};
|
|
@@ -139,6 +199,8 @@ export function Popover({
|
|
|
139
199
|
'data-testid': testId
|
|
140
200
|
}) {
|
|
141
201
|
const wrapperRef = useRef(null);
|
|
202
|
+
const measurementFrameRef = useRef(null);
|
|
203
|
+
const [hasOverflow, setHasOverflow] = useState(false);
|
|
142
204
|
const isControlled = isOpen !== undefined;
|
|
143
205
|
const handlePopoverShow = useCallback(() => {
|
|
144
206
|
onOpenChange?.(true);
|
|
@@ -146,7 +208,7 @@ export function Popover({
|
|
|
146
208
|
const handlePopoverHide = useCallback(() => {
|
|
147
209
|
onOpenChange?.(false);
|
|
148
210
|
}, [onOpenChange]);
|
|
149
|
-
const popover =
|
|
211
|
+
const popover = usePopoverInternal({
|
|
150
212
|
dialogLabel: label,
|
|
151
213
|
role,
|
|
152
214
|
isModal,
|
|
@@ -159,21 +221,82 @@ export function Popover({
|
|
|
159
221
|
// it is the element the `popover` theme target has to sit on — a target on
|
|
160
222
|
// the content div inside it styles a box that paints nothing.
|
|
161
223
|
surfaceTarget: 'popover',
|
|
162
|
-
xstyle: [styles.contentPadding, xstyle],
|
|
224
|
+
xstyle: [styles.contentPadding, styles.surfaceViewportFit, hasOverflow && styles.surfaceScrollable, xstyle],
|
|
163
225
|
className,
|
|
164
226
|
style,
|
|
165
227
|
onShow: handlePopoverShow,
|
|
166
228
|
onHide: handlePopoverHide
|
|
167
229
|
});
|
|
230
|
+
const measureOverflow = useCallback(() => {
|
|
231
|
+
const surface = popover.contentRef.current;
|
|
232
|
+
if (!surface) {
|
|
233
|
+
return;
|
|
234
|
+
}
|
|
235
|
+
const nextHasOverflow = surface.scrollHeight > surface.clientHeight + 1 || surface.scrollWidth > surface.clientWidth + 1;
|
|
236
|
+
// eslint-disable-next-line @eslint-react/set-state-in-effect -- DOM overflow measurement controls whether this surface becomes a scroll container
|
|
237
|
+
setHasOverflow(current => current === nextHasOverflow ? current : nextHasOverflow);
|
|
238
|
+
}, [popover.contentRef]);
|
|
239
|
+
const scheduleOverflowMeasurement = useCallback(() => {
|
|
240
|
+
if (measurementFrameRef.current != null) {
|
|
241
|
+
return;
|
|
242
|
+
}
|
|
243
|
+
measurementFrameRef.current = window.requestAnimationFrame(() => {
|
|
244
|
+
measurementFrameRef.current = null;
|
|
245
|
+
measureOverflow();
|
|
246
|
+
});
|
|
247
|
+
}, [measureOverflow]);
|
|
248
|
+
useIsomorphicLayoutEffect(() => {
|
|
249
|
+
if (!popover.isOpen) {
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
const surface = popover.contentRef.current;
|
|
253
|
+
if (!surface) {
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
measureOverflow();
|
|
257
|
+
const resizeObserver = typeof ResizeObserver === 'undefined' ? null : new ResizeObserver(scheduleOverflowMeasurement);
|
|
258
|
+
const mutationObserver = typeof MutationObserver === 'undefined' ? null : new MutationObserver(scheduleOverflowMeasurement);
|
|
259
|
+
resizeObserver?.observe(surface);
|
|
260
|
+
mutationObserver?.observe(surface, {
|
|
261
|
+
childList: true,
|
|
262
|
+
characterData: true,
|
|
263
|
+
subtree: true
|
|
264
|
+
});
|
|
265
|
+
surface.addEventListener('load', scheduleOverflowMeasurement, true);
|
|
266
|
+
window.addEventListener('resize', scheduleOverflowMeasurement);
|
|
267
|
+
window.visualViewport?.addEventListener('resize', scheduleOverflowMeasurement);
|
|
268
|
+
return () => {
|
|
269
|
+
resizeObserver?.disconnect();
|
|
270
|
+
mutationObserver?.disconnect();
|
|
271
|
+
surface.removeEventListener('load', scheduleOverflowMeasurement, true);
|
|
272
|
+
window.removeEventListener('resize', scheduleOverflowMeasurement);
|
|
273
|
+
window.visualViewport?.removeEventListener('resize', scheduleOverflowMeasurement);
|
|
274
|
+
if (measurementFrameRef.current != null) {
|
|
275
|
+
window.cancelAnimationFrame(measurementFrameRef.current);
|
|
276
|
+
measurementFrameRef.current = null;
|
|
277
|
+
}
|
|
278
|
+
};
|
|
279
|
+
}, [measureOverflow, popover.isOpen, scheduleOverflowMeasurement]);
|
|
280
|
+
useIsomorphicLayoutEffect(() => {
|
|
281
|
+
if (!popover.isOpen) {
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
scheduleOverflowMeasurement();
|
|
285
|
+
}, [content, popover.isOpen, scheduleOverflowMeasurement]);
|
|
168
286
|
|
|
169
287
|
// Shared handler for click events on the trigger button.
|
|
170
|
-
const handleTriggerClick = useCallback(
|
|
288
|
+
const handleTriggerClick = useCallback(event => {
|
|
171
289
|
if (!isEnabled) {
|
|
172
290
|
return;
|
|
173
291
|
}
|
|
174
|
-
//
|
|
175
|
-
|
|
176
|
-
|
|
292
|
+
// Pointer/touch activation should not make the first action look
|
|
293
|
+
// preselected. Keep focus inside the modal dialog by focusing its
|
|
294
|
+
// labeled container; keyboard and AT activation still focus the first
|
|
295
|
+
// content control and expose the expected focus ring.
|
|
296
|
+
popover.toggleWithOptions({
|
|
297
|
+
focusTarget: role === 'dialog' && event != null && event.detail > 0 ? 'container' : 'first'
|
|
298
|
+
});
|
|
299
|
+
}, [isEnabled, popover, role]);
|
|
177
300
|
|
|
178
301
|
// Shared handler for keydown events on role="button" elements.
|
|
179
302
|
// Native <button> synthesizes click on Enter/Space, but role="button"
|
|
@@ -289,7 +412,9 @@ export function Popover({
|
|
|
289
412
|
}, [isOpen, isControlled, popover]);
|
|
290
413
|
|
|
291
414
|
// Determine popover xstyle
|
|
292
|
-
const
|
|
415
|
+
const popoverSizeXstyle = width ? styles.customWidth(width) : alignment === 'center' ? styles.matchTriggerCentered : styles.matchTriggerAligned;
|
|
416
|
+
const isSidePlacement = placement === 'start' || placement === 'end';
|
|
417
|
+
const popoverViewportXstyle = alignment === 'center' ? isSidePlacement ? styles.viewportBlockCentered : styles.viewportCentered : [styles.viewportAligned, isSidePlacement ? alignment === 'start' ? styles.viewportBlockStart : styles.viewportBlockEnd : alignment === 'start' ? styles.viewportStart : styles.viewportEnd];
|
|
293
418
|
|
|
294
419
|
// Sibling mode: render only the popover (no wrapper needed)
|
|
295
420
|
if (anchorRef && children == null) {
|
|
@@ -301,7 +426,7 @@ export function Popover({
|
|
|
301
426
|
placement,
|
|
302
427
|
alignment,
|
|
303
428
|
offset: spacingVars['--spacing-1'],
|
|
304
|
-
xstyle: [
|
|
429
|
+
xstyle: [styles.viewportFit, popoverViewportXstyle, popoverSizeXstyle, layerAnimations[placement]]
|
|
305
430
|
})
|
|
306
431
|
});
|
|
307
432
|
}
|
|
@@ -324,7 +449,7 @@ export function Popover({
|
|
|
324
449
|
placement,
|
|
325
450
|
alignment,
|
|
326
451
|
offset: spacingVars['--spacing-1'],
|
|
327
|
-
xstyle: [
|
|
452
|
+
xstyle: [styles.viewportFit, popoverViewportXstyle, popoverSizeXstyle, layerAnimations[placement]]
|
|
328
453
|
})]
|
|
329
454
|
});
|
|
330
455
|
}
|
|
@@ -347,7 +472,7 @@ export function Popover({
|
|
|
347
472
|
placement,
|
|
348
473
|
alignment,
|
|
349
474
|
offset: spacingVars['--spacing-1'],
|
|
350
|
-
xstyle: [
|
|
475
|
+
xstyle: [styles.viewportFit, popoverViewportXstyle, popoverSizeXstyle, layerAnimations[placement]]
|
|
351
476
|
})]
|
|
352
477
|
});
|
|
353
478
|
}
|
|
@@ -201,6 +201,10 @@ export interface UsePopoverReturn {
|
|
|
201
201
|
}
|
|
202
202
|
interface InternalUsePopoverReturn extends UsePopoverReturn {
|
|
203
203
|
wasJustDismissed: () => boolean;
|
|
204
|
+
toggleWithOptions: (options?: {
|
|
205
|
+
skipAutoFocus?: boolean;
|
|
206
|
+
focusTarget?: 'first' | 'container';
|
|
207
|
+
}) => void;
|
|
204
208
|
}
|
|
205
209
|
export declare function usePopover(options?: UsePopoverOptions): UsePopoverReturn;
|
|
206
210
|
/** @internal Used by trigger components; not exported from package barrels. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePopover.d.ts","sourceRoot":"","sources":["../../src/Popover/usePopover.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAiC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAmB,KAAK,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAG5E,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"usePopover.d.ts","sourceRoot":"","sources":["../../src/Popover/usePopover.tsx"],"names":[],"mappings":"AAIA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,EAAiC,KAAK,SAAS,EAAC,MAAM,OAAO,CAAC;AAE5E,OAAO,EAAmB,KAAK,kBAAkB,EAAC,MAAM,mBAAmB,CAAC;AAG5E,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,kBAAkB,CAAC;AA8FnD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,IAAI,CAAC;IAEpB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;OAEG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAE5B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;;;;;;;;;OAUG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;;;;;;;;OAYG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAEzB;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;;;;;;;;;;;;OAaG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,UAAU,EAAE,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,KAAK,IAAI,CAAC;IAE7C;;;;OAIG;IACH,UAAU,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAEnD;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC;IAEjB;;;;OAIG;IACH,IAAI,EAAE,CAAC,OAAO,CAAC,EAAE;QAAC,aAAa,CAAC,EAAE,OAAO,CAAA;KAAC,KAAK,IAAI,CAAC;IAEpD;;OAEG;IACH,IAAI,EAAE,MAAM,IAAI,CAAC;IAEjB;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;OAEG;IACH,MAAM,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,EAAE,EAAE,MAAM,CAAC;IAEX;;;;;;;;;;;OAWG;IACH,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,EAAE,kBAAkB,KAAK,SAAS,CAAC;IAEvE;;OAEG;IACH,YAAY,EAAE;QACZ,eAAe,EAAE,QAAQ,GAAG,MAAM,CAAC;QACnC,eAAe,EAAE,OAAO,CAAC;QACzB,eAAe,EAAE,MAAM,CAAC;KACzB,CAAC;CACH;AAED,UAAU,wBAAyB,SAAQ,gBAAgB;IACzD,gBAAgB,EAAE,MAAM,OAAO,CAAC;IAChC,iBAAiB,EAAE,CAAC,OAAO,CAAC,EAAE;QAC5B,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,WAAW,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC;KACrC,KAAK,IAAI,CAAC;CACZ;AA6QD,wBAAgB,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,gBAAgB,CAO5E;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAChC,OAAO,GAAE,iBAAsB,GAC9B,wBAAwB,CAE1B"}
|