From 384df0ccb4a5324da6daee8f18712ef5a81fa05a Mon Sep 17 00:00:00 2001 From: Dmytro Kirpa <dmytrokirpa@microsoft.com> Date: Tue, 7 Jan 2025 14:52:33 +0100 Subject: [PATCH 01/78] feat(eslint-plugin-react-components): add prefer-fluentui-v9 rule (#33449) --- ...-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json | 7 + .../.eslintrc.json | 10 +- .../eslint-plugin-react-components/README.md | 29 +++- .../etc/eslint-plugin-react-components.api.md | 10 +- .../src/index.ts | 7 +- .../src/rules/prefer-fluentui-v9.spec.ts | 40 +++++ .../src/rules/prefer-fluentui-v9.ts | 148 ++++++++++++++++++ .../src/rules/utils/create-rule.ts | 9 ++ .../tsconfig.spec.json | 3 +- 9 files changed, 251 insertions(+), 12 deletions(-) create mode 100644 change/@fluentui-eslint-plugin-react-components-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json create mode 100644 packages/react-components/eslint-plugin-react-components/src/rules/prefer-fluentui-v9.spec.ts create mode 100644 packages/react-components/eslint-plugin-react-components/src/rules/prefer-fluentui-v9.ts create mode 100644 packages/react-components/eslint-plugin-react-components/src/rules/utils/create-rule.ts diff --git a/change/@fluentui-eslint-plugin-react-components-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json b/change/@fluentui-eslint-plugin-react-components-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json new file mode 100644 index 00000000000000..5459e40ce0c429 --- /dev/null +++ b/change/@fluentui-eslint-plugin-react-components-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "feat: add prefer-fluentui-v9 rule", + "packageName": "@fluentui/eslint-plugin-react-components", + "email": "dmytrokirpa@microsoft.com", + "dependentChangeType": "none" +} diff --git a/packages/react-components/eslint-plugin-react-components/.eslintrc.json b/packages/react-components/eslint-plugin-react-components/.eslintrc.json index 63b4e8d8a8963a..700ea69cb4542d 100644 --- a/packages/react-components/eslint-plugin-react-components/.eslintrc.json +++ b/packages/react-components/eslint-plugin-react-components/.eslintrc.json @@ -1,5 +1,13 @@ { "extends": ["plugin:@fluentui/eslint-plugin/node", "plugin:eslint-plugin/recommended"], "plugins": ["eslint-plugin"], - "root": true + "root": true, + "overrides": [ + { + "files": ["src/rules/*.ts"], + "rules": { + "@typescript-eslint/naming-convention": "off" + } + } + ] } diff --git a/packages/react-components/eslint-plugin-react-components/README.md b/packages/react-components/eslint-plugin-react-components/README.md index 5da83b63a80507..0b22544de65533 100644 --- a/packages/react-components/eslint-plugin-react-components/README.md +++ b/packages/react-components/eslint-plugin-react-components/README.md @@ -40,21 +40,42 @@ module.exports = { }; ``` -1. Or configure individual rules manually: +2. Or configure individual rules manually: ```js module.exports = { plugins: ['@fluentui/react-components'], rules: { - '@fluentui/react-components/rule-name-1': 'error', - '@fluentui/react-components/rule-name-2': 'warn', + '@fluentui/react-components/prefer-fluentui-v9': 'warn', }, }; ``` ## Available Rules -TBD +### prefer-fluentui-v9 + +This rule ensures the use of Fluent UI v9 counterparts for Fluent UI v8 components. + +#### Examples + +**✅ Do** + +```js +// Import and use components that have been already migrated to Fluent UI v9 +import { Button } from '@fluentui/react-components'; + +const Component = () => <Button>...</Button>; +``` + +**❌ Don't** + +```js +// Avoid importing and using Fluent UI V8 components that have already been migrated to Fluent UI V9. +import { DefaultButton } from '@fluentui/react'; + +const Component = () => <DefaultButton>...</DefaultButton>; +``` ## License diff --git a/packages/react-components/eslint-plugin-react-components/etc/eslint-plugin-react-components.api.md b/packages/react-components/eslint-plugin-react-components/etc/eslint-plugin-react-components.api.md index ebe584c246463f..d4416ee6720ef5 100644 --- a/packages/react-components/eslint-plugin-react-components/etc/eslint-plugin-react-components.api.md +++ b/packages/react-components/eslint-plugin-react-components/etc/eslint-plugin-react-components.api.md @@ -4,8 +4,11 @@ ```ts +import { RuleListener } from '@typescript-eslint/utils/dist/ts-eslint'; +import { RuleModule } from '@typescript-eslint/utils/dist/ts-eslint'; + // @public (undocumented) -const plugin: { +export const plugin: { meta: { name: string; version: string; @@ -16,9 +19,10 @@ const plugin: { rules: {}; }; }; - rules: {}; + rules: { + "prefer-fluentui-v9": RuleModule<"replaceFluent8With9" | "replaceIconWithJsx" | "replaceStackWithFlex" | "replaceFocusZoneWithTabster", {}[], unknown, RuleListener>; + }; }; -export default plugin; // (No @packageDocumentation comment for this package) diff --git a/packages/react-components/eslint-plugin-react-components/src/index.ts b/packages/react-components/eslint-plugin-react-components/src/index.ts index 821e8d8738ab9e..e3ed57c99b71fd 100644 --- a/packages/react-components/eslint-plugin-react-components/src/index.ts +++ b/packages/react-components/eslint-plugin-react-components/src/index.ts @@ -1,7 +1,8 @@ import { name, version } from '../package.json'; +import { RULE_NAME as preferFluentUIV9Name, rule as preferFluentUIV9 } from './rules/prefer-fluentui-v9'; const allRules = { - // add all rules here + [preferFluentUIV9Name]: preferFluentUIV9, }; const configs = { @@ -14,7 +15,7 @@ const configs = { }; // Plugin definition -const plugin = { +export const plugin = { meta: { name, version, @@ -33,4 +34,4 @@ Object.assign(configs, { }, }); -export default plugin; +module.exports = plugin; diff --git a/packages/react-components/eslint-plugin-react-components/src/rules/prefer-fluentui-v9.spec.ts b/packages/react-components/eslint-plugin-react-components/src/rules/prefer-fluentui-v9.spec.ts new file mode 100644 index 00000000000000..22f79c07d8055a --- /dev/null +++ b/packages/react-components/eslint-plugin-react-components/src/rules/prefer-fluentui-v9.spec.ts @@ -0,0 +1,40 @@ +import { RuleTester } from '@typescript-eslint/rule-tester'; +import { RULE_NAME, rule } from './prefer-fluentui-v9'; + +const ruleTester = new RuleTester(); + +ruleTester.run(RULE_NAME, rule, { + valid: [ + { + code: `import type { IDropdownOption } from '@fluentui/react';`, + }, + { + code: `import type { ITheme } from '@fluentui/react';`, + }, + { + code: `import { ThemeProvider } from '@fluentui/react';`, + }, + { + code: `import { Button } from '@fluentui/react-components';`, + }, + ], + invalid: [ + { + code: `import { Dropdown, Icon } from '@fluentui/react';`, + errors: [{ messageId: 'replaceFluent8With9' }, { messageId: 'replaceIconWithJsx' }], + }, + { + code: `import { Stack } from '@fluentui/react';`, + errors: [{ messageId: 'replaceStackWithFlex' }], + }, + { + code: `import { DatePicker } from '@fluentui/react';`, + errors: [ + { + messageId: 'replaceFluent8With9', + data: { fluent8: 'DatePicker', fluent9: 'DatePicker', package: '@fluentui/react-datepicker-compat' }, + }, + ], + }, + ], +}); diff --git a/packages/react-components/eslint-plugin-react-components/src/rules/prefer-fluentui-v9.ts b/packages/react-components/eslint-plugin-react-components/src/rules/prefer-fluentui-v9.ts new file mode 100644 index 00000000000000..bf43866a6e90dd --- /dev/null +++ b/packages/react-components/eslint-plugin-react-components/src/rules/prefer-fluentui-v9.ts @@ -0,0 +1,148 @@ +import { AST_NODE_TYPES } from '@typescript-eslint/utils'; + +import { createRule } from './utils/create-rule'; + +export const RULE_NAME = 'prefer-fluentui-v9'; + +type Options = Array<{}>; + +type MessageIds = 'replaceFluent8With9' | 'replaceIconWithJsx' | 'replaceStackWithFlex' | 'replaceFocusZoneWithTabster'; + +export const rule = createRule<Options, MessageIds>({ + name: RULE_NAME, + meta: { + type: 'problem', + docs: { + description: 'This rule ensures the use of Fluent UI v9 counterparts for Fluent UI v8 components.', + }, + schema: [], + messages: { + replaceFluent8With9: `Avoid importing {{ fluent8 }} from '@fluentui/react', as this package has started migration to Fluent UI 9. Import {{ fluent9 }} from '{{ package }}' instead.`, + replaceIconWithJsx: `Avoid using Icon from '@fluentui/react', as this package has already migrated to Fluent UI 9. Use a JSX SVG icon from '@fluentui/react-icons' instead.`, + replaceStackWithFlex: `Avoid using Stack from '@fluentui/react', as this package has already migrated to Fluent UI 9. Use native CSS flexbox instead. More details are available at https://react.fluentui.dev/?path=/docs/concepts-migration-from-v8-components-flex-stack--docs`, + replaceFocusZoneWithTabster: `Avoid using {{ fluent8 }} from '@fluentui/react', as this package has already migrated to Fluent UI 9. Use the equivalent [Tabster](https://tabster.io/) hook instead.`, + }, + }, + defaultOptions: [], + create(context) { + return { + ImportDeclaration(node) { + if (node.source.value !== '@fluentui/react') { + return; + } + + for (const specifier of node.specifiers) { + if ( + specifier.type === AST_NODE_TYPES.ImportSpecifier && + specifier.imported.type === AST_NODE_TYPES.Identifier + ) { + const name = specifier.imported.name; + + switch (name) { + case 'Icon': + context.report({ node, messageId: 'replaceIconWithJsx' }); + break; + case 'Stack': + context.report({ node, messageId: 'replaceStackWithFlex' }); + break; + case 'FocusTrapZone': + case 'FocusZone': + context.report({ node, messageId: 'replaceFocusZoneWithTabster', data: { fluent8: name } }); + break; + default: + if (isMigration(name)) { + const migration = MIGRATIONS[name]; + + context.report({ + node, + messageId: 'replaceFluent8With9', + data: { + fluent8: name, + fluent9: migration.import, + package: migration.package, + }, + }); + } + } + } + } + }, + }; + }, +}); + +/** + * Migrations from Fluent 8 components to Fluent 9 components. + * @see https://react.fluentui.dev/?path=/docs/concepts-migration-from-v8-component-mapping--docs + */ +const MIGRATIONS = { + makeStyles: { import: 'makeStyles', package: '@fluentui/react-components' }, + ActionButton: { import: 'Button', package: '@fluentui/react-components' }, + Announced: { import: 'useAnnounce', package: '@fluentui/react-components' }, + Breadcrumb: { import: 'Breadcrumb', package: '@fluentui/react-components' }, + Button: { import: 'Button', package: '@fluentui/react-components' }, + Callout: { import: 'Popover', package: '@fluentui/react-components' }, + Calendar: { import: 'Calendar', package: '@fluentui/react-calendar-compat' }, + CommandBar: { import: 'Toolbar', package: '@fluentui/react-components' }, + CommandBarButton: { import: 'Toolbar', package: '@fluentui/react-components' }, + CommandButton: { import: 'MenuButton', package: '@fluentui/react-components' }, + CompoundButton: { import: 'CompoundButton', package: '@fluentui/react-components' }, + Checkbox: { import: 'Checkbox', package: '@fluentui/react-components' }, + ChoiceGroup: { import: 'RadioGroup', package: '@fluentui/react-components' }, + Coachmark: { import: 'TeachingPopover', package: '@fluentui/react-components' }, + ComboBox: { import: 'Combobox', package: '@fluentui/react-components' }, + ContextualMenu: { import: 'Menu', package: '@fluentui/react-components' }, + DefaultButton: { import: 'Button', package: '@fluentui/react-components' }, + DatePicker: { import: 'DatePicker', package: '@fluentui/react-datepicker-compat' }, + DetailsList: { import: 'DataGrid', package: '@fluentui/react-components' }, + Dialog: { import: 'Dialog', package: '@fluentui/react-components' }, + DocumentCard: { import: 'Card', package: '@fluentui/react-components' }, + Dropdown: { import: 'Dropdown', package: '@fluentui/react-components' }, + Fabric: { import: 'FluentProvider', package: '@fluentui/react-components' }, + Facepile: { import: 'AvatarGroup', package: '@fluentui/react-components' }, + FocusTrapZone: { import: 'Tabster', package: '@fluentui/react-components' }, + FocusZone: { import: 'Tabster', package: '@fluentui/react-components' }, + GroupedList: { import: 'Tree', package: '@fluentui/react-components' }, + HoverCard: { import: 'Popover', package: '@fluentui/react-components' }, // Not a direct equivalent; but could be used with custom behavior. + IconButton: { import: 'Button', package: '@fluentui/react-components' }, + Image: { import: 'Image', package: '@fluentui/react-components' }, + Keytips: { import: 'Keytips', package: '@fluentui-contrib/react-keytips' }, + Label: { import: 'Label', package: '@fluentui/react-components' }, + Layer: { import: 'Portal', package: '@fluentui/react-components' }, + Link: { import: 'Link', package: '@fluentui/react-components' }, + MessageBar: { import: 'MessageBar', package: '@fluentui/react-components' }, + Modal: { import: 'Dialog', package: '@fluentui/react-components' }, + OverflowSet: { import: 'Overflow', package: '@fluentui/react-components' }, + Overlay: { import: 'Portal', package: '@fluentui/react-components' }, + Panel: { import: 'Drawer', package: '@fluentui/react-components' }, + PeoplePicker: { import: 'TagPicker', package: '@fluentui/react-components' }, + Persona: { import: 'Persona', package: '@fluentui/react-components' }, + Pivot: { import: 'TabList', package: '@fluentui/react-components' }, + PivotItem: { import: 'Tab', package: '@fluentui/react-components' }, + ProgressIndicator: { import: 'ProgressBar', package: '@fluentui/react-components' }, + Rating: { import: 'Rating', package: '@fluentui/react-components' }, + SearchBox: { import: 'SearchBox', package: '@fluentui/react-components' }, + Separator: { import: 'Divider', package: '@fluentui/react-components' }, + Shimmer: { import: 'Skeleton', package: '@fluentui/react-components' }, + Slider: { import: 'Slider', package: '@fluentui/react-components' }, + SplitButton: { import: 'SplitButton', package: '@fluentui/react-components' }, + SpinButton: { import: 'SpinButton', package: '@fluentui/react-components' }, + Spinner: { import: 'Spinner', package: '@fluentui/react-components' }, + Stack: { import: 'StackShim', package: '@fluentui/react-components' }, + SwatchColorPicker: { import: 'SwatchPicker', package: '@fluentui/react-components' }, + TagPicker: { import: 'TagPicker', package: '@fluentui/react-components' }, + TeachingBubble: { import: 'TeachingPopover', package: '@fluentui/react-components' }, + Text: { import: 'Text', package: '@fluentui/react-components' }, + TextField: { import: 'Input', package: '@fluentui/react-components' }, + TimePicker: { import: 'TimePicker', package: '@fluentui/react-timepicker-compat' }, + ToggleButton: { import: 'ToggleButton', package: '@fluentui/react-components' }, + Toggle: { import: 'Switch', package: '@fluentui/react-components' }, + Tooltip: { import: 'Tooltip', package: '@fluentui/react-components' }, +}; + +/** + * Checks if a component name is in the MIGRATIONS list. + * @param name - The name of the component. + * @returns True if the component is in the MIGRATIONS list, false otherwise. + */ +const isMigration = (name: string): name is keyof typeof MIGRATIONS => name in MIGRATIONS; diff --git a/packages/react-components/eslint-plugin-react-components/src/rules/utils/create-rule.ts b/packages/react-components/eslint-plugin-react-components/src/rules/utils/create-rule.ts new file mode 100644 index 00000000000000..0365797e179f62 --- /dev/null +++ b/packages/react-components/eslint-plugin-react-components/src/rules/utils/create-rule.ts @@ -0,0 +1,9 @@ +import { ESLintUtils } from '@typescript-eslint/utils'; + +/** + * Creates an ESLint rule with a pre-configured URL pointing to the rule's documentation. + */ +export const createRule = ESLintUtils.RuleCreator( + name => + `https://github.com/microsoft/fluentui/blob/master/packages/react-components/eslint-plugin-react-components/README.md#${name}`, +); diff --git a/packages/react-components/eslint-plugin-react-components/tsconfig.spec.json b/packages/react-components/eslint-plugin-react-components/tsconfig.spec.json index 469fcba4d7ba75..18aba1c9375371 100644 --- a/packages/react-components/eslint-plugin-react-components/tsconfig.spec.json +++ b/packages/react-components/eslint-plugin-react-components/tsconfig.spec.json @@ -1,7 +1,8 @@ { "extends": "./tsconfig.json", "compilerOptions": { - "module": "CommonJS", + "module": "NodeNext", + "moduleResolution": "NodeNext", "outDir": "dist", "types": ["jest", "node"] }, From 8f763922d713d9ccd35e65db07206c10b170fafd Mon Sep 17 00:00:00 2001 From: Makoto Morimoto <Humberto.Morimoto@microsoft.com> Date: Tue, 7 Jan 2025 12:14:01 -0800 Subject: [PATCH 02/78] chore: Adding key to inner slot in Stack component (#33578) --- ...luentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json | 7 +++++++ packages/react/src/components/Stack/Stack.tsx | 5 ++++- .../__snapshots__/TeachingBubble.deprecated.test.tsx.snap | 4 ++-- .../__snapshots__/TeachingBubble.test.tsx.snap | 4 ++-- 4 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 change/@fluentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json diff --git a/change/@fluentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json b/change/@fluentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json new file mode 100644 index 00000000000000..fe47255a1a8393 --- /dev/null +++ b/change/@fluentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: Adding key to inner slot in Stack component.", + "packageName": "@fluentui/react", + "email": "Humberto.Morimoto@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react/src/components/Stack/Stack.tsx b/packages/react/src/components/Stack/Stack.tsx index 3caa6aa3d37fb7..259f45c7a26fce 100644 --- a/packages/react/src/components/Stack/Stack.tsx +++ b/packages/react/src/components/Stack/Stack.tsx @@ -2,6 +2,7 @@ /** @jsx withSlots */ import * as React from 'react'; import { withSlots, createComponent, getSlots } from '@fluentui/foundation-legacy'; +import { useId } from '@fluentui/react-hooks'; import { css, getNativeProps, htmlElementProperties, warnDeprecations } from '../../Utilities'; import { styles, GlobalClassNames as StackGlobalClassNames } from './Stack.styles'; import { StackItem } from './StackItem/StackItem'; @@ -26,6 +27,8 @@ const StackView: IStackComponent['view'] = props => { padding: 'tokens.padding', }); + const stackInnerId = useId('stack-inner'); + const stackChildren = _processStackChildren(props.children, { disableShrink, enableScopedSelectors, @@ -42,7 +45,7 @@ const StackView: IStackComponent['view'] = props => { if (wrap) { return ( <Slots.root {...nativeProps}> - <Slots.inner>{stackChildren}</Slots.inner> + <Slots.inner key={stackInnerId}>{stackChildren}</Slots.inner> </Slots.root> ); } diff --git a/packages/react/src/components/TeachingBubble/__snapshots__/TeachingBubble.deprecated.test.tsx.snap b/packages/react/src/components/TeachingBubble/__snapshots__/TeachingBubble.deprecated.test.tsx.snap index 538429c8d9bda9..1cadc860cd9c60 100644 --- a/packages/react/src/components/TeachingBubble/__snapshots__/TeachingBubble.deprecated.test.tsx.snap +++ b/packages/react/src/components/TeachingBubble/__snapshots__/TeachingBubble.deprecated.test.tsx.snap @@ -326,7 +326,7 @@ exports[`TeachingBubble renders renders with hasCloseIcon which is deprecated 1` margin-right: 4px; margin-top: 0; } - id="id__3" + id="id__4" > Test Primary Button </span> @@ -481,7 +481,7 @@ exports[`TeachingBubble renders renders with hasCloseIcon which is deprecated 1` margin-right: 4px; margin-top: 0; } - id="id__6" + id="id__7" > Test Secondary Button </span> diff --git a/packages/react/src/components/TeachingBubble/__snapshots__/TeachingBubble.test.tsx.snap b/packages/react/src/components/TeachingBubble/__snapshots__/TeachingBubble.test.tsx.snap index 9fd15c657e6be6..15cbda84535c98 100644 --- a/packages/react/src/components/TeachingBubble/__snapshots__/TeachingBubble.test.tsx.snap +++ b/packages/react/src/components/TeachingBubble/__snapshots__/TeachingBubble.test.tsx.snap @@ -610,7 +610,7 @@ exports[`TeachingBubble renders TeachingBubbleContent with buttons correctly 1`] margin-right: 4px; margin-top: 0; } - id="id__3" + id="id__4" > Test Primary Button </span> @@ -765,7 +765,7 @@ exports[`TeachingBubble renders TeachingBubbleContent with buttons correctly 1`] margin-right: 4px; margin-top: 0; } - id="id__6" + id="id__7" > Test Secondary Button </span> From 60b2d9cd2d0ea61cc331abf47ef196e1b9f81f75 Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Wed, 8 Jan 2025 07:21:56 +0000 Subject: [PATCH 03/78] release: applying package updates - react v8 --- ...-94a6046f-d21a-4386-9830-79921b5d4337.json | 7 ------- packages/azure-themes/CHANGELOG.json | 15 +++++++++++++ packages/azure-themes/CHANGELOG.md | 11 +++++++++- packages/azure-themes/package.json | 4 ++-- packages/charts/react-charting/CHANGELOG.json | 21 +++++++++++++++++++ packages/charts/react-charting/CHANGELOG.md | 12 ++++++++++- packages/charts/react-charting/package.json | 6 +++--- packages/cra-template/package.json | 2 +- packages/fluent2-theme/CHANGELOG.json | 15 +++++++++++++ packages/fluent2-theme/CHANGELOG.md | 11 +++++++++- packages/fluent2-theme/package.json | 4 ++-- packages/react-cards/CHANGELOG.json | 15 +++++++++++++ packages/react-cards/CHANGELOG.md | 11 +++++++++- packages/react-cards/package.json | 4 ++-- .../library/package.json | 4 ++-- packages/react-date-time/CHANGELOG.json | 15 +++++++++++++ packages/react-date-time/CHANGELOG.md | 11 +++++++++- packages/react-date-time/package.json | 4 ++-- .../react-docsite-components/CHANGELOG.json | 21 +++++++++++++++++++ .../react-docsite-components/CHANGELOG.md | 12 ++++++++++- .../react-docsite-components/package.json | 6 +++--- packages/react-examples/package.json | 14 ++++++------- packages/react-experiments/CHANGELOG.json | 15 +++++++++++++ packages/react-experiments/CHANGELOG.md | 11 +++++++++- packages/react-experiments/package.json | 4 ++-- packages/react-monaco-editor/CHANGELOG.json | 21 +++++++++++++++++++ packages/react-monaco-editor/CHANGELOG.md | 12 ++++++++++- packages/react-monaco-editor/package.json | 6 +++--- packages/react/CHANGELOG.json | 15 +++++++++++++ packages/react/CHANGELOG.md | 11 +++++++++- packages/react/package.json | 2 +- packages/storybook/package.json | 6 +++--- packages/theme-samples/CHANGELOG.json | 15 +++++++++++++ packages/theme-samples/CHANGELOG.md | 11 +++++++++- packages/theme-samples/package.json | 4 ++-- 35 files changed, 306 insertions(+), 52 deletions(-) delete mode 100644 change/@fluentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json diff --git a/change/@fluentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json b/change/@fluentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json deleted file mode 100644 index fe47255a1a8393..00000000000000 --- a/change/@fluentui-react-94a6046f-d21a-4386-9830-79921b5d4337.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "chore: Adding key to inner slot in Stack component.", - "packageName": "@fluentui/react", - "email": "Humberto.Morimoto@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/packages/azure-themes/CHANGELOG.json b/packages/azure-themes/CHANGELOG.json index 43392ea44f3ada..d805638349bb4e 100644 --- a/packages/azure-themes/CHANGELOG.json +++ b/packages/azure-themes/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/azure-themes", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/azure-themes_v8.6.118", + "version": "8.6.118", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/azure-themes", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Fri, 03 Jan 2025 07:21:32 GMT", "tag": "@fluentui/azure-themes_v8.6.117", diff --git a/packages/azure-themes/CHANGELOG.md b/packages/azure-themes/CHANGELOG.md index c68c4e0e6ca104..6d33570bd6959c 100644 --- a/packages/azure-themes/CHANGELOG.md +++ b/packages/azure-themes/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/azure-themes -This log was last generated on Fri, 03 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [8.6.118](https://github.com/microsoft/fluentui/tree/@fluentui/azure-themes_v8.6.118) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/azure-themes_v8.6.117..@fluentui/azure-themes_v8.6.118) + +### Patches + +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [8.6.117](https://github.com/microsoft/fluentui/tree/@fluentui/azure-themes_v8.6.117) Fri, 03 Jan 2025 07:21:32 GMT diff --git a/packages/azure-themes/package.json b/packages/azure-themes/package.json index 56290726705740..84b147bb49e9cc 100644 --- a/packages/azure-themes/package.json +++ b/packages/azure-themes/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/azure-themes", - "version": "8.6.117", + "version": "8.6.118", "description": "Azure themes for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" } diff --git a/packages/charts/react-charting/CHANGELOG.json b/packages/charts/react-charting/CHANGELOG.json index 7f4d219e1bc5b8..e5ceb86a70036d 100644 --- a/packages/charts/react-charting/CHANGELOG.json +++ b/packages/charts/react-charting/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-charting", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/react-charting_v5.23.39", + "version": "5.23.39", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-charting", + "comment": "Bump @fluentui/theme-samples to v8.7.194", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + }, + { + "author": "beachball", + "package": "@fluentui/react-charting", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Mon, 06 Jan 2025 07:16:33 GMT", "tag": "@fluentui/react-charting_v5.23.38", diff --git a/packages/charts/react-charting/CHANGELOG.md b/packages/charts/react-charting/CHANGELOG.md index 1a31a12f7e1668..9660401028e9d1 100644 --- a/packages/charts/react-charting/CHANGELOG.md +++ b/packages/charts/react-charting/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-charting -This log was last generated on Mon, 06 Jan 2025 07:16:33 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [5.23.39](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.39) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charting_v5.23.38..@fluentui/react-charting_v5.23.39) + +### Patches + +- Bump @fluentui/theme-samples to v8.7.194 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [5.23.38](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.38) Mon, 06 Jan 2025 07:16:33 GMT diff --git a/packages/charts/react-charting/package.json b/packages/charts/react-charting/package.json index abe45679da3c3e..f0c8be40c0d649 100644 --- a/packages/charts/react-charting/package.json +++ b/packages/charts/react-charting/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-charting", - "version": "5.23.38", + "version": "5.23.39", "description": "React web charting controls for Microsoft fluentui system.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -40,7 +40,7 @@ }, "dependencies": { "@fluentui/react-focus": "^8.9.20", - "@fluentui/theme-samples": "^8.7.193", + "@fluentui/theme-samples": "^8.7.194", "@microsoft/load-themed-styles": "^1.10.26", "@types/d3-array": "^3.0.0", "@types/d3-axis": "^3.0.0", @@ -66,7 +66,7 @@ "tslib": "^2.1.0" }, "peerDependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@types/react": ">=16.8.0 <19.0.0", "@types/react-dom": ">=16.8.0 <19.0.0", "react": ">=16.8.0 <19.0.0", diff --git a/packages/cra-template/package.json b/packages/cra-template/package.json index f1f5b95012939e..4b7d2b9b1a85d3 100644 --- a/packages/cra-template/package.json +++ b/packages/cra-template/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/cra-template", - "version": "8.4.194", + "version": "8.4.195", "description": "Create React App template for Fluent UI React (@fluentui/react)", "repository": { "type": "git", diff --git a/packages/fluent2-theme/CHANGELOG.json b/packages/fluent2-theme/CHANGELOG.json index 8db818dd7af00c..c98ffb340e50a4 100644 --- a/packages/fluent2-theme/CHANGELOG.json +++ b/packages/fluent2-theme/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/fluent2-theme", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/fluent2-theme_v8.107.122", + "version": "8.107.122", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/fluent2-theme", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Fri, 03 Jan 2025 07:21:32 GMT", "tag": "@fluentui/fluent2-theme_v8.107.121", diff --git a/packages/fluent2-theme/CHANGELOG.md b/packages/fluent2-theme/CHANGELOG.md index b2177427f6ca44..20c6586e7c4892 100644 --- a/packages/fluent2-theme/CHANGELOG.md +++ b/packages/fluent2-theme/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/fluent2-theme -This log was last generated on Fri, 03 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [8.107.122](https://github.com/microsoft/fluentui/tree/@fluentui/fluent2-theme_v8.107.122) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/fluent2-theme_v8.107.121..@fluentui/fluent2-theme_v8.107.122) + +### Patches + +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [8.107.121](https://github.com/microsoft/fluentui/tree/@fluentui/fluent2-theme_v8.107.121) Fri, 03 Jan 2025 07:21:32 GMT diff --git a/packages/fluent2-theme/package.json b/packages/fluent2-theme/package.json index f275ccaa2071bc..390598b19b7209 100644 --- a/packages/fluent2-theme/package.json +++ b/packages/fluent2-theme/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/fluent2-theme", - "version": "8.107.121", + "version": "8.107.122", "description": "A Fluent2 theme for Fluent UI React 8.x", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" } diff --git a/packages/react-cards/CHANGELOG.json b/packages/react-cards/CHANGELOG.json index 4e7c9c3d5fe586..4cbe3386256270 100644 --- a/packages/react-cards/CHANGELOG.json +++ b/packages/react-cards/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-cards", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/react-cards_v0.205.194", + "version": "0.205.194", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-cards", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Fri, 03 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-cards_v0.205.193", diff --git a/packages/react-cards/CHANGELOG.md b/packages/react-cards/CHANGELOG.md index b625859d167a73..6b5143a5965031 100644 --- a/packages/react-cards/CHANGELOG.md +++ b/packages/react-cards/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-cards -This log was last generated on Fri, 03 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [0.205.194](https://github.com/microsoft/fluentui/tree/@fluentui/react-cards_v0.205.194) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-cards_v0.205.193..@fluentui/react-cards_v0.205.194) + +### Patches + +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [0.205.193](https://github.com/microsoft/fluentui/tree/@fluentui/react-cards_v0.205.193) Fri, 03 Jan 2025 07:21:32 GMT diff --git a/packages/react-cards/package.json b/packages/react-cards/package.json index 81d5951bf76ff6..b4577baff1d012 100644 --- a/packages/react-cards/package.json +++ b/packages/react-cards/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-cards", - "version": "0.205.193", + "version": "0.205.194", "description": "Deprecated experimental Card container components for Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -33,7 +33,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@fluentui/foundation-legacy": "^8.4.23", "@fluentui/set-version": "^8.2.23", "@microsoft/load-themed-styles": "^1.10.26", diff --git a/packages/react-components/react-migration-v8-v9/library/package.json b/packages/react-components/react-migration-v8-v9/library/package.json index f6400d33a76637..4fc09ed6074b93 100644 --- a/packages/react-components/react-migration-v8-v9/library/package.json +++ b/packages/react-components/react-migration-v8-v9/library/package.json @@ -19,8 +19,8 @@ }, "dependencies": { "@ctrl/tinycolor": "3.3.4", - "@fluentui/fluent2-theme": "^8.107.121", - "@fluentui/react": "^8.122.4", + "@fluentui/fluent2-theme": "^8.107.122", + "@fluentui/react": "^8.122.5", "@fluentui/react-components": "^9.56.8", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-hooks": "^8.8.16", diff --git a/packages/react-date-time/CHANGELOG.json b/packages/react-date-time/CHANGELOG.json index aea80f2408bca6..e294f99c2f0f5f 100644 --- a/packages/react-date-time/CHANGELOG.json +++ b/packages/react-date-time/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-date-time", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/react-date-time_v8.7.194", + "version": "8.7.194", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-date-time", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Fri, 03 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-date-time_v8.7.193", diff --git a/packages/react-date-time/CHANGELOG.md b/packages/react-date-time/CHANGELOG.md index 458c9611f62318..efce8ba0cfdd80 100644 --- a/packages/react-date-time/CHANGELOG.md +++ b/packages/react-date-time/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-date-time -This log was last generated on Fri, 03 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [8.7.194](https://github.com/microsoft/fluentui/tree/@fluentui/react-date-time_v8.7.194) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-date-time_v8.7.193..@fluentui/react-date-time_v8.7.194) + +### Patches + +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [8.7.193](https://github.com/microsoft/fluentui/tree/@fluentui/react-date-time_v8.7.193) Fri, 03 Jan 2025 07:21:32 GMT diff --git a/packages/react-date-time/package.json b/packages/react-date-time/package.json index bd11841eb9126f..1efd230ad16fcc 100644 --- a/packages/react-date-time/package.json +++ b/packages/react-date-time/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-date-time", - "version": "8.7.193", + "version": "8.7.194", "description": "Date and time related React components for building experiences for Microsoft 365.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" }, diff --git a/packages/react-docsite-components/CHANGELOG.json b/packages/react-docsite-components/CHANGELOG.json index 079e8260021da3..953fe83726c9bd 100644 --- a/packages/react-docsite-components/CHANGELOG.json +++ b/packages/react-docsite-components/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-docsite-components", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/react-docsite-components_v8.13.159", + "version": "8.13.159", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + }, + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react-monaco-editor to v1.7.277", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Mon, 06 Jan 2025 07:16:33 GMT", "tag": "@fluentui/react-docsite-components_v8.13.158", diff --git a/packages/react-docsite-components/CHANGELOG.md b/packages/react-docsite-components/CHANGELOG.md index 15f0c2c0bc1c88..c79eb080c69f62 100644 --- a/packages/react-docsite-components/CHANGELOG.md +++ b/packages/react-docsite-components/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-docsite-components -This log was last generated on Mon, 06 Jan 2025 07:16:33 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [8.13.159](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.159) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-docsite-components_v8.13.158..@fluentui/react-docsite-components_v8.13.159) + +### Patches + +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) +- Bump @fluentui/react-monaco-editor to v1.7.277 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [8.13.158](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.158) Mon, 06 Jan 2025 07:16:33 GMT diff --git a/packages/react-docsite-components/package.json b/packages/react-docsite-components/package.json index 576fff39a25a91..30d1083227846e 100644 --- a/packages/react-docsite-components/package.json +++ b/packages/react-docsite-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-docsite-components", - "version": "8.13.158", + "version": "8.13.159", "description": "Fluent UI React components for building documentation sites.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -35,14 +35,14 @@ "react-dom": ">=16.8.0 <19.0.0" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@fluentui/theme": "^2.6.64", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", "@fluentui/public-docsite-setup": "^0.3.34", "@fluentui/react-hooks": "^8.8.16", "@fluentui/set-version": "^8.2.23", - "@fluentui/react-monaco-editor": "^1.7.276", + "@fluentui/react-monaco-editor": "^1.7.277", "color-check": "0.0.2", "markdown-to-jsx": "^7.0.0", "office-ui-fabric-core": "^11.0.0", diff --git a/packages/react-examples/package.json b/packages/react-examples/package.json index 31db239fd53bd3..6acc283a63b1da 100644 --- a/packages/react-examples/package.json +++ b/packages/react-examples/package.json @@ -27,18 +27,18 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/azure-themes": "^8.6.117", + "@fluentui/azure-themes": "^8.6.118", "@fluentui/date-time-utilities": "^8.6.9", "@fluentui/dom-utilities": "^2.3.9", "@fluentui/example-data": "^8.4.25", "@fluentui/font-icons-mdl2": "^8.5.57", "@fluentui/foundation-legacy": "^8.4.23", "@fluentui/merge-styles": "^8.6.13", - "@fluentui/react": "^8.122.4", - "@fluentui/react-cards": "^0.205.193", - "@fluentui/react-charting": "^5.23.38", - "@fluentui/react-docsite-components": "^8.13.158", - "@fluentui/react-experiments": "^8.14.190", + "@fluentui/react": "^8.122.5", + "@fluentui/react-cards": "^0.205.194", + "@fluentui/react-charting": "^5.23.39", + "@fluentui/react-docsite-components": "^8.13.159", + "@fluentui/react-experiments": "^8.14.191", "@fluentui/react-file-type-icons": "^8.12.7", "@fluentui/react-focus": "^8.9.20", "@fluentui/react-hooks": "^8.8.16", @@ -47,7 +47,7 @@ "@fluentui/scheme-utilities": "^8.3.65", "@fluentui/style-utilities": "^8.11.6", "@fluentui/theme": "^2.6.64", - "@fluentui/theme-samples": "^8.7.193", + "@fluentui/theme-samples": "^8.7.194", "@fluentui/utilities": "^8.15.19", "@microsoft/load-themed-styles": "^1.10.26", "d3-fetch": "3.0.1", diff --git a/packages/react-experiments/CHANGELOG.json b/packages/react-experiments/CHANGELOG.json index 64f65979a5fe63..d0177c7041f7a3 100644 --- a/packages/react-experiments/CHANGELOG.json +++ b/packages/react-experiments/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-experiments", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/react-experiments_v8.14.191", + "version": "8.14.191", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-experiments", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Fri, 03 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-experiments_v8.14.190", diff --git a/packages/react-experiments/CHANGELOG.md b/packages/react-experiments/CHANGELOG.md index e3caacded43df6..597552adf1297e 100644 --- a/packages/react-experiments/CHANGELOG.md +++ b/packages/react-experiments/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-experiments -This log was last generated on Fri, 03 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [8.14.191](https://github.com/microsoft/fluentui/tree/@fluentui/react-experiments_v8.14.191) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-experiments_v8.14.190..@fluentui/react-experiments_v8.14.191) + +### Patches + +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [8.14.190](https://github.com/microsoft/fluentui/tree/@fluentui/react-experiments_v8.14.190) Fri, 03 Jan 2025 07:21:32 GMT diff --git a/packages/react-experiments/package.json b/packages/react-experiments/package.json index 75fff504cd8e1c..e2658817839fe1 100644 --- a/packages/react-experiments/package.json +++ b/packages/react-experiments/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-experiments", - "version": "8.14.190", + "version": "8.14.191", "description": "Experimental React components for building experiences for Microsoft 365.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -38,7 +38,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@fluentui/theme": "^2.6.64", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", diff --git a/packages/react-monaco-editor/CHANGELOG.json b/packages/react-monaco-editor/CHANGELOG.json index ae031efd326d78..b649aef893a820 100644 --- a/packages/react-monaco-editor/CHANGELOG.json +++ b/packages/react-monaco-editor/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-monaco-editor", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/react-monaco-editor_v1.7.277", + "version": "1.7.277", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + }, + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react-charting to v5.23.39", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Mon, 06 Jan 2025 07:16:33 GMT", "tag": "@fluentui/react-monaco-editor_v1.7.276", diff --git a/packages/react-monaco-editor/CHANGELOG.md b/packages/react-monaco-editor/CHANGELOG.md index 66951d7cda12d9..2610eace648b0d 100644 --- a/packages/react-monaco-editor/CHANGELOG.md +++ b/packages/react-monaco-editor/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-monaco-editor -This log was last generated on Mon, 06 Jan 2025 07:16:33 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [1.7.277](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.277) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-monaco-editor_v1.7.276..@fluentui/react-monaco-editor_v1.7.277) + +### Patches + +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) +- Bump @fluentui/react-charting to v5.23.39 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [1.7.276](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.276) Mon, 06 Jan 2025 07:16:33 GMT diff --git a/packages/react-monaco-editor/package.json b/packages/react-monaco-editor/package.json index c0f1a356be8c49..de09ff4bbac275 100644 --- a/packages/react-monaco-editor/package.json +++ b/packages/react-monaco-editor/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-monaco-editor", - "version": "1.7.276", + "version": "1.7.277", "description": "Live React example editing using monaco", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -29,12 +29,12 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", "@fluentui/monaco-editor": "^1.3.24", "@fluentui/react-hooks": "^8.8.16", - "@fluentui/react-charting": "^5.23.38", + "@fluentui/react-charting": "^5.23.39", "raw-loader": "4.0.2", "react-syntax-highlighter": "^10.1.3", "tslib": "^2.1.0" diff --git a/packages/react/CHANGELOG.json b/packages/react/CHANGELOG.json index 25521c31e3e2fc..cb5cd89cc85b01 100644 --- a/packages/react/CHANGELOG.json +++ b/packages/react/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/react_v8.122.5", + "version": "8.122.5", + "comments": { + "patch": [ + { + "author": "Humberto.Morimoto@microsoft.com", + "package": "@fluentui/react", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd", + "comment": "chore: Adding key to inner slot in Stack component." + } + ] + } + }, { "date": "Fri, 03 Jan 2025 07:21:31 GMT", "tag": "@fluentui/react_v8.122.4", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 5ea71f70d4ab0e..dbf76e1ebe0846 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react -This log was last generated on Fri, 03 Jan 2025 07:21:31 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [8.122.5](https://github.com/microsoft/fluentui/tree/@fluentui/react_v8.122.5) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react_v8.122.4..@fluentui/react_v8.122.5) + +### Patches + +- chore: Adding key to inner slot in Stack component. ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by Humberto.Morimoto@microsoft.com) + ## [8.122.4](https://github.com/microsoft/fluentui/tree/@fluentui/react_v8.122.4) Fri, 03 Jan 2025 07:21:31 GMT diff --git a/packages/react/package.json b/packages/react/package.json index 5b9ca3512e6bf6..90b98f3293d83b 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react", - "version": "8.122.4", + "version": "8.122.5", "description": "Reusable React components for building web experiences.", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/storybook/package.json b/packages/storybook/package.json index be92f2ea032aa0..ccf3ca88252d40 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -22,11 +22,11 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@fluentui/theme": "^2.6.64", "@storybook/addon-essentials": "7.6.20", - "@fluentui/azure-themes": "^8.6.117", - "@fluentui/theme-samples": "^8.7.193", + "@fluentui/azure-themes": "^8.6.118", + "@fluentui/theme-samples": "^8.7.194", "tslib": "^2.1.0" }, "peerDependencies": { diff --git a/packages/theme-samples/CHANGELOG.json b/packages/theme-samples/CHANGELOG.json index 565407386dd702..b54d2d9b34977f 100644 --- a/packages/theme-samples/CHANGELOG.json +++ b/packages/theme-samples/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/theme-samples", "entries": [ + { + "date": "Wed, 08 Jan 2025 07:21:37 GMT", + "tag": "@fluentui/theme-samples_v8.7.194", + "version": "8.7.194", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/theme-samples", + "comment": "Bump @fluentui/react to v8.122.5", + "commit": "8f763922d713d9ccd35e65db07206c10b170fafd" + } + ] + } + }, { "date": "Fri, 03 Jan 2025 07:21:32 GMT", "tag": "@fluentui/theme-samples_v8.7.193", diff --git a/packages/theme-samples/CHANGELOG.md b/packages/theme-samples/CHANGELOG.md index 5a86bc6267f446..4f840e8fc6bd63 100644 --- a/packages/theme-samples/CHANGELOG.md +++ b/packages/theme-samples/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/theme-samples -This log was last generated on Fri, 03 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. <!-- Start content --> +## [8.7.194](https://github.com/microsoft/fluentui/tree/@fluentui/theme-samples_v8.7.194) + +Wed, 08 Jan 2025 07:21:37 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/theme-samples_v8.7.193..@fluentui/theme-samples_v8.7.194) + +### Patches + +- Bump @fluentui/react to v8.122.5 ([PR #33578](https://github.com/microsoft/fluentui/pull/33578) by beachball) + ## [8.7.193](https://github.com/microsoft/fluentui/tree/@fluentui/theme-samples_v8.7.193) Fri, 03 Jan 2025 07:21:32 GMT diff --git a/packages/theme-samples/package.json b/packages/theme-samples/package.json index b98a87701ee4d7..53714d03b041ed 100644 --- a/packages/theme-samples/package.json +++ b/packages/theme-samples/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/theme-samples", - "version": "8.7.193", + "version": "8.7.194", "description": "Sample themes for use with Fabric components.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -26,7 +26,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.4", + "@fluentui/react": "^8.122.5", "@fluentui/set-version": "^8.2.23", "@fluentui/scheme-utilities": "^8.3.65", "tslib": "^2.1.0" From b52d6ba234a24ce1d05c636cfc41b0098b15cfb9 Mon Sep 17 00:00:00 2001 From: Valentyna <vkozlova@microsoft.com> Date: Wed, 8 Jan 2025 01:47:17 -0800 Subject: [PATCH 04/78] feat(react-color-picker): a11y labels and behaviors (#33543) --- ...-cf2c2f44-2d77-4ead-b123-c81b1da98292.json | 7 +++++ .../ColorSlider/ColorSlider.test.tsx | 3 ++ .../components/ColorSlider/useColorSlider.ts | 7 ++++- .../AlphaSliderDefault.stories.tsx | 18 ++++++++++-- .../ColorPicker/ColorAreaDefault.stories.tsx | 17 +++++++++-- .../ColorPickerDefault.stories.tsx | 17 +++++++++-- .../ColorSliderDefault.stories.tsx | 28 +++++++++++++++++-- 7 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 change/@fluentui-react-color-picker-preview-cf2c2f44-2d77-4ead-b123-c81b1da98292.json diff --git a/change/@fluentui-react-color-picker-preview-cf2c2f44-2d77-4ead-b123-c81b1da98292.json b/change/@fluentui-react-color-picker-preview-cf2c2f44-2d77-4ead-b123-c81b1da98292.json new file mode 100644 index 00000000000000..e5329cbb374e3c --- /dev/null +++ b/change/@fluentui-react-color-picker-preview-cf2c2f44-2d77-4ead-b123-c81b1da98292.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "feat: added aria-attributes to the ColorPicker", + "packageName": "@fluentui/react-color-picker-preview", + "email": "vkozlova@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/ColorSlider.test.tsx b/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/ColorSlider.test.tsx index 1c8ef38586b7f0..6917a93ee1435d 100644 --- a/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/ColorSlider.test.tsx +++ b/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/ColorSlider.test.tsx @@ -16,13 +16,16 @@ describe('ColorSlider', () => { <div> <div class="fui-ColorSlider" + role="group" style="--fui-Slider--direction: -90deg; --fui-Slider--progress: 0%; --fui-Slider__thumb--color: hsl(0, 100%, 50%);" > <input + aria-orientation="horizontal" class="fui-ColorSlider__input" id="slider-9" max="360" min="0" + tabindex="0" type="range" value="0" /> diff --git a/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/useColorSlider.ts b/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/useColorSlider.ts index 2cb225eae94d25..0d59f6c3529ba6 100644 --- a/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/useColorSlider.ts +++ b/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/useColorSlider.ts @@ -87,7 +87,10 @@ export const useColorSlider_unstable = ( thumb: 'div', }, root: slot.always(root, { - defaultProps: nativeProps.root, + defaultProps: { + role: 'group', + ...nativeProps.root, + }, elementType: 'div', }), input: slot.always(input, { @@ -96,6 +99,8 @@ export const useColorSlider_unstable = ( ref, min: MIN, max: MAX, + tabIndex: 0, + ['aria-orientation']: vertical ? 'vertical' : 'horizontal', ...nativeProps.primary, type: 'range', }, diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx index 0887a9e81f9cf1..bce95432ff2ccf 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx @@ -27,13 +27,25 @@ export const AlphaSliderExample = (props: Partial<AlphaSliderProps>) => { const styles = useStyles(); const [color, setColor] = React.useState(COLOR); - const onSliderChange: AlphaSliderProps['onChange'] = (_, data) => setColor({ ...data.color, a: data.color.a ?? 1 }); + const [value, setValue] = React.useState(COLOR.a * 100); + const onSliderChange: AlphaSliderProps['onChange'] = (_, data) => { + const alpha = data.color.a ?? 1; + setColor({ ...data.color, a: alpha }); + setValue(alpha * 100); + }; const resetSlider = () => setColor(COLOR); return ( <div className={styles.example}> - <AlphaSlider color={color} onChange={onSliderChange} {...props} /> - <AlphaSlider color={color} onChange={onSliderChange} vertical {...props} /> + <AlphaSlider color={color} onChange={onSliderChange} aria-valuetext={`${value}%`} aria-label="Alpha" {...props} /> + <AlphaSlider + color={color} + onChange={onSliderChange} + aria-valuetext={`${value}%`} + aria-label="Vertical alpha" + vertical + {...props} + /> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toRgbString() }} /> <Button onClick={resetSlider}>Reset</Button> </div> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx index 2d935e63115e01..53b06d3ee52946 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx @@ -27,12 +27,25 @@ export const ColorAreaExample = () => { const styles = useStyles(); const [color, setColor] = React.useState(DEFAULT_COLOR_HSV); - const onChange: ColorAreaProps['onChange'] = (_, data) => setColor({ ...data.color, a: data.color.a ?? 1 }); + const [namedColor, setNamedColor] = React.useState(''); + + const onChange: ColorAreaProps['onChange'] = (_, data) => { + setColor({ ...data.color, a: data.color.a ?? 1 }); + const _namedColor = tinycolor(`hsl(${data.color.h},100%,50%)`).toName(); + if (_namedColor) { + setNamedColor(_namedColor); + } + }; const resetSlider = () => setColor(DEFAULT_COLOR_HSV); + const ariaAttributes = { + 'aria-label': 'ColorPicker', + 'aria-roledescription': '2D slider', + 'aria-valuetext': `Saturation ${color.s * 100}, Brightness: ${color.v * 100}, ${namedColor}`, + }; return ( <div className={styles.example}> - <ColorArea color={color} onChange={onChange} /> + <ColorArea color={color} onChange={onChange} inputX={ariaAttributes} inputY={ariaAttributes} /> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toHexString() }} /> <Button onClick={resetSlider}>Reset</Button> </div> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx index 7740403609d1a5..3d903f1a6eb8b7 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx @@ -67,11 +67,16 @@ export const Default = () => { const [color, setColor] = React.useState(DEFAULT_COLOR_HSV); const [hex, setHex] = React.useState(tinycolor(color).toHexString()); const [rgb, setRgb] = React.useState(tinycolor(color).toRgb()); + const [namedColor, setNamedColor] = React.useState(''); const handleChange: ColorPickerProps['onColorChange'] = (_, data) => { setColor({ ...data.color, a: data.color.a ?? 1 }); setHex(tinycolor(data.color).toHexString()); setRgb(tinycolor(data.color).toRgb()); + const _namedColor = tinycolor(`hsl(${data.color.h},100%,50%)`).toName(); + if (_namedColor) { + setNamedColor(_namedColor); + } }; const onRgbChange = (event: SpinButtonChangeEvent, data: SpinButtonOnChangeData) => { @@ -91,12 +96,18 @@ export const Default = () => { } }; + const colorAriaAttributes = { + 'aria-label': 'ColorPicker', + 'aria-roledescription': '2D slider', + 'aria-valuetext': `Saturation ${color.s * 100}, Brightness: ${color.v * 100}, ${namedColor}`, + }; + return ( <div className={styles.example}> <ColorPicker color={color} onColorChange={handleChange}> - <ColorArea /> - <ColorSlider /> - <AlphaSlider /> + <ColorArea inputX={colorAriaAttributes} inputY={colorAriaAttributes} /> + <ColorSlider aria-label="Hue" aria-valuetext={`${color.h}°, ${namedColor}`} /> + <AlphaSlider aria-label="Alpha" aria-valuetext={`${color.a * 100}%`} /> </ColorPicker> <div className={styles.inputFields}> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toRgbString() }} /> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorSliderDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorSliderDefault.stories.tsx index a26bed7accaa17..1062a371d2bb9e 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorSliderDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorSliderDefault.stories.tsx @@ -26,13 +26,35 @@ const DEFAULT_COLOR_HSV = tinycolor('#2be700').toHsv(); export const ColorSliderExample = (props: Partial<ColorSliderProps>) => { const styles = useStyles(); const [color, setColor] = React.useState(DEFAULT_COLOR_HSV); - const onSliderChange: ColorSliderProps['onChange'] = (_, data) => setColor({ ...data.color, a: data.color.a ?? 1 }); + const [hue, setHue] = React.useState(DEFAULT_COLOR_HSV.h); + const [namedColor, setNamedColor] = React.useState(''); + const onSliderChange: ColorSliderProps['onChange'] = (_, data) => { + setColor({ ...data.color, a: data.color.a ?? 1 }); + setHue(data.color.h); + const _namedColor = tinycolor(`hsl(${data.color.h},100%,50%)`).toName(); + if (_namedColor) { + setNamedColor(_namedColor); + } + }; const resetSlider = () => setColor(DEFAULT_COLOR_HSV); return ( <div className={styles.example}> - <ColorSlider color={color} onChange={onSliderChange} {...props} /> - <ColorSlider color={color} onChange={onSliderChange} vertical {...props} /> + <ColorSlider + color={color} + onChange={onSliderChange} + aria-label="Hue" + aria-valuetext={`${hue}°, ${namedColor}`} + {...props} + /> + <ColorSlider + color={color} + onChange={onSliderChange} + vertical + aria-label="Vertical Hue" + aria-valuetext={`${hue}°, ${namedColor}`} + {...props} + /> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toHexString() }} /> <Button onClick={resetSlider}>Reset</Button> </div> From bd3e4c27b89c17e279e99342f305eb9c71714a09 Mon Sep 17 00:00:00 2001 From: Dmytro Kirpa <dmytrokirpa@microsoft.com> Date: Wed, 8 Jan 2025 14:05:22 +0100 Subject: [PATCH 05/78] fix(react-tabs): update tab border color to fix issues in high contrast mode (#33573) --- ...ui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json | 7 +++++++ .../library/src/components/Tab/useTabStyles.styles.ts | 6 +++--- 2 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 change/@fluentui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json diff --git a/change/@fluentui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json b/change/@fluentui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json new file mode 100644 index 00000000000000..ca5b255c638c47 --- /dev/null +++ b/change/@fluentui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: update tab border color for better visibility in high contrast mode", + "packageName": "@fluentui/react-tabs", + "email": "dmytrokirpa@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-tabs/library/src/components/Tab/useTabStyles.styles.ts b/packages/react-components/react-tabs/library/src/components/Tab/useTabStyles.styles.ts index 665b37b7d26558..c6d3116d6c22cf 100644 --- a/packages/react-components/react-tabs/library/src/components/Tab/useTabStyles.styles.ts +++ b/packages/react-components/react-tabs/library/src/components/Tab/useTabStyles.styles.ts @@ -190,7 +190,7 @@ const useCircularAppearanceStyles = makeStyles({ }, subtle: { backgroundColor: tokens.colorSubtleBackground, - border: `solid ${tokens.strokeWidthThin} ${tokens.colorTransparentStroke}`, + border: `solid ${tokens.strokeWidthThin} transparent`, color: tokens.colorNeutralForeground2, ':enabled:hover': { backgroundColor: tokens.colorSubtleBackgroundHover, @@ -221,7 +221,7 @@ const useCircularAppearanceStyles = makeStyles({ subtleDisabled: { backgroundColor: tokens.colorSubtleBackground, color: tokens.colorNeutralForegroundDisabled, - border: `solid ${tokens.strokeWidthThin} ${tokens.colorTransparentStroke}`, + border: `solid ${tokens.strokeWidthThin} transparent`, }, subtleDisabledSelected: { backgroundColor: tokens.colorNeutralBackgroundDisabled, @@ -254,7 +254,7 @@ const useCircularAppearanceStyles = makeStyles({ }, filledDisabled: { backgroundColor: tokens.colorNeutralBackgroundDisabled, - border: `solid ${tokens.strokeWidthThin} ${tokens.colorTransparentStroke}`, + border: `solid ${tokens.strokeWidthThin} transparent`, color: tokens.colorNeutralForegroundDisabled, }, filledDisabledSelected: { From 52572e1cdd452d32c67195bdc42f1114f58242bb Mon Sep 17 00:00:00 2001 From: Soumya Tripathy <soumya_tripathy@outlook.com> Date: Wed, 8 Jan 2025 21:17:19 +0530 Subject: [PATCH 06/78] Improvement/33473 react toast styling (#33550) --- ...i-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json | 7 +++++++ .../library/src/components/Toast/Toast.types.ts | 2 ++ .../react-toast/library/src/components/Toast/useToast.ts | 4 ++++ .../components/ToastTitle/useToastTitleStyles.styles.ts | 2 +- 4 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 change/@fluentui-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json diff --git a/change/@fluentui-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json b/change/@fluentui-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json new file mode 100644 index 00000000000000..c4a1d4c3f55c15 --- /dev/null +++ b/change/@fluentui-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "feat: Add intent property to Toast state and useToast hook. Correct media className assignment in useToastTitleStyles.", + "packageName": "@fluentui/react-toast", + "email": "soumya_tripathy@outlook.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-toast/library/src/components/Toast/Toast.types.ts b/packages/react-components/react-toast/library/src/components/Toast/Toast.types.ts index b19b50447c8ec9..5e418eb9f17718 100644 --- a/packages/react-components/react-toast/library/src/components/Toast/Toast.types.ts +++ b/packages/react-components/react-toast/library/src/components/Toast/Toast.types.ts @@ -1,5 +1,6 @@ import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities'; import { BackgroundAppearanceContextValue } from '@fluentui/react-shared-contexts'; +import type { ToastIntent } from '../../state/types'; export type ToastSlots = { root: Slot<'div'>; @@ -21,4 +22,5 @@ export type ToastProps = ComponentProps<ToastSlots> & { */ export type ToastState = ComponentState<ToastSlots> & { backgroundAppearance: BackgroundAppearanceContextValue; + intent?: ToastIntent | undefined; }; diff --git a/packages/react-components/react-toast/library/src/components/Toast/useToast.ts b/packages/react-components/react-toast/library/src/components/Toast/useToast.ts index 43f3af33d3a21c..0d67fc235b9eb4 100644 --- a/packages/react-components/react-toast/library/src/components/Toast/useToast.ts +++ b/packages/react-components/react-toast/library/src/components/Toast/useToast.ts @@ -1,6 +1,7 @@ import * as React from 'react'; import { getIntrinsicElementProps, slot } from '@fluentui/react-utilities'; import type { ToastProps, ToastState } from './Toast.types'; +import { useToastContainerContext } from '../../contexts/toastContainerContext'; /** * Create the state required to render Toast. @@ -12,6 +13,8 @@ import type { ToastProps, ToastState } from './Toast.types'; * @param ref - reference to root HTMLElement of Toast */ export const useToast_unstable = (props: ToastProps, ref: React.Ref<HTMLElement>): ToastState => { + const { intent } = useToastContainerContext(); + return { components: { root: 'div', @@ -27,5 +30,6 @@ export const useToast_unstable = (props: ToastProps, ref: React.Ref<HTMLElement> { elementType: 'div' }, ), backgroundAppearance: props.appearance, + intent, }; }; diff --git a/packages/react-components/react-toast/library/src/components/ToastTitle/useToastTitleStyles.styles.ts b/packages/react-components/react-toast/library/src/components/ToastTitle/useToastTitleStyles.styles.ts index e04b74aa19a063..5776211c3fd01b 100644 --- a/packages/react-components/react-toast/library/src/components/ToastTitle/useToastTitleStyles.styles.ts +++ b/packages/react-components/react-toast/library/src/components/ToastTitle/useToastTitleStyles.styles.ts @@ -102,9 +102,9 @@ export const useToastTitleStyles_unstable = (state: ToastTitleState): ToastTitle toastTitleClassNames.media, mediaBaseClassName, state.backgroundAppearance === 'inverted' && invertedStyles.media, - state.media.className, intent && intentIconStyles[intent], intent && state.backgroundAppearance === 'inverted' && intentIconStylesInverted[intent], + state.media.className, ); } From 6473e08086509d7dab294243777a2066c75b62aa Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Wed, 8 Jan 2025 18:33:56 +0000 Subject: [PATCH 07/78] release: applying package updates - react-components --- apps/vr-tests-react-components/package.json | 2 +- ...-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json | 7 -- ...-0f7e3b1e-353f-410a-8642-202d0d30d244.json | 7 -- ...-cf2c2f44-2d77-4ead-b123-c81b1da98292.json | 7 -- ...-4c011c9c-802b-466f-8bf8-cacdc208ad49.json | 7 -- ...-33c0a62b-e18c-45a1-9fbd-bfd7089f997c.json | 7 -- ...-06d8884d-7988-49cd-a359-4efb7050f12c.json | 7 -- ...-72abc821-ab32-4cac-8dd2-4c8dce4c810e.json | 7 -- ...-f4f8b668-785c-48d9-9d8f-2410472b12f4.json | 7 -- ...-f474a804-4972-4d68-b0dc-f1d699251a90.json | 7 -- ...-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json | 7 -- ...-c3487ced-27ab-4e86-ab00-dca2debf985c.json | 7 -- ...-e37ea84e-b210-4707-bac3-e4fd689b556e.json | 7 -- .../library/CHANGELOG.json | 39 +++++++ .../react-charts-preview/library/CHANGELOG.md | 15 ++- .../react-charts-preview/library/package.json | 12 +- .../CHANGELOG.json | 15 +++ .../CHANGELOG.md | 11 +- .../package.json | 2 +- .../react-accordion/library/CHANGELOG.json | 33 ++++++ .../react-accordion/library/CHANGELOG.md | 14 ++- .../react-accordion/library/package.json | 10 +- .../react-aria/library/CHANGELOG.json | 15 +++ .../react-aria/library/CHANGELOG.md | 11 +- .../react-aria/library/package.json | 4 +- .../react-avatar/library/CHANGELOG.json | 33 ++++++ .../react-avatar/library/CHANGELOG.md | 14 ++- .../react-avatar/library/package.json | 10 +- .../react-badge/library/CHANGELOG.json | 15 +++ .../react-badge/library/CHANGELOG.md | 11 +- .../react-badge/library/package.json | 4 +- .../react-breadcrumb/library/CHANGELOG.json | 33 ++++++ .../react-breadcrumb/library/CHANGELOG.md | 14 ++- .../react-breadcrumb/library/package.json | 10 +- .../react-button/library/CHANGELOG.json | 21 ++++ .../react-button/library/CHANGELOG.md | 12 +- .../react-button/library/package.json | 6 +- .../library/CHANGELOG.json | 15 +++ .../library/CHANGELOG.md | 11 +- .../library/package.json | 4 +- .../react-card/library/CHANGELOG.json | 21 ++++ .../react-card/library/CHANGELOG.md | 12 +- .../react-card/library/package.json | 6 +- .../react-carousel/library/CHANGELOG.json | 27 +++++ .../react-carousel/library/CHANGELOG.md | 13 ++- .../react-carousel/library/package.json | 8 +- .../react-checkbox/library/CHANGELOG.json | 27 +++++ .../react-checkbox/library/CHANGELOG.md | 13 ++- .../react-checkbox/library/package.json | 8 +- .../library/CHANGELOG.json | 27 +++++ .../library/CHANGELOG.md | 13 ++- .../library/package.json | 4 +- .../react-colorpicker-compat/package.json | 2 +- .../react-combobox/library/CHANGELOG.json | 39 +++++++ .../react-combobox/library/CHANGELOG.md | 15 ++- .../react-combobox/library/package.json | 12 +- .../react-components/CHANGELOG.json | 83 ++++++++++++++ .../react-components/CHANGELOG.md | 36 +++++- .../react-components/package.json | 106 +++++++++--------- .../react-conformance-griffel/CHANGELOG.json | 15 +++ .../react-conformance-griffel/CHANGELOG.md | 11 +- .../react-conformance-griffel/package.json | 4 +- .../library/CHANGELOG.json | 51 +++++++++ .../library/CHANGELOG.md | 17 ++- .../library/package.json | 16 +-- .../react-dialog/library/CHANGELOG.json | 39 +++++++ .../react-dialog/library/CHANGELOG.md | 15 ++- .../react-dialog/library/package.json | 12 +- .../react-divider/library/CHANGELOG.json | 15 +++ .../react-divider/library/CHANGELOG.md | 11 +- .../react-divider/library/package.json | 4 +- .../react-drawer/library/CHANGELOG.json | 33 ++++++ .../react-drawer/library/CHANGELOG.md | 14 ++- .../react-drawer/library/package.json | 10 +- .../react-field/library/CHANGELOG.json | 21 ++++ .../react-field/library/CHANGELOG.md | 12 +- .../react-field/library/package.json | 6 +- .../react-icons-compat/library/CHANGELOG.json | 15 +++ .../react-icons-compat/library/CHANGELOG.md | 11 +- .../react-icons-compat/library/package.json | 4 +- .../react-image/library/CHANGELOG.json | 15 +++ .../react-image/library/CHANGELOG.md | 11 +- .../react-image/library/package.json | 4 +- .../react-infolabel/library/CHANGELOG.json | 27 +++++ .../react-infolabel/library/CHANGELOG.md | 13 ++- .../react-infolabel/library/package.json | 8 +- .../react-input/library/CHANGELOG.json | 21 ++++ .../react-input/library/CHANGELOG.md | 12 +- .../react-input/library/package.json | 6 +- .../react-jsx-runtime/package.json | 2 +- .../react-label/library/CHANGELOG.json | 15 +++ .../react-label/library/CHANGELOG.md | 11 +- .../react-label/library/package.json | 4 +- .../react-link/library/CHANGELOG.json | 15 +++ .../react-link/library/CHANGELOG.md | 11 +- .../react-link/library/package.json | 4 +- .../react-list/library/CHANGELOG.json | 29 ++++- .../react-list/library/CHANGELOG.md | 15 ++- .../react-list/library/package.json | 6 +- .../react-menu/library/CHANGELOG.json | 33 ++++++ .../react-menu/library/CHANGELOG.md | 14 ++- .../react-menu/library/package.json | 10 +- .../react-message-bar/library/CHANGELOG.json | 45 ++++++++ .../react-message-bar/library/CHANGELOG.md | 16 ++- .../react-message-bar/library/package.json | 12 +- .../library/CHANGELOG.json | 27 +++++ .../library/CHANGELOG.md | 13 ++- .../library/package.json | 8 +- .../library/CHANGELOG.json | 15 +++ .../library/CHANGELOG.md | 11 +- .../library/package.json | 4 +- .../library/package.json | 2 +- .../react-motion/library/CHANGELOG.json | 15 +++ .../react-motion/library/CHANGELOG.md | 11 +- .../react-motion/library/package.json | 2 +- .../react-nav-preview/library/CHANGELOG.json | 45 ++++++++ .../react-nav-preview/library/CHANGELOG.md | 16 ++- .../react-nav-preview/library/package.json | 14 +-- .../react-overflow/library/package.json | 2 +- .../react-persona/library/CHANGELOG.json | 27 +++++ .../react-persona/library/CHANGELOG.md | 13 ++- .../react-persona/library/package.json | 8 +- .../react-popover/library/CHANGELOG.json | 33 ++++++ .../react-popover/library/CHANGELOG.md | 14 ++- .../react-popover/library/package.json | 10 +- .../react-portal-compat/CHANGELOG.json | 15 +++ .../react-portal-compat/CHANGELOG.md | 11 +- .../react-portal-compat/package.json | 4 +- .../react-portal/library/package.json | 2 +- .../react-positioning/CHANGELOG.json | 15 +++ .../react-positioning/CHANGELOG.md | 11 +- .../react-positioning/package.json | 2 +- .../react-progress/library/CHANGELOG.json | 21 ++++ .../react-progress/library/CHANGELOG.md | 12 +- .../react-progress/library/package.json | 6 +- .../react-provider/library/CHANGELOG.json | 15 +++ .../react-provider/library/CHANGELOG.md | 11 +- .../react-provider/library/package.json | 4 +- .../react-radio/library/CHANGELOG.json | 27 +++++ .../react-radio/library/CHANGELOG.md | 13 ++- .../react-radio/library/package.json | 8 +- .../react-rating/library/CHANGELOG.json | 15 +++ .../react-rating/library/CHANGELOG.md | 11 +- .../react-rating/library/package.json | 4 +- .../react-search/library/CHANGELOG.json | 21 ++++ .../react-search/library/CHANGELOG.md | 12 +- .../react-search/library/package.json | 6 +- .../react-select/library/CHANGELOG.json | 21 ++++ .../react-select/library/CHANGELOG.md | 12 +- .../react-select/library/package.json | 6 +- .../react-skeleton/library/CHANGELOG.json | 21 ++++ .../react-skeleton/library/CHANGELOG.md | 12 +- .../react-skeleton/library/package.json | 6 +- .../react-slider/library/CHANGELOG.json | 21 ++++ .../react-slider/library/CHANGELOG.md | 12 +- .../react-slider/library/package.json | 6 +- .../react-spinbutton/library/CHANGELOG.json | 21 ++++ .../react-spinbutton/library/CHANGELOG.md | 12 +- .../react-spinbutton/library/package.json | 6 +- .../react-spinner/library/CHANGELOG.json | 21 ++++ .../react-spinner/library/CHANGELOG.md | 12 +- .../react-spinner/library/package.json | 6 +- .../react-storybook-addon/package.json | 4 +- .../library/CHANGELOG.json | 21 ++++ .../react-swatch-picker/library/CHANGELOG.md | 12 +- .../react-swatch-picker/library/package.json | 6 +- .../react-switch/library/CHANGELOG.json | 27 +++++ .../react-switch/library/CHANGELOG.md | 13 ++- .../react-switch/library/package.json | 8 +- .../react-table/library/CHANGELOG.json | 39 +++++++ .../react-table/library/CHANGELOG.md | 15 ++- .../react-table/library/package.json | 12 +- .../react-tabs/library/CHANGELOG.json | 21 ++++ .../react-tabs/library/CHANGELOG.md | 12 +- .../react-tabs/library/package.json | 4 +- .../react-tag-picker/library/CHANGELOG.json | 51 +++++++++ .../react-tag-picker/library/CHANGELOG.md | 17 ++- .../react-tag-picker/library/package.json | 16 +-- .../react-tags/library/CHANGELOG.json | 27 +++++ .../react-tags/library/CHANGELOG.md | 13 ++- .../react-tags/library/package.json | 8 +- .../library/CHANGELOG.json | 39 +++++++ .../library/CHANGELOG.md | 15 ++- .../library/package.json | 10 +- .../react-text/library/CHANGELOG.json | 15 +++ .../react-text/library/CHANGELOG.md | 11 +- .../react-text/library/package.json | 4 +- .../react-textarea/library/CHANGELOG.json | 21 ++++ .../react-textarea/library/CHANGELOG.md | 12 +- .../react-textarea/library/package.json | 6 +- .../library/CHANGELOG.json | 27 +++++ .../library/CHANGELOG.md | 13 ++- .../library/package.json | 8 +- .../react-toast/library/CHANGELOG.json | 45 ++++++++ .../react-toast/library/CHANGELOG.md | 16 ++- .../react-toast/library/package.json | 12 +- .../react-toolbar/library/CHANGELOG.json | 33 ++++++ .../react-toolbar/library/CHANGELOG.md | 14 ++- .../react-toolbar/library/package.json | 10 +- .../react-tooltip/library/CHANGELOG.json | 27 +++++ .../react-tooltip/library/CHANGELOG.md | 13 ++- .../react-tooltip/library/package.json | 8 +- .../react-tree/library/CHANGELOG.json | 57 ++++++++++ .../react-tree/library/CHANGELOG.md | 18 ++- .../react-tree/library/package.json | 18 +-- .../library/package.json | 2 +- .../react-virtualizer/library/CHANGELOG.json | 15 +++ .../react-virtualizer/library/CHANGELOG.md | 11 +- .../react-virtualizer/library/package.json | 4 +- .../react-components/recipes/package.json | 4 +- .../theme-designer/package.json | 2 +- packages/react-conformance/CHANGELOG.json | 15 +++ packages/react-conformance/CHANGELOG.md | 11 +- packages/react-conformance/package.json | 2 +- 214 files changed, 2779 insertions(+), 443 deletions(-) delete mode 100644 change/@fluentui-eslint-plugin-react-components-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json delete mode 100644 change/@fluentui-react-color-picker-preview-0f7e3b1e-353f-410a-8642-202d0d30d244.json delete mode 100644 change/@fluentui-react-color-picker-preview-cf2c2f44-2d77-4ead-b123-c81b1da98292.json delete mode 100644 change/@fluentui-react-components-4c011c9c-802b-466f-8bf8-cacdc208ad49.json delete mode 100644 change/@fluentui-react-conformance-33c0a62b-e18c-45a1-9fbd-bfd7089f997c.json delete mode 100644 change/@fluentui-react-list-06d8884d-7988-49cd-a359-4efb7050f12c.json delete mode 100644 change/@fluentui-react-message-bar-72abc821-ab32-4cac-8dd2-4c8dce4c810e.json delete mode 100644 change/@fluentui-react-motion-f4f8b668-785c-48d9-9d8f-2410472b12f4.json delete mode 100644 change/@fluentui-react-positioning-f474a804-4972-4d68-b0dc-f1d699251a90.json delete mode 100644 change/@fluentui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json delete mode 100644 change/@fluentui-react-teaching-popover-c3487ced-27ab-4e86-ab00-dca2debf985c.json delete mode 100644 change/@fluentui-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json diff --git a/apps/vr-tests-react-components/package.json b/apps/vr-tests-react-components/package.json index b7dcfa211e8f53..52951858b54e45 100644 --- a/apps/vr-tests-react-components/package.json +++ b/apps/vr-tests-react-components/package.json @@ -82,6 +82,6 @@ "@fluentui/react-teaching-popover": "*", "@fluentui/react-tag-picker": "*", "@fluentui/react-carousel": "*", - "@fluentui/react-list": ">=9.0.0-alpha" + "@fluentui/react-list": "*" } } diff --git a/change/@fluentui-eslint-plugin-react-components-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json b/change/@fluentui-eslint-plugin-react-components-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json deleted file mode 100644 index 5459e40ce0c429..00000000000000 --- a/change/@fluentui-eslint-plugin-react-components-1c2bc691-c857-43cf-9806-ffe8d0d058c0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "feat: add prefer-fluentui-v9 rule", - "packageName": "@fluentui/eslint-plugin-react-components", - "email": "dmytrokirpa@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-color-picker-preview-0f7e3b1e-353f-410a-8642-202d0d30d244.json b/change/@fluentui-react-color-picker-preview-0f7e3b1e-353f-410a-8642-202d0d30d244.json deleted file mode 100644 index 817c04f0d17a40..00000000000000 --- a/change/@fluentui-react-color-picker-preview-0f7e3b1e-353f-410a-8642-202d0d30d244.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: contrast border of thumb", - "packageName": "@fluentui/react-color-picker-preview", - "email": "vkozlova@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-color-picker-preview-cf2c2f44-2d77-4ead-b123-c81b1da98292.json b/change/@fluentui-react-color-picker-preview-cf2c2f44-2d77-4ead-b123-c81b1da98292.json deleted file mode 100644 index e5329cbb374e3c..00000000000000 --- a/change/@fluentui-react-color-picker-preview-cf2c2f44-2d77-4ead-b123-c81b1da98292.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "feat: added aria-attributes to the ColorPicker", - "packageName": "@fluentui/react-color-picker-preview", - "email": "vkozlova@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-components-4c011c9c-802b-466f-8bf8-cacdc208ad49.json b/change/@fluentui-react-components-4c011c9c-802b-466f-8bf8-cacdc208ad49.json deleted file mode 100644 index a7215bf4831779..00000000000000 --- a/change/@fluentui-react-components-4c011c9c-802b-466f-8bf8-cacdc208ad49.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "feat: add @fluentui/react-list to suite", - "packageName": "@fluentui/react-components", - "email": "jirivyhnalek@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-conformance-33c0a62b-e18c-45a1-9fbd-bfd7089f997c.json b/change/@fluentui-react-conformance-33c0a62b-e18c-45a1-9fbd-bfd7089f997c.json deleted file mode 100644 index 132ef6bac19f53..00000000000000 --- a/change/@fluentui-react-conformance-33c0a62b-e18c-45a1-9fbd-bfd7089f997c.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "chore: remove usage of \"export *\"", - "packageName": "@fluentui/react-conformance", - "email": "olfedias@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-list-06d8884d-7988-49cd-a359-4efb7050f12c.json b/change/@fluentui-react-list-06d8884d-7988-49cd-a359-4efb7050f12c.json deleted file mode 100644 index 3af28cbdf09ec9..00000000000000 --- a/change/@fluentui-react-list-06d8884d-7988-49cd-a359-4efb7050f12c.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "feat: release stable", - "packageName": "@fluentui/react-list", - "email": "jirivyhnalek@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-message-bar-72abc821-ab32-4cac-8dd2-4c8dce4c810e.json b/change/@fluentui-react-message-bar-72abc821-ab32-4cac-8dd2-4c8dce4c810e.json deleted file mode 100644 index 45370fc286bc2a..00000000000000 --- a/change/@fluentui-react-message-bar-72abc821-ab32-4cac-8dd2-4c8dce4c810e.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "refactor(MessageBar): migrate slide & fade to motion components", - "packageName": "@fluentui/react-message-bar", - "email": "robertpenner@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-motion-f4f8b668-785c-48d9-9d8f-2410472b12f4.json b/change/@fluentui-react-motion-f4f8b668-785c-48d9-9d8f-2410472b12f4.json deleted file mode 100644 index 81ed563ea2612c..00000000000000 --- a/change/@fluentui-react-motion-f4f8b668-785c-48d9-9d8f-2410472b12f4.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: handle case when Animation.persist() does not exist", - "packageName": "@fluentui/react-motion", - "email": "seanmonahan@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-positioning-f474a804-4972-4d68-b0dc-f1d699251a90.json b/change/@fluentui-react-positioning-f474a804-4972-4d68-b0dc-f1d699251a90.json deleted file mode 100644 index c76bca52bb3cc9..00000000000000 --- a/change/@fluentui-react-positioning-f474a804-4972-4d68-b0dc-f1d699251a90.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "chore: bump @floating-ui/dom", - "packageName": "@fluentui/react-positioning", - "email": "863023+radium-v@users.noreply.github.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json b/change/@fluentui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json deleted file mode 100644 index ca5b255c638c47..00000000000000 --- a/change/@fluentui-react-tabs-9ce35d6f-27b5-451e-aa6f-d2902a97787b.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: update tab border color for better visibility in high contrast mode", - "packageName": "@fluentui/react-tabs", - "email": "dmytrokirpa@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-teaching-popover-c3487ced-27ab-4e86-ab00-dca2debf985c.json b/change/@fluentui-react-teaching-popover-c3487ced-27ab-4e86-ab00-dca2debf985c.json deleted file mode 100644 index d70149ff0dba7c..00000000000000 --- a/change/@fluentui-react-teaching-popover-c3487ced-27ab-4e86-ab00-dca2debf985c.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "fix: accName updates and semantic fixes", - "packageName": "@fluentui/react-teaching-popover", - "email": "sarah.higley@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json b/change/@fluentui-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json deleted file mode 100644 index c4a1d4c3f55c15..00000000000000 --- a/change/@fluentui-react-toast-e37ea84e-b210-4707-bac3-e4fd689b556e.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "feat: Add intent property to Toast state and useToast hook. Correct media className assignment in useToastTitleStyles.", - "packageName": "@fluentui/react-toast", - "email": "soumya_tripathy@outlook.com", - "dependentChangeType": "patch" -} diff --git a/packages/charts/react-charts-preview/library/CHANGELOG.json b/packages/charts/react-charts-preview/library/CHANGELOG.json index 5a9a3eb9685df3..94ed98519669a4 100644 --- a/packages/charts/react-charts-preview/library/CHANGELOG.json +++ b/packages/charts/react-charts-preview/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-charts-preview", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-charts-preview_v0.1.6", + "version": "0.1.6", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-button to v9.3.99", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-overflow to v9.2.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-popover to v9.9.30", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-tooltip to v9.5.3", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-charts-preview_v0.1.5", diff --git a/packages/charts/react-charts-preview/library/CHANGELOG.md b/packages/charts/react-charts-preview/library/CHANGELOG.md index ae5c058ec77e90..ede8b5d0bf0233 100644 --- a/packages/charts/react-charts-preview/library/CHANGELOG.md +++ b/packages/charts/react-charts-preview/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-charts-preview -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [0.1.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-charts-preview_v0.1.6) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charts-preview_v0.1.5..@fluentui/react-charts-preview_v0.1.6) + +### Patches + +- Bump @fluentui/react-button to v9.3.99 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-overflow to v9.2.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-popover to v9.9.30 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-tooltip to v9.5.3 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [0.1.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-charts-preview_v0.1.5) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/charts/react-charts-preview/library/package.json b/packages/charts/react-charts-preview/library/package.json index 32be5463b027cd..2bcc9cb58d91b8 100644 --- a/packages/charts/react-charts-preview/library/package.json +++ b/packages/charts/react-charts-preview/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-charts-preview", - "version": "0.1.5", + "version": "0.1.6", "description": "React web chart controls for Microsoft fluentui v9 system.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -37,14 +37,14 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/react-button": "^9.3.98", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-overflow": "^9.2.5", - "@fluentui/react-popover": "^9.9.29", + "@fluentui/react-button": "^9.3.99", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-overflow": "^9.2.6", + "@fluentui/react-popover": "^9.9.30", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-tooltip": "^9.5.2", + "@fluentui/react-tooltip": "^9.5.3", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", diff --git a/packages/react-components/eslint-plugin-react-components/CHANGELOG.json b/packages/react-components/eslint-plugin-react-components/CHANGELOG.json index fbf6513e4e7dbd..c3080ab03dec51 100644 --- a/packages/react-components/eslint-plugin-react-components/CHANGELOG.json +++ b/packages/react-components/eslint-plugin-react-components/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/eslint-plugin-react-components", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:32 GMT", + "tag": "@fluentui/eslint-plugin-react-components_v0.1.1", + "version": "0.1.1", + "comments": { + "patch": [ + { + "author": "dmytrokirpa@microsoft.com", + "package": "@fluentui/eslint-plugin-react-components", + "commit": "384df0ccb4a5324da6daee8f18712ef5a81fa05a", + "comment": "feat: add prefer-fluentui-v9 rule" + } + ] + } + }, { "date": "Fri, 06 Dec 2024 12:53:38 GMT", "tag": "@fluentui/eslint-plugin-react-components_v0.1.0", diff --git a/packages/react-components/eslint-plugin-react-components/CHANGELOG.md b/packages/react-components/eslint-plugin-react-components/CHANGELOG.md index 32ebceabc4cfa7..0501f8787c383f 100644 --- a/packages/react-components/eslint-plugin-react-components/CHANGELOG.md +++ b/packages/react-components/eslint-plugin-react-components/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/eslint-plugin-react-components -This log was last generated on Fri, 06 Dec 2024 12:53:38 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:32 GMT and should not be manually modified. <!-- Start content --> +## [0.1.1](https://github.com/microsoft/fluentui/tree/@fluentui/eslint-plugin-react-components_v0.1.1) + +Wed, 08 Jan 2025 18:33:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/eslint-plugin-react-components_v0.1.0..@fluentui/eslint-plugin-react-components_v0.1.1) + +### Patches + +- feat: add prefer-fluentui-v9 rule ([PR #33449](https://github.com/microsoft/fluentui/pull/33449) by dmytrokirpa@microsoft.com) + ## [0.1.0](https://github.com/microsoft/fluentui/tree/@fluentui/eslint-plugin-react-components_v0.1.0) Fri, 06 Dec 2024 12:53:38 GMT diff --git a/packages/react-components/eslint-plugin-react-components/package.json b/packages/react-components/eslint-plugin-react-components/package.json index a7bfca2ce415e6..b67ca20a4c7985 100644 --- a/packages/react-components/eslint-plugin-react-components/package.json +++ b/packages/react-components/eslint-plugin-react-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/eslint-plugin-react-components", - "version": "0.1.0", + "version": "0.1.1", "description": "ESLint plugin and custom rules for Fluent UI components v9", "main": "./lib-commonjs/index.js", "module": "./lib/index.js", diff --git a/packages/react-components/react-accordion/library/CHANGELOG.json b/packages/react-components/react-accordion/library/CHANGELOG.json index f054c4eacb5926..6d918b9c6a9ec7 100644 --- a/packages/react-components/react-accordion/library/CHANGELOG.json +++ b/packages/react-components/react-accordion/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-accordion", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-accordion_v9.5.13", + "version": "9.5.13", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-motion to v9.6.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.2", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-accordion_v9.5.12", diff --git a/packages/react-components/react-accordion/library/CHANGELOG.md b/packages/react-components/react-accordion/library/CHANGELOG.md index e39d97bf662dfb..5f4519eed6cf93 100644 --- a/packages/react-components/react-accordion/library/CHANGELOG.md +++ b/packages/react-components/react-accordion/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-accordion -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.5.13](https://github.com/microsoft/fluentui/tree/@fluentui/react-accordion_v9.5.13) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-accordion_v9.5.12..@fluentui/react-accordion_v9.5.13) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion to v9.6.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.2 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.5.12](https://github.com/microsoft/fluentui/tree/@fluentui/react-accordion_v9.5.12) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-accordion/library/package.json b/packages/react-components/react-accordion/library/package.json index 6b972c03096921..b9812bfd106852 100644 --- a/packages/react-components/react-accordion/library/package.json +++ b/packages/react-components/react-accordion/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-accordion", - "version": "9.5.12", + "version": "9.5.13", "description": "Fluent UI accordion component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,13 +18,13 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-motion": "^9.6.5", - "@fluentui/react-motion-components-preview": "^0.4.1", + "@fluentui/react-motion": "^9.6.6", + "@fluentui/react-motion-components-preview": "^0.4.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-aria/library/CHANGELOG.json b/packages/react-components/react-aria/library/CHANGELOG.json index 6a27e3b825e8cb..bd4d8fd100391d 100644 --- a/packages/react-components/react-aria/library/CHANGELOG.json +++ b/packages/react-components/react-aria/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-aria", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-aria_v9.13.13", + "version": "9.13.13", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-aria", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-aria_v9.13.12", diff --git a/packages/react-components/react-aria/library/CHANGELOG.md b/packages/react-components/react-aria/library/CHANGELOG.md index 9007f8b13fbab8..de32309340dabb 100644 --- a/packages/react-components/react-aria/library/CHANGELOG.md +++ b/packages/react-components/react-aria/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-aria -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.13.13](https://github.com/microsoft/fluentui/tree/@fluentui/react-aria_v9.13.13) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-aria_v9.13.12..@fluentui/react-aria_v9.13.13) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.13.12](https://github.com/microsoft/fluentui/tree/@fluentui/react-aria_v9.13.12) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-aria/library/package.json b/packages/react-components/react-aria/library/package.json index cc8e4e6fc85ccc..8df4f1e8f2d1dc 100644 --- a/packages/react-components/react-aria/library/package.json +++ b/packages/react-components/react-aria/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-aria", - "version": "9.13.12", + "version": "9.13.13", "description": "React helper to ensure ARIA", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,7 +20,7 @@ "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-utilities": "^9.18.19", "@swc/helpers": "^0.5.1" diff --git a/packages/react-components/react-avatar/library/CHANGELOG.json b/packages/react-components/react-avatar/library/CHANGELOG.json index 2566640b7b57e6..20f5de14d1b2a7 100644 --- a/packages/react-components/react-avatar/library/CHANGELOG.json +++ b/packages/react-components/react-avatar/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-avatar", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-avatar_v9.6.48", + "version": "9.6.48", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-badge to v9.2.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-popover to v9.9.30", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-tooltip to v9.5.3", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-avatar_v9.6.47", diff --git a/packages/react-components/react-avatar/library/CHANGELOG.md b/packages/react-components/react-avatar/library/CHANGELOG.md index ffe7d5ebb1e270..944829443990ca 100644 --- a/packages/react-components/react-avatar/library/CHANGELOG.md +++ b/packages/react-components/react-avatar/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-avatar -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.6.48](https://github.com/microsoft/fluentui/tree/@fluentui/react-avatar_v9.6.48) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-avatar_v9.6.47..@fluentui/react-avatar_v9.6.48) + +### Patches + +- Bump @fluentui/react-badge to v9.2.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-popover to v9.9.30 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-tooltip to v9.5.3 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.6.47](https://github.com/microsoft/fluentui/tree/@fluentui/react-avatar_v9.6.47) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-avatar/library/package.json b/packages/react-components/react-avatar/library/package.json index cd07c63f6f0996..2f9d349d45ee4e 100644 --- a/packages/react-components/react-avatar/library/package.json +++ b/packages/react-components/react-avatar/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-avatar", - "version": "9.6.47", + "version": "9.6.48", "description": "React components for building Microsoft web experiences.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,16 +21,16 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-badge": "^9.2.48", + "@fluentui/react-badge": "^9.2.49", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-popover": "^9.9.29", + "@fluentui/react-popover": "^9.9.30", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-tooltip": "^9.5.2", + "@fluentui/react-tooltip": "^9.5.3", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-badge/library/CHANGELOG.json b/packages/react-components/react-badge/library/CHANGELOG.json index 3f09172012b249..f1cc7a2126c9a1 100644 --- a/packages/react-components/react-badge/library/CHANGELOG.json +++ b/packages/react-components/react-badge/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-badge", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-badge_v9.2.49", + "version": "9.2.49", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-badge", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-badge_v9.2.48", diff --git a/packages/react-components/react-badge/library/CHANGELOG.md b/packages/react-components/react-badge/library/CHANGELOG.md index 7660ccb6ebae67..6c04179d03e350 100644 --- a/packages/react-components/react-badge/library/CHANGELOG.md +++ b/packages/react-components/react-badge/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-badge -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.49](https://github.com/microsoft/fluentui/tree/@fluentui/react-badge_v9.2.49) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-badge_v9.2.48..@fluentui/react-badge_v9.2.49) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.48](https://github.com/microsoft/fluentui/tree/@fluentui/react-badge_v9.2.48) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-badge/library/package.json b/packages/react-components/react-badge/library/package.json index f425921e38959f..25d81efe78c90c 100644 --- a/packages/react-components/react-badge/library/package.json +++ b/packages/react-components/react-badge/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-badge", - "version": "9.2.48", + "version": "9.2.49", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,7 +19,7 @@ }, "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-breadcrumb/library/CHANGELOG.json b/packages/react-components/react-breadcrumb/library/CHANGELOG.json index 96f9192e5d3f60..0fb1591c357a6b 100644 --- a/packages/react-components/react-breadcrumb/library/CHANGELOG.json +++ b/packages/react-components/react-breadcrumb/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-breadcrumb", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-breadcrumb_v9.0.48", + "version": "9.0.48", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-button to v9.3.99", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-link to v9.3.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-breadcrumb_v9.0.46", diff --git a/packages/react-components/react-breadcrumb/library/CHANGELOG.md b/packages/react-components/react-breadcrumb/library/CHANGELOG.md index 9ed2e6dc7e45a5..703053e51edcfd 100644 --- a/packages/react-components/react-breadcrumb/library/CHANGELOG.md +++ b/packages/react-components/react-breadcrumb/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-breadcrumb -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.0.48](https://github.com/microsoft/fluentui/tree/@fluentui/react-breadcrumb_v9.0.48) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-breadcrumb_v9.0.46..@fluentui/react-breadcrumb_v9.0.48) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-button to v9.3.99 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-link to v9.3.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.0.46](https://github.com/microsoft/fluentui/tree/@fluentui/react-breadcrumb_v9.0.46) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-breadcrumb/library/package.json b/packages/react-components/react-breadcrumb/library/package.json index acfb5dbf3fe059..55e7425017793e 100644 --- a/packages/react-components/react-breadcrumb/library/package.json +++ b/packages/react-components/react-breadcrumb/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-breadcrumb", - "version": "9.0.47", + "version": "9.0.48", "description": "Breadcrumb component for Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -22,15 +22,15 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-button": "^9.3.98", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-button": "^9.3.99", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-link": "^9.3.5", + "@fluentui/react-link": "^9.3.6", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-button/library/CHANGELOG.json b/packages/react-components/react-button/library/CHANGELOG.json index 3272fcc2e7a6b4..d7913c861648d2 100644 --- a/packages/react-components/react-button/library/CHANGELOG.json +++ b/packages/react-components/react-button/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-button", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-button_v9.3.99", + "version": "9.3.99", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-button", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-button", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:47 GMT", "tag": "@fluentui/react-button_v9.3.98", diff --git a/packages/react-components/react-button/library/CHANGELOG.md b/packages/react-components/react-button/library/CHANGELOG.md index 29a60e44cfc364..55ed9021a9fb48 100644 --- a/packages/react-components/react-button/library/CHANGELOG.md +++ b/packages/react-components/react-button/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-button -This log was last generated on Mon, 16 Dec 2024 16:26:47 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.3.99](https://github.com/microsoft/fluentui/tree/@fluentui/react-button_v9.3.99) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-button_v9.3.98..@fluentui/react-button_v9.3.99) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.3.98](https://github.com/microsoft/fluentui/tree/@fluentui/react-button_v9.3.98) Mon, 16 Dec 2024 16:26:47 GMT diff --git a/packages/react-components/react-button/library/package.json b/packages/react-components/react-button/library/package.json index d400e4c6d83fa0..b632cf2d08c840 100644 --- a/packages/react-components/react-button/library/package.json +++ b/packages/react-components/react-button/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-button", - "version": "9.3.98", + "version": "9.3.99", "description": "Fluent UI React Button component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,9 +20,9 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-calendar-compat/library/CHANGELOG.json b/packages/react-components/react-calendar-compat/library/CHANGELOG.json index 510e8a28b20fc7..edb0f761aaea45 100644 --- a/packages/react-components/react-calendar-compat/library/CHANGELOG.json +++ b/packages/react-components/react-calendar-compat/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-calendar-compat", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-calendar-compat_v0.1.25", + "version": "0.1.25", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-calendar-compat", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-calendar-compat_v0.1.24", diff --git a/packages/react-components/react-calendar-compat/library/CHANGELOG.md b/packages/react-components/react-calendar-compat/library/CHANGELOG.md index b93d888faa30bb..c0f3f3865b4c77 100644 --- a/packages/react-components/react-calendar-compat/library/CHANGELOG.md +++ b/packages/react-components/react-calendar-compat/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-calendar-compat -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [0.1.25](https://github.com/microsoft/fluentui/tree/@fluentui/react-calendar-compat_v0.1.25) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-calendar-compat_v0.1.24..@fluentui/react-calendar-compat_v0.1.25) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [0.1.24](https://github.com/microsoft/fluentui/tree/@fluentui/react-calendar-compat_v0.1.24) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-calendar-compat/library/package.json b/packages/react-components/react-calendar-compat/library/package.json index 472a14ed776673..8dfb256dc9abf6 100644 --- a/packages/react-components/react-calendar-compat/library/package.json +++ b/packages/react-components/react-calendar-compat/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-calendar-compat", - "version": "0.1.24", + "version": "0.1.25", "description": "Calendar compat component for Fluent UI v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,7 +20,7 @@ "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-card/library/CHANGELOG.json b/packages/react-components/react-card/library/CHANGELOG.json index 8b203f585f0f94..98cac8664bfbe8 100644 --- a/packages/react-components/react-card/library/CHANGELOG.json +++ b/packages/react-components/react-card/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-card", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-card_v9.0.101", + "version": "9.0.101", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-card", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-card", + "comment": "Bump @fluentui/react-text to v9.4.31", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-card_v9.0.100", diff --git a/packages/react-components/react-card/library/CHANGELOG.md b/packages/react-components/react-card/library/CHANGELOG.md index db8460d2369086..3e15430679e69c 100644 --- a/packages/react-components/react-card/library/CHANGELOG.md +++ b/packages/react-components/react-card/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-card -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.0.101](https://github.com/microsoft/fluentui/tree/@fluentui/react-card_v9.0.101) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-card_v9.0.100..@fluentui/react-card_v9.0.101) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-text to v9.4.31 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.0.100](https://github.com/microsoft/fluentui/tree/@fluentui/react-card_v9.0.100) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-card/library/package.json b/packages/react-components/react-card/library/package.json index 2d5555d5656da3..f0a088e09f34b2 100644 --- a/packages/react-components/react-card/library/package.json +++ b/packages/react-components/react-card/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-card", - "version": "9.0.100", + "version": "9.0.101", "private": false, "description": "Card container components for Fluent UI React.", "main": "lib-commonjs/index.js", @@ -23,9 +23,9 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-text": "^9.4.30", + "@fluentui/react-text": "^9.4.31", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-carousel/library/CHANGELOG.json b/packages/react-components/react-carousel/library/CHANGELOG.json index a8f2222ae9a225..0081147104e9ac 100644 --- a/packages/react-components/react-carousel/library/CHANGELOG.json +++ b/packages/react-components/react-carousel/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-carousel", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-carousel_v9.4.4", + "version": "9.4.4", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-button to v9.3.99", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:47 GMT", "tag": "@fluentui/react-carousel_v9.4.3", diff --git a/packages/react-components/react-carousel/library/CHANGELOG.md b/packages/react-components/react-carousel/library/CHANGELOG.md index a79d70f0ff4492..ffcbf93a31bdd2 100644 --- a/packages/react-components/react-carousel/library/CHANGELOG.md +++ b/packages/react-components/react-carousel/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-carousel -This log was last generated on Mon, 16 Dec 2024 16:26:47 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.4.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-carousel_v9.4.4) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-carousel_v9.4.3..@fluentui/react-carousel_v9.4.4) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-button to v9.3.99 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.4.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-carousel_v9.4.3) Mon, 16 Dec 2024 16:26:47 GMT diff --git a/packages/react-components/react-carousel/library/package.json b/packages/react-components/react-carousel/library/package.json index adca635a564059..8f8e5514146c4f 100644 --- a/packages/react-components/react-carousel/library/package.json +++ b/packages/react-components/react-carousel/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-carousel", - "version": "9.4.3", + "version": "9.4.4", "description": "A composable carousel component that enables pagination with minimal rerenders", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -25,11 +25,11 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-button": "^9.3.98", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-button": "^9.3.99", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-checkbox/library/CHANGELOG.json b/packages/react-components/react-checkbox/library/CHANGELOG.json index e389153c3b1f91..be6eaffe0562ac 100644 --- a/packages/react-components/react-checkbox/library/CHANGELOG.json +++ b/packages/react-components/react-checkbox/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-checkbox", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-checkbox_v9.2.45", + "version": "9.2.45", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-checkbox", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-checkbox", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-checkbox", + "comment": "Bump @fluentui/react-label to v9.1.82", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-checkbox_v9.2.44", diff --git a/packages/react-components/react-checkbox/library/CHANGELOG.md b/packages/react-components/react-checkbox/library/CHANGELOG.md index 6a18380fb5121d..77f54ee619c374 100644 --- a/packages/react-components/react-checkbox/library/CHANGELOG.md +++ b/packages/react-components/react-checkbox/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-checkbox -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.45](https://github.com/microsoft/fluentui/tree/@fluentui/react-checkbox_v9.2.45) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-checkbox_v9.2.44..@fluentui/react-checkbox_v9.2.45) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-label to v9.1.82 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.44](https://github.com/microsoft/fluentui/tree/@fluentui/react-checkbox_v9.2.44) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-checkbox/library/package.json b/packages/react-components/react-checkbox/library/package.json index 86f85036ed0447..60de9de02621c0 100644 --- a/packages/react-components/react-checkbox/library/package.json +++ b/packages/react-components/react-checkbox/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-checkbox", - "version": "9.2.44", + "version": "9.2.45", "description": "Fluent UI checkbox component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,10 +18,10 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-field": "^9.1.84", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-label": "^9.1.81", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-label": "^9.1.82", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-color-picker-preview/library/CHANGELOG.json b/packages/react-components/react-color-picker-preview/library/CHANGELOG.json index 173928e5dd1b24..f8e64896e9ddc1 100644 --- a/packages/react-components/react-color-picker-preview/library/CHANGELOG.json +++ b/packages/react-components/react-color-picker-preview/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-color-picker-preview", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:32 GMT", + "tag": "@fluentui/react-color-picker-preview_v0.1.3", + "version": "0.1.3", + "comments": { + "patch": [ + { + "author": "vkozlova@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "c53044a18a262e2defa3f27bf09950ec724a8997", + "comment": "fix: contrast border of thumb" + }, + { + "author": "vkozlova@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "b52d6ba234a24ce1d05c636cfc41b0098b15cfb9", + "comment": "feat: added aria-attributes to the ColorPicker" + }, + { + "author": "beachball", + "package": "@fluentui/react-color-picker-preview", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:48 GMT", "tag": "@fluentui/react-color-picker-preview_v0.1.2", diff --git a/packages/react-components/react-color-picker-preview/library/CHANGELOG.md b/packages/react-components/react-color-picker-preview/library/CHANGELOG.md index e0a5a638c81c6c..52bcf72cde4c4d 100644 --- a/packages/react-components/react-color-picker-preview/library/CHANGELOG.md +++ b/packages/react-components/react-color-picker-preview/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-color-picker-preview -This log was last generated on Mon, 16 Dec 2024 16:26:48 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:32 GMT and should not be manually modified. <!-- Start content --> +## [0.1.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-color-picker-preview_v0.1.3) + +Wed, 08 Jan 2025 18:33:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-color-picker-preview_v0.1.2..@fluentui/react-color-picker-preview_v0.1.3) + +### Patches + +- fix: contrast border of thumb ([PR #33526](https://github.com/microsoft/fluentui/pull/33526) by vkozlova@microsoft.com) +- feat: added aria-attributes to the ColorPicker ([PR #33543](https://github.com/microsoft/fluentui/pull/33543) by vkozlova@microsoft.com) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [0.1.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-color-picker-preview_v0.1.2) Mon, 16 Dec 2024 16:26:48 GMT diff --git a/packages/react-components/react-color-picker-preview/library/package.json b/packages/react-components/react-color-picker-preview/library/package.json index 401162146c746b..6f3f46d0a1615c 100644 --- a/packages/react-components/react-color-picker-preview/library/package.json +++ b/packages/react-components/react-color-picker-preview/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-color-picker-preview", - "version": "0.1.2", + "version": "0.1.3", "description": "ColorPicker component for Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -26,7 +26,7 @@ "dependencies": { "@ctrl/tinycolor": "3.3.4", "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-colorpicker-compat/package.json b/packages/react-components/react-colorpicker-compat/package.json index a45b6b1865a591..e9209a38f85286 100644 --- a/packages/react-components/react-colorpicker-compat/package.json +++ b/packages/react-components/react-colorpicker-compat/package.json @@ -19,7 +19,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-combobox/library/CHANGELOG.json b/packages/react-components/react-combobox/library/CHANGELOG.json index 7073fcfe6e8d9b..03ad9f5d9ce256 100644 --- a/packages/react-components/react-combobox/library/CHANGELOG.json +++ b/packages/react-components/react-combobox/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-combobox", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-combobox_v9.13.16", + "version": "9.13.16", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-positioning to v9.16.1", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-combobox_v9.13.15", diff --git a/packages/react-components/react-combobox/library/CHANGELOG.md b/packages/react-components/react-combobox/library/CHANGELOG.md index dd65c1ea6c722b..9d10ca0edeb740 100644 --- a/packages/react-components/react-combobox/library/CHANGELOG.md +++ b/packages/react-components/react-combobox/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-combobox -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.13.16](https://github.com/microsoft/fluentui/tree/@fluentui/react-combobox_v9.13.16) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-combobox_v9.13.15..@fluentui/react-combobox_v9.13.16) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-positioning to v9.16.1 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.13.15](https://github.com/microsoft/fluentui/tree/@fluentui/react-combobox_v9.13.15) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-combobox/library/package.json b/packages/react-components/react-combobox/library/package.json index 9cf5745494ce9a..4500264946ddb9 100644 --- a/packages/react-components/react-combobox/library/package.json +++ b/packages/react-components/react-combobox/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-combobox", - "version": "9.13.15", + "version": "9.13.16", "description": "Fluent UI React Combobox component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,14 +19,14 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/keyboard-keys": "^9.0.8", "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-field": "^9.1.84", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-portal": "^9.4.40", - "@fluentui/react-positioning": "^9.16.0", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-positioning": "^9.16.1", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-components/CHANGELOG.json b/packages/react-components/react-components/CHANGELOG.json index d41c76fea81a72..c695eca381bf9f 100644 --- a/packages/react-components/react-components/CHANGELOG.json +++ b/packages/react-components/react-components/CHANGELOG.json @@ -1,6 +1,89 @@ { "name": "@fluentui/react-components", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:32 GMT", + "tag": "@fluentui/react-components_v9.57.0", + "version": "9.57.0", + "comments": { + "patch": [ + { + "author": "dmytrokirpa@microsoft.com", + "package": "@fluentui/eslint-plugin-react-components", + "commit": "384df0ccb4a5324da6daee8f18712ef5a81fa05a", + "comment": "feat: add prefer-fluentui-v9 rule" + }, + { + "author": "vkozlova@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "c53044a18a262e2defa3f27bf09950ec724a8997", + "comment": "fix: contrast border of thumb" + }, + { + "author": "vkozlova@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "b52d6ba234a24ce1d05c636cfc41b0098b15cfb9", + "comment": "feat: added aria-attributes to the ColorPicker" + }, + { + "author": "olfedias@microsoft.com", + "package": "@fluentui/react-conformance", + "commit": "dc7bb663e3d93a19b611cf1892556d69c57b1269", + "comment": "chore: remove usage of \"export *\"" + }, + { + "author": "seanmonahan@microsoft.com", + "package": "@fluentui/react-motion", + "commit": "7f1647fadcd193c0d16e51b314d299ee19ae5746", + "comment": "fix: handle case when Animation.persist() does not exist" + }, + { + "author": "863023+radium-v@users.noreply.github.com", + "package": "@fluentui/react-positioning", + "commit": "8bd0e68bc5a78f8b9b3ea10210ad876151849d7a", + "comment": "chore: bump @floating-ui/dom" + }, + { + "author": "dmytrokirpa@microsoft.com", + "package": "@fluentui/react-tabs", + "commit": "bd3e4c27b89c17e279e99342f305eb9c71714a09", + "comment": "fix: update tab border color for better visibility in high contrast mode" + }, + { + "author": "soumya_tripathy@outlook.com", + "package": "@fluentui/react-toast", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb", + "comment": "feat: Add intent property to Toast state and useToast hook. Correct media className assignment in useToastTitleStyles." + } + ], + "minor": [ + { + "author": "jirivyhnalek@microsoft.com", + "package": "@fluentui/react-components", + "commit": "aa6e5ddc04518065cd0a25bcdd5c91d2c1615bbd", + "comment": "feat: add @fluentui/react-list to suite" + }, + { + "author": "jirivyhnalek@microsoft.com", + "package": "@fluentui/react-list", + "commit": "aa6e5ddc04518065cd0a25bcdd5c91d2c1615bbd", + "comment": "feat: release stable" + }, + { + "author": "robertpenner@microsoft.com", + "package": "@fluentui/react-message-bar", + "commit": "9c716b2519ad2d135fb5d16a60ef6ee183a16e31", + "comment": "refactor(MessageBar): migrate slide & fade to motion components" + }, + { + "author": "sarah.higley@microsoft.com", + "package": "@fluentui/react-teaching-popover", + "commit": "0bfe0c7fdf8981d7ccf8c4c15e927d8202fbdd12", + "comment": "fix: accName updates and semantic fixes" + } + ] + } + }, { "date": "Thu, 19 Dec 2024 14:30:56 GMT", "tag": "@fluentui/react-components_v9.56.8", diff --git a/packages/react-components/react-components/CHANGELOG.md b/packages/react-components/react-components/CHANGELOG.md index 0d568f05c23fa6..afacfc2fae0f59 100644 --- a/packages/react-components/react-components/CHANGELOG.md +++ b/packages/react-components/react-components/CHANGELOG.md @@ -1,9 +1,43 @@ # Change Log - @fluentui/react-components -This log was last generated on Thu, 19 Dec 2024 14:30:56 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:32 GMT and should not be manually modified. <!-- Start content --> +## [9.57.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-components_v9.57.0) + +Wed, 08 Jan 2025 18:33:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-components_v9.56.8..@fluentui/react-components_v9.57.0) + +### Minor changes + +- `@fluentui/react-components` + - feat: add @fluentui/react-list to suite ([PR #33378](https://github.com/microsoft/fluentui/pull/33378) by jirivyhnalek@microsoft.com) +- `@fluentui/react-list` + - feat: release stable ([PR #33378](https://github.com/microsoft/fluentui/pull/33378) by jirivyhnalek@microsoft.com) +- `@fluentui/react-message-bar` + - refactor(MessageBar): migrate slide & fade to motion components ([PR #33465](https://github.com/microsoft/fluentui/pull/33465) by robertpenner@microsoft.com) +- `@fluentui/react-teaching-popover` + - fix: accName updates and semantic fixes ([PR #33194](https://github.com/microsoft/fluentui/pull/33194) by sarah.higley@microsoft.com) + +### Patches + +- `@fluentui/eslint-plugin-react-components` + - feat: add prefer-fluentui-v9 rule ([PR #33449](https://github.com/microsoft/fluentui/pull/33449) by dmytrokirpa@microsoft.com) +- `@fluentui/react-color-picker-preview` + - fix: contrast border of thumb ([PR #33526](https://github.com/microsoft/fluentui/pull/33526) by vkozlova@microsoft.com) + - feat: added aria-attributes to the ColorPicker ([PR #33543](https://github.com/microsoft/fluentui/pull/33543) by vkozlova@microsoft.com) +- `@fluentui/react-conformance` + - chore: remove usage of "export *" ([PR #33448](https://github.com/microsoft/fluentui/pull/33448) by olfedias@microsoft.com) +- `@fluentui/react-motion` + - fix: handle case when Animation.persist() does not exist ([PR #33282](https://github.com/microsoft/fluentui/pull/33282) by seanmonahan@microsoft.com) +- `@fluentui/react-positioning` + - chore: bump @floating-ui/dom ([PR #33458](https://github.com/microsoft/fluentui/pull/33458) by 863023+radium-v@users.noreply.github.com) +- `@fluentui/react-tabs` + - fix: update tab border color for better visibility in high contrast mode ([PR #33573](https://github.com/microsoft/fluentui/pull/33573) by dmytrokirpa@microsoft.com) +- `@fluentui/react-toast` + - feat: Add intent property to Toast state and useToast hook. Correct media className assignment in useToastTitleStyles. ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by soumya_tripathy@outlook.com) + ## [9.56.8](https://github.com/microsoft/fluentui/tree/@fluentui/react-components_v9.56.8) Thu, 19 Dec 2024 14:30:56 GMT diff --git a/packages/react-components/react-components/package.json b/packages/react-components/react-components/package.json index 224551b149af34..ba48442cdf3a95 100644 --- a/packages/react-components/react-components/package.json +++ b/packages/react-components/react-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-components", - "version": "9.56.8", + "version": "9.57.0", "description": "Suite package for converged React components", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -16,66 +16,66 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-accordion": "^9.5.12", + "@fluentui/react-accordion": "^9.5.13", "@fluentui/react-alert": "9.0.0-beta.124", - "@fluentui/react-avatar": "^9.6.47", - "@fluentui/react-badge": "^9.2.48", - "@fluentui/react-button": "^9.3.98", - "@fluentui/react-card": "^9.0.100", - "@fluentui/react-checkbox": "^9.2.44", - "@fluentui/react-combobox": "^9.13.15", - "@fluentui/react-dialog": "^9.11.26", - "@fluentui/react-divider": "^9.2.80", - "@fluentui/react-drawer": "^9.6.6", - "@fluentui/react-field": "^9.1.83", - "@fluentui/react-image": "^9.1.78", + "@fluentui/react-avatar": "^9.6.48", + "@fluentui/react-badge": "^9.2.49", + "@fluentui/react-button": "^9.3.99", + "@fluentui/react-card": "^9.0.101", + "@fluentui/react-checkbox": "^9.2.45", + "@fluentui/react-combobox": "^9.13.16", + "@fluentui/react-dialog": "^9.11.27", + "@fluentui/react-divider": "^9.2.81", + "@fluentui/react-drawer": "^9.6.7", + "@fluentui/react-field": "^9.1.84", + "@fluentui/react-image": "^9.1.79", "@fluentui/react-infobutton": "9.0.0-beta.102", - "@fluentui/react-infolabel": "^9.0.54", - "@fluentui/react-input": "^9.4.96", - "@fluentui/react-label": "^9.1.81", - "@fluentui/react-link": "^9.3.5", - "@fluentui/react-list": "9.0.0-alpha.0", - "@fluentui/react-menu": "^9.14.24", - "@fluentui/react-overflow": "^9.2.5", - "@fluentui/react-persona": "^9.2.106", - "@fluentui/react-portal": "^9.4.40", - "@fluentui/react-popover": "^9.9.29", - "@fluentui/react-positioning": "^9.16.0", - "@fluentui/react-progress": "^9.1.94", - "@fluentui/react-provider": "^9.18.2", - "@fluentui/react-radio": "^9.2.39", - "@fluentui/react-select": "^9.1.94", + "@fluentui/react-infolabel": "^9.0.55", + "@fluentui/react-input": "^9.4.97", + "@fluentui/react-label": "^9.1.82", + "@fluentui/react-link": "^9.3.6", + "@fluentui/react-list": "^9.0.0", + "@fluentui/react-menu": "^9.14.25", + "@fluentui/react-overflow": "^9.2.6", + "@fluentui/react-persona": "^9.2.107", + "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-popover": "^9.9.30", + "@fluentui/react-positioning": "^9.16.1", + "@fluentui/react-progress": "^9.1.95", + "@fluentui/react-provider": "^9.18.3", + "@fluentui/react-radio": "^9.2.40", + "@fluentui/react-select": "^9.1.95", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-skeleton": "^9.1.23", - "@fluentui/react-slider": "^9.2.3", - "@fluentui/react-spinbutton": "^9.2.95", - "@fluentui/react-spinner": "^9.5.5", - "@fluentui/react-swatch-picker": "^9.1.17", - "@fluentui/react-switch": "^9.1.101", - "@fluentui/react-table": "^9.15.26", - "@fluentui/react-tabs": "^9.6.5", + "@fluentui/react-skeleton": "^9.1.24", + "@fluentui/react-slider": "^9.2.4", + "@fluentui/react-spinbutton": "^9.2.96", + "@fluentui/react-spinner": "^9.5.6", + "@fluentui/react-swatch-picker": "^9.1.18", + "@fluentui/react-switch": "^9.1.102", + "@fluentui/react-table": "^9.15.27", + "@fluentui/react-tabs": "^9.6.6", "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-tags": "^9.3.27", - "@fluentui/react-textarea": "^9.3.95", + "@fluentui/react-tags": "^9.3.28", + "@fluentui/react-textarea": "^9.3.96", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-toast": "^9.3.63", - "@fluentui/react-toolbar": "^9.2.13", - "@fluentui/react-tooltip": "^9.5.2", + "@fluentui/react-toast": "^9.3.64", + "@fluentui/react-toolbar": "^9.2.14", + "@fluentui/react-tooltip": "^9.5.3", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-text": "^9.4.30", - "@fluentui/react-virtualizer": "9.0.0-alpha.89", - "@fluentui/react-tree": "^9.8.11", + "@fluentui/react-text": "^9.4.31", + "@fluentui/react-virtualizer": "9.0.0-alpha.90", + "@fluentui/react-tree": "^9.8.12", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", - "@fluentui/react-message-bar": "^9.2.19", - "@fluentui/react-breadcrumb": "^9.0.47", - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-rating": "^9.0.26", - "@fluentui/react-search": "^9.0.26", - "@fluentui/react-teaching-popover": "^9.1.26", - "@fluentui/react-tag-picker": "^9.3.13", - "@fluentui/react-motion": "^9.6.5", - "@fluentui/react-carousel": "^9.4.3" + "@fluentui/react-message-bar": "^9.3.0", + "@fluentui/react-breadcrumb": "^9.0.48", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-rating": "^9.0.27", + "@fluentui/react-search": "^9.0.27", + "@fluentui/react-teaching-popover": "^9.2.0", + "@fluentui/react-tag-picker": "^9.3.14", + "@fluentui/react-motion": "^9.6.6", + "@fluentui/react-carousel": "^9.4.4" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", diff --git a/packages/react-components/react-conformance-griffel/CHANGELOG.json b/packages/react-components/react-conformance-griffel/CHANGELOG.json index 5012a22f7787f5..87000c04c0a1ca 100644 --- a/packages/react-components/react-conformance-griffel/CHANGELOG.json +++ b/packages/react-components/react-conformance-griffel/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-conformance-griffel", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-conformance-griffel_v9.0.13", + "version": "9.0.13", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-conformance-griffel", + "comment": "Bump @fluentui/react-conformance to v0.19.3", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 11 Nov 2024 10:01:11 GMT", "tag": "@fluentui/react-conformance-griffel_v9.0.12", diff --git a/packages/react-components/react-conformance-griffel/CHANGELOG.md b/packages/react-components/react-conformance-griffel/CHANGELOG.md index 3486ea68be0f7d..309c3bc2280f50 100644 --- a/packages/react-components/react-conformance-griffel/CHANGELOG.md +++ b/packages/react-components/react-conformance-griffel/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-conformance-griffel -This log was last generated on Mon, 11 Nov 2024 10:01:11 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.0.13](https://github.com/microsoft/fluentui/tree/@fluentui/react-conformance-griffel_v9.0.13) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-conformance-griffel_v9.0.12..@fluentui/react-conformance-griffel_v9.0.13) + +### Patches + +- Bump @fluentui/react-conformance to v0.19.3 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.0.12](https://github.com/microsoft/fluentui/tree/@fluentui/react-conformance-griffel_v9.0.12) Mon, 11 Nov 2024 10:01:11 GMT diff --git a/packages/react-components/react-conformance-griffel/package.json b/packages/react-components/react-conformance-griffel/package.json index fdc7b4d9a4fd81..c86e6cc2a301a7 100644 --- a/packages/react-components/react-conformance-griffel/package.json +++ b/packages/react-components/react-conformance-griffel/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-conformance-griffel", - "version": "9.0.12", + "version": "9.0.13", "description": "A set of conformance tests for Griffel CSS-in-JS", "main": "lib-commonjs/index.js", "typings": "./dist/index.d.ts", @@ -18,7 +18,7 @@ "@types/react": ">=16.14.0 <19.0.0", "@types/react-dom": ">=16.9.0 <19.0.0", "typescript": "^4.3.0", - "@fluentui/react-conformance": "^0.19.2" + "@fluentui/react-conformance": "^0.19.3" }, "dependencies": { "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-datepicker-compat/library/CHANGELOG.json b/packages/react-components/react-datepicker-compat/library/CHANGELOG.json index eee18adda14d6b..9d9fff5f088e67 100644 --- a/packages/react-components/react-datepicker-compat/library/CHANGELOG.json +++ b/packages/react-components/react-datepicker-compat/library/CHANGELOG.json @@ -1,6 +1,57 @@ { "name": "@fluentui/react-datepicker-compat", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-datepicker-compat_v0.4.60", + "version": "0.4.60", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-calendar-compat to v0.1.25", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-input to v9.4.97", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-popover to v9.9.30", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-positioning to v9.16.1", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-datepicker-compat_v0.4.59", diff --git a/packages/react-components/react-datepicker-compat/library/CHANGELOG.md b/packages/react-components/react-datepicker-compat/library/CHANGELOG.md index f430f52192888c..c05f0a647e00ec 100644 --- a/packages/react-components/react-datepicker-compat/library/CHANGELOG.md +++ b/packages/react-components/react-datepicker-compat/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-datepicker-compat -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [0.4.60](https://github.com/microsoft/fluentui/tree/@fluentui/react-datepicker-compat_v0.4.60) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-datepicker-compat_v0.4.59..@fluentui/react-datepicker-compat_v0.4.60) + +### Patches + +- Bump @fluentui/react-calendar-compat to v0.1.25 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-input to v9.4.97 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-popover to v9.9.30 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-positioning to v9.16.1 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [0.4.59](https://github.com/microsoft/fluentui/tree/@fluentui/react-datepicker-compat_v0.4.59) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-datepicker-compat/library/package.json b/packages/react-components/react-datepicker-compat/library/package.json index 8a749c1b98a0f7..c389c90fbe7add 100644 --- a/packages/react-components/react-datepicker-compat/library/package.json +++ b/packages/react-components/react-datepicker-compat/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-datepicker-compat", - "version": "0.4.59", + "version": "0.4.60", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,14 +21,14 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-calendar-compat": "^0.1.24", - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-calendar-compat": "^0.1.25", + "@fluentui/react-field": "^9.1.84", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-input": "^9.4.96", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-popover": "^9.9.29", - "@fluentui/react-portal": "^9.4.40", - "@fluentui/react-positioning": "^9.16.0", + "@fluentui/react-input": "^9.4.97", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-popover": "^9.9.30", + "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-positioning": "^9.16.1", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-dialog/library/CHANGELOG.json b/packages/react-components/react-dialog/library/CHANGELOG.json index 9db09ede386696..db2f8af9726443 100644 --- a/packages/react-components/react-dialog/library/CHANGELOG.json +++ b/packages/react-components/react-dialog/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-dialog", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-dialog_v9.11.27", + "version": "9.11.27", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-motion to v9.6.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.2", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:36 GMT", "tag": "@fluentui/react-dialog_v9.11.26", diff --git a/packages/react-components/react-dialog/library/CHANGELOG.md b/packages/react-components/react-dialog/library/CHANGELOG.md index 7981ed712d1234..c81c59e32589b5 100644 --- a/packages/react-components/react-dialog/library/CHANGELOG.md +++ b/packages/react-components/react-dialog/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-dialog -This log was last generated on Wed, 18 Dec 2024 10:59:36 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.11.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-dialog_v9.11.27) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-dialog_v9.11.26..@fluentui/react-dialog_v9.11.27) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion to v9.6.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.2 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.11.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-dialog_v9.11.26) Wed, 18 Dec 2024 10:59:36 GMT diff --git a/packages/react-components/react-dialog/library/package.json b/packages/react-components/react-dialog/library/package.json index d9690afee5ece9..35ebfdfe0dbc31 100644 --- a/packages/react-components/react-dialog/library/package.json +++ b/packages/react-components/react-dialog/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-dialog", - "version": "9.11.26", + "version": "9.11.27", "description": "Dialog component for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -25,17 +25,17 @@ }, "dependencies": { "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/keyboard-keys": "^9.0.8", "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-motion": "^9.6.5", - "@fluentui/react-motion-components-preview": "^0.4.1", + "@fluentui/react-motion": "^9.6.6", + "@fluentui/react-motion-components-preview": "^0.4.2", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-portal": "^9.4.40", + "@fluentui/react-portal": "^9.4.41", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-divider/library/CHANGELOG.json b/packages/react-components/react-divider/library/CHANGELOG.json index 12861306696bc5..cfd921712513ba 100644 --- a/packages/react-components/react-divider/library/CHANGELOG.json +++ b/packages/react-components/react-divider/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-divider", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-divider_v9.2.81", + "version": "9.2.81", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-divider", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-divider_v9.2.80", diff --git a/packages/react-components/react-divider/library/CHANGELOG.md b/packages/react-components/react-divider/library/CHANGELOG.md index fb892cf385cec0..38a29a2f69e7f1 100644 --- a/packages/react-components/react-divider/library/CHANGELOG.md +++ b/packages/react-components/react-divider/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-divider -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.81](https://github.com/microsoft/fluentui/tree/@fluentui/react-divider_v9.2.81) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-divider_v9.2.80..@fluentui/react-divider_v9.2.81) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.80](https://github.com/microsoft/fluentui/tree/@fluentui/react-divider_v9.2.80) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-divider/library/package.json b/packages/react-components/react-divider/library/package.json index 33d964b56d5bc7..485f8b83c26716 100644 --- a/packages/react-components/react-divider/library/package.json +++ b/packages/react-components/react-divider/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-divider", - "version": "9.2.80", + "version": "9.2.81", "description": "Fluent UI component to visually separate content.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,7 +18,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-drawer/library/CHANGELOG.json b/packages/react-components/react-drawer/library/CHANGELOG.json index 37f190c2cbecd4..673e1556b54f6e 100644 --- a/packages/react-components/react-drawer/library/CHANGELOG.json +++ b/packages/react-components/react-drawer/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-drawer", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-drawer_v9.6.7", + "version": "9.6.7", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-dialog to v9.11.27", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-motion to v9.6.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-drawer_v9.6.6", diff --git a/packages/react-components/react-drawer/library/CHANGELOG.md b/packages/react-components/react-drawer/library/CHANGELOG.md index 209a903a7db912..6ddf6d54166b1d 100644 --- a/packages/react-components/react-drawer/library/CHANGELOG.md +++ b/packages/react-components/react-drawer/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-drawer -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.6.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-drawer_v9.6.7) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-drawer_v9.6.6..@fluentui/react-drawer_v9.6.7) + +### Patches + +- Bump @fluentui/react-dialog to v9.11.27 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion to v9.6.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.6.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-drawer_v9.6.6) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-drawer/library/package.json b/packages/react-components/react-drawer/library/package.json index d475b3e597c2dc..d94a138f8a88f9 100644 --- a/packages/react-components/react-drawer/library/package.json +++ b/packages/react-components/react-drawer/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-drawer", - "version": "9.6.6", + "version": "9.6.7", "description": "Drawer components for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,10 +20,10 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-dialog": "^9.11.26", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-motion": "^9.6.5", - "@fluentui/react-portal": "^9.4.40", + "@fluentui/react-dialog": "^9.11.27", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-motion": "^9.6.6", + "@fluentui/react-portal": "^9.4.41", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-field/library/CHANGELOG.json b/packages/react-components/react-field/library/CHANGELOG.json index 4e71e32e04687b..71f917cde5b92f 100644 --- a/packages/react-components/react-field/library/CHANGELOG.json +++ b/packages/react-components/react-field/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-field", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-field_v9.1.84", + "version": "9.1.84", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-field", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-field", + "comment": "Bump @fluentui/react-label to v9.1.82", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-field_v9.1.83", diff --git a/packages/react-components/react-field/library/CHANGELOG.md b/packages/react-components/react-field/library/CHANGELOG.md index 882fcf4b4b0d27..96c5540dc6f1da 100644 --- a/packages/react-components/react-field/library/CHANGELOG.md +++ b/packages/react-components/react-field/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-field -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.1.84](https://github.com/microsoft/fluentui/tree/@fluentui/react-field_v9.1.84) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-field_v9.1.83..@fluentui/react-field_v9.1.84) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-label to v9.1.82 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.83](https://github.com/microsoft/fluentui/tree/@fluentui/react-field_v9.1.83) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-field/library/package.json b/packages/react-components/react-field/library/package.json index 2acac90e36ceb2..e8e239bba65a46 100644 --- a/packages/react-components/react-field/library/package.json +++ b/packages/react-components/react-field/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-field", - "version": "9.1.83", + "version": "9.1.84", "description": "Fluent UI Field components", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,8 +21,8 @@ "dependencies": { "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-label": "^9.1.81", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-label": "^9.1.82", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-icons-compat/library/CHANGELOG.json b/packages/react-components/react-icons-compat/library/CHANGELOG.json index c3ed6a507a8896..6c529be129823a 100644 --- a/packages/react-components/react-icons-compat/library/CHANGELOG.json +++ b/packages/react-components/react-icons-compat/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-icons-compat", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-icons-compat_v0.1.7", + "version": "0.1.7", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-icons-compat", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-icons-compat_v0.1.6", diff --git a/packages/react-components/react-icons-compat/library/CHANGELOG.md b/packages/react-components/react-icons-compat/library/CHANGELOG.md index 8d6b6b99dee2f3..b43bc400205907 100644 --- a/packages/react-components/react-icons-compat/library/CHANGELOG.md +++ b/packages/react-components/react-icons-compat/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-icons-compat -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [0.1.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-icons-compat_v0.1.7) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-icons-compat_v0.1.6..@fluentui/react-icons-compat_v0.1.7) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [0.1.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-icons-compat_v0.1.6) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-icons-compat/library/package.json b/packages/react-components/react-icons-compat/library/package.json index 1910e01272b437..cf92fb784977c4 100644 --- a/packages/react-components/react-icons-compat/library/package.json +++ b/packages/react-components/react-icons-compat/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-icons-compat", - "version": "0.1.6", + "version": "0.1.7", "description": "Package for icon utility methods used by font and svg icons.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -24,7 +24,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-image/library/CHANGELOG.json b/packages/react-components/react-image/library/CHANGELOG.json index 7bfd0f97a836a0..53cc360c714a0b 100644 --- a/packages/react-components/react-image/library/CHANGELOG.json +++ b/packages/react-components/react-image/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-image", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-image_v9.1.79", + "version": "9.1.79", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-image", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-image_v9.1.78", diff --git a/packages/react-components/react-image/library/CHANGELOG.md b/packages/react-components/react-image/library/CHANGELOG.md index 57dc9836716671..dc84fa08a79a35 100644 --- a/packages/react-components/react-image/library/CHANGELOG.md +++ b/packages/react-components/react-image/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-image -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.1.79](https://github.com/microsoft/fluentui/tree/@fluentui/react-image_v9.1.79) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-image_v9.1.78..@fluentui/react-image_v9.1.79) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.78](https://github.com/microsoft/fluentui/tree/@fluentui/react-image_v9.1.78) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-image/library/package.json b/packages/react-components/react-image/library/package.json index 97a6cb4820a228..aed4249848420b 100644 --- a/packages/react-components/react-image/library/package.json +++ b/packages/react-components/react-image/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-image", - "version": "9.1.78", + "version": "9.1.79", "description": "Fluent UI React Image component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,7 +20,7 @@ "dependencies": { "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-theme": "^9.1.24", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" diff --git a/packages/react-components/react-infolabel/library/CHANGELOG.json b/packages/react-components/react-infolabel/library/CHANGELOG.json index 60a99447d46d24..412ff5f8625b2f 100644 --- a/packages/react-components/react-infolabel/library/CHANGELOG.json +++ b/packages/react-components/react-infolabel/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-infolabel", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-infolabel_v9.0.55", + "version": "9.0.55", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-infolabel", + "comment": "Bump @fluentui/react-label to v9.1.82", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-infolabel", + "comment": "Bump @fluentui/react-popover to v9.9.30", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-infolabel", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-infolabel_v9.0.54", diff --git a/packages/react-components/react-infolabel/library/CHANGELOG.md b/packages/react-components/react-infolabel/library/CHANGELOG.md index 29f67f2804eeaf..fbbafa546ef0f0 100644 --- a/packages/react-components/react-infolabel/library/CHANGELOG.md +++ b/packages/react-components/react-infolabel/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-infolabel -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.0.55](https://github.com/microsoft/fluentui/tree/@fluentui/react-infolabel_v9.0.55) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-infolabel_v9.0.54..@fluentui/react-infolabel_v9.0.55) + +### Patches + +- Bump @fluentui/react-label to v9.1.82 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-popover to v9.9.30 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.0.54](https://github.com/microsoft/fluentui/tree/@fluentui/react-infolabel_v9.0.54) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-infolabel/library/package.json b/packages/react-components/react-infolabel/library/package.json index 8401759d0ec358..ca362048345b94 100644 --- a/packages/react-components/react-infolabel/library/package.json +++ b/packages/react-components/react-infolabel/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-infolabel", - "version": "9.0.54", + "version": "9.0.55", "description": "InfoLabel component for Fluent UI v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,10 +21,10 @@ }, "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-label": "^9.1.81", - "@fluentui/react-popover": "^9.9.29", + "@fluentui/react-label": "^9.1.82", + "@fluentui/react-popover": "^9.9.30", "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-input/library/CHANGELOG.json b/packages/react-components/react-input/library/CHANGELOG.json index 2a9577a10c0936..ba43058f1db9cb 100644 --- a/packages/react-components/react-input/library/CHANGELOG.json +++ b/packages/react-components/react-input/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-input", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-input_v9.4.97", + "version": "9.4.97", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-input", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-input", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-input_v9.4.96", diff --git a/packages/react-components/react-input/library/CHANGELOG.md b/packages/react-components/react-input/library/CHANGELOG.md index e06621c2218993..6bbbc3d63c5273 100644 --- a/packages/react-components/react-input/library/CHANGELOG.md +++ b/packages/react-components/react-input/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-input -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.4.97](https://github.com/microsoft/fluentui/tree/@fluentui/react-input_v9.4.97) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-input_v9.4.96..@fluentui/react-input_v9.4.97) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.4.96](https://github.com/microsoft/fluentui/tree/@fluentui/react-input_v9.4.96) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-input/library/package.json b/packages/react-components/react-input/library/package.json index f0c0faf7dc15c3..d412181b1a0799 100644 --- a/packages/react-components/react-input/library/package.json +++ b/packages/react-components/react-input/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-input", - "version": "9.4.96", + "version": "9.4.97", "description": "Fluent UI React Input component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,8 +19,8 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-field": "^9.1.84", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-jsx-runtime/package.json b/packages/react-components/react-jsx-runtime/package.json index 6d0c69efb5761c..dd92ba6fb9fe72 100644 --- a/packages/react-components/react-jsx-runtime/package.json +++ b/packages/react-components/react-jsx-runtime/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-jsx-runtime", - "version": "9.0.48", + "version": "9.0.49", "description": "Custom JSX runtime for @fluentui/react-components", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-components/react-label/library/CHANGELOG.json b/packages/react-components/react-label/library/CHANGELOG.json index 2d1380b2a4bc5e..4efc646a403d9e 100644 --- a/packages/react-components/react-label/library/CHANGELOG.json +++ b/packages/react-components/react-label/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-label", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-label_v9.1.82", + "version": "9.1.82", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-label", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-label_v9.1.81", diff --git a/packages/react-components/react-label/library/CHANGELOG.md b/packages/react-components/react-label/library/CHANGELOG.md index 2a142b0a4398be..b79ad510eff75e 100644 --- a/packages/react-components/react-label/library/CHANGELOG.md +++ b/packages/react-components/react-label/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-label -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.1.82](https://github.com/microsoft/fluentui/tree/@fluentui/react-label_v9.1.82) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-label_v9.1.81..@fluentui/react-label_v9.1.82) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.81](https://github.com/microsoft/fluentui/tree/@fluentui/react-label_v9.1.81) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-label/library/package.json b/packages/react-components/react-label/library/package.json index 960cae5ef3cd59..73b906301626c4 100644 --- a/packages/react-components/react-label/library/package.json +++ b/packages/react-components/react-label/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-label", - "version": "9.1.81", + "version": "9.1.82", "description": "Fluent UI React Label component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,7 +21,7 @@ "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-link/library/CHANGELOG.json b/packages/react-components/react-link/library/CHANGELOG.json index c95e9a8dd55ec3..8061cf7c2ee68f 100644 --- a/packages/react-components/react-link/library/CHANGELOG.json +++ b/packages/react-components/react-link/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-link", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-link_v9.3.6", + "version": "9.3.6", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-link", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-link_v9.3.5", diff --git a/packages/react-components/react-link/library/CHANGELOG.md b/packages/react-components/react-link/library/CHANGELOG.md index 9b5645d43cf746..fcfc2d45b52b1e 100644 --- a/packages/react-components/react-link/library/CHANGELOG.md +++ b/packages/react-components/react-link/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-link -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.3.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-link_v9.3.6) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-link_v9.3.5..@fluentui/react-link_v9.3.6) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.3.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-link_v9.3.5) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-link/library/package.json b/packages/react-components/react-link/library/package.json index a9e4a2f0e2dc5f..91c545008a75ae 100644 --- a/packages/react-components/react-link/library/package.json +++ b/packages/react-components/react-link/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-link", - "version": "9.3.5", + "version": "9.3.6", "description": "Fluent UI React Link component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,7 +20,7 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-list/library/CHANGELOG.json b/packages/react-components/react-list/library/CHANGELOG.json index 7ab989757171a6..13cf7d94e5ff49 100644 --- a/packages/react-components/react-list/library/CHANGELOG.json +++ b/packages/react-components/react-list/library/CHANGELOG.json @@ -1,6 +1,33 @@ { - "name": "@fluentui/react-list-preview", + "name": "@fluentui/react-list", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:34 GMT", + "tag": "@fluentui/react-list_v9.0.0", + "version": "9.0.0", + "comments": { + "minor": [ + { + "author": "jirivyhnalek@microsoft.com", + "package": "@fluentui/react-list", + "commit": "aa6e5ddc04518065cd0a25bcdd5c91d2c1615bbd", + "comment": "feat: release stable" + }, + { + "author": "beachball", + "package": "@fluentui/react-list", + "comment": "Bump @fluentui/react-checkbox to v9.2.45", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-list", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-list-preview_v0.4.4", diff --git a/packages/react-components/react-list/library/CHANGELOG.md b/packages/react-components/react-list/library/CHANGELOG.md index c851cc897195a3..746ef1c75daf81 100644 --- a/packages/react-components/react-list/library/CHANGELOG.md +++ b/packages/react-components/react-list/library/CHANGELOG.md @@ -1,9 +1,20 @@ -# Change Log - @fluentui/react-list-preview +# Change Log - @fluentui/react-list -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:34 GMT and should not be manually modified. <!-- Start content --> +## [9.0.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-list_v9.0.0) + +Wed, 08 Jan 2025 18:33:34 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-list-preview_v0.4.4..@fluentui/react-list_v9.0.0) + +### Minor changes + +- feat: release stable ([PR #33378](https://github.com/microsoft/fluentui/pull/33378) by jirivyhnalek@microsoft.com) +- Bump @fluentui/react-checkbox to v9.2.45 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [0.4.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-list-preview_v0.4.4) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-list/library/package.json b/packages/react-components/react-list/library/package.json index 0bb815194667d4..06086197b8399f 100644 --- a/packages/react-components/react-list/library/package.json +++ b/packages/react-components/react-list/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-list", - "version": "9.0.0-alpha.0", + "version": "9.0.0", "description": "React List v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -26,9 +26,9 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-checkbox": "^9.2.44", + "@fluentui/react-checkbox": "^9.2.45", "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/keyboard-keys": "^9.0.8", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-menu/library/CHANGELOG.json b/packages/react-components/react-menu/library/CHANGELOG.json index 1fdd22876e8b59..ed7f7f386ba708 100644 --- a/packages/react-components/react-menu/library/CHANGELOG.json +++ b/packages/react-components/react-menu/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-menu", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-menu_v9.14.25", + "version": "9.14.25", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-positioning to v9.16.1", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:36 GMT", "tag": "@fluentui/react-menu_v9.14.24", diff --git a/packages/react-components/react-menu/library/CHANGELOG.md b/packages/react-components/react-menu/library/CHANGELOG.md index 21ffdb0f06672c..75a603f314dc95 100644 --- a/packages/react-components/react-menu/library/CHANGELOG.md +++ b/packages/react-components/react-menu/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-menu -This log was last generated on Wed, 18 Dec 2024 10:59:36 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.14.25](https://github.com/microsoft/fluentui/tree/@fluentui/react-menu_v9.14.25) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-menu_v9.14.24..@fluentui/react-menu_v9.14.25) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-positioning to v9.16.1 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.14.24](https://github.com/microsoft/fluentui/tree/@fluentui/react-menu_v9.14.24) Wed, 18 Dec 2024 10:59:36 GMT diff --git a/packages/react-components/react-menu/library/package.json b/packages/react-components/react-menu/library/package.json index dd6fdf9899d947..ff33f37bbafc2d 100644 --- a/packages/react-components/react-menu/library/package.json +++ b/packages/react-components/react-menu/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-menu", - "version": "9.14.24", + "version": "9.14.25", "description": "Fluent UI menu component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,16 +21,16 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-portal": "^9.4.40", - "@fluentui/react-positioning": "^9.16.0", + "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-positioning": "^9.16.1", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-message-bar/library/CHANGELOG.json b/packages/react-components/react-message-bar/library/CHANGELOG.json index 76cb7b3b7d04aa..b0c4cd2750ca7b 100644 --- a/packages/react-components/react-message-bar/library/CHANGELOG.json +++ b/packages/react-components/react-message-bar/library/CHANGELOG.json @@ -1,6 +1,51 @@ { "name": "@fluentui/react-message-bar", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:34 GMT", + "tag": "@fluentui/react-message-bar_v9.3.0", + "version": "9.3.0", + "comments": { + "minor": [ + { + "author": "robertpenner@microsoft.com", + "package": "@fluentui/react-message-bar", + "commit": "9c716b2519ad2d135fb5d16a60ef6ee183a16e31", + "comment": "refactor(MessageBar): migrate slide & fade to motion components" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-button to v9.3.99", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-motion to v9.6.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.2", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-link to v9.3.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Thu, 19 Dec 2024 14:30:56 GMT", "tag": "@fluentui/react-message-bar_v9.2.19", diff --git a/packages/react-components/react-message-bar/library/CHANGELOG.md b/packages/react-components/react-message-bar/library/CHANGELOG.md index 47343bfcb13b62..8ae29562aba1e7 100644 --- a/packages/react-components/react-message-bar/library/CHANGELOG.md +++ b/packages/react-components/react-message-bar/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-message-bar -This log was last generated on Thu, 19 Dec 2024 14:30:56 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:34 GMT and should not be manually modified. <!-- Start content --> +## [9.3.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-message-bar_v9.3.0) + +Wed, 08 Jan 2025 18:33:34 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-message-bar_v9.2.19..@fluentui/react-message-bar_v9.3.0) + +### Minor changes + +- refactor(MessageBar): migrate slide & fade to motion components ([PR #33465](https://github.com/microsoft/fluentui/pull/33465) by robertpenner@microsoft.com) +- Bump @fluentui/react-button to v9.3.99 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion to v9.6.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.2 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-link to v9.3.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.19](https://github.com/microsoft/fluentui/tree/@fluentui/react-message-bar_v9.2.19) Thu, 19 Dec 2024 14:30:56 GMT diff --git a/packages/react-components/react-message-bar/library/package.json b/packages/react-components/react-message-bar/library/package.json index 4fd78689ddb5a2..e0524bef605bf4 100644 --- a/packages/react-components/react-message-bar/library/package.json +++ b/packages/react-components/react-message-bar/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-message-bar", - "version": "9.2.19", + "version": "9.3.0", "description": "Fluent UI MessageBar component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,13 +18,13 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-button": "^9.3.98", + "@fluentui/react-button": "^9.3.99", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-motion": "^9.6.5", - "@fluentui/react-motion-components-preview": "^0.4.1", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-motion": "^9.6.6", + "@fluentui/react-motion-components-preview": "^0.4.2", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-link": "^9.3.5", + "@fluentui/react-link": "^9.3.6", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-migration-v0-v9/library/CHANGELOG.json b/packages/react-components/react-migration-v0-v9/library/CHANGELOG.json index 192dbf6cdb2303..4419d284333423 100644 --- a/packages/react-components/react-migration-v0-v9/library/CHANGELOG.json +++ b/packages/react-components/react-migration-v0-v9/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-migration-v0-v9", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-migration-v0-v9_v9.2.26", + "version": "9.2.26", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-components to v9.57.0", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Thu, 19 Dec 2024 14:30:56 GMT", "tag": "@fluentui/react-migration-v0-v9_v9.2.25", diff --git a/packages/react-components/react-migration-v0-v9/library/CHANGELOG.md b/packages/react-components/react-migration-v0-v9/library/CHANGELOG.md index 45990059abacff..981da181f3b33e 100644 --- a/packages/react-components/react-migration-v0-v9/library/CHANGELOG.md +++ b/packages/react-components/react-migration-v0-v9/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-migration-v0-v9 -This log was last generated on Thu, 19 Dec 2024 14:30:56 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-migration-v0-v9_v9.2.26) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-migration-v0-v9_v9.2.25..@fluentui/react-migration-v0-v9_v9.2.26) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-components to v9.57.0 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.25](https://github.com/microsoft/fluentui/tree/@fluentui/react-migration-v0-v9_v9.2.25) Thu, 19 Dec 2024 14:30:56 GMT diff --git a/packages/react-components/react-migration-v0-v9/library/package.json b/packages/react-components/react-migration-v0-v9/library/package.json index 1a9f2e4164c5a9..e858ab14609575 100644 --- a/packages/react-components/react-migration-v0-v9/library/package.json +++ b/packages/react-components/react-migration-v0-v9/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-migration-v0-v9", - "version": "9.2.25", + "version": "9.2.26", "description": "Migration shim components and methods for hybrid v0/v9 applications building on Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,11 +20,11 @@ "@fluentui/scripts-storybook": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-components": "^9.56.8", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-components": "^9.57.0", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-migration-v8-v9/library/CHANGELOG.json b/packages/react-components/react-migration-v8-v9/library/CHANGELOG.json index 9e0442e9187172..fcdd600308112f 100644 --- a/packages/react-components/react-migration-v8-v9/library/CHANGELOG.json +++ b/packages/react-components/react-migration-v8-v9/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-migration-v8-v9", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-migration-v8-v9_v9.6.45", + "version": "9.6.45", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-migration-v8-v9", + "comment": "Bump @fluentui/react-components to v9.57.0", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Thu, 19 Dec 2024 14:30:56 GMT", "tag": "@fluentui/react-migration-v8-v9_v9.6.44", diff --git a/packages/react-components/react-migration-v8-v9/library/CHANGELOG.md b/packages/react-components/react-migration-v8-v9/library/CHANGELOG.md index d3764f2a61d43c..0accaa8a4bde60 100644 --- a/packages/react-components/react-migration-v8-v9/library/CHANGELOG.md +++ b/packages/react-components/react-migration-v8-v9/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-migration-v8-v9 -This log was last generated on Thu, 19 Dec 2024 14:30:56 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.6.45](https://github.com/microsoft/fluentui/tree/@fluentui/react-migration-v8-v9_v9.6.45) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-migration-v8-v9_v9.6.44..@fluentui/react-migration-v8-v9_v9.6.45) + +### Patches + +- Bump @fluentui/react-components to v9.57.0 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.6.44](https://github.com/microsoft/fluentui/tree/@fluentui/react-migration-v8-v9_v9.6.44) Thu, 19 Dec 2024 14:30:56 GMT diff --git a/packages/react-components/react-migration-v8-v9/library/package.json b/packages/react-components/react-migration-v8-v9/library/package.json index 4fc09ed6074b93..cddd7a5f762af6 100644 --- a/packages/react-components/react-migration-v8-v9/library/package.json +++ b/packages/react-components/react-migration-v8-v9/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-migration-v8-v9", - "version": "9.6.44", + "version": "9.6.45", "description": "Migration shim components and methods for hybrid v8/v9 applications building on Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,7 +21,7 @@ "@ctrl/tinycolor": "3.3.4", "@fluentui/fluent2-theme": "^8.107.122", "@fluentui/react": "^8.122.5", - "@fluentui/react-components": "^9.56.8", + "@fluentui/react-components": "^9.57.0", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-hooks": "^8.8.16", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-motion-components-preview/library/package.json b/packages/react-components/react-motion-components-preview/library/package.json index 1728d67fb379f9..aad5bb8e23a1c0 100644 --- a/packages/react-components/react-motion-components-preview/library/package.json +++ b/packages/react-components/react-motion-components-preview/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-motion-components-preview", - "version": "0.4.1", + "version": "0.4.2", "description": "A preview package for Fluent UI motion components, providing a collection of components", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-components/react-motion/library/CHANGELOG.json b/packages/react-components/react-motion/library/CHANGELOG.json index 24bb99cd1b605f..05292b2f68c12e 100644 --- a/packages/react-components/react-motion/library/CHANGELOG.json +++ b/packages/react-components/react-motion/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-motion", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:34 GMT", + "tag": "@fluentui/react-motion_v9.6.6", + "version": "9.6.6", + "comments": { + "patch": [ + { + "author": "seanmonahan@microsoft.com", + "package": "@fluentui/react-motion", + "commit": "7f1647fadcd193c0d16e51b314d299ee19ae5746", + "comment": "fix: handle case when Animation.persist() does not exist" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-motion_v9.6.5", diff --git a/packages/react-components/react-motion/library/CHANGELOG.md b/packages/react-components/react-motion/library/CHANGELOG.md index 0889c60147dc63..298064f61dda1d 100644 --- a/packages/react-components/react-motion/library/CHANGELOG.md +++ b/packages/react-components/react-motion/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-motion -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:34 GMT and should not be manually modified. <!-- Start content --> +## [9.6.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-motion_v9.6.6) + +Wed, 08 Jan 2025 18:33:34 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-motion_v9.6.5..@fluentui/react-motion_v9.6.6) + +### Patches + +- fix: handle case when Animation.persist() does not exist ([PR #33282](https://github.com/microsoft/fluentui/pull/33282) by seanmonahan@microsoft.com) + ## [9.6.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-motion_v9.6.5) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-motion/library/package.json b/packages/react-components/react-motion/library/package.json index 1c64fa8617afb7..2b96ece2a6d9b6 100644 --- a/packages/react-components/react-motion/library/package.json +++ b/packages/react-components/react-motion/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-motion", - "version": "9.6.5", + "version": "9.6.6", "description": "A package with utilities & motion definitions using Web Animations API", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-components/react-nav-preview/library/CHANGELOG.json b/packages/react-components/react-nav-preview/library/CHANGELOG.json index f979f9ca6a8609..f9ffcea5af28db 100644 --- a/packages/react-components/react-nav-preview/library/CHANGELOG.json +++ b/packages/react-components/react-nav-preview/library/CHANGELOG.json @@ -1,6 +1,51 @@ { "name": "@fluentui/react-nav-preview", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-nav-preview_v0.10.7", + "version": "0.10.7", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-button to v9.3.99", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-tooltip to v9.5.3", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-divider to v9.2.81", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-drawer to v9.6.7", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-nav-preview_v0.10.6", diff --git a/packages/react-components/react-nav-preview/library/CHANGELOG.md b/packages/react-components/react-nav-preview/library/CHANGELOG.md index f55721b6c8d25b..dc55f6c71f26f3 100644 --- a/packages/react-components/react-nav-preview/library/CHANGELOG.md +++ b/packages/react-components/react-nav-preview/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-nav-preview -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [0.10.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-nav-preview_v0.10.7) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-nav-preview_v0.10.6..@fluentui/react-nav-preview_v0.10.7) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-button to v9.3.99 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-tooltip to v9.5.3 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-divider to v9.2.81 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-drawer to v9.6.7 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [0.10.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-nav-preview_v0.10.6) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-nav-preview/library/package.json b/packages/react-components/react-nav-preview/library/package.json index 2a005fbfe34060..00060495d63485 100644 --- a/packages/react-components/react-nav-preview/library/package.json +++ b/packages/react-components/react-nav-preview/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-nav-preview", - "version": "0.10.6", + "version": "0.10.7", "description": "New fluentui react package", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,14 +18,14 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-button": "^9.3.98", - "@fluentui/react-tooltip": "^9.5.2", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-button": "^9.3.99", + "@fluentui/react-tooltip": "^9.5.3", "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-divider": "^9.2.80", - "@fluentui/react-drawer": "^9.6.6", + "@fluentui/react-divider": "^9.2.81", + "@fluentui/react-drawer": "^9.6.7", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-overflow/library/package.json b/packages/react-components/react-overflow/library/package.json index 070258ecb9f299..f043a99aaff0e8 100644 --- a/packages/react-components/react-overflow/library/package.json +++ b/packages/react-components/react-overflow/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-overflow", - "version": "9.2.5", + "version": "9.2.6", "description": "React bindings for @fluentui/priority-overflow", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-components/react-persona/library/CHANGELOG.json b/packages/react-components/react-persona/library/CHANGELOG.json index ed6f87cb9ac87a..309665ce51dffd 100644 --- a/packages/react-components/react-persona/library/CHANGELOG.json +++ b/packages/react-components/react-persona/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-persona", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-persona_v9.2.107", + "version": "9.2.107", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-persona", + "comment": "Bump @fluentui/react-avatar to v9.6.48", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-persona", + "comment": "Bump @fluentui/react-badge to v9.2.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-persona", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-persona_v9.2.106", diff --git a/packages/react-components/react-persona/library/CHANGELOG.md b/packages/react-components/react-persona/library/CHANGELOG.md index 4edfffc9ef1572..ed990a25a7a6c1 100644 --- a/packages/react-components/react-persona/library/CHANGELOG.md +++ b/packages/react-components/react-persona/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-persona -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.107](https://github.com/microsoft/fluentui/tree/@fluentui/react-persona_v9.2.107) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-persona_v9.2.106..@fluentui/react-persona_v9.2.107) + +### Patches + +- Bump @fluentui/react-avatar to v9.6.48 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-badge to v9.2.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.106](https://github.com/microsoft/fluentui/tree/@fluentui/react-persona_v9.2.106) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-persona/library/package.json b/packages/react-components/react-persona/library/package.json index 3d393e34cacd26..9b28d4120f31a4 100644 --- a/packages/react-components/react-persona/library/package.json +++ b/packages/react-components/react-persona/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-persona", - "version": "9.2.106", + "version": "9.2.107", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,12 +18,12 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-avatar": "^9.6.47", - "@fluentui/react-badge": "^9.2.48", + "@fluentui/react-avatar": "^9.6.48", + "@fluentui/react-badge": "^9.2.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-popover/library/CHANGELOG.json b/packages/react-components/react-popover/library/CHANGELOG.json index c94ce03602c922..5ce44b032d9446 100644 --- a/packages/react-components/react-popover/library/CHANGELOG.json +++ b/packages/react-components/react-popover/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-popover", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-popover_v9.9.30", + "version": "9.9.30", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-positioning to v9.16.1", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-popover_v9.9.29", diff --git a/packages/react-components/react-popover/library/CHANGELOG.md b/packages/react-components/react-popover/library/CHANGELOG.md index a50fe337667ae0..f89e0f32d6635f 100644 --- a/packages/react-components/react-popover/library/CHANGELOG.md +++ b/packages/react-components/react-popover/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-popover -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.9.30](https://github.com/microsoft/fluentui/tree/@fluentui/react-popover_v9.9.30) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-popover_v9.9.29..@fluentui/react-popover_v9.9.30) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-positioning to v9.16.1 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.9.29](https://github.com/microsoft/fluentui/tree/@fluentui/react-popover_v9.9.29) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-popover/library/package.json b/packages/react-components/react-popover/library/package.json index b799df80949d37..56a67c2063dc3d 100644 --- a/packages/react-components/react-popover/library/package.json +++ b/packages/react-components/react-popover/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-popover", - "version": "9.9.29", + "version": "9.9.30", "description": "Popover component for Fluent UI", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -22,15 +22,15 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-portal": "^9.4.40", - "@fluentui/react-positioning": "^9.16.0", + "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-positioning": "^9.16.1", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-portal-compat/CHANGELOG.json b/packages/react-components/react-portal-compat/CHANGELOG.json index 2a97f72c72d312..90ce8c3c195e61 100644 --- a/packages/react-components/react-portal-compat/CHANGELOG.json +++ b/packages/react-components/react-portal-compat/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-portal-compat", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-portal-compat_v9.0.177", + "version": "9.0.177", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-portal-compat", + "comment": "Bump @fluentui/react-components to v9.57.0", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Thu, 19 Dec 2024 14:30:56 GMT", "tag": "@fluentui/react-portal-compat_v9.0.176", diff --git a/packages/react-components/react-portal-compat/CHANGELOG.md b/packages/react-components/react-portal-compat/CHANGELOG.md index 24aec79e8fa1bf..bd2c4bacc8df30 100644 --- a/packages/react-components/react-portal-compat/CHANGELOG.md +++ b/packages/react-components/react-portal-compat/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-portal-compat -This log was last generated on Thu, 19 Dec 2024 14:30:56 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.0.177](https://github.com/microsoft/fluentui/tree/@fluentui/react-portal-compat_v9.0.177) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-portal-compat_v9.0.176..@fluentui/react-portal-compat_v9.0.177) + +### Patches + +- Bump @fluentui/react-components to v9.57.0 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.0.176](https://github.com/microsoft/fluentui/tree/@fluentui/react-portal-compat_v9.0.176) Thu, 19 Dec 2024 14:30:56 GMT diff --git a/packages/react-components/react-portal-compat/package.json b/packages/react-components/react-portal-compat/package.json index 907063c27bb591..ba113e75699290 100644 --- a/packages/react-components/react-portal-compat/package.json +++ b/packages/react-components/react-portal-compat/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-portal-compat", - "version": "9.0.176", + "version": "9.0.177", "description": "A package that contains compatibility layer for React Portals", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@swc/helpers": "^0.5.1" }, "peerDependencies": { - "@fluentui/react-components": "^9.56.8", + "@fluentui/react-components": "^9.57.0", "@types/react": ">=16.14.0 <19.0.0", "react": ">=16.14.0 <19.0.0" }, diff --git a/packages/react-components/react-portal/library/package.json b/packages/react-components/react-portal/library/package.json index e08c24eaffb1bc..3055707457ae4a 100644 --- a/packages/react-components/react-portal/library/package.json +++ b/packages/react-components/react-portal/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-portal", - "version": "9.4.40", + "version": "9.4.41", "description": "A utility component that creates portals compatible with Fluent UI", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-components/react-positioning/CHANGELOG.json b/packages/react-components/react-positioning/CHANGELOG.json index e87dc53c98d909..e22728dd3ce15f 100644 --- a/packages/react-components/react-positioning/CHANGELOG.json +++ b/packages/react-components/react-positioning/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-positioning", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:34 GMT", + "tag": "@fluentui/react-positioning_v9.16.1", + "version": "9.16.1", + "comments": { + "patch": [ + { + "author": "863023+radium-v@users.noreply.github.com", + "package": "@fluentui/react-positioning", + "commit": "8bd0e68bc5a78f8b9b3ea10210ad876151849d7a", + "comment": "chore: bump @floating-ui/dom" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-positioning_v9.16.0", diff --git a/packages/react-components/react-positioning/CHANGELOG.md b/packages/react-components/react-positioning/CHANGELOG.md index 3c502e8e232ef1..b1be7944e080cb 100644 --- a/packages/react-components/react-positioning/CHANGELOG.md +++ b/packages/react-components/react-positioning/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-positioning -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:34 GMT and should not be manually modified. <!-- Start content --> +## [9.16.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-positioning_v9.16.1) + +Wed, 08 Jan 2025 18:33:34 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-positioning_v9.16.0..@fluentui/react-positioning_v9.16.1) + +### Patches + +- chore: bump @floating-ui/dom ([PR #33458](https://github.com/microsoft/fluentui/pull/33458) by 863023+radium-v@users.noreply.github.com) + ## [9.16.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-positioning_v9.16.0) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-positioning/package.json b/packages/react-components/react-positioning/package.json index 2c34e23a8c5483..87b6218997dcdf 100644 --- a/packages/react-components/react-positioning/package.json +++ b/packages/react-components/react-positioning/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-positioning", - "version": "9.16.0", + "version": "9.16.1", "description": "A react wrapper around Popper.js for Fluent UI", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-components/react-progress/library/CHANGELOG.json b/packages/react-components/react-progress/library/CHANGELOG.json index 2331d8fd3ed57e..4d4a0bbc6d3583 100644 --- a/packages/react-components/react-progress/library/CHANGELOG.json +++ b/packages/react-components/react-progress/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-progress", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-progress_v9.1.95", + "version": "9.1.95", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-progress", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-progress", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-progress_v9.1.94", diff --git a/packages/react-components/react-progress/library/CHANGELOG.md b/packages/react-components/react-progress/library/CHANGELOG.md index c659b7965cd53e..ef369438ccf483 100644 --- a/packages/react-components/react-progress/library/CHANGELOG.md +++ b/packages/react-components/react-progress/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-progress -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.1.95](https://github.com/microsoft/fluentui/tree/@fluentui/react-progress_v9.1.95) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-progress_v9.1.94..@fluentui/react-progress_v9.1.95) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.94](https://github.com/microsoft/fluentui/tree/@fluentui/react-progress_v9.1.94) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-progress/library/package.json b/packages/react-components/react-progress/library/package.json index 3a636c008886e7..8b1fb03db94805 100644 --- a/packages/react-components/react-progress/library/package.json +++ b/packages/react-components/react-progress/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-progress", - "version": "9.1.94", + "version": "9.1.95", "description": "Progress component for FluentUI v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,8 +18,8 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-field": "^9.1.84", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-provider/library/CHANGELOG.json b/packages/react-components/react-provider/library/CHANGELOG.json index e6fd2fad4ec7b2..05211ef22f12dc 100644 --- a/packages/react-components/react-provider/library/CHANGELOG.json +++ b/packages/react-components/react-provider/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-provider", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-provider_v9.18.3", + "version": "9.18.3", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-provider", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-provider_v9.18.2", diff --git a/packages/react-components/react-provider/library/CHANGELOG.md b/packages/react-components/react-provider/library/CHANGELOG.md index 7cfddde12588a5..999afeec8067a1 100644 --- a/packages/react-components/react-provider/library/CHANGELOG.md +++ b/packages/react-components/react-provider/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-provider -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.18.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-provider_v9.18.3) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-provider_v9.18.2..@fluentui/react-provider_v9.18.3) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.18.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-provider_v9.18.2) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-provider/library/package.json b/packages/react-components/react-provider/library/package.json index a3e9631e170547..79600a7aa21537 100644 --- a/packages/react-components/react-provider/library/package.json +++ b/packages/react-components/react-provider/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-provider", - "version": "9.18.2", + "version": "9.18.3", "description": "Fluent UI React provider component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -23,7 +23,7 @@ "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/core": "^1.16.0", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" diff --git a/packages/react-components/react-radio/library/CHANGELOG.json b/packages/react-components/react-radio/library/CHANGELOG.json index e5b96985ef0773..57d6d9e181e407 100644 --- a/packages/react-components/react-radio/library/CHANGELOG.json +++ b/packages/react-components/react-radio/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-radio", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-radio_v9.2.40", + "version": "9.2.40", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-radio", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-radio", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-radio", + "comment": "Bump @fluentui/react-label to v9.1.82", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:45 GMT", "tag": "@fluentui/react-radio_v9.2.39", diff --git a/packages/react-components/react-radio/library/CHANGELOG.md b/packages/react-components/react-radio/library/CHANGELOG.md index e9837cc96dc5da..a922d4370c8a52 100644 --- a/packages/react-components/react-radio/library/CHANGELOG.md +++ b/packages/react-components/react-radio/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-radio -This log was last generated on Mon, 16 Dec 2024 16:26:45 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.40](https://github.com/microsoft/fluentui/tree/@fluentui/react-radio_v9.2.40) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-radio_v9.2.39..@fluentui/react-radio_v9.2.40) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-label to v9.1.82 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.39](https://github.com/microsoft/fluentui/tree/@fluentui/react-radio_v9.2.39) Mon, 16 Dec 2024 16:26:45 GMT diff --git a/packages/react-components/react-radio/library/package.json b/packages/react-components/react-radio/library/package.json index be2e7bd795d8f6..0c7a944e3a0dca 100644 --- a/packages/react-components/react-radio/library/package.json +++ b/packages/react-components/react-radio/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-radio", - "version": "9.2.39", + "version": "9.2.40", "description": "Fluent UI Radio component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,9 +18,9 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-label": "^9.1.81", + "@fluentui/react-field": "^9.1.84", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-label": "^9.1.82", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-rating/library/CHANGELOG.json b/packages/react-components/react-rating/library/CHANGELOG.json index df938bde41798b..753e044c2b8474 100644 --- a/packages/react-components/react-rating/library/CHANGELOG.json +++ b/packages/react-components/react-rating/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-rating", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-rating_v9.0.27", + "version": "9.0.27", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-rating", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-rating_v9.0.26", diff --git a/packages/react-components/react-rating/library/CHANGELOG.md b/packages/react-components/react-rating/library/CHANGELOG.md index 40f23176c40902..522b9b150e0900 100644 --- a/packages/react-components/react-rating/library/CHANGELOG.md +++ b/packages/react-components/react-rating/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-rating -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.0.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-rating_v9.0.27) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-rating_v9.0.26..@fluentui/react-rating_v9.0.27) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.0.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-rating_v9.0.26) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-rating/library/package.json b/packages/react-components/react-rating/library/package.json index 475a9d86c01c11..9813715e14f83c 100644 --- a/packages/react-components/react-rating/library/package.json +++ b/packages/react-components/react-rating/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-rating", - "version": "9.0.26", + "version": "9.0.27", "description": "Rating component for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,7 +18,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-tabster": "^9.23.2", diff --git a/packages/react-components/react-search/library/CHANGELOG.json b/packages/react-components/react-search/library/CHANGELOG.json index 5a4ce3c60cfba2..efa469de9a9e3d 100644 --- a/packages/react-components/react-search/library/CHANGELOG.json +++ b/packages/react-components/react-search/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-search", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-search_v9.0.27", + "version": "9.0.27", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-search", + "comment": "Bump @fluentui/react-input to v9.4.97", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-search", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-search_v9.0.26", diff --git a/packages/react-components/react-search/library/CHANGELOG.md b/packages/react-components/react-search/library/CHANGELOG.md index 14ad3329e17fd3..f8f5ef72e11ac7 100644 --- a/packages/react-components/react-search/library/CHANGELOG.md +++ b/packages/react-components/react-search/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-search -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.0.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-search_v9.0.27) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-search_v9.0.26..@fluentui/react-search_v9.0.27) + +### Patches + +- Bump @fluentui/react-input to v9.4.97 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.0.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-search_v9.0.26) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-search/library/package.json b/packages/react-components/react-search/library/package.json index eb2a1f1abfac37..7ca2a9087c1ff9 100644 --- a/packages/react-components/react-search/library/package.json +++ b/packages/react-components/react-search/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-search", - "version": "9.0.26", + "version": "9.0.27", "description": "Search input for Fluent UI v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,8 +19,8 @@ }, "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-input": "^9.4.96", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-input": "^9.4.97", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-select/library/CHANGELOG.json b/packages/react-components/react-select/library/CHANGELOG.json index 938167b408407d..1d631967311040 100644 --- a/packages/react-components/react-select/library/CHANGELOG.json +++ b/packages/react-components/react-select/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-select", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-select_v9.1.95", + "version": "9.1.95", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-select", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-select", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-select_v9.1.94", diff --git a/packages/react-components/react-select/library/CHANGELOG.md b/packages/react-components/react-select/library/CHANGELOG.md index e748652046f588..27c2d8590820de 100644 --- a/packages/react-components/react-select/library/CHANGELOG.md +++ b/packages/react-components/react-select/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-select -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.1.95](https://github.com/microsoft/fluentui/tree/@fluentui/react-select_v9.1.95) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-select_v9.1.94..@fluentui/react-select_v9.1.95) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.94](https://github.com/microsoft/fluentui/tree/@fluentui/react-select_v9.1.94) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-select/library/package.json b/packages/react-components/react-select/library/package.json index a227ac934979ea..b1b41ae03e5701 100644 --- a/packages/react-components/react-select/library/package.json +++ b/packages/react-components/react-select/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-select", - "version": "9.1.94", + "version": "9.1.95", "description": "Fluent UI React Select component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,9 +18,9 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-field": "^9.1.84", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-skeleton/library/CHANGELOG.json b/packages/react-components/react-skeleton/library/CHANGELOG.json index c137fd85ef87e6..900979ee683885 100644 --- a/packages/react-components/react-skeleton/library/CHANGELOG.json +++ b/packages/react-components/react-skeleton/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-skeleton", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-skeleton_v9.1.24", + "version": "9.1.24", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-skeleton", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-skeleton", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-skeleton_v9.1.23", diff --git a/packages/react-components/react-skeleton/library/CHANGELOG.md b/packages/react-components/react-skeleton/library/CHANGELOG.md index ad25c767ca042a..af93dc948549d1 100644 --- a/packages/react-components/react-skeleton/library/CHANGELOG.md +++ b/packages/react-components/react-skeleton/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-skeleton -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.1.24](https://github.com/microsoft/fluentui/tree/@fluentui/react-skeleton_v9.1.24) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-skeleton_v9.1.23..@fluentui/react-skeleton_v9.1.24) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.23](https://github.com/microsoft/fluentui/tree/@fluentui/react-skeleton_v9.1.23) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-skeleton/library/package.json b/packages/react-components/react-skeleton/library/package.json index af6f284cc3a87d..1c7f8beb5b1aad 100644 --- a/packages/react-components/react-skeleton/library/package.json +++ b/packages/react-components/react-skeleton/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-skeleton", - "version": "9.1.23", + "version": "9.1.24", "description": "Converged v9 Skeleton Component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,8 +18,8 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-field": "^9.1.84", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-slider/library/CHANGELOG.json b/packages/react-components/react-slider/library/CHANGELOG.json index e8d8d49e0466c6..897b1640bab726 100644 --- a/packages/react-components/react-slider/library/CHANGELOG.json +++ b/packages/react-components/react-slider/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-slider", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-slider_v9.2.4", + "version": "9.2.4", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-slider", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-slider", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-slider_v9.2.3", diff --git a/packages/react-components/react-slider/library/CHANGELOG.md b/packages/react-components/react-slider/library/CHANGELOG.md index 029e3bf7d2f38c..8ed1e09a45b67a 100644 --- a/packages/react-components/react-slider/library/CHANGELOG.md +++ b/packages/react-components/react-slider/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-slider -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-slider_v9.2.4) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-slider_v9.2.3..@fluentui/react-slider_v9.2.4) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-slider_v9.2.3) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-slider/library/package.json b/packages/react-components/react-slider/library/package.json index bc97aec7e96d3b..bc6355ab336e04 100644 --- a/packages/react-components/react-slider/library/package.json +++ b/packages/react-components/react-slider/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-slider", - "version": "9.2.3", + "version": "9.2.4", "description": "Fluent UI React Slider component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,8 +19,8 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-field": "^9.1.84", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-spinbutton/library/CHANGELOG.json b/packages/react-components/react-spinbutton/library/CHANGELOG.json index 23e855fb9010fa..8018e6b7edd7e7 100644 --- a/packages/react-components/react-spinbutton/library/CHANGELOG.json +++ b/packages/react-components/react-spinbutton/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-spinbutton", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-spinbutton_v9.2.96", + "version": "9.2.96", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-spinbutton", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-spinbutton", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-spinbutton_v9.2.95", diff --git a/packages/react-components/react-spinbutton/library/CHANGELOG.md b/packages/react-components/react-spinbutton/library/CHANGELOG.md index 11eb1bc311d4cb..05f57ff9e7d707 100644 --- a/packages/react-components/react-spinbutton/library/CHANGELOG.md +++ b/packages/react-components/react-spinbutton/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-spinbutton -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.96](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinbutton_v9.2.96) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-spinbutton_v9.2.95..@fluentui/react-spinbutton_v9.2.96) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.95](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinbutton_v9.2.95) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-spinbutton/library/package.json b/packages/react-components/react-spinbutton/library/package.json index 93b1a2bd3aac76..b5cf8472b53796 100644 --- a/packages/react-components/react-spinbutton/library/package.json +++ b/packages/react-components/react-spinbutton/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-spinbutton", - "version": "9.2.95", + "version": "9.2.96", "description": "Fluent UI React SpinButton component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,9 +20,9 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-field": "^9.1.84", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-spinner/library/CHANGELOG.json b/packages/react-components/react-spinner/library/CHANGELOG.json index 017e026c38b7f6..1a41b356e3b9be 100644 --- a/packages/react-components/react-spinner/library/CHANGELOG.json +++ b/packages/react-components/react-spinner/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-spinner", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-spinner_v9.5.6", + "version": "9.5.6", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-spinner", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-spinner", + "comment": "Bump @fluentui/react-label to v9.1.82", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-spinner_v9.5.5", diff --git a/packages/react-components/react-spinner/library/CHANGELOG.md b/packages/react-components/react-spinner/library/CHANGELOG.md index af04d213ea57cd..7074cc9fd1c101 100644 --- a/packages/react-components/react-spinner/library/CHANGELOG.md +++ b/packages/react-components/react-spinner/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-spinner -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.5.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinner_v9.5.6) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-spinner_v9.5.5..@fluentui/react-spinner_v9.5.6) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-label to v9.1.82 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.5.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinner_v9.5.5) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-spinner/library/package.json b/packages/react-components/react-spinner/library/package.json index 9b17b7d96842fa..75407220d5e09c 100644 --- a/packages/react-components/react-spinner/library/package.json +++ b/packages/react-components/react-spinner/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-spinner", - "version": "9.5.5", + "version": "9.5.6", "description": "Spinner component for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,8 +18,8 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-label": "^9.1.81", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-label": "^9.1.82", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-storybook-addon/package.json b/packages/react-components/react-storybook-addon/package.json index c59fd67adbc08b..85f0abd762c951 100644 --- a/packages/react-components/react-storybook-addon/package.json +++ b/packages/react-components/react-storybook-addon/package.json @@ -17,8 +17,8 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-provider": "^9.18.2", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-provider": "^9.18.3", "@fluentui/react-theme": "^9.1.24", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-swatch-picker/library/CHANGELOG.json b/packages/react-components/react-swatch-picker/library/CHANGELOG.json index 0776c2dd9eef38..5cd3633c8601ca 100644 --- a/packages/react-components/react-swatch-picker/library/CHANGELOG.json +++ b/packages/react-components/react-swatch-picker/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-swatch-picker", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-swatch-picker_v9.1.18", + "version": "9.1.18", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-swatch-picker", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-swatch-picker", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-swatch-picker_v9.1.17", diff --git a/packages/react-components/react-swatch-picker/library/CHANGELOG.md b/packages/react-components/react-swatch-picker/library/CHANGELOG.md index bb073c3c88ca95..c26125e374a697 100644 --- a/packages/react-components/react-swatch-picker/library/CHANGELOG.md +++ b/packages/react-components/react-swatch-picker/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-swatch-picker -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.1.18](https://github.com/microsoft/fluentui/tree/@fluentui/react-swatch-picker_v9.1.18) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-swatch-picker_v9.1.17..@fluentui/react-swatch-picker_v9.1.18) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.17](https://github.com/microsoft/fluentui/tree/@fluentui/react-swatch-picker_v9.1.17) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-swatch-picker/library/package.json b/packages/react-components/react-swatch-picker/library/package.json index 81bcd3bd8605a2..c2bc2a4cb65ff9 100644 --- a/packages/react-components/react-swatch-picker/library/package.json +++ b/packages/react-components/react-swatch-picker/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-swatch-picker", - "version": "9.1.17", + "version": "9.1.18", "description": "New fluentui react package", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,9 +21,9 @@ }, "dependencies": { "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-field": "^9.1.84", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-switch/library/CHANGELOG.json b/packages/react-components/react-switch/library/CHANGELOG.json index de58e85b9a63ae..a04f296cc6c8f4 100644 --- a/packages/react-components/react-switch/library/CHANGELOG.json +++ b/packages/react-components/react-switch/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-switch", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-switch_v9.1.102", + "version": "9.1.102", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-switch", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-switch", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-switch", + "comment": "Bump @fluentui/react-label to v9.1.82", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-switch_v9.1.101", diff --git a/packages/react-components/react-switch/library/CHANGELOG.md b/packages/react-components/react-switch/library/CHANGELOG.md index 311cc3f498aecc..03080221d07978 100644 --- a/packages/react-components/react-switch/library/CHANGELOG.md +++ b/packages/react-components/react-switch/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-switch -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.1.102](https://github.com/microsoft/fluentui/tree/@fluentui/react-switch_v9.1.102) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-switch_v9.1.101..@fluentui/react-switch_v9.1.102) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-label to v9.1.82 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.101](https://github.com/microsoft/fluentui/tree/@fluentui/react-switch_v9.1.101) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-switch/library/package.json b/packages/react-components/react-switch/library/package.json index f36956d1e9a2d2..2b11b352e15869 100644 --- a/packages/react-components/react-switch/library/package.json +++ b/packages/react-components/react-switch/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-switch", - "version": "9.1.101", + "version": "9.1.102", "description": "Fluent UI React Switch component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,10 +18,10 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-field": "^9.1.84", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-label": "^9.1.81", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-label": "^9.1.82", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-table/library/CHANGELOG.json b/packages/react-components/react-table/library/CHANGELOG.json index a886e5816aee6f..8fe333c75e9d26 100644 --- a/packages/react-components/react-table/library/CHANGELOG.json +++ b/packages/react-components/react-table/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-table", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-table_v9.15.27", + "version": "9.15.27", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-avatar to v9.6.48", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-checkbox to v9.2.45", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-radio to v9.2.40", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-table_v9.15.26", diff --git a/packages/react-components/react-table/library/CHANGELOG.md b/packages/react-components/react-table/library/CHANGELOG.md index 12e5af8af60b18..b9f25c208af8f2 100644 --- a/packages/react-components/react-table/library/CHANGELOG.md +++ b/packages/react-components/react-table/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-table -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.15.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-table_v9.15.27) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-table_v9.15.26..@fluentui/react-table_v9.15.27) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-avatar to v9.6.48 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-checkbox to v9.2.45 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-radio to v9.2.40 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.15.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-table_v9.15.26) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-table/library/package.json b/packages/react-components/react-table/library/package.json index 64b5817d9c20c5..c689784c43e4d0 100644 --- a/packages/react-components/react-table/library/package.json +++ b/packages/react-components/react-table/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-table", - "version": "9.15.26", + "version": "9.15.27", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,17 +21,17 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-avatar": "^9.6.47", - "@fluentui/react-checkbox": "^9.2.44", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-avatar": "^9.6.48", + "@fluentui/react-checkbox": "^9.2.45", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-radio": "^9.2.39", + "@fluentui/react-radio": "^9.2.40", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-tabs/library/CHANGELOG.json b/packages/react-components/react-tabs/library/CHANGELOG.json index 200250dc31f644..92a23bf4ad3592 100644 --- a/packages/react-components/react-tabs/library/CHANGELOG.json +++ b/packages/react-components/react-tabs/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-tabs", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:35 GMT", + "tag": "@fluentui/react-tabs_v9.6.6", + "version": "9.6.6", + "comments": { + "patch": [ + { + "author": "dmytrokirpa@microsoft.com", + "package": "@fluentui/react-tabs", + "commit": "bd3e4c27b89c17e279e99342f305eb9c71714a09", + "comment": "fix: update tab border color for better visibility in high contrast mode" + }, + { + "author": "beachball", + "package": "@fluentui/react-tabs", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:45 GMT", "tag": "@fluentui/react-tabs_v9.6.5", diff --git a/packages/react-components/react-tabs/library/CHANGELOG.md b/packages/react-components/react-tabs/library/CHANGELOG.md index 0007817dd87583..aea9dcd16bdf24 100644 --- a/packages/react-components/react-tabs/library/CHANGELOG.md +++ b/packages/react-components/react-tabs/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-tabs -This log was last generated on Mon, 16 Dec 2024 16:26:45 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:35 GMT and should not be manually modified. <!-- Start content --> +## [9.6.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabs_v9.6.6) + +Wed, 08 Jan 2025 18:33:35 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tabs_v9.6.5..@fluentui/react-tabs_v9.6.6) + +### Patches + +- fix: update tab border color for better visibility in high contrast mode ([PR #33573](https://github.com/microsoft/fluentui/pull/33573) by dmytrokirpa@microsoft.com) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.6.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabs_v9.6.5) Mon, 16 Dec 2024 16:26:45 GMT diff --git a/packages/react-components/react-tabs/library/package.json b/packages/react-components/react-tabs/library/package.json index f725a304f761bf..a8fe90af743ee2 100644 --- a/packages/react-components/react-tabs/library/package.json +++ b/packages/react-components/react-tabs/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tabs", - "version": "9.6.5", + "version": "9.6.6", "description": "Fluent UI React tabs components", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,7 +19,7 @@ }, "dependencies": { "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-tag-picker/library/CHANGELOG.json b/packages/react-components/react-tag-picker/library/CHANGELOG.json index dcdb7e04548c97..59c378ad76f988 100644 --- a/packages/react-components/react-tag-picker/library/CHANGELOG.json +++ b/packages/react-components/react-tag-picker/library/CHANGELOG.json @@ -1,6 +1,57 @@ { "name": "@fluentui/react-tag-picker", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-tag-picker_v9.3.14", + "version": "9.3.14", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-combobox to v9.13.16", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-tags to v9.3.28", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-positioning to v9.16.1", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-tag-picker_v9.3.13", diff --git a/packages/react-components/react-tag-picker/library/CHANGELOG.md b/packages/react-components/react-tag-picker/library/CHANGELOG.md index 470b1ed2359132..47a429155cacba 100644 --- a/packages/react-components/react-tag-picker/library/CHANGELOG.md +++ b/packages/react-components/react-tag-picker/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-tag-picker -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.3.14](https://github.com/microsoft/fluentui/tree/@fluentui/react-tag-picker_v9.3.14) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tag-picker_v9.3.13..@fluentui/react-tag-picker_v9.3.14) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-combobox to v9.13.16 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-tags to v9.3.28 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-positioning to v9.16.1 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.3.13](https://github.com/microsoft/fluentui/tree/@fluentui/react-tag-picker_v9.3.13) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-tag-picker/library/package.json b/packages/react-components/react-tag-picker/library/package.json index 7b986adf517ad8..20c3a7e79e3b55 100644 --- a/packages/react-components/react-tag-picker/library/package.json +++ b/packages/react-components/react-tag-picker/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tag-picker", - "version": "9.3.13", + "version": "9.3.14", "description": "FluentUI TagPicker component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -28,20 +28,20 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-portal": "^9.4.40", + "@fluentui/react-portal": "^9.4.41", "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-combobox": "^9.13.15", - "@fluentui/react-tags": "^9.3.27", + "@fluentui/react-combobox": "^9.13.16", + "@fluentui/react-tags": "^9.3.28", "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-positioning": "^9.16.0", + "@fluentui/react-positioning": "^9.16.1", "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-field": "^9.1.84", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-tags/library/CHANGELOG.json b/packages/react-components/react-tags/library/CHANGELOG.json index f56534ae1e173f..3184e3dc41e7c9 100644 --- a/packages/react-components/react-tags/library/CHANGELOG.json +++ b/packages/react-components/react-tags/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-tags", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-tags_v9.3.28", + "version": "9.3.28", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-tags", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tags", + "comment": "Bump @fluentui/react-avatar to v9.6.48", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tags", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-tags_v9.3.27", diff --git a/packages/react-components/react-tags/library/CHANGELOG.md b/packages/react-components/react-tags/library/CHANGELOG.md index 1e5eca39fc03ac..e5767dadce9caf 100644 --- a/packages/react-components/react-tags/library/CHANGELOG.md +++ b/packages/react-components/react-tags/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-tags -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.3.28](https://github.com/microsoft/fluentui/tree/@fluentui/react-tags_v9.3.28) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tags_v9.3.27..@fluentui/react-tags_v9.3.28) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-avatar to v9.6.48 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.3.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-tags_v9.3.27) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-tags/library/package.json b/packages/react-components/react-tags/library/package.json index 260179433ba036..54045929a198da 100644 --- a/packages/react-components/react-tags/library/package.json +++ b/packages/react-components/react-tags/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tags", - "version": "9.3.27", + "version": "9.3.28", "description": "Fluent UI Tag component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,10 +21,10 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-avatar": "^9.6.47", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-avatar": "^9.6.48", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-teaching-popover/library/CHANGELOG.json b/packages/react-components/react-teaching-popover/library/CHANGELOG.json index 4a3e38967b0e8f..bf57242cc48bd5 100644 --- a/packages/react-components/react-teaching-popover/library/CHANGELOG.json +++ b/packages/react-components/react-teaching-popover/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-teaching-popover", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:35 GMT", + "tag": "@fluentui/react-teaching-popover_v9.2.0", + "version": "9.2.0", + "comments": { + "minor": [ + { + "author": "sarah.higley@microsoft.com", + "package": "@fluentui/react-teaching-popover", + "commit": "0bfe0c7fdf8981d7ccf8c4c15e927d8202fbdd12", + "comment": "fix: accName updates and semantic fixes" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-popover to v9.9.30", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-button to v9.3.99", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-teaching-popover_v9.1.26", diff --git a/packages/react-components/react-teaching-popover/library/CHANGELOG.md b/packages/react-components/react-teaching-popover/library/CHANGELOG.md index c29d691b79d335..dfd3e92c3e9a66 100644 --- a/packages/react-components/react-teaching-popover/library/CHANGELOG.md +++ b/packages/react-components/react-teaching-popover/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-teaching-popover -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:35 GMT and should not be manually modified. <!-- Start content --> +## [9.2.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-teaching-popover_v9.2.0) + +Wed, 08 Jan 2025 18:33:35 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-teaching-popover_v9.1.26..@fluentui/react-teaching-popover_v9.2.0) + +### Minor changes + +- fix: accName updates and semantic fixes ([PR #33194](https://github.com/microsoft/fluentui/pull/33194) by sarah.higley@microsoft.com) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-popover to v9.9.30 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-button to v9.3.99 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.1.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-teaching-popover_v9.1.26) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-teaching-popover/library/package.json b/packages/react-components/react-teaching-popover/library/package.json index 24cda56556d13e..71051338731bf5 100644 --- a/packages/react-components/react-teaching-popover/library/package.json +++ b/packages/react-components/react-teaching-popover/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-teaching-popover", - "version": "9.1.26", + "version": "9.2.0", "description": "New fluentui react package", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -24,17 +24,17 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-popover": "^9.9.29", - "@fluentui/react-button": "^9.3.98", + "@fluentui/react-popover": "^9.9.30", + "@fluentui/react-button": "^9.3.99", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/react-context-selector": "^9.1.71", "use-sync-external-store": "^1.2.0" }, diff --git a/packages/react-components/react-text/library/CHANGELOG.json b/packages/react-components/react-text/library/CHANGELOG.json index c9e98e07e508bc..000c38549c4fe4 100644 --- a/packages/react-components/react-text/library/CHANGELOG.json +++ b/packages/react-components/react-text/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-text", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-text_v9.4.31", + "version": "9.4.31", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-text", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-text_v9.4.30", diff --git a/packages/react-components/react-text/library/CHANGELOG.md b/packages/react-components/react-text/library/CHANGELOG.md index 69cd6b493caa2a..141a7d41f48f09 100644 --- a/packages/react-components/react-text/library/CHANGELOG.md +++ b/packages/react-components/react-text/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-text -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.4.31](https://github.com/microsoft/fluentui/tree/@fluentui/react-text_v9.4.31) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-text_v9.4.30..@fluentui/react-text_v9.4.31) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.4.30](https://github.com/microsoft/fluentui/tree/@fluentui/react-text_v9.4.30) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-text/library/package.json b/packages/react-components/react-text/library/package.json index ef50ba68f13a70..915cb6d2e42d65 100644 --- a/packages/react-components/react-text/library/package.json +++ b/packages/react-components/react-text/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-text", - "version": "9.4.30", + "version": "9.4.31", "description": "Text is a typography and styling abstraction component that can be used to ensure the consistency of all text across your application.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,7 +21,7 @@ "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-textarea/library/CHANGELOG.json b/packages/react-components/react-textarea/library/CHANGELOG.json index 59d2c4aacfd0b2..10476a2cd14da6 100644 --- a/packages/react-components/react-textarea/library/CHANGELOG.json +++ b/packages/react-components/react-textarea/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-textarea", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-textarea_v9.3.96", + "version": "9.3.96", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-textarea", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-textarea", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-textarea_v9.3.95", diff --git a/packages/react-components/react-textarea/library/CHANGELOG.md b/packages/react-components/react-textarea/library/CHANGELOG.md index 32a6809825d9e6..40d3ce4eb73a94 100644 --- a/packages/react-components/react-textarea/library/CHANGELOG.md +++ b/packages/react-components/react-textarea/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-textarea -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.3.96](https://github.com/microsoft/fluentui/tree/@fluentui/react-textarea_v9.3.96) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-textarea_v9.3.95..@fluentui/react-textarea_v9.3.96) + +### Patches + +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.3.95](https://github.com/microsoft/fluentui/tree/@fluentui/react-textarea_v9.3.95) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-textarea/library/package.json b/packages/react-components/react-textarea/library/package.json index 1b805b4ee2747d..ab0f6978f6093b 100644 --- a/packages/react-components/react-textarea/library/package.json +++ b/packages/react-components/react-textarea/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-textarea", - "version": "9.3.95", + "version": "9.3.96", "description": "Fluent UI TextArea component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,11 +18,11 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.83", + "@fluentui/react-field": "^9.1.84", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-timepicker-compat/library/CHANGELOG.json b/packages/react-components/react-timepicker-compat/library/CHANGELOG.json index d91f937b5c4360..e8f43b5ac291f3 100644 --- a/packages/react-components/react-timepicker-compat/library/CHANGELOG.json +++ b/packages/react-components/react-timepicker-compat/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-timepicker-compat", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-timepicker-compat_v0.2.46", + "version": "0.2.46", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-timepicker-compat", + "comment": "Bump @fluentui/react-combobox to v9.13.16", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-timepicker-compat", + "comment": "Bump @fluentui/react-field to v9.1.84", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-timepicker-compat", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-timepicker-compat_v0.2.43", diff --git a/packages/react-components/react-timepicker-compat/library/CHANGELOG.md b/packages/react-components/react-timepicker-compat/library/CHANGELOG.md index 108a7686647029..99fddd77436dca 100644 --- a/packages/react-components/react-timepicker-compat/library/CHANGELOG.md +++ b/packages/react-components/react-timepicker-compat/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-timepicker-compat -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [0.2.46](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.46) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.43..@fluentui/react-timepicker-compat_v0.2.46) + +### Patches + +- Bump @fluentui/react-combobox to v9.13.16 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-field to v9.1.84 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [0.2.43](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.43) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-timepicker-compat/library/package.json b/packages/react-components/react-timepicker-compat/library/package.json index 0eca335dda8f2e..7c7f9cf217a4e6 100644 --- a/packages/react-components/react-timepicker-compat/library/package.json +++ b/packages/react-components/react-timepicker-compat/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-timepicker-compat", - "version": "0.2.45", + "version": "0.2.46", "description": "Fluent UI TimePicker Compat Component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -28,9 +28,9 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-combobox": "^9.13.15", - "@fluentui/react-field": "^9.1.83", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-combobox": "^9.13.16", + "@fluentui/react-field": "^9.1.84", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-toast/library/CHANGELOG.json b/packages/react-components/react-toast/library/CHANGELOG.json index 3248dc1d1bac5d..7d756df4532bcf 100644 --- a/packages/react-components/react-toast/library/CHANGELOG.json +++ b/packages/react-components/react-toast/library/CHANGELOG.json @@ -1,6 +1,51 @@ { "name": "@fluentui/react-toast", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:35 GMT", + "tag": "@fluentui/react-toast_v9.3.64", + "version": "9.3.64", + "comments": { + "patch": [ + { + "author": "soumya_tripathy@outlook.com", + "package": "@fluentui/react-toast", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb", + "comment": "feat: Add intent property to Toast state and useToast hook. Correct media className assignment in useToastTitleStyles." + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-motion to v9.6.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.2", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-toast_v9.3.63", diff --git a/packages/react-components/react-toast/library/CHANGELOG.md b/packages/react-components/react-toast/library/CHANGELOG.md index cbcc7c29c8b979..fd8c6b52b431d8 100644 --- a/packages/react-components/react-toast/library/CHANGELOG.md +++ b/packages/react-components/react-toast/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-toast -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:35 GMT and should not be manually modified. <!-- Start content --> +## [9.3.64](https://github.com/microsoft/fluentui/tree/@fluentui/react-toast_v9.3.64) + +Wed, 08 Jan 2025 18:33:35 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-toast_v9.3.63..@fluentui/react-toast_v9.3.64) + +### Patches + +- feat: Add intent property to Toast state and useToast hook. Correct media className assignment in useToastTitleStyles. ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by soumya_tripathy@outlook.com) +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion to v9.6.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.2 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.3.63](https://github.com/microsoft/fluentui/tree/@fluentui/react-toast_v9.3.63) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-toast/library/package.json b/packages/react-components/react-toast/library/package.json index c259c41a4866df..f293206e1e0164 100644 --- a/packages/react-components/react-toast/library/package.json +++ b/packages/react-components/react-toast/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-toast", - "version": "9.3.63", + "version": "9.3.64", "description": "Toast component for Fluent UI", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,12 +21,12 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.12", + "@fluentui/react-aria": "^9.13.13", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-motion": "^9.6.5", - "@fluentui/react-motion-components-preview": "^0.4.1", - "@fluentui/react-portal": "^9.4.40", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-motion": "^9.6.6", + "@fluentui/react-motion-components-preview": "^0.4.2", + "@fluentui/react-portal": "^9.4.41", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-toolbar/library/CHANGELOG.json b/packages/react-components/react-toolbar/library/CHANGELOG.json index 24591b1b04dd9b..7687952f67677f 100644 --- a/packages/react-components/react-toolbar/library/CHANGELOG.json +++ b/packages/react-components/react-toolbar/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-toolbar", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-toolbar_v9.2.14", + "version": "9.2.14", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-button to v9.3.99", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-divider to v9.2.81", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-radio to v9.2.40", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-toolbar_v9.2.13", diff --git a/packages/react-components/react-toolbar/library/CHANGELOG.md b/packages/react-components/react-toolbar/library/CHANGELOG.md index ce804c026b75d5..f8de414f13cd9f 100644 --- a/packages/react-components/react-toolbar/library/CHANGELOG.md +++ b/packages/react-components/react-toolbar/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-toolbar -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.2.14](https://github.com/microsoft/fluentui/tree/@fluentui/react-toolbar_v9.2.14) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-toolbar_v9.2.13..@fluentui/react-toolbar_v9.2.14) + +### Patches + +- Bump @fluentui/react-button to v9.3.99 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-divider to v9.2.81 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-radio to v9.2.40 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.2.13](https://github.com/microsoft/fluentui/tree/@fluentui/react-toolbar_v9.2.13) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-toolbar/library/package.json b/packages/react-components/react-toolbar/library/package.json index afaf5041bbc076..d27a6121e3a1be 100644 --- a/packages/react-components/react-toolbar/library/package.json +++ b/packages/react-components/react-toolbar/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-toolbar", - "version": "9.2.13", + "version": "9.2.14", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,13 +20,13 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-button": "^9.3.98", - "@fluentui/react-divider": "^9.2.80", + "@fluentui/react-button": "^9.3.99", + "@fluentui/react-divider": "^9.2.81", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-radio": "^9.2.39", + "@fluentui/react-radio": "^9.2.40", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-tooltip/library/CHANGELOG.json b/packages/react-components/react-tooltip/library/CHANGELOG.json index 098a78d2bcc7cd..6a00ff1c9fcc92 100644 --- a/packages/react-components/react-tooltip/library/CHANGELOG.json +++ b/packages/react-components/react-tooltip/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-tooltip", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-tooltip_v9.5.3", + "version": "9.5.3", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-tooltip", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tooltip", + "comment": "Bump @fluentui/react-portal to v9.4.41", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tooltip", + "comment": "Bump @fluentui/react-positioning to v9.16.1", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-tooltip_v9.5.2", diff --git a/packages/react-components/react-tooltip/library/CHANGELOG.md b/packages/react-components/react-tooltip/library/CHANGELOG.md index 513571721b4d3b..ec6e48cf3f019a 100644 --- a/packages/react-components/react-tooltip/library/CHANGELOG.md +++ b/packages/react-components/react-tooltip/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-tooltip -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.5.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-tooltip_v9.5.3) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tooltip_v9.5.2..@fluentui/react-tooltip_v9.5.3) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-portal to v9.4.41 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-positioning to v9.16.1 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.5.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-tooltip_v9.5.2) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-tooltip/library/package.json b/packages/react-components/react-tooltip/library/package.json index 0c8e69581d8ef1..83f0b10c1d815f 100644 --- a/packages/react-components/react-tooltip/library/package.json +++ b/packages/react-components/react-tooltip/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tooltip", - "version": "9.5.2", + "version": "9.5.3", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,9 +19,9 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.0.48", - "@fluentui/react-portal": "^9.4.40", - "@fluentui/react-positioning": "^9.16.0", + "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-positioning": "^9.16.1", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", diff --git a/packages/react-components/react-tree/library/CHANGELOG.json b/packages/react-components/react-tree/library/CHANGELOG.json index 41f3078e613cc9..cfab14d7ff9094 100644 --- a/packages/react-components/react-tree/library/CHANGELOG.json +++ b/packages/react-components/react-tree/library/CHANGELOG.json @@ -1,6 +1,63 @@ { "name": "@fluentui/react-tree", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-tree_v9.8.12", + "version": "9.8.12", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-aria to v9.13.13", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-avatar to v9.6.48", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-button to v9.3.99", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-checkbox to v9.2.45", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.2", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-motion to v9.6.6", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-radio to v9.2.40", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Wed, 18 Dec 2024 10:59:37 GMT", "tag": "@fluentui/react-tree_v9.8.11", diff --git a/packages/react-components/react-tree/library/CHANGELOG.md b/packages/react-components/react-tree/library/CHANGELOG.md index 68b0eece97c5e5..722c479af322d0 100644 --- a/packages/react-components/react-tree/library/CHANGELOG.md +++ b/packages/react-components/react-tree/library/CHANGELOG.md @@ -1,9 +1,25 @@ # Change Log - @fluentui/react-tree -This log was last generated on Wed, 18 Dec 2024 10:59:37 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.8.12](https://github.com/microsoft/fluentui/tree/@fluentui/react-tree_v9.8.12) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tree_v9.8.11..@fluentui/react-tree_v9.8.12) + +### Patches + +- Bump @fluentui/react-aria to v9.13.13 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-avatar to v9.6.48 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-button to v9.3.99 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-checkbox to v9.2.45 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.2 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-motion to v9.6.6 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-radio to v9.2.40 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.8.11](https://github.com/microsoft/fluentui/tree/@fluentui/react-tree_v9.8.11) Wed, 18 Dec 2024 10:59:37 GMT diff --git a/packages/react-components/react-tree/library/package.json b/packages/react-components/react-tree/library/package.json index 96e8d3f78bdbbb..a9ac047a35ecdf 100644 --- a/packages/react-components/react-tree/library/package.json +++ b/packages/react-components/react-tree/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tree", - "version": "9.8.11", + "version": "9.8.12", "description": "Tree component for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,20 +21,20 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.12", - "@fluentui/react-avatar": "^9.6.47", - "@fluentui/react-button": "^9.3.98", - "@fluentui/react-checkbox": "^9.2.44", + "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-avatar": "^9.6.48", + "@fluentui/react-button": "^9.3.99", + "@fluentui/react-checkbox": "^9.2.45", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-motion-components-preview": "^0.4.1", - "@fluentui/react-motion": "^9.6.5", - "@fluentui/react-radio": "^9.2.39", + "@fluentui/react-motion-components-preview": "^0.4.2", + "@fluentui/react-motion": "^9.6.6", + "@fluentui/react-radio": "^9.2.40", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-tabster": "^9.23.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-utilities-compat/library/package.json b/packages/react-components/react-utilities-compat/library/package.json index ecaca7c70a69ac..3fa4d8ea8a47f5 100644 --- a/packages/react-components/react-utilities-compat/library/package.json +++ b/packages/react-components/react-utilities-compat/library/package.json @@ -25,7 +25,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", "@fluentui/react-utilities": "^9.18.19", diff --git a/packages/react-components/react-virtualizer/library/CHANGELOG.json b/packages/react-components/react-virtualizer/library/CHANGELOG.json index 866966d33fd529..b3b4da467af753 100644 --- a/packages/react-components/react-virtualizer/library/CHANGELOG.json +++ b/packages/react-components/react-virtualizer/library/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-virtualizer", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:36 GMT", + "tag": "@fluentui/react-virtualizer_v9.0.0-alpha.90", + "version": "9.0.0-alpha.90", + "comments": { + "prerelease": [ + { + "author": "beachball", + "package": "@fluentui/react-virtualizer", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.49", + "commit": "52572e1cdd452d32c67195bdc42f1114f58242bb" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:46 GMT", "tag": "@fluentui/react-virtualizer_v9.0.0-alpha.89", diff --git a/packages/react-components/react-virtualizer/library/CHANGELOG.md b/packages/react-components/react-virtualizer/library/CHANGELOG.md index 5acf3a7e7229e9..5fc5628f4f265e 100644 --- a/packages/react-components/react-virtualizer/library/CHANGELOG.md +++ b/packages/react-components/react-virtualizer/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-virtualizer -This log was last generated on Mon, 16 Dec 2024 16:26:46 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. <!-- Start content --> +## [9.0.0-alpha.90](https://github.com/microsoft/fluentui/tree/@fluentui/react-virtualizer_v9.0.0-alpha.90) + +Wed, 08 Jan 2025 18:33:36 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-virtualizer_v9.0.0-alpha.89..@fluentui/react-virtualizer_v9.0.0-alpha.90) + +### Changes + +- Bump @fluentui/react-jsx-runtime to v9.0.49 ([PR #33550](https://github.com/microsoft/fluentui/pull/33550) by beachball) + ## [9.0.0-alpha.89](https://github.com/microsoft/fluentui/tree/@fluentui/react-virtualizer_v9.0.0-alpha.89) Mon, 16 Dec 2024 16:26:46 GMT diff --git a/packages/react-components/react-virtualizer/library/package.json b/packages/react-components/react-virtualizer/library/package.json index 9dc68d3ce9e418..c991049a75c83b 100644 --- a/packages/react-components/react-virtualizer/library/package.json +++ b/packages/react-components/react-virtualizer/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-virtualizer", - "version": "9.0.0-alpha.89", + "version": "9.0.0-alpha.90", "description": "Generic and composable virtualizer framework built on browser intersection observer", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,7 +18,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.48", + "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-utilities": "^9.18.19", "@fluentui/react-shared-contexts": "^9.21.2", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/recipes/package.json b/packages/react-components/recipes/package.json index e17fe8cad21099..84a5bc9b94a2da 100644 --- a/packages/react-components/recipes/package.json +++ b/packages/react-components/recipes/package.json @@ -27,9 +27,9 @@ "@fluentui/react-storybook-addon-export-to-sandbox": "*" }, "dependencies": { - "@fluentui/react-provider": "^9.18.2", + "@fluentui/react-provider": "^9.18.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-text": "^9.4.30", + "@fluentui/react-text": "^9.4.31", "@fluentui/react-utilities": "^9.18.19", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", diff --git a/packages/react-components/theme-designer/package.json b/packages/react-components/theme-designer/package.json index 74899a1d5bcf98..4031580527472e 100644 --- a/packages/react-components/theme-designer/package.json +++ b/packages/react-components/theme-designer/package.json @@ -17,7 +17,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-components": "^9.56.8", + "@fluentui/react-components": "^9.57.0", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-storybook-addon-export-to-sandbox": "^0.1.0", diff --git a/packages/react-conformance/CHANGELOG.json b/packages/react-conformance/CHANGELOG.json index 963ea3f628894e..482e753f9b5323 100644 --- a/packages/react-conformance/CHANGELOG.json +++ b/packages/react-conformance/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-conformance", "entries": [ + { + "date": "Wed, 08 Jan 2025 18:33:33 GMT", + "tag": "@fluentui/react-conformance_v0.19.3", + "version": "0.19.3", + "comments": { + "patch": [ + { + "author": "olfedias@microsoft.com", + "package": "@fluentui/react-conformance", + "commit": "dc7bb663e3d93a19b611cf1892556d69c57b1269", + "comment": "chore: remove usage of \"export *\"" + } + ] + } + }, { "date": "Mon, 11 Nov 2024 10:01:11 GMT", "tag": "@fluentui/react-conformance_v0.19.2", diff --git a/packages/react-conformance/CHANGELOG.md b/packages/react-conformance/CHANGELOG.md index 6206fdbd4279cf..0f022441351a42 100644 --- a/packages/react-conformance/CHANGELOG.md +++ b/packages/react-conformance/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-conformance -This log was last generated on Mon, 11 Nov 2024 10:01:11 GMT and should not be manually modified. +This log was last generated on Wed, 08 Jan 2025 18:33:33 GMT and should not be manually modified. <!-- Start content --> +## [0.19.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-conformance_v0.19.3) + +Wed, 08 Jan 2025 18:33:33 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-conformance_v0.19.2..@fluentui/react-conformance_v0.19.3) + +### Patches + +- chore: remove usage of "export *" ([PR #33448](https://github.com/microsoft/fluentui/pull/33448) by olfedias@microsoft.com) + ## [0.19.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-conformance_v0.19.2) Mon, 11 Nov 2024 10:01:11 GMT diff --git a/packages/react-conformance/package.json b/packages/react-conformance/package.json index b04b94218ddf49..9ba2de77051081 100644 --- a/packages/react-conformance/package.json +++ b/packages/react-conformance/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-conformance", - "version": "0.19.2", + "version": "0.19.3", "description": "Customizable conformance testing utility for Fluent UI React components.", "main": "lib-commonjs/index.js", "typings": "./dist/index.d.ts", From 93063df115dbd3bec400c581353b190e7952de6e Mon Sep 17 00:00:00 2001 From: Mason Tejera <17346018+mltejera@users.noreply.github.com> Date: Wed, 8 Jan 2025 21:17:41 +0000 Subject: [PATCH 08/78] [nav] Replacing 'size' prop with 'density' (#33559) --- ...-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json | 7 +++++ .../library/etc/react-nav-preview.api.md | 22 +++++++------- .../react-nav-preview/library/src/Nav.ts | 2 +- .../src/components/AppItem/AppItem.types.ts | 6 ++-- .../src/components/AppItem/useAppItem.ts | 4 +-- .../AppItem/useAppItemStyles.styles.ts | 4 +-- .../AppItemStatic/AppItemStatic.types.ts | 6 ++-- .../AppItemStatic/useAppItemStatic.ts | 4 +-- .../useAppItemStaticStyles.styles.ts | 4 +-- .../library/src/components/Nav/Nav.types.ts | 9 +++--- .../library/src/components/Nav/index.ts | 2 +- .../library/src/components/Nav/useNav.ts | 4 +-- .../NavCategoryItem/NavCategoryItem.types.ts | 6 ++-- .../useNavCategoryItem.styles.ts | 4 +-- .../NavCategoryItem/useNavCategoryItem.tsx | 4 +-- .../library/src/components/NavContext.ts | 4 +-- .../src/components/NavContext.types.ts | 5 +++- .../components/NavDrawer/NavDrawer.types.ts | 10 ++++++- .../src/components/NavDrawer/useNavDrawer.ts | 3 +- .../NavDrawer/useNavDrawerStyles.styles.ts | 15 ++++++++-- .../src/components/NavItem/NavItem.types.ts | 6 ++-- .../src/components/NavItem/useNavItem.ts | 4 +-- .../NavItem/useNavItemStyles.styles.ts | 4 +-- .../components/NavSubItem/NavSubItem.types.ts | 6 ++-- .../components/NavSubItem/useNavSubItem.ts | 4 +-- .../NavSubItem/useNavSubItemStyles.styles.ts | 6 ++-- .../SplitNavItem/SplitNavItem.types.ts | 6 ++-- .../SplitNavItem/useSplitNavItem.tsx | 4 +-- .../useSplitNavItemStyles.styles.ts | 6 ++-- .../src/components/sharedNavStyles.styles.ts | 1 + .../src/components/useNavContextValues.tsx | 6 ++-- .../react-nav-preview/library/src/index.ts | 2 +- .../stories/src/Nav/index.stories.tsx | 2 +- .../src/NavDrawer/SplitNavItems.stories.tsx | 16 ++++++---- ...s.tsx => VariableDensityItems.stories.tsx} | 29 +++++++++++++------ 35 files changed, 137 insertions(+), 90 deletions(-) create mode 100644 change/@fluentui-react-nav-preview-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json rename packages/react-components/react-nav-preview/stories/src/NavDrawer/{VariableSizedItems.stories.tsx => VariableDensityItems.stories.tsx} (91%) diff --git a/change/@fluentui-react-nav-preview-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json b/change/@fluentui-react-nav-preview-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json new file mode 100644 index 00000000000000..6330f4d3225373 --- /dev/null +++ b/change/@fluentui-react-nav-preview-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "[BREAKING CHANGE] Replacing NavSize type and size prop with NavDensity type and density prop to avoid collisions with size on base Drawer component. ", + "packageName": "@fluentui/react-nav-preview", + "email": "matejera@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-nav-preview/library/etc/react-nav-preview.api.md b/packages/react-components/react-nav-preview/library/etc/react-nav-preview.api.md index 183c5222ea6030..70ed49272f741a 100644 --- a/packages/react-components/react-nav-preview/library/etc/react-nav-preview.api.md +++ b/packages/react-components/react-nav-preview/library/etc/react-nav-preview.api.md @@ -57,7 +57,7 @@ export type AppItemSlots = { // @public export type AppItemState = ComponentState<AppItemSlots> & { - size: NavSize; + density: NavDensity; }; // @public @@ -77,7 +77,7 @@ export type AppItemStaticSlots = { // @public export type AppItemStaticState = ComponentState<AppItemStaticSlots> & { - size: NavSize; + density: NavDensity; }; // @public @@ -117,7 +117,7 @@ export type NavCategoryItemSlots = { // @public export type NavCategoryItemState = ComponentState<NavCategoryItemSlots> & NavCategoryItemContextValue & { selected: boolean; - size: NavSize; + density: NavDensity; }; // @public @@ -133,7 +133,7 @@ export type NavCategoryState = NavCategoryContextValue & Required<NavCategoryPro export const navClassNames: SlotClassNames<NavSlots>; // @public (undocumented) -export type NavContextValue = Pick<NavProps, 'onNavItemSelect' | 'selectedValue' | 'selectedCategoryValue' | 'size'> & { +export type NavContextValue = Pick<NavProps, 'onNavItemSelect' | 'selectedValue' | 'selectedCategoryValue' | 'density'> & { onRegister: RegisterNavItemEventHandler; onUnregister: RegisterNavItemEventHandler; onSelect: EventHandler<OnNavItemSelectData>; @@ -153,6 +153,9 @@ export type NavContextValues = { nav: NavContextValue; }; +// @public +export type NavDensity = 'small' | 'medium'; + // @public export const NavDivider: ForwardRefComponent<NavDividerProps>; @@ -254,7 +257,7 @@ export type NavItemSlots = { // @public export type NavItemState = ComponentState<NavItemSlots> & Pick<NavItemProps, 'value'> & { selected: boolean; - size: NavSize; + density: NavDensity; }; // @public @@ -271,7 +274,7 @@ export type NavProps = ComponentProps<NavSlots> & { selectedCategoryValue?: NavItemValue; multiple?: boolean; onNavCategoryItemToggle?: EventHandler<OnNavItemSelectData>; - size?: NavSize; + density?: NavDensity; }; // @public (undocumented) @@ -294,9 +297,6 @@ export type NavSectionHeaderSlots = { // @public export type NavSectionHeaderState = ComponentState<NavSectionHeaderSlots>; -// @public -export type NavSize = 'small' | 'medium'; - // @public (undocumented) export type NavSlots = { root: NonNullable<Slot<'div'>>; @@ -344,7 +344,7 @@ export type NavSubItemSlots = { // @public export type NavSubItemState = ComponentState<NavSubItemSlots> & Pick<NavSubItemProps, 'value'> & { selected: boolean; - size: NavSize; + density: NavDensity; }; // @public (undocumented) @@ -412,7 +412,7 @@ export type SplitNavItemSlots = { // @public export type SplitNavItemState = ComponentState<SplitNavItemSlots> & { - size: NavSize; + density: NavDensity; isSubNav: boolean; }; diff --git a/packages/react-components/react-nav-preview/library/src/Nav.ts b/packages/react-components/react-nav-preview/library/src/Nav.ts index f5f3bad6d018fc..0851ebf53f3b67 100644 --- a/packages/react-components/react-nav-preview/library/src/Nav.ts +++ b/packages/react-components/react-nav-preview/library/src/Nav.ts @@ -1,4 +1,4 @@ -export type { NavProps, NavSize, NavSlots, NavState, OnNavItemSelectData } from './components/Nav/index'; +export type { NavProps, NavDensity, NavSlots, NavState, OnNavItemSelectData } from './components/Nav/index'; export { Nav, navClassNames, renderNav_unstable, useNavStyles_unstable, useNav_unstable } from './components/Nav/index'; export type { NavCategoryItemProps, diff --git a/packages/react-components/react-nav-preview/library/src/components/AppItem/AppItem.types.ts b/packages/react-components/react-nav-preview/library/src/components/AppItem/AppItem.types.ts index 87d48798d39a1b..6f3266ef22cfae 100644 --- a/packages/react-components/react-nav-preview/library/src/components/AppItem/AppItem.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/AppItem/AppItem.types.ts @@ -1,6 +1,6 @@ import { ARIAButtonSlotProps } from '@fluentui/react-aria'; import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities'; -import { NavSize } from '../Nav/Nav.types'; +import { NavDensity } from '../Nav/Nav.types'; export type AppItemSlots = { /** @@ -24,9 +24,9 @@ export type AppItemProps = ComponentProps<AppItemSlots> & { href?: string }; */ export type AppItemState = ComponentState<AppItemSlots> & { /** - * The size of the NavItem + * The density of the NavItem * * @default 'medium' */ - size: NavSize; + density: NavDensity; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/AppItem/useAppItem.ts b/packages/react-components/react-nav-preview/library/src/components/AppItem/useAppItem.ts index ae6173145e839e..f77e0eeadf0c5a 100644 --- a/packages/react-components/react-nav-preview/library/src/components/AppItem/useAppItem.ts +++ b/packages/react-components/react-nav-preview/library/src/components/AppItem/useAppItem.ts @@ -20,7 +20,7 @@ export const useAppItem_unstable = ( const { icon, as, href } = props; const rootElementType = as || (href ? 'a' : 'button'); - const { size = 'medium' } = useNavContext_unstable(); + const { density = 'medium' } = useNavContext_unstable(); const root = slot.always<ARIAButtonSlotProps<'a'>>( getIntrinsicElementProps( @@ -48,6 +48,6 @@ export const useAppItem_unstable = ( icon: slot.optional(icon, { elementType: 'span', }), - size, + density, }; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/AppItem/useAppItemStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/AppItem/useAppItemStyles.styles.ts index e93f60e5fd0c9f..cbc08bbf8ce74a 100644 --- a/packages/react-components/react-nav-preview/library/src/components/AppItem/useAppItemStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/AppItem/useAppItemStyles.styles.ts @@ -42,13 +42,13 @@ export const useAppItemStyles_unstable = (state: AppItemState): AppItemState => const iconStyles = useIconStyles(); const appItemSpecificStyles = useAppItemStyles(); - const { size, icon } = state; + const { density, icon } = state; state.root.className = mergeClasses( rootDefaultClassName, appItemClassNames.root, appItemSpecificStyles.root, - size === 'small' && appItemSpecificStyles.small, + density === 'small' && appItemSpecificStyles.small, !icon && appItemSpecificStyles.absentIconRootAdjustment, state.root.className, ); diff --git a/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/AppItemStatic.types.ts b/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/AppItemStatic.types.ts index da9d014f92dbcc..de605b7700b713 100644 --- a/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/AppItemStatic.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/AppItemStatic.types.ts @@ -1,5 +1,5 @@ import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities'; -import { NavSize } from '../Nav/Nav.types'; +import { NavDensity } from '../Nav/Nav.types'; export type AppItemStaticSlots = { /** @@ -22,9 +22,9 @@ export type AppItemStaticProps = ComponentProps<AppItemStaticSlots> & {}; */ export type AppItemStaticState = ComponentState<AppItemStaticSlots> & { /** - * The size of the Nav + * The density of the Nav * * @default 'medium' */ - size: NavSize; + density: NavDensity; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/useAppItemStatic.ts b/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/useAppItemStatic.ts index c590d540f34c4a..283bbbc51c588b 100644 --- a/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/useAppItemStatic.ts +++ b/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/useAppItemStatic.ts @@ -18,7 +18,7 @@ export const useAppItemStatic_unstable = ( ): AppItemStaticState => { const { icon } = props; - const { size = 'medium' } = useNavContext_unstable(); + const { density = 'medium' } = useNavContext_unstable(); return { components: { root: 'div', @@ -34,6 +34,6 @@ export const useAppItemStatic_unstable = ( icon: slot.optional(icon, { elementType: 'span', }), - size, + density, }; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/useAppItemStaticStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/useAppItemStaticStyles.styles.ts index a8b987af14aae9..2aa8c4b80861e1 100644 --- a/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/useAppItemStaticStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/AppItemStatic/useAppItemStaticStyles.styles.ts @@ -32,14 +32,14 @@ export const useAppItemStaticStyles_unstable = (state: AppItemStaticState): AppI const appItemSpecificStyles = useAppItemStyles(); const appItemStaticStyles = useAppItemStaticStyles(); - const { size, icon } = state; + const { density, icon } = state; state.root.className = mergeClasses( rootDefaultClassName, appItemStaticClassNames.root, appItemSpecificStyles.root, appItemStaticStyles.root, - size === 'small' && appItemSpecificStyles.small, + density === 'small' && appItemSpecificStyles.small, !icon && appItemSpecificStyles.absentIconRootAdjustment, state.root.className, ); diff --git a/packages/react-components/react-nav-preview/library/src/components/Nav/Nav.types.ts b/packages/react-components/react-nav-preview/library/src/components/Nav/Nav.types.ts index 2c454797acdba1..1a5a9d8a23551c 100644 --- a/packages/react-components/react-nav-preview/library/src/components/Nav/Nav.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/Nav/Nav.types.ts @@ -8,9 +8,10 @@ export type NavSlots = { }; /*** - * Indicates the vertical size of the Nav content. + * Indicates the vertical density of the Nav content. + * This does not affect horizontal spacing. */ -export type NavSize = 'small' | 'medium'; +export type NavDensity = 'small' | 'medium'; /** * Nav Props @@ -76,10 +77,10 @@ export type NavProps = ComponentProps<NavSlots> & { onNavCategoryItemToggle?: EventHandler<OnNavItemSelectData>; /** - * The size and density of the Nav and it's children + * The vertical density of the Nav and it's children * @default 'medium' */ - size?: NavSize; + density?: NavDensity; }; export type OnNavItemSelectData = EventData<'click', React.MouseEvent<HTMLButtonElement | HTMLAnchorElement>> & { diff --git a/packages/react-components/react-nav-preview/library/src/components/Nav/index.ts b/packages/react-components/react-nav-preview/library/src/components/Nav/index.ts index 96192347cd9e18..c07ddb4584da82 100644 --- a/packages/react-components/react-nav-preview/library/src/components/Nav/index.ts +++ b/packages/react-components/react-nav-preview/library/src/components/Nav/index.ts @@ -1,5 +1,5 @@ export { Nav } from './Nav'; -export type { NavSlots, NavProps, OnNavItemSelectData, NavState, NavSize } from './Nav.types'; +export type { NavSlots, NavProps, OnNavItemSelectData, NavState, NavDensity } from './Nav.types'; export { renderNav_unstable } from './renderNav'; export { useNav_unstable } from './useNav'; export { useNavStyles_unstable, navClassNames } from './useNavStyles.styles'; diff --git a/packages/react-components/react-nav-preview/library/src/components/Nav/useNav.ts b/packages/react-components/react-nav-preview/library/src/components/Nav/useNav.ts index 83a8bc502be0a4..ca6424eb556d05 100644 --- a/packages/react-components/react-nav-preview/library/src/components/Nav/useNav.ts +++ b/packages/react-components/react-nav-preview/library/src/components/Nav/useNav.ts @@ -59,7 +59,7 @@ export const useNav_unstable = (props: NavProps, ref: React.Ref<HTMLDivElement>) onNavItemSelect, onNavCategoryItemToggle, multiple = true, - size = 'medium', + density = 'medium', openCategories: controlledOpenCategoryItems, selectedCategoryValue: controlledSelectedCategoryValue, selectedValue: controlledSelectedValue, @@ -164,6 +164,6 @@ export const useNav_unstable = (props: NavProps, ref: React.Ref<HTMLDivElement>) getRegisteredNavItems, onRequestNavCategoryItemToggle, multiple, - size, + density, }; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/NavCategoryItem.types.ts b/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/NavCategoryItem.types.ts index 3b8b0a9897bbf8..52756e4bc6562f 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/NavCategoryItem.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/NavCategoryItem.types.ts @@ -1,4 +1,4 @@ -import { NavSize } from '../Nav/Nav.types'; +import { NavDensity } from '../Nav/Nav.types'; import { NavCategoryItemContextValue } from '../NavCategoryItemContext'; import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities'; @@ -39,9 +39,9 @@ export type NavCategoryItemState = ComponentState<NavCategoryItemSlots> & */ selected: boolean; /** - * The size of the NavItem + * The density of the NavItem * * @default 'medium' */ - size: NavSize; + density: NavDensity; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/useNavCategoryItem.styles.ts b/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/useNavCategoryItem.styles.ts index 686459e60f1682..26e2d1d95b20d0 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/useNavCategoryItem.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/useNavCategoryItem.styles.ts @@ -51,13 +51,13 @@ export const useNavCategoryItemStyles_unstable = (state: NavCategoryItemState): const iconStyles = useIconStyles(); const expandIconStyles = useExpandIconStyles(); - const { selected, open, size } = state; + const { selected, open, density } = state; state.root.className = mergeClasses( navCategoryItemClassNames.root, defaultRootClassName, rootStyles.base, - size === 'small' && smallStyles.root, + density === 'small' && smallStyles.root, selected && open === false && indicatorStyles.base, selected && open === false && contentStyles.selected, state.root.className, diff --git a/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/useNavCategoryItem.tsx b/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/useNavCategoryItem.tsx index 85a06e0e915775..e41b63a5a7349a 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/useNavCategoryItem.tsx +++ b/packages/react-components/react-nav-preview/library/src/components/NavCategoryItem/useNavCategoryItem.tsx @@ -22,7 +22,7 @@ export const useNavCategoryItem_unstable = ( const { open, value } = useNavCategoryContext_unstable(); - const { onRequestNavCategoryItemToggle, selectedCategoryValue, size = 'medium' } = useNavContext_unstable(); + const { onRequestNavCategoryItemToggle, selectedCategoryValue, density = 'medium' } = useNavContext_unstable(); const onNavCategoryItemClick = useEventCallback( mergeCallbacks(onClick, event => @@ -64,6 +64,6 @@ export const useNavCategoryItem_unstable = ( icon: slot.optional(icon, { elementType: 'span', }), - size, + density, }; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavContext.ts b/packages/react-components/react-nav-preview/library/src/components/NavContext.ts index f0cb4b5af7a71c..dfc0df68cf5bbc 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavContext.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavContext.ts @@ -32,9 +32,9 @@ const navContextDefaultValue: NavContextValue = { multiple: true, /** - * Indicates the size and density of the Nav. + * Indicates the vertical density and density of the Nav. */ - size: 'medium', + density: 'medium', }; const NavContext = React.createContext<NavContextValue | undefined>(undefined); diff --git a/packages/react-components/react-nav-preview/library/src/components/NavContext.types.ts b/packages/react-components/react-nav-preview/library/src/components/NavContext.types.ts index 41beee99b9aa05..659424009eae73 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavContext.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavContext.types.ts @@ -3,7 +3,10 @@ import { EventHandler } from '@fluentui/react-utilities'; import type { NavProps, OnNavItemSelectData } from './Nav/Nav.types'; -export type NavContextValue = Pick<NavProps, 'onNavItemSelect' | 'selectedValue' | 'selectedCategoryValue' | 'size'> & { +export type NavContextValue = Pick< + NavProps, + 'onNavItemSelect' | 'selectedValue' | 'selectedCategoryValue' | 'density' +> & { /** A callback to allow a navItem to register itself with the navItem list. */ onRegister: RegisterNavItemEventHandler; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavDrawer/NavDrawer.types.ts b/packages/react-components/react-nav-preview/library/src/components/NavDrawer/NavDrawer.types.ts index 4c23d1ac19eab7..fd6092408c6e53 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavDrawer/NavDrawer.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavDrawer/NavDrawer.types.ts @@ -25,4 +25,12 @@ export type NavDrawerProps = ComponentProps<NavDrawerSlots> & /** * State used in rendering NavDrawer */ -export type NavDrawerState = DrawerState & NavContextValue; +export type NavDrawerState = DrawerState & + NavContextValue & { + /** + * Analagous to size from DrawerBaseProps. + * Intended to be left unset in most cases. + * If left unset, it defaults to 260px. + */ + size?: 'small' | 'medium' | 'large' | 'full'; + }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavDrawer/useNavDrawer.ts b/packages/react-components/react-nav-preview/library/src/components/NavDrawer/useNavDrawer.ts index e0e01144391604..553a6e55ac7234 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavDrawer/useNavDrawer.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavDrawer/useNavDrawer.ts @@ -16,7 +16,7 @@ import type { NavDrawerProps, NavDrawerState } from './NavDrawer.types'; * @param ref - reference to root HTMLDivElement of NavDrawer */ export const useNavDrawer_unstable = (props: NavDrawerProps, ref: React.Ref<HTMLDivElement>): NavDrawerState => { - const { tabbable = false } = props; + const { tabbable = false, size = undefined } = props; const focusAttributes = useArrowNavigationGroup({ axis: 'vertical', @@ -34,6 +34,7 @@ export const useNavDrawer_unstable = (props: NavDrawerProps, ref: React.Ref<HTML return { ...navState, + size, components: { // TODO: remove once React v18 slot API is modified // this is a problem with the lack of support for union types on React v18 diff --git a/packages/react-components/react-nav-preview/library/src/components/NavDrawer/useNavDrawerStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/NavDrawer/useNavDrawerStyles.styles.ts index 9c206c0627f120..9e448574200b16 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavDrawer/useNavDrawerStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavDrawer/useNavDrawerStyles.styles.ts @@ -13,10 +13,14 @@ export const navDrawerClassNames: SlotClassNames<Omit<InlineDrawerSlots, 'surfac */ const useStyles = makeStyles({ root: { - width: '260px', // per spec backgroundColor: navItemTokens.backgroundColor, alignItems: 'unset', }, + // seperate style so it can be applied conditionally + // if size is not set, use default width from the token. + defaultWidth: { + width: `${navItemTokens.defaultDrawerWidth}px`, + }, }); /** @@ -25,8 +29,15 @@ const useStyles = makeStyles({ export const useNavDrawerStyles_unstable = (state: NavDrawerState): NavDrawerState => { 'use no memo'; + const { size } = state; + const styles = useStyles(); - state.root.className = mergeClasses(navDrawerClassNames.root, styles.root, state.root.className); + state.root.className = mergeClasses( + navDrawerClassNames.root, + styles.root, + !size && styles.defaultWidth, + state.root.className, + ); return state; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavItem/NavItem.types.ts b/packages/react-components/react-nav-preview/library/src/components/NavItem/NavItem.types.ts index c4248ee931023d..97e39d7fe62a1e 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavItem/NavItem.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavItem/NavItem.types.ts @@ -1,5 +1,5 @@ import { NavItemValue } from '../NavContext.types'; -import { NavSize } from '../Nav/Nav.types'; +import { NavDensity } from '../Nav/Nav.types'; import type { ARIAButtonSlotProps } from '@fluentui/react-aria'; import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities'; @@ -40,9 +40,9 @@ export type NavItemState = ComponentState<NavItemSlots> & selected: boolean; /** - * The size of the NavItem + * The density of the NavItem * * @default 'medium' */ - size: NavSize; + density: NavDensity; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavItem/useNavItem.ts b/packages/react-components/react-nav-preview/library/src/components/NavItem/useNavItem.ts index ec66e38d7ed3bf..d4c798594ffa65 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavItem/useNavItem.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavItem/useNavItem.ts @@ -21,7 +21,7 @@ export const useNavItem_unstable = ( ): NavItemState => { const { onClick, value, icon, as, href } = props; - const { selectedValue, onRegister, onUnregister, onSelect, size = 'medium' } = useNavContext_unstable(); + const { selectedValue, onRegister, onUnregister, onSelect, density = 'medium' } = useNavContext_unstable(); const rootElementType = as || (href ? 'a' : 'button'); @@ -76,6 +76,6 @@ export const useNavItem_unstable = ( }), selected, value, - size, + density, }; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavItem/useNavItemStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/NavItem/useNavItemStyles.styles.ts index f515ef35ce37e2..4e6c990fe5319c 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavItem/useNavItemStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavItem/useNavItemStyles.styles.ts @@ -26,12 +26,12 @@ export const useNavItemStyles_unstable = (state: NavItemState): NavItemState => const indicatorStyles = useIndicatorStyles(); const iconStyles = useIconStyles(); - const { selected, size } = state; + const { selected, density } = state; state.root.className = mergeClasses( navItemClassNames.root, rootDefaultClassName, - size === 'small' && smallStyles.root, + density === 'small' && smallStyles.root, selected && indicatorStyles.base, selected && contentStyles.selected, state.root.className, diff --git a/packages/react-components/react-nav-preview/library/src/components/NavSubItem/NavSubItem.types.ts b/packages/react-components/react-nav-preview/library/src/components/NavSubItem/NavSubItem.types.ts index 609192d2eb0c8d..519bb8222227a5 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavSubItem/NavSubItem.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavSubItem/NavSubItem.types.ts @@ -2,7 +2,7 @@ import { NavItemValue } from '../NavContext.types'; import type { ARIAButtonSlotProps } from '@fluentui/react-aria'; import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utilities'; -import { NavSize } from '../Nav/Nav.types'; +import { NavDensity } from '../Nav/Nav.types'; export type NavSubItemSlots = { root: NonNullable<Slot<ARIAButtonSlotProps<'a'>>>; @@ -29,9 +29,9 @@ export type NavSubItemState = ComponentState<NavSubItemSlots> & */ selected: boolean; /** - * The size of the NavItem + * The density of the NavItem * * @default 'medium' */ - size: NavSize; + density: NavDensity; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavSubItem/useNavSubItem.ts b/packages/react-components/react-nav-preview/library/src/components/NavSubItem/useNavSubItem.ts index fc83644d2ea393..c4cbda8184f09c 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavSubItem/useNavSubItem.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavSubItem/useNavSubItem.ts @@ -22,7 +22,7 @@ export const useNavSubItem_unstable = ( ): NavSubItemState => { const { onClick, value: subItemValue, as, href } = props; - const { selectedValue, onRegister, onUnregister, onSelect, size = 'medium' } = useNavContext_unstable(); + const { selectedValue, onRegister, onUnregister, onSelect, density = 'medium' } = useNavContext_unstable(); const { value: parentCategoryValue } = useNavCategoryContext_unstable(); @@ -78,6 +78,6 @@ export const useNavSubItem_unstable = ( root, selected, value: subItemValue, - size, + density, }; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/NavSubItem/useNavSubItemStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/NavSubItem/useNavSubItemStyles.styles.ts index d65e541d387c74..e46d310101cea2 100644 --- a/packages/react-components/react-nav-preview/library/src/components/NavSubItem/useNavSubItemStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/NavSubItem/useNavSubItemStyles.styles.ts @@ -42,13 +42,13 @@ export const useNavSubItemStyles_unstable = (state: NavSubItemState): NavSubItem const indicatorStyles = useIndicatorStyles(); const navSubItemSpecificStyles = useNavSubItemSpecificStyles(); - const { selected, size } = state; + const { selected, density } = state; state.root.className = mergeClasses( navSubItemClassNames.root, rootDefaultClassName, - size === 'small' && smallStyles.root, - size === 'small' && navSubItemSpecificStyles.smallBase, + density === 'small' && smallStyles.root, + density === 'small' && navSubItemSpecificStyles.smallBase, navSubItemSpecificStyles.base, selected && indicatorStyles.base, selected && contentStyles.selected, diff --git a/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/SplitNavItem.types.ts b/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/SplitNavItem.types.ts index ad3783f5551ff4..148971b40f943a 100644 --- a/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/SplitNavItem.types.ts +++ b/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/SplitNavItem.types.ts @@ -2,7 +2,7 @@ import type { ComponentProps, ComponentState, Slot } from '@fluentui/react-utili import { NavItemProps } from '../NavItem/NavItem.types'; import { ButtonProps, MenuButtonProps, ToggleButtonProps } from '@fluentui/react-button'; import type { TooltipProps } from '@fluentui/react-tooltip'; -import { NavSize } from '../Nav/Nav.types'; +import { NavDensity } from '../Nav/Nav.types'; import { NavSubItemProps } from '../NavSubItem/NavSubItem.types'; export type SplitNavItemSlots = { @@ -58,11 +58,11 @@ export type SplitNavItemProps = ComponentProps<SplitNavItemSlots>; */ export type SplitNavItemState = ComponentState<SplitNavItemSlots> & { /** - * The size of the NavItem + * The density of the NavItem * * @default 'medium' */ - size: NavSize; + density: NavDensity; /** * A boolean that represents if the main item in the SplitNavItem is a SubNav item. diff --git a/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/useSplitNavItem.tsx b/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/useSplitNavItem.tsx index 1fe021228bebfd..65d3d2387f923a 100644 --- a/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/useSplitNavItem.tsx +++ b/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/useSplitNavItem.tsx @@ -33,7 +33,7 @@ export const useSplitNavItem_unstable = ( children, } = props; - const { size = 'medium' } = useNavContext_unstable(); + const { density = 'medium' } = useNavContext_unstable(); const { value: potentialParenValue } = useNavCategoryContext_unstable(); @@ -116,7 +116,7 @@ export const useSplitNavItem_unstable = ( actionButtonTooltip: actionButtonTooltipShorthand, toggleButtonTooltip: toggleButtonTooltipShorthand, menuButtonTooltip: menuButtonTooltipShorthand, - size, + density, isSubNav, }; }; diff --git a/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/useSplitNavItemStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/useSplitNavItemStyles.styles.ts index 8faf6d435386c9..d442f4087ef1f0 100644 --- a/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/useSplitNavItemStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/SplitNavItem/useSplitNavItemStyles.styles.ts @@ -92,7 +92,7 @@ export const useSplitNavItemStyles_unstable = (state: SplitNavItemState): SplitN state.actionButton.className = mergeClasses( splitNavItemClassNames.actionButton, splitNavItemStyles.baseSecondary, - state.size === 'medium' && splitNavItemStyles.baseMedium, + state.density === 'medium' && splitNavItemStyles.baseMedium, state.actionButton.className, ); } @@ -101,7 +101,7 @@ export const useSplitNavItemStyles_unstable = (state: SplitNavItemState): SplitN state.toggleButton.className = mergeClasses( splitNavItemClassNames.toggleButton, splitNavItemStyles.baseSecondary, - state.size === 'medium' && splitNavItemStyles.baseMedium, + state.density === 'medium' && splitNavItemStyles.baseMedium, state.toggleButton.className, ); } @@ -110,7 +110,7 @@ export const useSplitNavItemStyles_unstable = (state: SplitNavItemState): SplitN state.menuButton.className = mergeClasses( splitNavItemClassNames.menuButton, splitNavItemStyles.baseSecondary, - state.size === 'medium' && splitNavItemStyles.baseMedium, + state.density === 'medium' && splitNavItemStyles.baseMedium, state.menuButton.className, ); } diff --git a/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts index b5cb54500dae0b..c2e2ecdbba7623 100644 --- a/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts @@ -5,6 +5,7 @@ import { makeResetStyles, makeStyles } from '@griffel/react'; // Styles shared by several nav components. export const navItemTokens = { + defaultDrawerWidth: 260, indicatorOffset: 16, indicatorWidth: 4, indicatorHeight: 20, diff --git a/packages/react-components/react-nav-preview/library/src/components/useNavContextValues.tsx b/packages/react-components/react-nav-preview/library/src/components/useNavContextValues.tsx index 05dde17412aa55..ff06b9c84d2587 100644 --- a/packages/react-components/react-nav-preview/library/src/components/useNavContextValues.tsx +++ b/packages/react-components/react-nav-preview/library/src/components/useNavContextValues.tsx @@ -12,7 +12,7 @@ export function useNavContextValues_unstable(state: NavState): NavContextValues onRequestNavCategoryItemToggle, openCategories, multiple, - size, + density, } = state; const navContext = React.useMemo<NavContextValue>( @@ -26,7 +26,7 @@ export function useNavContextValues_unstable(state: NavState): NavContextValues onRequestNavCategoryItemToggle, openCategories, multiple, - size, + density, }), [ selectedValue, @@ -38,7 +38,7 @@ export function useNavContextValues_unstable(state: NavState): NavContextValues onRequestNavCategoryItemToggle, openCategories, multiple, - size, + density, ], ); diff --git a/packages/react-components/react-nav-preview/library/src/index.ts b/packages/react-components/react-nav-preview/library/src/index.ts index 843555cbcbd1ba..6a5055e6925fd8 100644 --- a/packages/react-components/react-nav-preview/library/src/index.ts +++ b/packages/react-components/react-nav-preview/library/src/index.ts @@ -1,5 +1,5 @@ export { Nav, renderNav_unstable, useNav_unstable, useNavStyles_unstable, navClassNames } from './components/Nav/index'; -export type { NavProps, NavSlots, NavState, NavSize, OnNavItemSelectData } from './components/Nav/index'; +export type { NavProps, NavSlots, NavState, NavDensity, OnNavItemSelectData } from './components/Nav/index'; export { NavCategory, renderNavCategory_unstable, useNavCategory_unstable } from './components/NavCategory/index'; export type { NavCategoryProps, NavCategoryState } from './components/NavCategory/index'; diff --git a/packages/react-components/react-nav-preview/stories/src/Nav/index.stories.tsx b/packages/react-components/react-nav-preview/stories/src/Nav/index.stories.tsx index c63459f634e14b..6b509811b994ad 100644 --- a/packages/react-components/react-nav-preview/stories/src/Nav/index.stories.tsx +++ b/packages/react-components/react-nav-preview/stories/src/Nav/index.stories.tsx @@ -5,7 +5,7 @@ import { Nav } from '@fluentui/react-nav-preview'; // import bestPracticesMd from './NavBestPractices.md'; export { Basic } from '../NavDrawer/Basic.stories'; -export { VariableSizedItems } from '../NavDrawer/VariableSizedItems.stories'; +export { VariableDensityItems } from '../NavDrawer/VariableDensityItems.stories'; export { Controlled } from '../NavDrawer/Controlled.stories'; export { SplitNavItems } from '../NavDrawer/SplitNavItems.stories'; diff --git a/packages/react-components/react-nav-preview/stories/src/NavDrawer/SplitNavItems.stories.tsx b/packages/react-components/react-nav-preview/stories/src/NavDrawer/SplitNavItems.stories.tsx index 27f969a0ecbfb9..cddf77819f8143 100644 --- a/packages/react-components/react-nav-preview/stories/src/NavDrawer/SplitNavItems.stories.tsx +++ b/packages/react-components/react-nav-preview/stories/src/NavDrawer/SplitNavItems.stories.tsx @@ -7,7 +7,7 @@ import { NavDrawerBody, NavDrawerHeader, NavDrawerProps, - NavSize, + NavDensity, AppItem, AppItemStatic, SplitNavItem, @@ -189,7 +189,7 @@ export const SplitNavItems = (props: Partial<NavDrawerProps>) => { const appItemIconLabelId = useId('app-item-icon-label'); const appItemStaticLabelId = useId('app-item-static-label'); - const [size, setNavSize] = React.useState<NavSize>('small'); + const [density, setNavDensity] = React.useState<NavDensity>('small'); const [enabledLinks, setEnabledLinks] = React.useState(true); const [isAppItemIconPresent, setIsAppItemIconPresent] = React.useState(true); const [isAppItemStatic, setIsAppItemStatic] = React.useState(true); @@ -198,7 +198,7 @@ export const SplitNavItems = (props: Partial<NavDrawerProps>) => { const linkDestination = enabledLinks ? 'https://www.bing.com' : ''; const appItemIcon = isAppItemIconPresent ? ( - size === 'small' ? ( + density === 'small' ? ( <PersonCircle24Regular /> ) : ( <PersonCircle32Regular /> @@ -295,7 +295,7 @@ export const SplitNavItems = (props: Partial<NavDrawerProps>) => { return ( <div className={styles.root}> - <NavDrawer defaultSelectedValue="5" open={true} type={'inline'} size={size}> + <NavDrawer defaultSelectedValue="5" open={true} density={density} type={'inline'}> <NavDrawerHeader> <Tooltip content="Navigation" relationship="label"> <Hamburger /> @@ -310,8 +310,12 @@ export const SplitNavItems = (props: Partial<NavDrawerProps>) => { </NavDrawer> <div className={styles.content}> <div className={styles.field}> - <Label id={labelId}>Size</Label> - <RadioGroup value={size} onChange={(_, data) => setNavSize(data.value as NavSize)} aria-labelledby={labelId}> + <Label id={labelId}>Density</Label> + <RadioGroup + value={density} + aria-labelledby={labelId} + onChange={(_, data) => setNavDensity(data.value as NavDensity)} + > <Radio value="medium" label="Medium" /> <Radio value="small" label="Small" /> </RadioGroup> diff --git a/packages/react-components/react-nav-preview/stories/src/NavDrawer/VariableSizedItems.stories.tsx b/packages/react-components/react-nav-preview/stories/src/NavDrawer/VariableDensityItems.stories.tsx similarity index 91% rename from packages/react-components/react-nav-preview/stories/src/NavDrawer/VariableSizedItems.stories.tsx rename to packages/react-components/react-nav-preview/stories/src/NavDrawer/VariableDensityItems.stories.tsx index 8109df9c38cb9c..5ee25b36dfd911 100644 --- a/packages/react-components/react-nav-preview/stories/src/NavDrawer/VariableSizedItems.stories.tsx +++ b/packages/react-components/react-nav-preview/stories/src/NavDrawer/VariableDensityItems.stories.tsx @@ -11,12 +11,12 @@ import { NavSectionHeader, NavSubItem, NavSubItemGroup, - NavSize, + NavDensity, NavDivider, AppItem, AppItemStatic, } from '@fluentui/react-nav-preview'; -import { Label, Radio, RadioGroup, Switch, Tooltip, makeStyles, tokens, useId } from '@fluentui/react-components'; +import { Label, Switch, Tooltip, makeStyles, tokens, useId, Radio, RadioGroup } from '@fluentui/react-components'; import { Board20Filled, Board20Regular, @@ -45,8 +45,8 @@ import { PreviewLink20Filled, PreviewLink20Regular, bundleIcon, - PersonCircle32Regular, PersonCircle24Regular, + PersonCircle32Regular, } from '@fluentui/react-icons'; const useStyles = makeStyles({ @@ -85,7 +85,7 @@ const CareerDevelopment = bundleIcon(PeopleStar20Filled, PeopleStar20Regular); const Analytics = bundleIcon(DataArea20Filled, DataArea20Regular); const Reports = bundleIcon(DocumentBulletListMultiple20Filled, DocumentBulletListMultiple20Regular); -export const VariableSizedItems = (props: Partial<NavDrawerProps>) => { +export const VariableDensityItems = (props: Partial<NavDrawerProps>) => { const styles = useStyles(); const labelId = useId('type-label'); @@ -93,7 +93,7 @@ export const VariableSizedItems = (props: Partial<NavDrawerProps>) => { const appItemIconLabelId = useId('app-item-icon-label'); const appItemStaticLabelId = useId('app-item-static-label'); - const [size, setNavSize] = React.useState<NavSize>('small'); + const [density, setNavDesnity] = React.useState<NavDensity>('small'); const [enabledLinks, setEnabledLinks] = React.useState(true); const [isAppItemIconPresent, setIsAppItemIconPresent] = React.useState(true); const [isAppItemStatic, setIsAppItemStatic] = React.useState(true); @@ -101,7 +101,7 @@ export const VariableSizedItems = (props: Partial<NavDrawerProps>) => { const linkDestination = enabledLinks ? 'https://www.bing.com' : ''; const appItemIcon = isAppItemIconPresent ? ( - size === 'small' ? ( + density === 'small' ? ( <PersonCircle24Regular /> ) : ( <PersonCircle32Regular /> @@ -118,7 +118,13 @@ export const VariableSizedItems = (props: Partial<NavDrawerProps>) => { return ( <div className={styles.root}> - <NavDrawer defaultSelectedValue="7" defaultSelectedCategoryValue="6" open={true} type={'inline'} size={size}> + <NavDrawer + defaultSelectedValue="7" + defaultSelectedCategoryValue="6" + open={true} + type={'inline'} + density={density} + > <NavDrawerHeader> <Tooltip content="Navigation" relationship="label"> <Hamburger /> @@ -199,11 +205,16 @@ export const VariableSizedItems = (props: Partial<NavDrawerProps>) => { </NavDrawer> <div className={styles.content}> <div className={styles.field}> - <Label id={labelId}>Size</Label> - <RadioGroup value={size} onChange={(_, data) => setNavSize(data.value as NavSize)} aria-labelledby={labelId}> + <Label id={labelId}>Density</Label> + <RadioGroup + value={density} + aria-labelledby={labelId} + onChange={(_, data) => setNavDesnity(data.value as NavDensity)} + > <Radio value="medium" label="Medium" /> <Radio value="small" label="Small" /> </RadioGroup> + <Label id={linkLabelId}>Links</Label> <Switch checked={enabledLinks} From 479f2f31226381d03c7a12788fb0bae55cd558c4 Mon Sep 17 00:00:00 2001 From: Jeff Smith <37851214+eljefe223@users.noreply.github.com> Date: Wed, 8 Jan 2025 16:32:40 -0800 Subject: [PATCH 09/78] fix: radio-group emit change with keyboard and disabled radio unchecks (#33585) --- ...-fc912571-691c-494a-b4de-9a632a76a26c.json | 7 +++ packages/web-components/docs/api-report.md | 2 +- .../src/radio-group/radio-group.spec.ts | 56 +++++++++++++++++++ .../src/radio-group/radio-group.stories.ts | 43 ++++++++++++++ .../src/radio-group/radio-group.ts | 12 +++- packages/web-components/src/radio/radio.ts | 1 - 6 files changed, 117 insertions(+), 4 deletions(-) create mode 100644 change/@fluentui-web-components-fc912571-691c-494a-b4de-9a632a76a26c.json diff --git a/change/@fluentui-web-components-fc912571-691c-494a-b4de-9a632a76a26c.json b/change/@fluentui-web-components-fc912571-691c-494a-b4de-9a632a76a26c.json new file mode 100644 index 00000000000000..87d09789bbf038 --- /dev/null +++ b/change/@fluentui-web-components-fc912571-691c-494a-b4de-9a632a76a26c.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "fix: radio-group emit change with keyboard and disabled radio unchecks", + "packageName": "@fluentui/web-components", + "email": "jes@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/web-components/docs/api-report.md b/packages/web-components/docs/api-report.md index 34a685264c2c0d..820bc3b50b27eb 100644 --- a/packages/web-components/docs/api-report.md +++ b/packages/web-components/docs/api-report.md @@ -3045,7 +3045,7 @@ export class RadioGroup extends FASTElement { // @internal protected checkedIndexChanged(prev: number | undefined, next: number): void; // @internal - checkRadio(index?: number): void; + checkRadio(index?: number, shouldEmit?: boolean): void; checkValidity(): boolean; // @internal clickHandler(e: MouseEvent): boolean | void; diff --git a/packages/web-components/src/radio-group/radio-group.spec.ts b/packages/web-components/src/radio-group/radio-group.spec.ts index d3bd6b443ac6fa..c7f8df7215555d 100644 --- a/packages/web-components/src/radio-group/radio-group.spec.ts +++ b/packages/web-components/src/radio-group/radio-group.spec.ts @@ -233,6 +233,62 @@ test.describe('RadioGroup', () => { await expect(radios.nth(2)).toHaveJSProperty('checked', false); }); + test('radio should remain checked after it is set to disabled and uncheck when a new radio is checked', async ({ + page, + }) => { + const element = page.locator('fluent-radio-group'); + const radios = element.locator('fluent-radio'); + + await page.setContent(/* html */ ` + <fluent-radio-group> + <fluent-radio id="radio-1" name="radio" value="foo"></fluent-radio> + <fluent-radio id="radio-2" name="radio" value="bar"></fluent-radio> + <fluent-radio id="radio-3" name="radio" value="baz"></fluent-radio> + </fluent-radio-group> + `); + + await radios.nth(0).evaluate((node: Radio) => { + node.checked = true; + node.disabled = true; + }); + + await expect(radios.nth(0)).toHaveJSProperty('checked', true); + + await radios.nth(1).click(); + + await expect(radios.nth(1)).toBeFocused(); + + await page.keyboard.press('ArrowRight'); + + await expect(radios.nth(0)).toHaveJSProperty('checked', false); + await expect(radios.nth(1)).toHaveJSProperty('checked', false); + await expect(radios.nth(2)).toHaveJSProperty('checked', true); + }); + + test('should emit `change` event when using keyboard', async ({ page }) => { + const element = page.locator('fluent-radio-group'); + const radios = element.locator('fluent-radio'); + + await page.setContent(/* html */ ` + <fluent-radio-group> + <fluent-radio id="radio-1" name="radio" value="foo"></fluent-radio> + <fluent-radio id="radio-2" name="radio" value="bar"></fluent-radio> + <fluent-radio id="radio-3" name="radio" value="baz"></fluent-radio> + </fluent-radio-group> + `); + + const wasChanged = element.evaluate((node: RadioGroup) => { + return new Promise(resolve => { + node.addEventListener('change', () => resolve(true), { once: true }); + }); + }); + + await radios.nth(1).click(); + await page.keyboard.press('Tab'); + await page.keyboard.press('ArrowRight'); + await expect(wasChanged).resolves.toBeTruthy(); + }); + // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 test.skip('should set a child radio with a matching `value` to `checked` when value changes', async ({ page }) => { const element = page.locator('fluent-radio-group'); diff --git a/packages/web-components/src/radio-group/radio-group.stories.ts b/packages/web-components/src/radio-group/radio-group.stories.ts index a6f7b1d876810e..9f999d289d61b5 100644 --- a/packages/web-components/src/radio-group/radio-group.stories.ts +++ b/packages/web-components/src/radio-group/radio-group.stories.ts @@ -204,6 +204,49 @@ export const DisabledItems: Story = { }, }; +export const DisabledAndCheckedItem: Story = { + args: { + orientation: RadioGroupOrientation.vertical, + id: 'radio-group-disabled-and-checked-item', + value: 'pear', + defaultSlotContent: () => html` + ${repeat( + [ + { + labelSlottedContent: () => html`<label slot="label">Apple</label>`, + value: 'apple', + disabled: true, + }, + { + labelSlottedContent: () => html`<label slot="label">Pear</label>`, + value: 'pear', + disabled: true, + }, + { + labelSlottedContent: () => html`<label slot="label">Banana</label>`, + value: 'banana', + disabled: true, + }, + { + labelSlottedContent: () => html`<label slot="label">Orange</label>`, + value: 'orange', + }, + { + labelSlottedContent: () => html`<label slot="label">Grape</label>`, + value: 'grape', + }, + { + labelSlottedContent: () => html`<label slot="label">Kiwi</label>`, + value: 'kiwi', + disabled: true, + }, + ], + radioFieldTemplate, + )} + `, + }, +}; + export const Required: Story = { render: renderComponent(html<StoryArgs<FluentRadioGroup>>` <form diff --git a/packages/web-components/src/radio-group/radio-group.ts b/packages/web-components/src/radio-group/radio-group.ts index 406a174f6b221d..15bea46a099e0e 100644 --- a/packages/web-components/src/radio-group/radio-group.ts +++ b/packages/web-components/src/radio-group/radio-group.ts @@ -321,6 +321,11 @@ export class RadioGroup extends FASTElement { this.dirtyState = true; const radioIndex = this.enabledRadios.indexOf(e.target as Radio); this.checkRadio(radioIndex); + this.radios + ?.filter(x => x.disabled) + ?.forEach(item => { + item.checked = false; + }); return true; } @@ -330,7 +335,7 @@ export class RadioGroup extends FASTElement { * @param index - the index of the radio to check * @internal */ - public checkRadio(index: number = this.checkedIndex): void { + public checkRadio(index: number = this.checkedIndex, shouldEmit: boolean = false): void { let checkedIndex = this.checkedIndex; this.enabledRadios.forEach((item, i) => { @@ -338,6 +343,9 @@ export class RadioGroup extends FASTElement { item.checked = shouldCheck; if (shouldCheck) { checkedIndex = i; + if (shouldEmit) { + item.$emit('change'); + } } }); @@ -480,7 +488,7 @@ export class RadioGroup extends FASTElement { } const nextIndex = checkedIndex + increment; - this.checkedIndex = this.getEnabledIndexInBounds(nextIndex); + this.checkRadio(this.getEnabledIndexInBounds(nextIndex), true); this.enabledRadios[this.checkedIndex]?.focus(); } diff --git a/packages/web-components/src/radio/radio.ts b/packages/web-components/src/radio/radio.ts index 057991bb10338a..eee1a18e9d9804 100644 --- a/packages/web-components/src/radio/radio.ts +++ b/packages/web-components/src/radio/radio.ts @@ -33,7 +33,6 @@ export class Radio extends BaseCheckbox { protected disabledChanged(prev: boolean | undefined, next: boolean | undefined): void { super.disabledChanged(prev, next); if (next) { - this.checked = false; this.tabIndex = -1; } From 2247d505c62e3f464f53b77362175580144ebd56 Mon Sep 17 00:00:00 2001 From: John Kreitlow <863023+radium-v@users.noreply.github.com> Date: Wed, 8 Jan 2025 19:47:54 -0800 Subject: [PATCH 10/78] chore(web-components): Use Playwright fixture for tests (#33023) --- ...-ec172ca8-23f3-4d01-a969-6504fa67a87a.json | 7 + package.json | 6 +- packages/web-components/.eslintrc.json | 1 + packages/web-components/README.md | 4 +- packages/web-components/docs/api-report.md | 2 + packages/web-components/package.json | 6 +- packages/web-components/playwright.config.ts | 16 +- packages/web-components/project.json | 5 +- packages/web-components/scripts/e2e.js | 38 + .../src/accordion-item/accordion-item.spec.ts | 184 ++--- .../src/accordion/accordion.spec.ts | 237 ++++--- .../src/anchor-button/anchor-button.spec.ts | 256 ++++--- .../web-components/src/avatar/avatar.spec.ts | 212 ++---- .../web-components/src/badge/badge.spec.ts | 222 ++---- .../web-components/src/button/button.spec.ts | 398 +++++------ .../src/checkbox/checkbox.spec.ts | 365 ++++------ .../src/counter-badge/counter-badge.spec.ts | 173 ++--- .../src/dialog-body/dialog-body.spec.ts | 32 +- .../web-components/src/dialog/dialog.spec.ts | 333 +++++---- .../src/divider/divider.spec.ts | 207 ++---- .../web-components/src/drawer/drawer.spec.ts | 220 +++--- .../web-components/src/field/field.spec.ts | 302 ++++---- packages/web-components/src/field/field.ts | 2 +- .../web-components/src/image/image.spec.ts | 231 ++---- .../web-components/src/label/label.spec.ts | 131 ++-- packages/web-components/src/link/link.spec.ts | 84 +-- .../src/menu-list/menu-list.spec.ts | 300 ++++---- packages/web-components/src/menu/menu.spec.ts | 273 ++------ .../message-bar.integration.spec.ts | 104 --- .../src/message-bar/message-bar.spec.ts | 73 ++ .../src/progress-bar/progress-bar.spec.ts | 143 ++-- .../src/radio-group/radio-group.spec.ts | 571 ++++++++------- .../web-components/src/radio/radio.spec.ts | 234 +++---- .../src/rating-display/rating-display.spec.ts | 153 ++-- .../web-components/src/slider/slider.spec.ts | 500 +++++-------- .../src/spinner/spinner.spec.ts | 78 +-- .../web-components/src/switch/switch.spec.ts | 188 ++--- .../src/tab-panel/tab-panel.spec.ts | 33 +- packages/web-components/src/tab/tab.spec.ts | 37 +- .../src/tablist/tablist.spec.ts | 288 +++----- packages/web-components/src/tabs/tabs.spec.ts | 392 ++++------- .../src/text-input/text-input.spec.ts | 513 ++++++-------- packages/web-components/src/text/text.spec.ts | 210 ++++-- .../src/textarea/textarea.spec.ts | 661 ++++++++---------- .../src/theme/set-theme.spec.ts | 26 +- .../web-components/src/theme/set-theme.ts | 8 +- .../src/toggle-button/toggle-button.spec.ts | 83 +-- .../src/tooltip/tooltip.spec.ts | 168 +++-- .../web-components/src/tooltip/tooltip.ts | 143 ++-- .../web-components/test/harness/index.html | 11 + .../web-components/test/harness/src/main.ts | 17 + .../test/harness/vite.config.ts | 23 + .../playwright/assertions.ts} | 39 +- .../test/playwright/fast-fixture.ts | 87 +++ .../web-components/test/playwright/index.ts | 43 ++ packages/web-components/tsconfig.lib.json | 2 +- packages/web-components/tsconfig.spec.json | 2 +- yarn.lock | 529 +++++++++----- 58 files changed, 4266 insertions(+), 5340 deletions(-) create mode 100644 change/@fluentui-web-components-ec172ca8-23f3-4d01-a969-6504fa67a87a.json create mode 100644 packages/web-components/scripts/e2e.js delete mode 100644 packages/web-components/src/message-bar/message-bar.integration.spec.ts create mode 100644 packages/web-components/src/message-bar/message-bar.spec.ts create mode 100644 packages/web-components/test/harness/index.html create mode 100644 packages/web-components/test/harness/src/main.ts create mode 100644 packages/web-components/test/harness/vite.config.ts rename packages/web-components/{src/helpers.tests.ts => test/playwright/assertions.ts} (64%) create mode 100644 packages/web-components/test/playwright/fast-fixture.ts create mode 100644 packages/web-components/test/playwright/index.ts diff --git a/change/@fluentui-web-components-ec172ca8-23f3-4d01-a969-6504fa67a87a.json b/change/@fluentui-web-components-ec172ca8-23f3-4d01-a969-6504fa67a87a.json new file mode 100644 index 00000000000000..c76de2b97d0c97 --- /dev/null +++ b/change/@fluentui-web-components-ec172ca8-23f3-4d01-a969-6504fa67a87a.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Allow field states to be set regardless of connection status", + "packageName": "@fluentui/web-components", + "email": "863023+radium-v@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/package.json b/package.json index 04d47a48d532b6..c50f53823e2ddb 100644 --- a/package.json +++ b/package.json @@ -84,6 +84,7 @@ "@nx/plugin": "19.8.4", "@nx/workspace": "19.8.4", "@octokit/rest": "18.12.0", + "@oddbird/css-anchor-positioning": "0.4.0", "@phenomnomnominal/tsquery": "6.1.3", "@playwright/test": "1.49.1", "@react-native/babel-preset": "0.73.21", @@ -224,7 +225,7 @@ "enquirer": "2.3.6", "enzyme": "3.10.0", "enzyme-to-json": "3.6.2", - "esbuild": "0.20.1", + "esbuild": "0.24.2", "esbuild-loader": "4.1.0", "eslint": "8.57.0", "eslint-config-airbnb": "18.2.1", @@ -342,6 +343,7 @@ "tslib": "2.6.3", "typescript": "5.3.3", "vinyl": "2.2.0", + "vite": "6.0.7", "webpack": "5.94.0", "webpack-bundle-analyzer": "4.10.1", "webpack-cli": "5.1.4", @@ -374,7 +376,7 @@ }, "resolutions": { "@types/jest-axe/axe-core": "4.7.2", - "esbuild": "0.20.1", + "esbuild": "0.24.2", "eslint": "8.57.0", "swc-loader": "^0.2.6", "prettier": "2.8.8", diff --git a/packages/web-components/.eslintrc.json b/packages/web-components/.eslintrc.json index 056edc796cd890..464e82d9e01d93 100644 --- a/packages/web-components/.eslintrc.json +++ b/packages/web-components/.eslintrc.json @@ -35,6 +35,7 @@ } ], "comma-dangle": "off", + "prefer-const": ["error", { "destructuring": "all" }], "@typescript-eslint/no-non-null-assertion": "off", "@typescript-eslint/no-use-before-define": "off", "@typescript-eslint/no-empty-interface": "error", diff --git a/packages/web-components/README.md b/packages/web-components/README.md index 18686453cc9860..c006fd4fca9752 100644 --- a/packages/web-components/README.md +++ b/packages/web-components/README.md @@ -89,4 +89,6 @@ This is a known issue and will indicate that you need to refresh the page. We're ## Testing -When testing locally, start the dev server and in a separate terminal window, run `yarn test:dev` within the web-components folder. +On CI, a static test harness build is first generated by running Vite in build mode. The Playwright tests are then run against the generated harness. To run Playwright tests in this mode, use the command `yarn nx run web-components:e2e`. + +To run Playwright tests locally in [UI mode](https://playwright.dev/docs/test-ui-mode), use the command `yarn nx run web-components:e2e:local`. This will start a local development server with Vite and open the Playwright test runner UI. diff --git a/packages/web-components/docs/api-report.md b/packages/web-components/docs/api-report.md index 820bc3b50b27eb..9af30b224cf095 100644 --- a/packages/web-components/docs/api-report.md +++ b/packages/web-components/docs/api-report.md @@ -4060,6 +4060,8 @@ export class Tooltip extends FASTElement { mouseleaveAnchorHandler: () => void; positioning?: TooltipPositioningOption; // @internal + positioningChanged(): void; + // @internal showTooltip(delay?: number): void; } diff --git a/packages/web-components/package.json b/packages/web-components/package.json index 489e639ac1b4bb..7f7baa31a7b64a 100644 --- a/packages/web-components/package.json +++ b/packages/web-components/package.json @@ -65,6 +65,8 @@ "./package.json": "./package.json" }, "sideEffects": [ + "define.*", + "index-rollup.*", "./dist/esm/**/define.js", "./dist/web-components.js", "./dist/web-components.min.js" @@ -86,8 +88,8 @@ "start": "yarn start-storybook -p 6006 --docs", "start-storybook": "storybook dev", "build-storybook": "storybook build -o ./dist/storybook --docs", - "e2e": "playwright test", - "test:dev": "playwright test" + "e2e": "node ./scripts/e2e.js", + "e2e:local": "node ./scripts/e2e.js --ui" }, "devDependencies": { "@microsoft/fast-element": "2.0.0", diff --git a/packages/web-components/playwright.config.ts b/packages/web-components/playwright.config.ts index 0b2718305e1cae..d65b0542c15228 100644 --- a/packages/web-components/playwright.config.ts +++ b/packages/web-components/playwright.config.ts @@ -7,34 +7,26 @@ const config: PlaywrightTestConfig = { fullyParallel: process.env.CI ? false : true, timeout: process.env.CI ? 10000 : 30000, use: { - baseURL: 'http://localhost:6006/iframe.html', - viewport: { - height: 720, - width: 1280, - }, + baseURL: 'http://localhost:5173', }, projects: [ { name: 'chromium', use: { ...devices['Desktop Chrome'] }, - testMatch: /.*\.spec\.ts$/, }, { name: 'firefox', use: { ...devices['Desktop Firefox'] }, - testMatch: [/set-theme\.spec\.ts$/], }, { name: 'webkit', use: { ...devices['Desktop Safari'] }, - testMatch: [/set-theme\.spec\.ts$/], }, ], webServer: { - // double-quotes are required for Windows - command: `node -e "import('express').then(({ default: e }) => e().use(e.static('./dist/storybook')).listen(6006))"`, - port: 6006, - reuseExistingServer: process.env.CI ? false : true, + command: 'yarn vite preview test/harness', + port: 5173, + reuseExistingServer: true, }, }; diff --git a/packages/web-components/project.json b/packages/web-components/project.json index 7c4ed6163142b0..00d105f89146e9 100644 --- a/packages/web-components/project.json +++ b/packages/web-components/project.json @@ -3,8 +3,5 @@ "$schema": "../../node_modules/nx/schemas/project-schema.json", "projectType": "library", "implicitDependencies": [], - "tags": ["platform:web", "web-components"], - "targets": { - "e2e": { "dependsOn": ["build-storybook"] } - } + "tags": ["platform:web", "web-components"] } diff --git a/packages/web-components/scripts/e2e.js b/packages/web-components/scripts/e2e.js new file mode 100644 index 00000000000000..ee17b49eb8446d --- /dev/null +++ b/packages/web-components/scripts/e2e.js @@ -0,0 +1,38 @@ +/* eslint-env node */ +import { execSync, spawn } from 'node:child_process'; + +const uiMode = process.argv.includes('--ui'); + +try { + // UI Mode runs Vite in development mode and Playwright in UI mode, in parallel + if (uiMode) { + const vite = spawn('vite', ['serve', 'test/harness'], { stdio: 'inherit' }); + const playwright = spawn('playwright', ['test', '--ui'], { stdio: 'inherit' }); + + // Forward the exit codes if the child processes exit + vite.on('exit', code => process.exit(code)); + playwright.on('exit', code => process.exit(code)); + + // Close the processes when the parent process exits + process.on('exit', () => { + vite.kill(); + playwright.kill(); + process.exit(0); + }); + + // Run both processes in parallel + Promise.all([vite, playwright]); + } + + // E2E Mode first builds the test harness with Vite and then runs the tests with Playwright + if (!uiMode) { + // Build the test harness + execSync(`vite build test/harness`, { stdio: 'inherit' }); + + // Run the tests + execSync(`playwright test`, { stdio: 'inherit' }); + } +} catch (err) { + console.error(err); + process.exit(1); +} diff --git a/packages/web-components/src/accordion-item/accordion-item.spec.ts b/packages/web-components/src/accordion-item/accordion-item.spec.ts index c504df0a12c7b7..717eb76a9ba157 100644 --- a/packages/web-components/src/accordion-item/accordion-item.spec.ts +++ b/packages/web-components/src/accordion-item/accordion-item.spec.ts @@ -1,23 +1,18 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import type { AccordionItem } from './accordion-item.js'; +import { expect, test } from '../../test/playwright/index.js'; +import { AccordionItem } from './accordion-item.js'; +import { AccordionItemSize } from './accordion-item.options.js'; test.describe('Accordion item', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-accordion--accordion')); - - await page.waitForFunction(() => - Promise.all([ - customElements.whenDefined('fluent-accordion'), - customElements.whenDefined('fluent-accordion-item'), - ]), - ); + test.use({ + innerHTML: 'Hello, World!', + tagName: 'fluent-accordion-item', + waitFor: ['fluent-accordion-item'], }); - test('should set a default heading level of 2 when `headinglevel` is not provided', async ({ page }) => { - const element = page.locator('fluent-accordion-item'); + test('should set a default heading level of 2 when `headinglevel` is not provided', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-accordion> <fluent-accordion-item> <span slot="heading">Heading 1</span> @@ -30,38 +25,29 @@ test.describe('Accordion item', () => { }); test('should set the `aria-level` attribute on the internal heading element equal to the heading level', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-accordion-item'); - const heading = page.locator(`[role="heading"]`); - - await page.setContent(/* html */ ` - <fluent-accordion> - <fluent-accordion-item> - <span slot="heading">Heading 1</span> - <div>Content 1</div> - </fluent-accordion-item> - </fluent-accordion> - `); - - await element.evaluate<void, AccordionItem>(node => { - node.headinglevel = 3; + const { element } = fastPage; + const heading = element.locator(`[role="heading"]`); + + await fastPage.setTemplate({ + attributes: { 'heading-level': '3' }, + innerHTML: /* html */ ` + <span slot="heading">Heading 1</span> + <div>Content 1</div> + `, }); await expect(heading).toHaveAttribute('aria-level', '3'); }); test('should set `aria-expanded` property on the internal control equal to the `expanded` property', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-accordion-item'); + const { element } = fastPage; const button = element.locator('button'); - await page.setContent(/* html */ ` - <fluent-accordion> - <fluent-accordion-item expanded></fluent-accordion-item> - </fluent-accordion> - `); + await fastPage.setTemplate({ attributes: { expanded: true } }); await expect(button).toHaveAttribute('aria-expanded', 'true'); @@ -72,16 +58,13 @@ test.describe('Accordion item', () => { await expect(button).toHaveAttribute('aria-expanded', 'false'); }); - test('should set `disabled` attribute on the internal control equal to the `disabled` property', async ({ page }) => { - const element = page.locator('fluent-accordion-item'); - const button = element.locator('button'); + test('should set `disabled` attribute on the internal control equal to the `disabled` property', async ({ + fastPage, + }) => { + const { element } = fastPage; + const button = fastPage.element.locator('button'); - await page.setContent(/* html */ ` - <fluent-accordion> - <fluent-accordion-item disabled></fluent-accordion-item> - <fluent-accordion> </fluent-accordion - ></fluent-accordion> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await expect(button).toHaveAttribute('disabled'); @@ -92,14 +75,14 @@ test.describe('Accordion item', () => { await expect(button).not.toHaveAttribute('disabled'); }); - test('accordion-item should NOT be expandable via click when accordion is disabled', async ({ page }) => { - const element = page.locator('fluent-accordion-item'); + test('accordion-item should NOT be expandable via click when accordion is disabled', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-accordion> - <fluent-accordion-item></fluent-accordion-item> - <fluent-accordion-item disabled></fluent-accordion-item> - <fluent-accordion-item></fluent-accordion-item> + <fluent-accordion-item>Item 1</fluent-accordion-item> + <fluent-accordion-item disabled>Item 2</fluent-accordion-item> + <fluent-accordion-item>Item 3</fluent-accordion-item> </fluent-accordion> `); const firstItem = element.nth(0); @@ -117,13 +100,13 @@ test.describe('Accordion item', () => { await expect(firstItem).toHaveJSProperty('expanded', true); }); - test('should set internal properties to match the id when provided', async ({ page }) => { - const element = page.locator('fluent-accordion-item'); + test('should set internal properties to match the id when provided', async ({ fastPage }) => { + const { element } = fastPage; const button = element.locator('button'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-accordion> - <fluent-accordion-item id="foo"></fluent-accordion-item> + <fluent-accordion-item id="foo">Item 1</fluent-accordion-item> </fluent-accordion> `); @@ -131,78 +114,61 @@ test.describe('Accordion item', () => { await expect(button).toHaveId('foo'); }); - test('should set the size attribute to the provided size value', async ({ page }) => { - const element = page.locator('fluent-accordion-item'); + for (const size of Object.values(AccordionItemSize)) { + test(`should set the \`size\` property to "${size}" when the attribute is set to "${size}"`, async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion> - <fluent-accordion-item></fluent-accordion-item> - </fluent-accordion> - `); + await fastPage.setTemplate({ attributes: { size } }); - await element.evaluate<void, AccordionItem>(node => { - node.size = 'small'; - }); - await expect(element).toHaveAttribute('size', 'small'); - await expect(element).toHaveJSProperty('size', 'small'); + await expect(element).toHaveAttribute('size', size); - await element.evaluate<void, AccordionItem>(node => { - node.size = 'medium'; + await expect(element).toHaveJSProperty('size', size); }); + } - await expect(element).toHaveAttribute('size', 'medium'); - await expect(element).toHaveJSProperty('size', 'medium'); + test('should set the `block` property when the `block` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate<void, AccordionItem>(node => { - node.size = 'large'; - }); - await expect(element).toHaveAttribute('size', 'large'); - await expect(element).toHaveJSProperty('size', 'large'); + await fastPage.setTemplate({ attributes: { block: true } }); - await element.evaluate<void, AccordionItem>(node => { - node.size = 'extra-large'; - }); - await expect(element).toHaveAttribute('size', 'extra-large'); - await expect(element).toHaveJSProperty('size', 'extra-large'); - }); + await expect(element).toHaveAttribute('block'); - test('should set the block attribute when block is set to true', async ({ page }) => { - const element = page.locator('fluent-accordion-item'); + await expect(element).toHaveJSProperty('block', true); - await page.setContent(/* html */ ` - <fluent-accordion> - <fluent-accordion-item block></fluent-accordion-item> - </fluent-accordion> - `); + await test.step('should remove the `block` attribute when the `block` property is set to `false`', async () => { + await element.evaluate<void, AccordionItem>(node => { + node.block = false; + }); - await expect(element).toHaveAttribute('block'); - await expect(element).toHaveJSProperty('block', true); + await expect(element).not.toHaveAttribute('block'); - await element.evaluate<void, AccordionItem>(node => { - node.block = false; + await expect(element).toHaveJSProperty('block', false); }); - - await expect(element).not.toHaveAttribute('block'); - await expect(element).toHaveJSProperty('block', false); }); - test('should set the marker-position attribute to the provided value', async ({ page }) => { - const element = page.locator('fluent-accordion-item'); + test('should set the `marker-position` attribute to the provided value', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion> - <fluent-accordion-item marker-position="end"></fluent-accordion-item> - </fluent-accordion> - `); + await fastPage.setTemplate({ + attributes: { + 'marker-position': 'end', + }, + }); await expect(element).toHaveAttribute('marker-position', 'end'); + await expect(element).toHaveJSProperty('markerPosition', 'end'); - await element.evaluate<void, AccordionItem>(node => { - node.markerPosition = 'start'; - }); + await test.step('should set the `marker-position` attribute to `start` when the `markerPosition` property is set to `start`', async () => { + await element.evaluate<void, AccordionItem>(node => { + node.markerPosition = 'start'; + }); - await expect(element).toHaveAttribute('marker-position', 'start'); - await expect(element).toHaveJSProperty('markerPosition', 'start'); + await expect(element).toHaveAttribute('marker-position', 'start'); + + await expect(element).toHaveJSProperty('markerPosition', 'start'); + }); }); }); diff --git a/packages/web-components/src/accordion/accordion.spec.ts b/packages/web-components/src/accordion/accordion.spec.ts index 26e9733fbedc41..aa4ded2142cd82 100644 --- a/packages/web-components/src/accordion/accordion.spec.ts +++ b/packages/web-components/src/accordion/accordion.spec.ts @@ -1,25 +1,17 @@ -import type { Locator } from '@playwright/test'; -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; test.describe('Accordion', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-accordion--accordion')); - - await page.waitForFunction(() => - Promise.all([ - customElements.whenDefined('fluent-accordion'), - customElements.whenDefined('fluent-accordion-item'), - customElements.whenDefined('fluent-checkbox'), - ]), - ); + test.use({ + innerHTML: 'Hello, World!', + tagName: 'fluent-accordion', }); - test('should set an expand mode of `multi` when passed to the `expand-mode` attribute', async ({ page }) => { - const element = page.locator('fluent-accordion'); + test('should set an expand mode of `multi` when passed to the `expand-mode` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="multi"> + await fastPage.setTemplate({ + attributes: { 'expand-mode': 'multi' }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -28,19 +20,21 @@ test.describe('Accordion', () => { <span slot="heading">Heading 2</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); await expect(element).toHaveAttribute('expand-mode', 'multi'); }); - test('should open/close appropriate accordion items on Enter key in multiple expand mode', async ({ page }) => { - const accordionItems = page.locator('fluent-accordion-item') as Locator; + test('should open/close appropriate accordion items on Enter key in single expand mode', async ({ fastPage }) => { + const { element } = fastPage; + const accordionItems = element.locator('fluent-accordion-item'); const firstItem = accordionItems.nth(0); const secondItem = accordionItems.nth(1); - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> + await fastPage.setTemplate({ + attributes: { 'expand-mode': 'single' }, + innerHTML: /* html */ ` <fluent-accordion-item tabindex="0" id="item-one"> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -49,17 +43,15 @@ test.describe('Accordion', () => { <span slot="heading">Heading 1</span> <div>Content 1</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); await expect(firstItem).toHaveAttribute('expanded'); await expect(firstItem).toHaveJSProperty('expanded', true); await expect(secondItem).not.toHaveAttribute('expanded'); await expect(secondItem).toHaveJSProperty('expanded', false); - await firstItem.evaluate(node => { - node.focus(); - }); + await firstItem.focus(); await expect(firstItem).toBeFocused(); @@ -71,13 +63,15 @@ test.describe('Accordion', () => { await expect(secondItem).toHaveJSProperty('expanded', true); }); - test('should open/close appropriate accordion items on Enter key in single expand mode', async ({ page }) => { - const accordionItems = page.locator('fluent-accordion-item') as Locator; + test('should open/close appropriate accordion items on Enter key in multi expand mode', async ({ fastPage }) => { + const { element } = fastPage; + const accordionItems = element.locator('fluent-accordion-item'); const firstItem = accordionItems.nth(0); const secondItem = accordionItems.nth(1); - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="multi"> + await fastPage.setTemplate({ + attributes: { 'expand-mode': 'multi' }, + innerHTML: /* html */ ` <fluent-accordion-item tabindex="0" id="item-one"> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -86,8 +80,8 @@ test.describe('Accordion', () => { <span slot="heading">Heading 1</span> <div>Content 1</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); await expect(firstItem).toHaveJSProperty('expanded', false); await expect(firstItem).not.toHaveAttribute('expanded'); @@ -110,11 +104,11 @@ test.describe('Accordion', () => { await expect(firstItem).toHaveJSProperty('expanded', false); }); - test('should set an expand mode of `single` when passed to the `expand-mode` attribute', async ({ page }) => { - const element = page.locator('fluent-accordion'); - - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> + test('should set an expand mode of `single` when passed to the `expand-mode` attribute', async ({ fastPage }) => { + const { element } = fastPage; + await fastPage.setTemplate({ + attributes: { 'expand-mode': 'single' }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -123,17 +117,19 @@ test.describe('Accordion', () => { <span slot="heading">Heading 2</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); await expect(element).toHaveAttribute('expand-mode', 'single'); }); - test('should set a default expand mode of `multi` when `expand-mode` attribute is not passed', async ({ page }) => { - const element = page.locator('fluent-accordion'); + test('should set a default expand mode of `multi` when `expand-mode` attribute is not passed', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -142,19 +138,21 @@ test.describe('Accordion', () => { <span slot="heading">Heading 2</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); await expect(element).toHaveJSProperty('expandmode', 'multi'); await expect(element).toHaveAttribute('expand-mode', 'multi'); }); - test('should expand/collapse items when clicked in multi mode', async ({ page }) => { - const element = page.locator('fluent-accordion'); + test('should expand/collapse items when clicked in multi mode', async ({ fastPage }) => { + const { element } = fastPage; + const items = element.locator('fluent-accordion-item'); - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="multi"> + await fastPage.setTemplate({ + attributes: { 'expand-mode': 'multi' }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -163,10 +161,8 @@ test.describe('Accordion', () => { <span slot="heading">Heading 2</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); - - const items = element.locator('fluent-accordion-item'); + `, + }); await items.nth(0).click(); @@ -177,11 +173,15 @@ test.describe('Accordion', () => { await expect(items.nth(1)).toHaveAttribute('expanded'); }); - test('should only have one expanded item in single mode', async ({ page }) => { - const element = page.locator('fluent-accordion'); + test('should only have one expanded item in single mode', async ({ fastPage }) => { + const { element } = fastPage; + const items = element.locator('fluent-accordion-item'); + const firstItem = items.nth(0); + const secondItem = items.nth(1); - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> + await fastPage.setTemplate({ + attributes: { 'expand-mode': 'single' }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -190,14 +190,8 @@ test.describe('Accordion', () => { <span slot="heading">Heading 2</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); - - const items = element.locator('fluent-accordion-item'); - - const firstItem = items.nth(0); - - const secondItem = items.nth(1); + `, + }); await firstItem.click(); @@ -214,11 +208,12 @@ test.describe('Accordion', () => { await expect(secondItem).toHaveAttribute('expanded'); }); - test("should set the expanded items' button to aria-disabled when in single expand mode", async ({ page }) => { - const element = page.locator('fluent-accordion'); + test("should set the expanded items' button to aria-disabled when in single expand mode", async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> + await fastPage.setTemplate({ + attributes: { 'expand-mode': 'single' }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -227,8 +222,8 @@ test.describe('Accordion', () => { <span slot="heading">Heading 2</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); const items = element.locator('fluent-accordion-item'); @@ -255,12 +250,13 @@ test.describe('Accordion', () => { }); test("should remove an expanded items' expandbutton aria-disabled attribute when expand mode changes from single to multi", async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-accordion'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> + await fastPage.setTemplate({ + attributes: { 'expand-mode': 'single' }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -269,8 +265,8 @@ test.describe('Accordion', () => { <span slot="heading">Heading 2</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); const items = element.locator('fluent-accordion-item'); @@ -289,11 +285,16 @@ test.describe('Accordion', () => { await expect(firstItem.locator('button')).not.toHaveAttribute('aria-disabled'); }); - test('should set the first item as expanded if no child is expanded by default in single mode', async ({ page }) => { - const element = page.locator('fluent-accordion'); + test('should set the first item as expanded if no child is expanded by default in single mode', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> + await fastPage.setTemplate({ + attributes: { + 'expand-mode': 'single', + }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -302,8 +303,8 @@ test.describe('Accordion', () => { <span slot="heading">Heading 2</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); const items = element.locator('fluent-accordion-item'); @@ -322,11 +323,14 @@ test.describe('Accordion', () => { await expect(secondItem).toHaveAttribute('expanded'); }); - test('should set the first item with an expanded attribute to expanded in single mode', async ({ page }) => { - const element = page.locator('fluent-accordion'); + test('should set the first item with an expanded attribute to expanded in single mode', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> + await fastPage.setTemplate({ + attributes: { + 'expand-mode': 'single', + }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -339,8 +343,8 @@ test.describe('Accordion', () => { <span slot="heading">Heading 3</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); const items = element.locator('fluent-accordion-item'); @@ -357,13 +361,14 @@ test.describe('Accordion', () => { await expect(thirdItem).not.toHaveAttribute('expanded'); }); - test('should allow disabled items to be expanded when in single mode', async ({ page }) => { - test.slow(); - - const element = page.locator('fluent-accordion'); + test('should allow disabled items to be expanded when in single mode', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> + await fastPage.setTemplate({ + attributes: { + 'expand-mode': 'single', + }, + innerHTML: /* html */ ` <fluent-accordion-item> <span slot="heading">Heading 1</span> <div>Content 1</div> @@ -376,8 +381,8 @@ test.describe('Accordion', () => { <span slot="heading">Heading 3</span> <div>Content 2</div> </fluent-accordion-item> - </fluent-accordion> - `); + `, + }); const items = element.locator('fluent-accordion-item'); @@ -404,25 +409,27 @@ test.describe('Accordion', () => { await expect(thirdItem).not.toHaveAttribute('expanded'); }); - test('should ignore `change` events from components other than accordion items', async ({ page }) => { - const element = page.locator('fluent-accordion'); - - await page.setContent(/* html */ ` - <fluent-accordion expand-mode="single"> - <fluent-accordion-item> - <div slot="heading">Accordion Item 1 Heading</div> - Accordion Item 1 Content - </fluent-accordion-item> - <fluent-accordion-item> - <div slot="heading">Accordion Item 2 Heading</div> - <fluent-checkbox>A checkbox as content</fluent-checkbox> - </fluent-accordion-item> - </fluent-accordion> - `); + test('should ignore `change` events from components other than accordion items', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-accordion expand-mode="single"> + <fluent-accordion-item> + <div slot="heading">Accordion Item 1 Heading</div> + Accordion Item 1 Content + </fluent-accordion-item> + <fluent-accordion-item> + <div slot="heading">Accordion Item 2 Heading</div> + <fluent-checkbox>A checkbox as content</fluent-checkbox> + </fluent-accordion-item> + </fluent-accordion> + `, + }); const item = element.locator('fluent-accordion-item').nth(1); - const button = item.locator(`button[part="button"]`); + const button = item.locator('button[part="button"]'); await button.click(); diff --git a/packages/web-components/src/anchor-button/anchor-button.spec.ts b/packages/web-components/src/anchor-button/anchor-button.spec.ts index e1ab92514051a5..8d35827ab34ce1 100644 --- a/packages/web-components/src/anchor-button/anchor-button.spec.ts +++ b/packages/web-components/src/anchor-button/anchor-button.spec.ts @@ -1,147 +1,225 @@ -import { spinalCase } from '@microsoft/fast-web-utilities'; -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; - -const proxyAttributes = { - href: 'href', - ping: 'ping', - hreflang: 'en-GB', - referrerpolicy: 'no-referrer', - rel: 'external', - target: '_blank', - type: 'foo', -}; - -// Regular Attributes -const attributes = { - appearance: 'primary', - shape: 'rounded', - size: 'medium', - ...proxyAttributes, -}; - -// Boolean Attributes -const booleanAttributes = { - iconOnly: true, -}; +import { expect, test } from '../../test/playwright/index.js'; +import { AnchorButtonAppearance, AnchorButtonShape, AnchorButtonSize } from './anchor-button.options.js'; test.describe('Anchor Button', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-button-anchor--anchor-button')); + test.use({ + innerHTML: 'Fluent Anchor Button', + tagName: 'fluent-anchor-button', + }); + + test('should set the `href` property to match the `href` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { href: '#foo' } }); + + await expect(element).toHaveJSProperty('href', '#foo'); + + await test.step('should set the `href` property and attribute on the internal anchor element', async () => { + const anchor = element.locator('a'); + + await expect(anchor).toHaveAttribute('href', '#foo'); + }); + }); + + test('should set the `hreflang` property to match the `hreflang` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { hreflang: 'en-GB' } }); + + await expect(element).toHaveJSProperty('hreflang', 'en-GB'); + + await test.step('should set the `hreflang` property and attribute on the internal anchor element', async () => { + const anchor = element.locator('a'); + + await expect(anchor).toHaveAttribute('hreflang', 'en-GB'); + }); + }); + + test('should set the `ping` property to match the `ping` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await page.waitForFunction(() => customElements.whenDefined('fluent-anchor-button')); + await fastPage.setTemplate({ attributes: { ping: 'ping' } }); + + await expect(element).toHaveJSProperty('ping', 'ping'); + + await test.step('should set the `ping` property and attribute on the internal anchor element', async () => { + const anchor = element.locator('a'); + + await expect(anchor).toHaveAttribute('ping', 'ping'); + }); + }); + + test('should set the `referrerpolicy` property to match the `referrerpolicy` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { referrerpolicy: 'no-referrer' } }); + + await expect(element).toHaveJSProperty('referrerpolicy', 'no-referrer'); + + await test.step('should set the `referrerpolicy` property and attribute on the internal anchor element', async () => { + const anchor = element.locator('a'); + + await expect(anchor).toHaveAttribute('referrerpolicy', 'no-referrer'); + }); }); - for (const [attribute, value] of Object.entries(attributes)) { - const attributeSpinalCase = spinalCase(attribute); + test('should set the `rel` property to match the `rel` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { rel: 'external' } }); - test(`should set the regular attribute: \`${attributeSpinalCase}\` to \`${value}\` on the element`, async ({ - page, + await expect(element).toHaveJSProperty('rel', 'external'); + + await test.step('should set the `rel` property and attribute on the internal anchor element', async () => { + const anchor = element.locator('a'); + + await expect(anchor).toHaveAttribute('rel', 'external'); + }); + }); + + test('should set the `target` property to match the `target` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { target: '_blank' } }); + + await expect(element).toHaveJSProperty('target', '_blank'); + + await test.step('should set the `target` property and attribute on the internal anchor element', async () => { + const anchor = element.locator('a'); + + await expect(anchor).toHaveAttribute('target', '_blank'); + }); + }); + + test('should set the `type` property to match the `type` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { type: 'foo' } }); + + await expect(element).toHaveJSProperty('type', 'foo'); + + await test.step('should set the `type` property and attribute on the internal anchor element', async () => { + const anchor = element.locator('a'); + + await expect(anchor).toHaveAttribute('type', 'foo'); + }); + }); + + test('should set the `iconOnly` property to match the `icon-only` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { 'icon-only': true } }); + + await expect(element).toHaveJSProperty('iconOnly', true); + }); + + for (const appearance of Object.values(AnchorButtonAppearance)) { + test(`should set the \`appearance\` property to "${appearance}" when the attribute is set to "${appearance}"`, async ({ + fastPage, }) => { - const element = page.locator('fluent-anchor-button'); + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { appearance } }); - await page.setContent(/* html */ ` - <fluent-anchor-button ${attributeSpinalCase}="${value}"></fluent-anchor-button> - `); + await expect(element).toHaveJSProperty('appearance', appearance); - await expect(element).toHaveJSProperty(`${attribute}`, `${value}`); + await expect(element).toHaveCustomState(appearance); }); } - // Boolean attributes - for (const [attribute, value] of Object.entries(booleanAttributes)) { - const attributeSpinalCase = spinalCase(attribute); + for (const shape of Object.values(AnchorButtonShape)) { + test(`should set the \`shape\` property to "${shape}" when the attribute is set to "${shape}"`, async ({ + fastPage, + }) => { + const { element } = fastPage; - test(`should set the boolean attribute: \`${attributeSpinalCase}\` to \`${value}\``, async ({ page }) => { - const element = page.locator('fluent-anchor-button'); + await fastPage.setTemplate({ attributes: { shape } }); - await page.setContent(/* html */ ` - <fluent-anchor-button ${attributeSpinalCase}></fluent-anchor-button> - `); + await expect(element).toHaveJSProperty('shape', shape); - await expect(element).toHaveJSProperty(attribute, value); + await expect(element).toHaveCustomState(shape); }); } - for (const [attribute, value] of Object.entries(proxyAttributes)) { - test(`should set the regular attribute: \`${attribute}\` to \`${value}\` on the internal proxy`, async ({ - page, + for (const size of Object.values(AnchorButtonSize)) { + test(`should set the \`size\` property to "${size}" when the attribute is set to "${size}"`, async ({ + fastPage, }) => { - const element = page.locator('fluent-anchor-button'); - const proxy = element.locator('a'); + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { size } }); - await page.setContent(/* html */ ` - <fluent-anchor-button ${attribute}="${value}"></fluent-anchor-button> - `); + await expect(element).toHaveJSProperty('size', size); - await expect(proxy).toHaveAttribute(`${attribute}`, `${value}`); + await expect(element).toHaveCustomState(size); }); } - test('should navigate to the provided url when clicked', async ({ page }) => { - const element = page.locator('fluent-anchor-button'); + test('should navigate to the provided url when clicked', async ({ fastPage, page }) => { + const { element } = fastPage; + const expectedUrl = '#foo'; - await page.setContent(/* html */ ` - <fluent-anchor-button href="${expectedUrl}"></fluent-anchor-button> - `); + await fastPage.setTemplate({ attributes: { href: expectedUrl } }); await element.click(); - expect(page.url()).toContain(expectedUrl); + await expect(page).toHaveURL(expectedUrl); }); - // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 - test.skip('should navigate to the provided url when clicked while pressing the `Control` key on Windows or Meta on Mac', async ({ - page, + test('should navigate to the provided url when clicked while pressing the `Control` key on Windows or `Meta` on Mac', async ({ + fastPage, context, }) => { - const element = page.locator('fluent-anchor-button'); + const { element } = fastPage; + const expectedUrl = '#foo'; - await page.setContent(/* html */ ` - <fluent-anchor-button href="${expectedUrl}"></fluent-anchor-button> - `); + await fastPage.setTemplate({ attributes: { href: expectedUrl } }); - const [newPage] = await Promise.all([ - context.waitForEvent('page'), - element.click({ modifiers: ['ControlOrMeta'] }), - ]); + const newPagePromise = context.waitForEvent('page'); - expect(newPage.url()).toContain(expectedUrl); + await element.click({ modifiers: ['ControlOrMeta'] }); + + const newPage = await newPagePromise; + + await expect(newPage).toHaveURL(expectedUrl); }); - test('should navigate to the provided url when `Enter` is pressed via keyboard', async ({ page }) => { - const element = page.locator('fluent-anchor-button'); + test('should navigate to the provided url when `Enter` is pressed via keyboard', async ({ fastPage, page }) => { + const { element } = fastPage; + const expectedUrl = '#foo'; - await page.setContent(/* html */ ` - <fluent-anchor-button href="${expectedUrl}"></fluent-anchor-button> - `); + await fastPage.setTemplate({ attributes: { href: expectedUrl } }); await element.focus(); await element.press('Enter'); - expect(page.url()).toContain(expectedUrl); + await expect(page).toHaveURL(expectedUrl); }); - // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 - test.skip('should navigate to the provided url when `ctrl` and `Enter` are pressed via keyboard', async ({ - page, + test('should navigate to the provided url when `ctrl` and `Enter` are pressed via keyboard', async ({ + fastPage, context, }) => { - const element = page.locator('fluent-anchor-button'); + const { element } = fastPage; + const expectedUrl = '#foo'; - await page.setContent(/* html */ ` - <fluent-anchor-button href="${expectedUrl}"></fluent-anchor-button> - `); + await fastPage.setTemplate({ attributes: { href: expectedUrl } }); + + const newPagePromise = context.waitForEvent('page'); await element.focus(); - const [newPage] = await Promise.all([context.waitForEvent('page'), element.press('ControlOrMeta+Enter')]); + await expect(element).toBeFocused(); + + await element.press('Control+Enter'); + + const newPage = await newPagePromise; - expect(newPage.url()).toContain(expectedUrl); + await expect(newPage).toHaveURL(expectedUrl); }); }); diff --git a/packages/web-components/src/avatar/avatar.spec.ts b/packages/web-components/src/avatar/avatar.spec.ts index 09ba2484c82d78..80b2ab539d8018 100644 --- a/packages/web-components/src/avatar/avatar.spec.ts +++ b/packages/web-components/src/avatar/avatar.spec.ts @@ -1,210 +1,126 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import type { Avatar } from './avatar.js'; -import type { AvatarAppearance, AvatarColor, AvatarSize } from './avatar.options.js'; +import { expect, test } from '../../test/playwright/index.js'; +import { AvatarAppearance, AvatarColor, AvatarSize } from './avatar.options.js'; -test.describe('Avatar Component', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-avatar--image')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-avatar')); - }); - - const colorAttributes = { - neutral: 'neutral', - brand: 'brand', - colorful: 'colorful', - darkRed: 'dark-red', - cranberry: 'cranberry', - red: 'red', - pumpkin: 'pumpkin', - peach: 'peach', - marigold: 'marigold', - gold: 'gold', - brass: 'brass', - brown: 'brown', - forest: 'forest', - seafoam: 'seafoam', - darkGreen: 'dark-green', - lightTeal: 'light-teal', - teal: 'teal', - steel: 'steel', - blue: 'blue', - royalBlue: 'royal-blue', - cornflower: 'cornflower', - navy: 'navy', - lavender: 'lavender', - purple: 'purple', - grape: 'grape', - lilac: 'lilac', - pink: 'pink', - magenta: 'magenta', - plum: 'plum', - beige: 'beige', - mink: 'mink', - platinum: 'platinum', - anchor: 'anchor', - }; - - const appearanceAttributes = { - ring: 'ring', - shadow: 'shadow', - ringShadow: 'ring-shadow', - }; - - const sizeAttributes = { - _16: 16, - _20: 20, - _24: 24, - _28: 28, - _32: 32, - _36: 36, - _40: 40, - _48: 48, - _56: 56, - _64: 64, - _72: 72, - _96: 96, - _120: 120, - _128: 128, - }; - - test('should render without crashing', async ({ page }) => { - const element = page.locator('fluent-avatar'); - await page.setContent(/* html */ ` - <fluent-avatar></fluent-avatar> - `); - - await expect(element).toBeVisible(); +test.describe('Avatar', () => { + test.use({ + tagName: 'fluent-avatar', }); - test('should have a role of img', async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('should have a `role` of `img`', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', 'img'); }); test('When no name value is set, should render with custom initials based on the provided initials value', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-avatar'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-avatar initials="JD"></fluent-avatar> - `); + await fastPage.setTemplate({ attributes: { initials: 'JD' } }); - await expect(element).toHaveText('JD'); + await expect(element).toContainText('JD'); }); - test('When name value is set, should generate initials based on the provided name value', async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('When name value is set, should generate initials based on the provided name value', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-avatar name="John Doe"></fluent-avatar> - `); + await fastPage.setTemplate({ attributes: { name: 'John Doe' } }); - await expect(element).toHaveText('JD'); + await expect(element).toContainText('JD'); }); - test('When name value and custom initials are set, should prioritize the provided initials', async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('When `name` and `initials` attributes are both set, should prioritize the provided initials', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-avatar name="Julie Wright" initials="JJ"></fluent-avatar> - `); + await fastPage.setTemplate({ attributes: { initials: 'JJ', name: 'Julie Wright' } }); - await expect(element).toHaveText('JJ'); + await expect(element).toContainText('JJ'); }); - test('should render correctly in active state', async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('should set the `active` property to `active` when the `active` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Avatar) => { - node.active = 'active'; - }); + await fastPage.setTemplate({ attributes: { active: 'active' } }); await expect(element).toHaveJSProperty('active', 'active'); }); - test('should render correctly in inactive state', async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('should set the `active` property to `inactive` when the `active` attribute is set to `inactive`', async ({ + fastPage, + }) => { + const { element } = fastPage; - await element.evaluate((node: Avatar) => { - node.active = 'inactive'; - }); + await fastPage.setTemplate({ attributes: { active: 'inactive' } }); await expect(element).toHaveJSProperty('active', 'inactive'); }); - test('default color should be neutral', async ({ page }) => { - const element = page.locator('fluent-avatar'); - - await expect(element).toHaveCustomState('neutral'); + test('should have a custom state of `neutral` when no color is provided', async ({ fastPage }) => { + await expect(fastPage.element).toHaveCustomState('neutral'); }); - test('should add a custom state of `brand` when `brand is provided as the color', async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('should add a custom state of `brand` when `brand is provided as the color', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-avatar color-id="pumpkin" name="John Doe" color="brand"></fluent-avatar> - `); + await fastPage.setTemplate({ attributes: { color: 'brand', 'color-id': 'pumpkin', name: 'John Doe' } }); await expect(element).toHaveCustomState('brand'); }); - test('should prioritize color derivation from colorId over name when set to "colorful"', async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('should prioritize color derivation from `colorId` over `name` when set to "colorful"', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-avatar color-id="pumpkin" name="Steve Smith" color="colorful"></fluent-avatar> - `); + await fastPage.setTemplate({ attributes: { color: 'colorful', 'color-id': 'pumpkin', name: 'Steve Smith' } }); await expect(element).toHaveCustomState('pumpkin'); }); - test(`should set the color attribute on the internal control`, async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('should set the `color` property to match the `color` attribute', async ({ fastPage }) => { + const { element } = fastPage; - for (const [, value] of Object.entries(colorAttributes)) { - await test.step(value, async () => { - await element.evaluate((node: Avatar, colorValue: string) => { - node.color = colorValue as AvatarColor; - }, value as string); + for (const color of Object.values(AvatarColor)) { + await test.step(`should set the \`color\` property to \`${color}\``, async () => { + await fastPage.setTemplate({ attributes: { color } }); - await expect(element).toHaveJSProperty('color', `${value}`); + await expect(element).toHaveAttribute('color', color); - await expect(element).toHaveAttribute('color', `${value}`); + await expect(element).toHaveJSProperty('color', color); + + // eslint-disable-next-line playwright/no-conditional-in-test + if (color !== AvatarColor.colorful) { + await expect.soft(element).toHaveCustomState(color); + } }); } }); - test(`should set the size attribute on the internal control`, async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - for (const [, value] of Object.entries(sizeAttributes)) { - await test.step(`${value}`, async () => { - await element.evaluate((node: Avatar, sizeValue: number) => { - node.size = sizeValue as AvatarSize; - }, value as number); + for (const size of Object.values(AvatarSize)) { + await test.step(`should set the \`size\` property to \`${size}\``, async () => { + await fastPage.setTemplate({ attributes: { size: `${size}` } }); - await expect(element).toHaveJSProperty('size', value); + await expect(element).toHaveAttribute('size', `${size}`); - await expect(element).toHaveAttribute('size', `${value}`); + await expect(element).toHaveJSProperty('size', size); }); } }); - test(`should set and reflect the appearance attribute on the internal control`, async ({ page }) => { - const element = page.locator('fluent-avatar'); + test('should set the `appearance` property to match the `appearance` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const appearance of Object.values(AvatarAppearance)) { + await test.step(appearance, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); - for (const [, value] of Object.entries(appearanceAttributes)) { - await test.step(value, async () => { - await element.evaluate((node: Avatar, appearanceValue: string) => { - node.appearance = appearanceValue as AvatarAppearance; - }, value as string); + await expect(element).toHaveJSProperty('appearance', appearance); - await expect(element).toHaveJSProperty('appearance', `${value}`); - await expect(element).toHaveAttribute('appearance', `${value}`); + await expect(element).toHaveAttribute('appearance', appearance); }); } }); diff --git a/packages/web-components/src/badge/badge.spec.ts b/packages/web-components/src/badge/badge.spec.ts index 9482c86f25bda7..1fc70715e07a60 100644 --- a/packages/web-components/src/badge/badge.spec.ts +++ b/packages/web-components/src/badge/badge.spec.ts @@ -1,20 +1,14 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import type { Badge } from './badge.js'; +import { expect, test } from '../../test/playwright/index.js'; +import { BadgeAppearance, BadgeColor, BadgeShape, BadgeSize } from './badge.options.js'; -test.describe('Badge component', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-badge--badge')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-badge')); +test.describe('Badge', () => { + test.use({ + tagName: 'fluent-badge', + innerHTML: 'Badge', }); - test('should set default attribute values', async ({ page }) => { - const element = page.locator('fluent-badge'); - - await page.setContent(/* html */ ` - <fluent-badge></fluent-badge> - `); + test('should set default attribute values', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveAttribute('appearance', 'filled'); @@ -25,187 +19,65 @@ test.describe('Badge component', () => { await expect(element).toHaveJSProperty('color', 'brand'); }); - test('should reflect color attribute and update property', async ({ page }) => { - const element = page.locator('fluent-badge'); - - await page.setContent(/* html */ ` - <fluent-badge color="brand"></fluent-badge> - `); - - await expect(element).toHaveAttribute('color', 'brand'); - - await expect(element).toHaveJSProperty('color', 'brand'); - - await element.evaluate((node: Badge) => { - node.color = 'danger'; - }); - - await expect(element).toHaveAttribute('color', 'danger'); - - await expect(element).toHaveJSProperty('color', 'danger'); - - await element.evaluate((node: Badge) => { - node.color = 'important'; - }); - - await expect(element).toHaveAttribute('color', 'important'); - - await expect(element).toHaveJSProperty('color', 'important'); - - await element.evaluate((node: Badge) => { - node.color = 'informative'; - }); + test('should set the `appearance` property to match the `appearance` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveAttribute('color', 'informative'); + for (const appearance of Object.values(BadgeAppearance)) { + await test.step(appearance, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); - await expect(element).toHaveJSProperty('color', 'informative'); + await expect(element).toHaveJSProperty('appearance', appearance); - await element.evaluate((node: Badge) => { - node.color = 'severe'; - }); - - await expect(element).toHaveAttribute('color', 'severe'); - - await expect(element).toHaveJSProperty('color', 'severe'); - - await element.evaluate((node: Badge) => { - node.color = 'subtle'; - }); - - await expect(element).toHaveAttribute('color', 'subtle'); - - await expect(element).toHaveJSProperty('color', 'subtle'); - - await element.evaluate((node: Badge) => { - node.color = 'success'; - }); - - await expect(element).toHaveAttribute('color', 'success'); - - await expect(element).toHaveJSProperty('color', 'success'); - - await element.evaluate((node: Badge) => { - node.color = 'warning'; - }); - - await expect(element).toHaveAttribute('color', 'warning'); - - await expect(element).toHaveJSProperty('color', 'warning'); + await expect(element).toHaveAttribute('appearance', appearance); + }); + } }); - test('should reflect size attribute and update property', async ({ page }) => { - const element = page.locator('fluent-badge'); - - await page.setContent(/* html */ ` - <fluent-badge size="tiny"></fluent-badge> - `); - - await expect(element).toHaveAttribute('size', 'tiny'); + test('should set the `color` property to match the `color` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveJSProperty('size', 'tiny'); + for (const color of Object.values(BadgeColor)) { + await test.step(`should set the \`color\` property to \`${color}\``, async () => { + await fastPage.setTemplate({ attributes: { color } }); - await element.evaluate((node: Badge) => { - node.size = 'extra-small'; - }); + await expect(element).toHaveAttribute('color', color); - await expect(element).toHaveAttribute('size', 'extra-small'); + await expect(element).toHaveJSProperty('color', color); - await expect(element).toHaveJSProperty('size', 'extra-small'); - - await element.evaluate((node: Badge) => { - node.size = 'small'; - }); - - await expect(element).toHaveAttribute('size', 'small'); - - await expect(element).toHaveJSProperty('size', 'small'); - - await element.evaluate((node: Badge) => { - node.size = 'medium'; - }); - - await expect(element).toHaveAttribute('size', 'medium'); - - await expect(element).toHaveJSProperty('size', 'medium'); - - await element.evaluate((node: Badge) => { - node.size = 'large'; - }); - - await expect(element).toHaveAttribute('size', 'large'); - - await expect(element).toHaveJSProperty('size', 'large'); - - await element.evaluate((node: Badge) => { - node.size = 'extra-large'; - }); - - await expect(element).toHaveAttribute('size', 'extra-large'); - - await expect(element).toHaveJSProperty('size', 'extra-large'); + await expect.soft(element).toHaveCustomState(color); + }); + } }); - test('should reflect appearance attribute and update property', async ({ page }) => { - const element = page.locator('fluent-badge'); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-badge appearance="filled"></fluent-badge> - `); + for (const size of Object.values(BadgeSize)) { + await test.step(`should set the \`size\` property to \`${size}\``, async () => { + await fastPage.setTemplate({ attributes: { size } }); - await expect(element).toHaveAttribute('appearance', 'filled'); + await expect(element).toHaveAttribute('size', size); - await expect(element).toHaveJSProperty('appearance', 'filled'); + await expect(element).toHaveJSProperty('size', size); - await element.evaluate((node: Badge) => { - node.appearance = 'ghost'; - }); - - await expect(element).toHaveAttribute('appearance', 'ghost'); - - await expect(element).toHaveJSProperty('appearance', 'ghost'); - - await element.evaluate((node: Badge) => { - node.appearance = 'outline'; - }); - - await expect(element).toHaveAttribute('appearance', 'outline'); - - await expect(element).toHaveJSProperty('appearance', 'outline'); - - await element.evaluate((node: Badge) => { - node.appearance = 'tint'; - }); - - await expect(element).toHaveAttribute('appearance', 'tint'); - - await expect(element).toHaveJSProperty('appearance', 'tint'); + await expect(element).toHaveCustomState(size); + }); + } }); - test('should reflect shape attribute and update property', async ({ page }) => { - const element = page.locator('fluent-badge'); - - await page.setContent(/* html */ ` - <fluent-badge shape="circular"></fluent-badge> - `); - - await expect(element).toHaveAttribute('shape', 'circular'); - - await expect(element).toHaveJSProperty('shape', 'circular'); - - await element.evaluate((node: Badge) => { - node.shape = 'rounded'; - }); - - await expect(element).toHaveAttribute('shape', 'rounded'); + test('should set the `shape` property to match the `shape` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveJSProperty('shape', 'rounded'); + for (const shape of Object.values(BadgeShape)) { + await test.step(`should set the \`shape\` property to \`${shape}\``, async () => { + await fastPage.setTemplate({ attributes: { shape } }); - await element.evaluate((node: Badge) => { - node.shape = 'square'; - }); + await expect(element).toHaveAttribute('shape', shape); - await expect(element).toHaveAttribute('shape', 'square'); + await expect(element).toHaveJSProperty('shape', shape); - await expect(element).toHaveJSProperty('shape', 'square'); + await expect(element).toHaveCustomState(shape); + }); + } }); }); diff --git a/packages/web-components/src/button/button.spec.ts b/packages/web-components/src/button/button.spec.ts index 7348cb470abc50..c001ce64d9380a 100644 --- a/packages/web-components/src/button/button.spec.ts +++ b/packages/web-components/src/button/button.spec.ts @@ -1,17 +1,15 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; test.describe('Button', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-button-button--button')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-button')); + test.use({ + tagName: 'fluent-button', + innerHTML: 'Button', }); - test('should NOT submit the parent form when clicked and `type` attribute is not set', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should NOT submit the parent form when clicked and `type` attribute is not set', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> <fluent-button>Button</fluent-button> </form> @@ -19,13 +17,16 @@ test.describe('Button', () => { await element.click(); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); }); - test('should NOT submit the parent form when clicked and `type` attribute is set to "button"', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should NOT submit the parent form when clicked and `type` attribute is set to "button"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> <fluent-button type="button">Button</fluent-button> </form> @@ -33,13 +34,16 @@ test.describe('Button', () => { await element.click(); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); }); - test('should NOT submit the parent form when clicked and `type` attribute is set to "reset"', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should NOT submit the parent form when clicked and `type` attribute is set to "reset"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> <fluent-button type="reset">Button</fluent-button> </form> @@ -47,13 +51,13 @@ test.describe('Button', () => { await element.click(); - expect(page.url()).not.toMatch(/foo/); + await expect(page).not.toHaveURL(/foo/); }); - test("should submit the form with the submit button's name and value when clicked", async ({ page }) => { - const element = page.locator('fluent-button'); + test("should submit the form with the submit button's name and value when clicked", async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="test-form" action="foo"> <fluent-button type="submit" name="bar" value="baz">Button</fluent-button> </form> @@ -61,15 +65,16 @@ test.describe('Button', () => { await element.click(); - expect(page.url()).toMatch(/foo\?bar=baz$/); + await expect(page).toHaveURL(/foo\?bar=baz$/); }); test('should NOT submit a value when the `name` attribute is NOT set and the `value` attribute is set', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="test-form" action="foo"> <fluent-button type="submit" value="baz">Button</fluent-button> </form> @@ -77,39 +82,32 @@ test.describe('Button', () => { await element.click(); - expect(page.url()).toMatch(/foo\?$/); + await expect(page).toHaveURL(/foo\?$/); }); - test('should be focusable by default', async ({ page }) => { - const element = page.locator('fluent-button'); - - await page.setContent(/* html */ ` - <fluent-button>Button</fluent-button> - `); + test('should be focusable by default', async ({ fastPage }) => { + const { element } = fastPage; await element.focus(); await expect(element).toBeFocused(); }); - test('should NOT be focusable when the `disabled` attribute is present', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should NOT be focusable when the `disabled` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-button disabled>Button</fluent-button> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await element.focus(); await expect(element).not.toBeFocused(); }); - test('should apply transparency correctly when the `disabled` attribute is present', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should apply transparency correctly when the `disabled` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; + await fastPage.setTemplate({ attributes: { disabled: true } }); + const transparent = 'rgba(0, 0, 0, 0)'; - await page.setContent(/* html */ ` - <fluent-button disabled>Button</fluent-button> - `); await expect(element).not.toHaveCSS('border-color', transparent); await expect(element).not.toHaveCSS('background-color', transparent); @@ -135,24 +133,23 @@ test.describe('Button', () => { await expect(element).toHaveCSS('background-color', transparent); }); - test('should be focusable when the `disabled-focusable` attribute is present', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should be focusable when the `disabled-focusable` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-button disabled-focusable>Button</fluent-button> - `); + await fastPage.setTemplate({ attributes: { 'disabled-focusable': true } }); await element.focus(); await expect(element).toBeFocused(); }); - test('should apply transparency correctly when the `disabled-focusable` attribute is present', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should apply transparency correctly when the `disabled-focusable` attribute is present', async ({ + fastPage, + }) => { + const { element } = fastPage; + await fastPage.setTemplate({ attributes: { 'disabled-focusable': true } }); + const transparent = 'rgba(0, 0, 0, 0)'; - await page.setContent(/* html */ ` - <fluent-button disabled-focusable>Button</fluent-button> - `); await expect(element).not.toHaveCSS('border-color', transparent); await expect(element).not.toHaveCSS('background-color', transparent); @@ -178,59 +175,62 @@ test.describe('Button', () => { await expect(element).toHaveCSS('background-color', transparent); }); - test('should NOT be clickable when the `disabled` attribute is present', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should NOT be clickable when the `disabled` attribute is present', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-button disabled>Disabled Button</fluent-button> - `); - - const elementHandle = Promise.race([ - element.evaluate(node => new Promise(resolve => node.addEventListener('click', () => resolve(false)))), - new Promise(resolve => setTimeout(() => resolve(true), 10)), - ]); + await fastPage.setTemplate({ attributes: { disabled: true } }); - await element.click(); + const wasNotClicked = await page.evaluate(el => { + const event = new KeyboardEvent('click', { + bubbles: true, + cancelable: true, + view: window, + }); - const wasNotClicked = await elementHandle; + // The return value of dispatchEvent will be false if any event listener called preventDefault, or true otherwise. + return el?.dispatchEvent(event); + }, await element.elementHandle()); - expect(wasNotClicked).toBeTruthy(); + expect(wasNotClicked).toEqual(true); }); - test('should NOT be actionable via keyboard when the `disabled-focusable` attribute is present', async ({ page }) => { - const element = page.locator('fluent-button'); + for (const key of ['Enter', ' ']) { + test(`should NOT be actionable with \`${key}\` keypress when the \`disabled-focusable\` attribute is present`, async ({ + fastPage, + page, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-button disabled-focusable>Disabled Button</fluent-button> - `); + await fastPage.setTemplate({ attributes: { 'disabled-focusable': true } }); - await element.focus(); - - const elementHandle = Promise.race([ - element.evaluate(node => new Promise(resolve => node.addEventListener('keydown', () => resolve(false)))), - new Promise(resolve => setTimeout(() => resolve(true), 10)), - ]); - - await page.keyboard.press('Enter'); + await element.focus(); - const ReceivedNoKeyDownEvent = await elementHandle; + const isActionable = await page.evaluate( + ([el, key]) => { + const event = new KeyboardEvent('keypress', { + key: key as string, + bubbles: true, + cancelable: true, + view: window, + }); - expect(ReceivedNoKeyDownEvent).toBeTruthy(); + // The return value of dispatchEvent will be false if any event listener called preventDefault, or true otherwise. + return (el as HTMLElement).dispatchEvent(event); + }, + [await element.elementHandle(), key], + ); - await page.keyboard.press('Space'); + expect(isActionable).toBe(false); + }); + } - const ReceivedNoKeyDownEvent2 = await elementHandle; - - expect(ReceivedNoKeyDownEvent2).toBeTruthy(); - }); + test('should NOT receive focus when the `tabindex` is manually set to -1', async ({ fastPage, page }) => { + const element = page.locator('fluent-button', { hasText: 'Not Focusable' }); + const focusable = page.locator('fluent-button', { hasText: 'Recieves Focus' }); - test('should NOT receive focus when the `tabindex` is manually set to -1', async ({ page }) => { - const element = page.locator('fluent-button', { hasText: 'Button' }); - const focusable = page.locator('fluent-button', { hasText: 'Focusable' }); - - await page.setContent(/* html */ ` - <fluent-button>Focusable</fluent-button> - <fluent-button tabindex="-1">Button</fluent-button> + await fastPage.setTemplate(/* html */ ` + <fluent-button>Recieves Focus</fluent-button> + <fluent-button tabindex="-1">Not Focusable</fluent-button> `); await focusable.focus(); @@ -242,20 +242,18 @@ test.describe('Button', () => { await expect(element).not.toBeFocused(); }); - test('should focus the element when the `autofocus` attribute is present', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should focus the element when the `autofocus` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-button autofocus>Button</fluent-button> - `); + await fastPage.setTemplate({ attributes: { autofocus: true } }); await expect(element).toBeFocused(); }); - test('should submit the parent form when clicked and `type` attribute is set to "submit"', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should submit the parent form when clicked and `type` attribute is set to "submit"', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> <fluent-button type="submit">Submit Button</fluent-button> </form> @@ -263,14 +261,17 @@ test.describe('Button', () => { await element.click(); - expect(page.url()).toContain('foo'); + await expect(fastPage.page).toHaveURL(/foo/); }); - test('should reset the parent form when clicked and `type` attribute is set to "reset"', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should reset the parent form when clicked and `type` attribute is set to "reset"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; const input = page.locator('#text-input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <input type="text" id="text-input"> <fluent-button type="reset">Reset Button</fluent-button> @@ -289,12 +290,13 @@ test.describe('Button', () => { }); test('should NOT reset the parent form when the `type` attribute is set to "reset" and the `disabled` attribute is present', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-button'); + const { element } = fastPage; const input = page.locator('#text-input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <input type="text" id="text-input"> <fluent-button type="reset" disabled>Reset Button</fluent-button> @@ -309,27 +311,29 @@ test.describe('Button', () => { }); test('should do nothing when clicked while not in a form and the `type` attribute is set to "submit"', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo">Unrelated Form</form> <fluent-button type="submit">Submit Button</fluent-button> `); await element.click(); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); }); test('should do nothing when clicked while not in a form and the `type` attribute is set to "reset"', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-button'); + const { element } = fastPage; const input = page.locator('#text-input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> Unrelated Form <input type="text" id="text-input"> @@ -347,13 +351,13 @@ test.describe('Button', () => { await expect(input).toHaveValue('foo'); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); }); - test('should NOT submit the parent form when clicked and `disabled` attribute is present', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should NOT submit the parent form when clicked and `disabled` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> <fluent-button type="submit" disabled>Submit Button</fluent-button> </form> @@ -361,13 +365,16 @@ test.describe('Button', () => { await element.click(); - expect(page.url()).not.toContain('foo'); + await expect(fastPage.page).not.toHaveURL(/foo/); }); - test('should submit the parent form when clicked and the `form` attribute is provided', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should submit the parent form when clicked and the `form` attribute is provided', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="testform" action="foo"> <input type="text" name="testinput" value="bar"> </form> @@ -375,79 +382,76 @@ test.describe('Button', () => { <fluent-button type="submit" form="testform">Submit Button</fluent-button> `); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); await element.click(); - expect(page.url()).toContain('foo'); + await expect(page).toHaveURL(/foo/); }); - test('should override the form action when the `formaction` attribute is provided', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should override the form action when the `formaction` attribute is provided', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> <fluent-button type="submit" formaction="bar">Submit Button</fluent-button> </form> `); - expect(page.url()).not.toContain('foo'); - await element.click(); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); - expect(page.url()).toContain('bar'); + await expect(page).toHaveURL(/bar/); }); test('should override the action of the referenced form when the `formaction` and `form` attributes are provided', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="testform" action="foo"> - <input type="text" name="testinput" value="bar"> + <input type="text" name="testinput" value="baz"> </form> - <fluent-button type="submit" form="testform" formaction="bar">Submit Button</fluent-button> `); - expect(page.url()).not.toContain('foo'); - await element.click(); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); - expect(page.url()).toContain('bar'); + await expect(page).toHaveURL(/bar/); }); - test('should override the form method when the `formmethod` attribute is provided', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should override the form method when the `formmethod` attribute is provided', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo" formmethod="get"> <fluent-button type="submit" formmethod="post">Submit Button</fluent-button> </form> `); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); const method = page.waitForRequest(request => request.method() === 'POST'); await element.click(); - expect(await method).toBeTruthy(); + await expect(method).resolves.toBeTruthy(); - expect(page.url()).toContain('foo'); + await expect(page).toHaveURL(/foo/); }); test('should override the method of the referenced form when the `formmethod` and `form` attributes are provided', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="testform" action="foo" method="get"> <input type="text" name="testinput" value="bar"> </form> @@ -455,40 +459,41 @@ test.describe('Button', () => { <fluent-button type="submit" form="testform" formmethod="post">Submit Button</fluent-button> `); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); const method = page.waitForRequest(request => request.method() === 'POST'); await element.click(); - expect(await method).toBeTruthy(); + await expect(method).resolves.toBeTruthy(); - expect(page.url()).toContain('foo'); + await expect(page).toHaveURL(/foo/); }); - test('should override the form encoding when the `formenctype` attribute is provided', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should override the form encoding when the `formenctype` attribute is provided', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo" enctype="application/x-www-form-urlencoded"> <input type="text" name="testinput" value="hello world"> <fluent-button type="submit" formenctype="plain/text">Submit Button</fluent-button> </form> `); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); await element.click(); - expect(page.url()).toMatch(/foo\?testinput=hello\+world$/); + await expect(page).toHaveURL(/foo\?testinput=hello\+world$/); }); test('should override the encoding of the referenced form when the `formenctype` and `form` attributes are provided', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="testform" action="foo" enctype="application/x-www-form-urlencoded"> <input type="text" name="testinput" value="hello world"> </form> @@ -496,35 +501,36 @@ test.describe('Button', () => { <fluent-button type="submit" form="testform" formenctype="plain/text">Submit Button</fluent-button> `); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); await element.click(); - expect(page.url()).toMatch(/foo\?testinput=hello\+world$/); + await expect(page).toHaveURL(/foo\?testinput=hello\+world$/); }); - test('should override the form target when the `formtarget` attribute is provided', async ({ page }) => { - const element = page.locator('fluent-button'); + test('should override the form target when the `formtarget` attribute is provided', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo" target="_blank"> <fluent-button type="submit" formtarget="_self">Submit Button</fluent-button> </form> `); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); await element.click(); - expect(page.url()).toContain('foo'); + await expect(page).toHaveURL(/foo/); }); test('should override the target of the referenced form when the `formtarget` and `form` attributes are provided', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="testform" action="foo" target="_blank"> <input type="text" name="testinput" value="hello world"> </form> @@ -532,21 +538,22 @@ test.describe('Button', () => { <fluent-button type="submit" form="testform" formtarget="_self">Submit Button</fluent-button> `); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); await element.click(); - expect(page.url()).toContain('foo'); + await expect(page).toHaveURL(/foo/); }); test('should submit the parent form when form validation errors are present and the `formnovalidate` attribute is present', async ({ + fastPage, page, }) => { const form = page.locator('#test-form'); - const element = page.locator('fluent-button'); + const { element } = fastPage; const input = page.locator('#text-input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="test-form" action="foo"> <input id="text-input" name="input-field" type="email"> <fluent-button type="submit" formnovalidate>Button</fluent-button> @@ -555,23 +562,26 @@ test.describe('Button', () => { await input.fill('foo'); - expect(await form.evaluate((node: HTMLFormElement) => node.checkValidity())).toBeFalsy(); + const validity = await form.evaluate((node: HTMLFormElement) => node.checkValidity()); + + expect(validity).toBe(false); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); await element.click(); - expect(page.url()).toContain('foo'); + await expect(page).toHaveURL(/foo/); }); test('should submit the referenced form when form validation errors are present and the `formnovalidate` and `form` attributes are present', async ({ + fastPage, page, }) => { const form = page.locator('#test-form'); - const element = page.locator('fluent-button'); + const { element } = fastPage; const input = page.locator('#text-input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="test-form" action="foo"> <input id="text-input" name="input-field" type="email"> </form> @@ -583,20 +593,21 @@ test.describe('Button', () => { expect(await form.evaluate((node: HTMLFormElement) => node.checkValidity())).toBeFalsy(); - expect(page.url()).not.toContain('foo'); + await expect(page).not.toHaveURL(/foo/); await element.click(); - expect(page.url()).toContain('foo'); + await expect(page).toHaveURL(/foo/); }); test('should NOT submit the parent form when form validation errors are present and the `formnovalidate` is NOT present', async ({ + fastPage, page, }) => { const button = page.locator('fluent-button'); const input = page.locator('#text-input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="test-form" action="#"> <input id="text-input" name="input-field" type="email"> <fluent-button type="submit">Button</fluent-button> @@ -605,27 +616,26 @@ test.describe('Button', () => { await input.fill('foo'); - const [wasNotSubmitted] = await Promise.all([ - input.evaluate( - node => - new Promise(resolve => { - node.addEventListener('invalid', () => resolve(true)); - }), - ), + const wasNotSubmitted = input.evaluate( + node => + new Promise(resolve => { + node.addEventListener('invalid', () => resolve(true)); + }), + ); - button.click(), - ]); + await button.click(); - expect(wasNotSubmitted).toBeTruthy(); + await expect(wasNotSubmitted).resolves.toBeTruthy(); }); test('should NOT submit the referenced form when form validation errors are present and the `formnovalidate` attribute is NOT present and the `form` attribute is present', async ({ + fastPage, page, }) => { const button = page.locator('fluent-button'); const input = page.locator('#text-input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="test-form" action="#"> <input id="text-input" name="input-field" type="email"> </form> @@ -635,17 +645,15 @@ test.describe('Button', () => { await input.fill('foo'); - const [wasInvalid] = await Promise.all([ - input.evaluate( - node => - new Promise(resolve => { - node.addEventListener('invalid', () => resolve(true)); - }), - ), + const wasInvalid = input.evaluate( + node => + new Promise(resolve => { + node.addEventListener('invalid', () => resolve(true)); + }), + ); - button.click(), - ]); + await button.click(); - expect(wasInvalid).toBeTruthy(); + await expect(wasInvalid).resolves.toBeTruthy(); }); }); diff --git a/packages/web-components/src/checkbox/checkbox.spec.ts b/packages/web-components/src/checkbox/checkbox.spec.ts index 1d945a1f09bd44..8a049a2d56950f 100644 --- a/packages/web-components/src/checkbox/checkbox.spec.ts +++ b/packages/web-components/src/checkbox/checkbox.spec.ts @@ -1,212 +1,100 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Checkbox } from './checkbox.js'; +import { CheckboxShape, CheckboxSize } from './checkbox.options.js'; test.describe('Checkbox', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-checkbox--checkbox')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-checkbox')); + test.use({ + tagName: 'fluent-checkbox', }); - test('should set and retrieve the `shape` property correctly', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await expect(element).toHaveCount(1); - - await test.step('should set the `shape` property to `circular`', async () => { - await page.setContent(/* html */ ` - <fluent-checkbox shape="circular"></fluent-checkbox> - `); - - await expect(element).toHaveJSProperty('shape', 'circular'); - }); - - await test.step('should set the `shape` attribute to `square`', async () => { - await element.evaluate((node: Checkbox) => { - node.shape = 'square'; - }); - - await expect(element).toHaveAttribute('shape', 'square'); - }); - - await test.step('should unset the `shape` property when the attribute is removed', async () => { - await element.evaluate((node: Checkbox) => { - node.removeAttribute('shape'); - }); - - await expect(element).toHaveJSProperty('shape', null); - }); + test('should have a role of `checkbox`', async ({ fastPage }) => { + await expect(fastPage.element).toHaveJSProperty('elementInternals.role', 'checkbox'); }); - test('should add a custom state matching the `shape` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); - - await element.evaluate((node: Checkbox) => { - node.shape = 'circular'; - }); - - await expect(element).toHaveCustomState('circular'); - - await element.evaluate((node: Checkbox) => { - node.shape = 'square'; - }); - - await expect(element).not.toHaveCustomState('circular'); - await expect(element).toHaveCustomState('square'); - - await element.evaluate((node: Checkbox) => { - node.shape = undefined; - }); + test('should initialize to the initial value if no value property is set', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).not.toHaveCustomState('circular'); - await expect(element).not.toHaveCustomState('square'); + await expect(element).toHaveJSProperty('value', 'on'); }); - test('should set and retrieve the `size` property correctly', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should set the `shape` property to match the `shape` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Checkbox) => { - node.size = 'medium'; - }); + for (const shape of Object.values(CheckboxShape)) { + await test.step(`should set the \`shape\` property to "${shape}"`, async () => { + await fastPage.setTemplate({ + attributes: { + shape, + }, + }); - await test.step('should set the `size` attribute to `medium`', async () => { - await element.evaluate((node: Checkbox) => { - node.size = 'medium'; - }); + await expect(element).toHaveAttribute('shape', shape); - await expect(element).toHaveAttribute('size', 'medium'); - }); + await expect(element).toHaveJSProperty('shape', shape); - await test.step('should set the `size` property to `large`', async () => { - await element.evaluate((node: Checkbox) => { - node.setAttribute('size', 'large'); + await expect(element).toHaveCustomState(shape); }); - - await expect(element).toHaveJSProperty('size', 'large'); - }); - - await test.step('should unset the `size` property when the attribute is removed', async () => { - await element.evaluate((node: Checkbox) => { - node.removeAttribute('size'); - }); - - await expect(element).toHaveJSProperty('size', null); - }); + } }); - test('should add a custom state matching the `size` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); + for (const size of Object.values(CheckboxSize)) { + await test.step(`should set the \`size\` property to "${size}"`, async () => { + await fastPage.setTemplate({ attributes: { size: size } }); - await element.evaluate((node: Checkbox) => { - node.size = 'medium'; - }); + await expect(element).toHaveJSProperty('size', size); - await expect(element).toHaveCustomState('medium'); + await expect(element).toHaveAttribute('size', size); - await element.evaluate((node: Checkbox) => { - node.size = 'large'; - }); - - await expect(element).not.toHaveCustomState('medium'); - await expect(element).toHaveCustomState('large'); - - await element.evaluate((node: Checkbox) => { - node.size = undefined; - }); - - await expect(element).not.toHaveCustomState('medium'); - await expect(element).not.toHaveCustomState('large'); - }); - - test('should have a role of `checkbox`', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); - - await expect(element).toHaveJSProperty('elementInternals.role', 'checkbox'); + await expect(element).toHaveCustomState(size); + }); + } }); - test('should set the `ariaChecked` property to `false` when `checked` is not defined', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); - - await expect(element).not.toHaveAttribute('checked'); + test('should set the `ariaChecked` property equal to the `checked` property', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'false'); - }); - - test('should set the `ariaChecked` property equal to the `checked` property', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox checked></fluent-checkbox> - `); - - await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'true'); await element.evaluate((node: Checkbox) => { - node.checked = false; + node.checked = true; }); - await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'false'); + await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'true'); }); - test('should NOT set a default `aria-required` value when `required` is not defined', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); + test('should NOT set a default `aria-required` value when `required` is not defined', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).not.toHaveAttribute('required'); await expect(element).not.toHaveAttribute('aria-required'); }); - test('should be focusable by default', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); + test('should be focusable by default', async ({ fastPage }) => { + const { element } = fastPage; await element.focus(); await expect(element).toBeFocused(); }); - test('should NOT be focusable when the `disabled` attribute is set', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should NOT be focusable when the `disabled` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-checkbox disabled></fluent-checkbox> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await element.focus(); await expect(element).not.toBeFocused(); }); - test('should set the `ariaChecked` attribute to "mixed" when `indeterminate` property is true', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); + test('should set the `ariaChecked` attribute to "mixed" when `indeterminate` property is true', async ({ + fastPage, + }) => { + const { element } = fastPage; await element.evaluate((node: Checkbox) => { node.indeterminate = true; @@ -221,12 +109,8 @@ test.describe('Checkbox', () => { await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'false'); }); - test('should set off `indeterminate` on `checked` change by user click', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); + test('should set `indeterminate` to false when the `checked` state changes via click', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((node: Checkbox) => { node.indeterminate = true; @@ -239,14 +123,14 @@ test.describe('Checkbox', () => { await expect(element).toHaveJSProperty('indeterminate', false); }); - test('should NOT change the `indeterminate` property when the owning form is reset', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should NOT change the `indeterminate` property when the owning form is reset', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-checkbox></fluent-checkbox> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-checkbox></fluent-checkbox> + </form> `); await element.evaluate((node: Checkbox) => { @@ -274,32 +158,24 @@ test.describe('Checkbox', () => { }); }); - test('should initialize to the initial value if no value property is set', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should initialize to the provided `value` attribute when set pre-connection', async ({ fastPage, page }) => { + const expectedValue = 'foobar'; - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); + await fastPage.setTemplate(''); - await expect(element).toHaveJSProperty('value', 'on'); - }); + const value = await page.evaluate(expectedValue => { + const node = document.createElement('fluent-checkbox') as Checkbox; - test('should initialize to the provided `value` attribute when set pre-connection', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + node.setAttribute('value', expectedValue); - await page.setContent(/* html */ ` - <fluent-checkbox value="foo"></fluent-checkbox> - `); + return node.value; + }, expectedValue); - await expect(element).toHaveJSProperty('value', 'foo'); + expect(value).toBe(expectedValue); }); - test('should initialize to the provided `value` attribute when set post-connection', async ({ page }) => { - const element = page.locator('fluent-checkbox'); - - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); + test('should initialize to the provided `value` attribute when set post-connection', async ({ fastPage }) => { + const { element } = fastPage; const expectedValue = 'foobar'; @@ -310,12 +186,10 @@ test.describe('Checkbox', () => { await expect(element).toHaveJSProperty('value', expectedValue); }); - test('should initialize to the provided `value` property when set pre-connection', async ({ page }) => { - // const element = page.locator('fluent-checkbox'); + test('should initialize to the provided `value` property when set pre-connection', async ({ fastPage, page }) => { + await fastPage.setTemplate(''); - await page.setContent(/* html */ ` - <fluent-checkbox></fluent-checkbox> - `); + await expect(fastPage.element).not.toBeAttached(); const expectedValue = 'foobar'; @@ -324,48 +198,48 @@ test.describe('Checkbox', () => { node.value = expectedValue; - return Promise.resolve(node.value); + return node.value; }, expectedValue); expect(value).toBe(expectedValue); }); - test('should be invalid when unchecked', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should be invalid when unchecked', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <form> - <fluent-checkbox required></fluent-checkbox> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-checkbox required></fluent-checkbox> + </form> `); - expect(await element.evaluate((node: Checkbox) => node.validity.valueMissing)).toBe(true); + await expect(element).toHaveJSProperty('validity.valueMissing', true); }); - test('should be valid when checked', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should be valid when checked', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <form> - <fluent-checkbox required>checkbox</fluent-checkbox> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-checkbox required>checkbox</fluent-checkbox> + </form> `); await element.click(); await expect(element).toHaveJSProperty('checked', true); - expect(await element.evaluate((node: Checkbox) => node.validity.valueMissing)).toBe(false); + await expect(element).toHaveJSProperty('validity.valueMissing', false); }); - test('should set the `checked` property to false if the `checked` attribute is unset', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should set the `checked` property to false if the `checked` attribute is unset', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-checkbox></fluent-checkbox> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-checkbox></fluent-checkbox> + </form> `); await expect(element).toHaveJSProperty('checked', false); @@ -383,14 +257,14 @@ test.describe('Checkbox', () => { await expect(element).toHaveJSProperty('checked', false); }); - test('should set its checked property to true if the checked attribute is set', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should set its checked property to true if the checked attribute is set', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-checkbox></fluent-checkbox> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-checkbox></fluent-checkbox> + </form> `); await expect(element).toHaveJSProperty('checked', false); @@ -409,20 +283,21 @@ test.describe('Checkbox', () => { }); test('should put the control into a clean state, where `checked` attribute modifications change the `checked` property prior to user or programmatic interaction', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-checkbox'); + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-checkbox required></fluent-checkbox> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-checkbox required></fluent-checkbox> + </form> `); await element.evaluate((node: Checkbox) => { node.checked = true; - node.removeAttribute('checked'); + node.toggleAttribute('checked', false); }); await expect(element).toHaveJSProperty('checked', true); @@ -434,21 +309,21 @@ test.describe('Checkbox', () => { await expect(element).toHaveJSProperty('checked', false); await element.evaluate((node: Checkbox) => { - node.setAttribute('checked', ''); + node.toggleAttribute('checked', true); }); expect(await element.evaluate((node: Checkbox) => node.value)).toBeTruthy(); }); - test('should submit the value of the checkbox when checked', async ({ page }) => { - const element = page.locator('fluent-checkbox'); + test('should submit the value of the checkbox when checked', async ({ fastPage, page }) => { + const { element } = fastPage; const submitButton = page.locator('button'); - await page.setContent(/* html */ ` - <form> - <fluent-checkbox name="checkbox" value="foo"></fluent-checkbox> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-checkbox name="checkbox" value="foo"></fluent-checkbox> + <button type="submit">submit</button> + </form> `); await element.click(); @@ -458,18 +333,18 @@ test.describe('Checkbox', () => { expect(page.url()).toContain('?checkbox=foo'); }); - test('should submit the values of multiple checkboxes when checked', async ({ page }) => { - const checkboxes = page.locator('fluent-checkbox'); + test('should submit the values of multiple checkboxes when checked', async ({ fastPage, page }) => { + const { element: checkboxes } = fastPage; const element1 = checkboxes.nth(0); const element2 = checkboxes.nth(1); const submitButton = page.locator('button'); - await page.setContent(/* html */ ` - <form> - <fluent-checkbox name="checkbox" value="foo"></fluent-checkbox> - <fluent-checkbox name="checkbox" value="bar"></fluent-checkbox> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-checkbox name="checkbox" value="foo"></fluent-checkbox> + <fluent-checkbox name="checkbox" value="bar"></fluent-checkbox> + <button type="submit">submit</button> + </form> `); await element1.click(); @@ -477,6 +352,6 @@ test.describe('Checkbox', () => { await submitButton.click(); - expect(page.url()).toContain('?checkbox=foo&checkbox=bar'); + await expect(page).toHaveURL(/\?checkbox=foo&checkbox=bar/); }); }); diff --git a/packages/web-components/src/counter-badge/counter-badge.spec.ts b/packages/web-components/src/counter-badge/counter-badge.spec.ts index d6a2ce3ac141ab..5faccef9b8ecab 100644 --- a/packages/web-components/src/counter-badge/counter-badge.spec.ts +++ b/packages/web-components/src/counter-badge/counter-badge.spec.ts @@ -1,5 +1,4 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { CounterBadge } from './counter-badge.js'; import { CounterBadgeAppearance, @@ -9,20 +8,16 @@ import { } from './counter-badge.options.js'; test.describe('CounterBadge component', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-badge-counter-badge--counter-badge')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-counter-badge')); + test.use({ + tagName: 'fluent-counter-badge', }); test('should display the count when then the `count` attribute is equal to the `overflow-count` attribute', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-counter-badge'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge count="100" overflow-count="100"></fluent-counter-badge> - `); + await fastPage.setTemplate({ attributes: { count: '100', 'overflow-count': '100' } }); await expect(element).toHaveAttribute('overflow-count', '100'); @@ -30,13 +25,11 @@ test.describe('CounterBadge component', () => { }); test('should display an overflow count when the `count` attribute is greater than the `overflow-count` attribute', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-counter-badge'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge count="101" overflow-count="100"></fluent-counter-badge> - `); + await fastPage.setTemplate({ attributes: { count: '101', 'overflow-count': '100' } }); await expect(element).toHaveAttribute('overflow-count', '100'); @@ -54,13 +47,11 @@ test.describe('CounterBadge component', () => { }); test('should display the count when the `overflow-count` attribute is higher than the `count` attribute', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-counter-badge'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge count="101" overflow-count="100"></fluent-counter-badge> - `); + await fastPage.setTemplate({ attributes: { count: '101', 'overflow-count': '100' } }); await expect(element).toHaveAttribute('overflow-count', '100'); @@ -75,24 +66,20 @@ test.describe('CounterBadge component', () => { await expect(element).toContainText('101'); }); - test('should display the count when the `count` attribute is set', async ({ page }) => { - const element = page.locator('fluent-counter-badge'); + test('should display the count when the `count` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge count="5"></fluent-counter-badge> - `); + await fastPage.setTemplate({ attributes: { count: '5' } }); await expect(element).toHaveAttribute('count', '5'); await expect(element).toContainText('5'); }); - test('should show 0 when showZero attribute is present and value is 0', async ({ page }) => { - const element = page.locator('fluent-counter-badge'); + test('should show 0 when showZero attribute is present and value is 0', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge show-zero count="0"></fluent-counter-badge> - `); + await fastPage.setTemplate({ attributes: { 'show-zero': true, count: '0' } }); await expect(element).toHaveAttribute('show-zero'); @@ -100,7 +87,7 @@ test.describe('CounterBadge component', () => { await expect(element).toContainText('0'); - await element.evaluate((node: CounterBadge) => { + await element.evaluate(node => { node.removeAttribute('show-zero'); }); @@ -112,13 +99,11 @@ test.describe('CounterBadge component', () => { }); test('should display "0" when the `showZero` property is set to true and the `count` property is set to 0', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-counter-badge'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge count="0"></fluent-counter-badge> - `); + await fastPage.setTemplate({ attributes: { count: '0' } }); await expect(element).toHaveJSProperty('showZero', false); @@ -134,12 +119,10 @@ test.describe('CounterBadge component', () => { await expect(element).toContainText('0'); }); - test('should display as a dot when the `dot` property is set to true', async ({ page }) => { - const element = page.locator('fluent-counter-badge'); + test('should display as a dot when the `dot` property is set to true', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge count="5"></fluent-counter-badge> - `); + await fastPage.setTemplate({ attributes: { count: '5' } }); await expect(element).toContainText('5'); @@ -154,12 +137,10 @@ test.describe('CounterBadge component', () => { await expect(element).not.toContainText('5'); }); - test('should display as a number when the `dot` property is set to false', async ({ page }) => { - const element = page.locator('fluent-counter-badge'); + test('should display as a number when the `dot` property is set to false', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge count="5" dot></fluent-counter-badge> - `); + await fastPage.setTemplate({ attributes: { count: '5', dot: true } }); await expect(element).not.toContainText('5'); @@ -174,77 +155,67 @@ test.describe('CounterBadge component', () => { await expect(element).toHaveJSProperty('dot', false); }); - for (const shape of Object.values(CounterBadgeShape)) { - test(`should set the \`shape\` property to "${shape}" when the attribute is set to "${shape}"`, async ({ - page, - }) => { - const element = page.locator('fluent-counter-badge'); + test('should set the `shape` property to match the `shape` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-counter-badge shape="${shape}"></fluent-counter-badge> - `); + for (const shape of Object.values(CounterBadgeShape)) { + await test.step(`should set the \`shape\` property to \`${shape}\``, async () => { + await fastPage.setTemplate({ attributes: { shape } }); - await expect(element).toHaveAttribute('shape', shape); + await expect(element).toHaveAttribute('shape', shape); - await expect(element).toHaveJSProperty('shape', shape); - - await expect(element).toHaveCustomState(shape); - }); - } + await expect(element).toHaveJSProperty('shape', shape); - for (const color of Object.values(CounterBadgeColor)) { - test(`should set the \`color\` property to "${color}" when the attribute is set to "${color}"`, async ({ - page, - }) => { - const element = page.locator('fluent-counter-badge'); + await expect.soft(element).toHaveCustomState(shape); + }); + } + }); - await page.setContent(/* html */ ` - <fluent-counter-badge color="${color}"></fluent-counter-badge> - `); + test('should set the `color` property to match the `color` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveAttribute('color', color); + for (const color of Object.values(CounterBadgeColor)) { + await test.step(`should set the \`color\` property to \`${color}\``, async () => { + await fastPage.setTemplate({ attributes: { color } }); - await expect(element).toHaveJSProperty('color', color); + await expect(element).toHaveAttribute('color', color); - await expect(element).toHaveCustomState(color); - }); - } + await expect(element).toHaveJSProperty('color', color); - for (const size of Object.values(CounterBadgeSize)) { - test(`should set the \`size\` property to "${size}" when the attribute is set to "${size}"`, async ({ page }) => { - const element = page.locator('fluent-counter-badge'); + await expect.soft(element).toHaveCustomState(color); + }); + } + }); - await page.setContent(/* html */ ` - <fluent-counter-badge size="${size}"></fluent-counter-badge> - `); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveAttribute('size', size); + for (const size of Object.values(CounterBadgeSize)) { + await test.step(`should set the \`size\` property to "${size}"`, async () => { + await fastPage.setTemplate({ attributes: { size } }); - await expect(element).toHaveJSProperty('size', size); + await expect(element).toHaveAttribute('size', size); - await expect(element).toHaveCustomState(size); - }); - } + await expect(element).toHaveJSProperty('size', size); - for (const appearance of Object.values(CounterBadgeAppearance)) { - test(`should set the \`appearance\` property to "${appearance}" when the attribute is set to "${appearance}"`, async ({ - page, - }) => { - const element = page.locator('fluent-counter-badge'); + await expect(element).toHaveCustomState(size); + }); + } + }); - await page.setContent(/* html */ ` - <fluent-counter-badge appearance="${appearance}"></fluent-counter-badge> - `); + test('should set the `appearance` property to match the `appearance` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: CounterBadge, appearance) => { - node.appearance = appearance; - }, appearance as CounterBadgeAppearance); + for (const appearance of Object.values(CounterBadgeAppearance)) { + await test.step(appearance, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); - await expect(element).toHaveAttribute('appearance', appearance); + await expect(element).toHaveJSProperty('appearance', appearance); - await expect(element).toHaveJSProperty('appearance', appearance); + await expect(element).toHaveAttribute('appearance', appearance); - await expect(element).toHaveCustomState(appearance); - }); - } + await expect(element).toHaveCustomState(appearance); + }); + } + }); }); diff --git a/packages/web-components/src/dialog-body/dialog-body.spec.ts b/packages/web-components/src/dialog-body/dialog-body.spec.ts index c791aa6dce0e66..ca31ae75c078a6 100644 --- a/packages/web-components/src/dialog-body/dialog-body.spec.ts +++ b/packages/web-components/src/dialog-body/dialog-body.spec.ts @@ -1,42 +1,28 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Dialog } from '../dialog/dialog.js'; import type { DialogBody } from './dialog-body.js'; test.describe('Dialog Body', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-dialog-dialog-body--default')); - - await page.waitForFunction(() => - Promise.all([ - customElements.whenDefined('fluent-button'), - customElements.whenDefined('fluent-dialog'), - customElements.whenDefined('fluent-dialog-body'), - ]), - ); + test.use({ + tagName: 'fluent-dialog-body', + waitFor: ['fluent-dialog'], }); - test('should render a dialog body', async ({ page }) => { - const element = page.locator('fluent-dialog-body'); + test('should render a dialog body with a close button', async ({ fastPage }) => { + const { element } = fastPage; const closeButton = element.locator('.title-action'); - await page.setContent(/* html */ ` - <fluent-dialog-body> - <div id="content">content</div> - </fluent-dialog-body> - `); - await expect(element).toBeVisible(); await expect(closeButton).toBeVisible(); }); - test('should add default close button for non-modal dialogs', async ({ page }) => { - const element = page.locator('fluent-dialog-body'); + test('should add default close button for non-modal dialogs', async ({ fastPage, page }) => { + const { element } = fastPage; const closeButton = element.locator('.title-action'); const dialog = page.locator('fluent-dialog'); const content = element.locator('#content'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-dialog type="non-modal"> <fluent-dialog-body> <div id="content">content</div> diff --git a/packages/web-components/src/dialog/dialog.spec.ts b/packages/web-components/src/dialog/dialog.spec.ts index 1beb0413ce2ff4..d7b7ab95aa72b4 100644 --- a/packages/web-components/src/dialog/dialog.spec.ts +++ b/packages/web-components/src/dialog/dialog.spec.ts @@ -1,41 +1,28 @@ -import { expect, test } from '@playwright/test'; import type { Locator } from '@playwright/test'; -import { fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Dialog } from './dialog.js'; -async function getPointOutside(element: Locator) { - // Get the bounding box of the element - const boundingBox = (await element.boundingBox()) as { x: number; y: number; width: number; height: number }; - - // Calculate a point outside the bounding box - return { - x: boundingBox.x + boundingBox.width + 10, // 10 pixels to the right - y: boundingBox.y + boundingBox.height + 10, // 10 pixels below - }; -} - test.describe('Dialog', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-dialog-dialog--default')); - - await page.waitForFunction(() => - Promise.all([ - customElements.whenDefined('fluent-button'), - customElements.whenDefined('fluent-dialog'), - customElements.whenDefined('fluent-dialog-body'), - ]), - ); + test.use({ + tagName: 'fluent-dialog', + innerHTML: /* html */ `<div id="content">Dialog Body</div>`, + waitFor: ['fluent-button', 'fluent-dialog-body'], }); - test('should open and close dialog programmatically', async ({ page }) => { - const element = page.locator('fluent-dialog'); - const content = element.locator('#content'); + async function getPointOutside(element: Locator) { + // Get the bounding box of the element + const boundingBox = (await element.boundingBox()) as { x: number; y: number; width: number; height: number }; + + // Calculate a point outside the bounding box + return { + x: boundingBox.x + boundingBox.width + 10, // 10 pixels to the right + y: boundingBox.y + boundingBox.height + 10, // 10 pixels below + }; + } - await page.setContent(/* html */ ` - <fluent-dialog> - <div id="content">content</div> - </fluent-dialog> - `); + test('should open and close programmatically', async ({ fastPage }) => { + const { element } = fastPage; + const content = element.locator('#content'); await test.step('should show the dialog content when the dialog is shown', async () => { await expect(content).toBeHidden(); @@ -56,184 +43,230 @@ test.describe('Dialog', () => { }); }); - test('should handle dialog overlay clicks correctly based on type', async ({ page }) => { - const element = page.locator('fluent-dialog'); + test('should close after clicking outside its bounds when its `type` attribute is set to "modal"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; const content = element.locator('#content'); - await page.setContent(/* html */ ` - <fluent-dialog> - <div id="content">content</div> - </fluent-dialog> - `); + await element.evaluate((node: Dialog) => { + node.show(); + }); - await test.step('should close modal dialog when clicking outside', async () => { - await element.evaluate((node: Dialog) => { - node.show(); - }); + await expect(content).toBeVisible(); - await expect(content).toBeVisible(); + // Get point outside the element + const { x, y } = await getPointOutside(element); + + // Dispatch a click event at the calculated point + await page.mouse.click(x, y); - // Get point outside the element - const { x, y } = await getPointOutside(element); + await expect(content).toBeHidden(); + }); - // Dispatch a click event at the calculated point - await page.mouse.click(x, y); + test('should NOT close after clicking outside its bounds when its `type` attribute is set to "non-modal"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; + const content = element.locator('#content'); - await expect(content).toBeHidden(); + await fastPage.setTemplate({ + attributes: { + type: 'non-modal', + }, }); - await test.step('should not close non-modal dialog when clicking outside', async () => { - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'non-modal'); - node.show(); - }); + await element.evaluate((node: Dialog) => { + node.show(); + }); - await expect(content).toBeVisible(); + await expect(content).toBeVisible(); - // Get point outside the element - const { x, y } = await getPointOutside(element); + // Get point outside the element + const { x, y } = await getPointOutside(element); - // Dispatch a click event at the calculated point - await page.mouse.click(x, y); + // Dispatch a click event at the calculated point + await page.mouse.click(x, y); - await expect(content).toBeVisible(); - }); + await expect(content).toBeVisible(); + }); - await test.step('should not close alert dialog when clicking outside', async () => { - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'alert'); - node.show(); - }); + test('should NOT close after clicking outside its bounds when its `type` attribute is set to "alert"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; + const content = element.locator('#content'); - await expect(content).toBeVisible(); + await element.evaluate((node: Dialog) => { + node.setAttribute('type', 'alert'); + node.show(); + }); - // Get point outside the element - const { x, y } = await getPointOutside(element); + await expect(content).toBeVisible(); - // Dispatch a click event at the calculated point - await page.mouse.click(x, y); + // Get point outside the element + const { x, y } = await getPointOutside(element); - await expect(content).toBeVisible(); - }); + // Dispatch a click event at the calculated point + await page.mouse.click(x, y); + + await expect(content).toBeVisible(); }); - test('should handle escape keypress correctly based on type', async ({ page }) => { - const element = page.locator('fluent-dialog'); + test('should close after the escape key is pressed when its `type` attribute is set to "modal"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; const content = element.locator('#content'); - await page.setContent(/* html */ ` - <fluent-dialog> - <div id="content">content</div> - </fluent-dialog> - `); + await element.evaluate((node: Dialog) => { + node.show(); + }); - await test.step('should close modal dialog when pressing escape', async () => { - await element.evaluate((node: Dialog) => { - node.show(); - }); + await expect(content).toBeVisible(); - await expect(content).toBeVisible(); + await page.keyboard.press('Escape'); - await page.keyboard.press('Escape'); + await expect(content).toBeHidden(); + }); - await expect(content).toBeHidden(); + test('should NOT close after the escape key is pressed when its `type` attribute is set to "non-modal"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; + const content = element.locator('#content'); + + await fastPage.setTemplate({ attributes: { type: 'non-modal' } }); + + await element.evaluate((node: Dialog) => { + node.show(); }); - await test.step('should not close non-modal dialog when pressing escape', async () => { - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'non-modal'); - node.show(); - }); + await expect(content).toBeVisible(); - await expect(content).toBeVisible(); + await page.keyboard.press('Escape'); + + await expect(content).toBeVisible(); + }); - await page.keyboard.press('Escape'); + test('should NOT close after the escape key is pressed when its `type` attribute is set to "alert"', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; + const content = element.locator('#content'); - await expect(content).toBeVisible(); + await fastPage.setTemplate({ attributes: { type: 'alert' } }); + + await element.evaluate((node: Dialog) => { + node.show(); }); - await test.step('should not close alert dialog when pressing escape', async () => { - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'alert'); - node.show(); - }); + await expect(content).toBeVisible(); - await expect(content).toBeVisible(); + await page.keyboard.press('Escape'); - await page.keyboard.press('Escape'); + await expect(content).toBeVisible(); + }); - await expect(content).toBeVisible(); - }); + test('should set the `role` attribute to "dialog" on the internal dialog element when the `type` attribute is set to "dialog"', async ({ + fastPage, + }) => { + const { element } = fastPage; + const dialog = element.locator('dialog'); + + await fastPage.setTemplate({ attributes: { type: 'dialog' } }); + + await expect(dialog).toHaveRole('dialog'); }); - test('should apply ARIA attributes correctly to dialog element based on type', async ({ page }) => { - const element = page.locator('fluent-dialog'); + test('should set the `role` attribute to "dialog" on the internal dialog element when the `type` attribute is set to "non-modal"', async ({ + fastPage, + }) => { + const { element } = fastPage; const dialog = element.locator('dialog'); - await page.setContent(/* html */ ` - <fluent-dialog> - <div id="content">content</div> - </fluent-dialog> - `); + await fastPage.setTemplate({ attributes: { type: 'non-modal' } }); - await test.step('should set role correctly on the dialog element', async () => { - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'dialog'); - }); + await expect(dialog).toHaveRole('dialog'); + }); - await expect(dialog).toHaveRole('dialog'); + test('should set the `role` attribute to "alertdialog" on the internal dialog element when the `type` attribute is set to "alert"', async ({ + fastPage, + }) => { + const { element } = fastPage; + const dialog = element.locator('dialog'); - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'non-modal'); - }); + await fastPage.setTemplate({ attributes: { type: 'alert' } }); - await expect(dialog).toHaveRole('dialog'); + await expect(dialog).toHaveRole('alertdialog'); + }); - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'alert'); - }); + test('should set the `aria-modal` attribute to "true" on the internal dialog element when the `type` attribute is set to "modal"', async ({ + fastPage, + }) => { + const { element } = fastPage; + const dialog = element.locator('dialog'); - await expect(dialog).toHaveRole('alertdialog'); - }); + await fastPage.setTemplate({ attributes: { type: 'modal' } }); - await test.step('should set aria-modal correctly on the dialog element', async () => { - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'modal'); - }); + await expect(dialog).toHaveAttribute('aria-modal', 'true'); + }); - await expect(dialog).toHaveAttribute('aria-modal'); + test('should set the `aria-modal` attribute to "false" on the internal dialog element when the `type` attribute is set to "non-modal"', async ({ + fastPage, + }) => { + const { element } = fastPage; + const dialog = element.locator('dialog'); - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'alert'); - }); + await fastPage.setTemplate({ attributes: { type: 'non-modal' } }); - await expect(dialog).toHaveAttribute('aria-modal'); + await expect(dialog).not.toHaveAttribute('aria-modal'); + }); - await element.evaluate((node: Dialog) => { - node.setAttribute('type', 'non-modal'); - }); + test('should set the `aria-modal` attribute to "true" on the internal dialog element when the `type` attribute is set to "alert"', async ({ + fastPage, + }) => { + const { element } = fastPage; + const dialog = element.locator('dialog'); - await expect(dialog).not.toHaveAttribute('aria-modal'); - }); + await fastPage.setTemplate({ attributes: { type: 'alert' } }); - await test.step('should set aria-labelledby on the dialog element', async () => { - await expect(dialog).not.toHaveAttribute('aria-labelledby'); + await expect(dialog).toHaveAttribute('aria-modal', 'true'); + }); - await element.evaluate((node: Dialog) => { - node.setAttribute('aria-labelledby', 'label'); - }); + test('should set the `aria-labelledby` attribute on the internal dialog element when the `aria-labelledby` attribute is set', async ({ + fastPage, + }) => { + const { element } = fastPage; + const dialog = element.locator('dialog'); + + await expect(dialog).not.toHaveAttribute('aria-labelledby'); - await expect(dialog).toHaveAttribute('aria-labelledby', 'label'); + await element.evaluate(node => { + node.setAttribute('aria-labelledby', 'label'); }); - await test.step('should set aria-describedby on the dialog element', async () => { - await expect(dialog).not.toHaveAttribute('aria-describedby'); + await expect(dialog).toHaveAttribute('aria-labelledby', 'label'); + }); - await element.evaluate((node: Dialog) => { - node.setAttribute('aria-describedby', 'elementID'); - }); + test('should set the `aria-describedby` attribute on the internal dialog element when the `aria-describedby` attribute is set', async ({ + fastPage, + }) => { + const { element } = fastPage; + const dialog = element.locator('dialog'); - await expect(dialog).toHaveAttribute('aria-describedby', 'elementID'); + await expect(dialog).not.toHaveAttribute('aria-describedby'); + + await element.evaluate(node => { + node.setAttribute('aria-describedby', 'elementID'); }); + + await expect(dialog).toHaveAttribute('aria-describedby', 'elementID'); }); }); diff --git a/packages/web-components/src/divider/divider.spec.ts b/packages/web-components/src/divider/divider.spec.ts index 5d61d6601a9cff..9d0de450edaa67 100644 --- a/packages/web-components/src/divider/divider.spec.ts +++ b/packages/web-components/src/divider/divider.spec.ts @@ -1,64 +1,44 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Divider } from './divider.js'; +import { DividerAlignContent, DividerAppearance, DividerOrientation, DividerRole } from './divider.options.js'; test.describe('Divider', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-divider--divider')); + test.use({ tagName: 'fluent-divider' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-divider')); - }); - - test('should set a default `role` attribute of "separator"', async ({ page }) => { - const element = page.locator('fluent-divider'); - - await page.setContent(/* html */ ` - <fluent-divider></fluent-divider> - `); + test('should set a default `role` attribute of "separator"', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', 'separator'); }); - test('should set the `role` attribute equal to the role provided', async ({ page }) => { - const element = page.locator('fluent-divider'); - - await page.setContent(/* html */ ` - <fluent-divider role="presentation"></fluent-divider> - `); - - await expect(element).toHaveJSProperty('elementInternals.role', 'presentation'); + test('should set the internal `role` property to match the `role` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Divider) => { - node.role = 'separator'; - }); + for (const role of Object.values(DividerRole)) { + await test.step(`role="${role}"`, async () => { + await fastPage.setTemplate({ attributes: { role } }); - await expect(element).toHaveJSProperty('elementInternals.role', 'separator'); + await expect(element).toHaveJSProperty('elementInternals.role', role); + }); + } }); - test('should set the `aria-orientation` attribute equal to the `orientation` value', async ({ page }) => { - const element = page.locator('fluent-divider'); - - await page.setContent(/* html */ ` - <fluent-divider orientation="vertical"></fluent-divider> - `); - - await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'vertical'); + test('should set the `aria-orientation` attribute equal to the `orientation` value', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Divider) => { - node.orientation = 'horizontal'; - }); + for (const orientation of Object.values(DividerOrientation)) { + await test.step(`orientation="${orientation}"`, async () => { + await fastPage.setTemplate({ attributes: { orientation } }); - await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'horizontal'); + await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', orientation); + }); + } }); - test('should NOT set the `aria-orientation` property equal to `orientation` value if the `role` is presentational', async ({ - page, - }) => { - const element = page.locator('fluent-divider'); + test('should NOT set the `aria-orientation` property when the `role` is "presentation"', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-divider orientation="vertical"></fluent-divider> - `); + await fastPage.setTemplate({ attributes: { orientation: 'vertical' } }); await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'vertical'); @@ -70,12 +50,10 @@ test.describe('Divider', () => { await expect(element).not.toHaveJSProperty('elementInternals.ariaOrientation', 'horizontal'); }); - test('should add a custom state matching the `orientation` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-divider'); + test('should add a custom state matching the `orientation` attribute when provided', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Divider) => { - node.orientation = 'vertical'; - }); + await fastPage.setTemplate({ attributes: { orientation: 'vertical' } }); await expect(element).toHaveCustomState('vertical'); @@ -88,126 +66,35 @@ test.describe('Divider', () => { await expect(element).toHaveCustomState('horizontal'); }); - test('should initialize to the provided value attribute if set post-connection', async ({ page }) => { - const element = page.locator('fluent-divider'); - - await page.setContent(/* html */ ` - <fluent-divider></fluent-divider> - `); - - await element.evaluate((node: Divider) => { - node.alignContent = 'start'; - }); - - await expect(element).toHaveJSProperty('alignContent', 'start'); - - await element.evaluate((node: Divider) => { - node.alignContent = 'center'; - }); - - await expect(element).toHaveJSProperty('alignContent', 'center'); - - await element.evaluate((node: Divider) => { - node.alignContent = 'end'; - }); - - await expect(element).toHaveJSProperty('alignContent', 'end'); - - await element.evaluate((node: Divider) => { - node.appearance = undefined; - }); - - await expect(element).not.toHaveJSProperty('appearance', 'default'); - - await element.evaluate((node: Divider) => { - node.appearance = 'strong'; - }); - - await expect(element).toHaveJSProperty('appearance', 'strong'); - - await element.evaluate((node: Divider) => { - node.appearance = 'brand'; - }); - - await expect(element).toHaveJSProperty('appearance', 'brand'); - await element.evaluate((node: Divider) => { - node.appearance = 'subtle'; - }); - - await expect(element).toHaveJSProperty('appearance', 'subtle'); - - await element.evaluate((node: Divider) => { - node.inset = true; - }); - - await expect(element).toHaveJSProperty('inset', true); - }); - - test('should add a custom state matching the `appearance` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-divider'); - - await element.evaluate((node: Divider) => { - node.appearance = 'strong'; - }); - - await expect(element).toHaveCustomState('strong'); - - await element.evaluate((node: Divider) => { - node.appearance = 'brand'; - }); - - await expect(element).not.toHaveCustomState('strong'); - - await expect(element).toHaveCustomState('brand'); - - await element.evaluate((node: Divider) => { - node.appearance = 'subtle'; - }); - - await expect(element).not.toHaveCustomState('brand'); - - await expect(element).toHaveCustomState('subtle'); - }); - - test('should add a custom state of `inset` when the value is true', async ({ page }) => { - const element = page.locator('fluent-divider'); - - await element.evaluate((node: Divider) => { - node.inset = true; - }); - - await expect(element).toHaveCustomState('inset'); + test('should initialize to the provided value attribute if set post-connection', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Divider) => { - node.inset = false; - }); + for (const alignment of Object.values(DividerAlignContent)) { + await test.step(`alignContent="${alignment}"`, async () => { + await fastPage.setTemplate({ attributes: { 'align-content': alignment } }); - await expect(element).not.toHaveCustomState('inset'); - }); + await expect(element).toHaveJSProperty('alignContent', alignment); - test('should add a custom state matching the `align-content` attribute value when provided', async ({ page }) => { - const element = page.locator('fluent-divider'); + await expect(element).toHaveCustomState(`align-${alignment}`); + }); + } - await element.evaluate((node: Divider) => { - node.alignContent = 'start'; - }); + for (const appearance of Object.values(DividerAppearance)) { + await test.step(`appearance="${appearance}"`, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); - await expect(element).toHaveCustomState('align-start'); + await expect(element).toHaveJSProperty('appearance', appearance); - await element.evaluate((node: Divider) => { - node.alignContent = 'end'; - }); + await expect(element).toHaveCustomState(appearance); + }); + } - await expect(element).not.toHaveCustomState('align-start'); + await test.step('inset', async () => { + await fastPage.setTemplate({ attributes: { inset: true } }); - await expect(element).toHaveCustomState('align-end'); + await expect(element).toHaveJSProperty('inset', true); - await element.evaluate((node: Divider) => { - node.alignContent = undefined; + await expect(element).toHaveCustomState('inset'); }); - - await expect(element).not.toHaveCustomState('align-start'); - - await expect(element).not.toHaveCustomState('align-end'); }); }); diff --git a/packages/web-components/src/drawer/drawer.spec.ts b/packages/web-components/src/drawer/drawer.spec.ts index 2d167763e75940..6528bafdd586a7 100644 --- a/packages/web-components/src/drawer/drawer.spec.ts +++ b/packages/web-components/src/drawer/drawer.spec.ts @@ -1,90 +1,59 @@ -import { expect, test } from '@playwright/test'; - -import { fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Drawer } from './drawer.js'; +import { DrawerPosition } from './drawer.options.js'; +import { DrawerSize, DrawerType } from './drawer.options.js'; test.describe('Drawer', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-drawer--drawer')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-drawer')); + test.use({ + tagName: 'fluent-drawer', }); - test('should reflect type attribute', async ({ page }) => { - const element = page.locator('fluent-drawer'); - - await page.setContent(/* html */ ` - <fluent-drawer type="modal">Drawer</fluent-drawer> - `); + for (const type of Object.values(DrawerType)) { + test(`should set the \`type\` property to "${type}" when set via the \`type\` attribute`, async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveAttribute('type', 'modal'); - await expect(element).toHaveJSProperty('type', 'modal'); + await fastPage.setTemplate({ attributes: { type } }); - await element.evaluate((node: Drawer) => { - node.type = 'non-modal'; + await expect(element).toHaveAttribute('type', type); + await expect(element).toHaveJSProperty('type', type); }); + } - await expect(element).toHaveAttribute('type', 'non-modal'); - }); - - test('should reflect size attribute', async ({ page }) => { - const element = page.locator('fluent-drawer'); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-drawer size="small">Drawer</fluent-drawer> - `); + for (const size of Object.values(DrawerSize)) { + await test.step(`should set the \`size\` property to \`${size}\``, async () => { + await fastPage.setTemplate({ attributes: { size } }); - await expect(element).toHaveAttribute('size', 'small'); - await expect(element).toHaveJSProperty('size', 'small'); + await expect(element).toHaveAttribute('size', size); - await element.evaluate((node: Drawer) => { - node.size = 'medium'; - }); - - await expect(element).toHaveAttribute('size', 'medium'); - await expect(element).toHaveJSProperty('size', 'medium'); - - await element.evaluate((node: Drawer) => { - node.size = 'large'; - }); - - await expect(element).toHaveAttribute('size', 'large'); - await expect(element).toHaveJSProperty('size', 'large'); - - await element.evaluate((node: Drawer) => { - node.size = 'full'; - }); - - await expect(element).toHaveAttribute('size', 'full'); - await expect(element).toHaveJSProperty('size', 'full'); + await expect(element).toHaveJSProperty('size', size); + }); + } }); - test('should reflect position attribute', async ({ page }) => { - const element = page.locator('fluent-drawer'); + test('should set the `position` property to match the `position` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-drawer position="start">Drawer</fluent-drawer> - `); + for (const position of Object.values(DrawerPosition)) { + await test.step(`should set the \`position\` property to \`${position}\``, async () => { + await fastPage.setTemplate({ attributes: { position } }); - await expect(element).toHaveAttribute('position', 'start'); - await expect(element).toHaveJSProperty('position', 'start'); + await expect(element).toHaveAttribute('position', position); - await element.evaluate((node: Drawer) => { - node.position = 'end'; - }); - - await expect(element).toHaveAttribute('position', 'end'); - await expect(element).toHaveJSProperty('position', 'end'); + await expect(element).toHaveJSProperty('position', position); + }); + } }); - test('should reflect aria-label attribute', async ({ page }) => { - const element = page.locator('fluent-drawer'); + test('should set the `ariaLabel` property when the `aria-label` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-drawer aria-label="abc">Drawer</fluent-drawer> - `); + await fastPage.setTemplate({ attributes: { 'aria-label': 'abc' } }); await expect(element).toHaveAttribute('aria-label', 'abc'); + await expect(element).toHaveJSProperty('ariaLabel', 'abc'); await element.evaluate((node: Drawer) => { @@ -92,17 +61,17 @@ test.describe('Drawer', () => { }); await expect(element).toHaveAttribute('aria-label', 'def'); + await expect(element).toHaveJSProperty('ariaLabel', 'def'); }); - test('should reflect aria-labelledby attribute', async ({ page }) => { - const element = page.locator('fluent-drawer'); + test('should set the `ariaLabelledby` property when the `aria-labelledby` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-drawer aria-labelledby="abc">Drawer</fluent-drawer> - `); + await fastPage.setTemplate({ attributes: { 'aria-labelledby': 'abc' } }); await expect(element).toHaveAttribute('aria-labelledby', 'abc'); + await expect(element).toHaveJSProperty('ariaLabelledby', 'abc'); await element.evaluate((node: Drawer) => { @@ -110,17 +79,19 @@ test.describe('Drawer', () => { }); await expect(element).toHaveAttribute('aria-labelledby', 'def'); + await expect(element).toHaveJSProperty('ariaLabelledby', 'def'); }); - test('should reflect aria-describedby attribute', async ({ page }) => { - const element = page.locator('fluent-drawer'); + test('should set the `ariaDescribedby` property when the `aria-describedby` attribute is set', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-drawer aria-describedby="abc">Drawer</fluent-drawer> - `); + await fastPage.setTemplate({ attributes: { 'aria-describedby': 'abc' } }); await expect(element).toHaveAttribute('aria-describedby', 'abc'); + await expect(element).toHaveJSProperty('ariaDescribedby', 'abc'); await element.evaluate((node: Drawer) => { @@ -128,80 +99,53 @@ test.describe('Drawer', () => { }); await expect(element).toHaveAttribute('aria-describedby', 'def'); + await expect(element).toHaveJSProperty('ariaDescribedby', 'def'); }); - test('should emit an event when open property changes', async ({ page }) => { - const element = page.locator('fluent-drawer'); - - await page.setContent(/* html */ ` - <fluent-drawer>Drawer</fluent-drawer> - `); - - const [wasOpened] = await Promise.all([ - element.evaluate( - node => - new Promise(resolve => { - node.addEventListener('toggle', () => resolve(true)); - }), - ), - await element.evaluate((node: Drawer) => { - node.show(); - }), - ]); - - expect(wasOpened).toBe(true); - }); + test('should emit a `toggle` event when the `show` method is called', async ({ fastPage }) => { + const { element } = fastPage; + + const wasOpened = element.evaluate( + node => new Promise(resolve => node.addEventListener('toggle', () => resolve(true))), + ); + + await element.evaluate((node: Drawer) => { + node.show(); + }); - test('should emit an event before open property changes', async ({ page }) => { - const element = page.locator('fluent-drawer'); - - await page.setContent(/* html */ ` - <fluent-drawer>Drawer</fluent-drawer> - `); - - const [wasOpened] = await Promise.all([ - element.evaluate( - node => - new Promise(resolve => { - node.addEventListener('beforetoggle', () => resolve(true)); - }), - ), - await element.evaluate((node: Drawer) => { - node.show(); - }), - ]); - - expect(wasOpened).toBe(true); + await expect(wasOpened).resolves.toBe(true); }); - test('should fire a `cancel` event when keydown is invoked on the document', async ({ page }) => { - const element = page.locator('fluent-drawer'); + test('should emit a `beforetoggle` event before open property changes', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-drawer type="modal"></fluent-drawer> - `); + const wasOpened = element.evaluate( + node => new Promise(resolve => node.addEventListener('beforetoggle', () => resolve(true))), + ); await element.evaluate((node: Drawer) => { node.show(); }); - const [wasDismissed] = await Promise.all([ - element.evaluate( - node => - new Promise(resolve => { - node.addEventListener('cancel', () => resolve(true)); - }), - ), - element.evaluate(node => { - node.dispatchEvent( - new Event('cancel', { - key: 'Escape', - } as EventInit), - ); - }), - ]); - - expect(wasDismissed).toBe(true); + await expect(wasOpened).resolves.toBe(true); + }); + + test('should emit a `cancel` event when a `cancel` event is invoked on the document', async ({ fastPage }) => { + const { element } = fastPage; + + await element.evaluate((node: Drawer) => { + node.show(); + }); + + const wasDismissed = element.evaluate( + node => new Promise(resolve => node.addEventListener('cancel', () => resolve(true))), + ); + + await element.evaluate(node => { + node.dispatchEvent(new Event('cancel', { key: 'Escape' } as EventInit)); + }); + + await expect(wasDismissed).resolves.toBe(true); }); }); diff --git a/packages/web-components/src/field/field.spec.ts b/packages/web-components/src/field/field.spec.ts index 2637f52870fa98..7e2d370a118ace 100644 --- a/packages/web-components/src/field/field.spec.ts +++ b/packages/web-components/src/field/field.spec.ts @@ -1,94 +1,83 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import type { TextInput } from '../index.js'; +import { expect, test } from '../../test/playwright/index.js'; +import type { TextInput } from '../text-input/text-input.js'; import type { Field } from './field.js'; test.describe('Field', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-field--field')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-field')); + test.use({ + tagName: 'fluent-field', + waitFor: ['fluent-text-input'], }); - test('should set the `disabled` state when the slotted input is disabled', async ({ page }) => { - const element = page.locator('fluent-field'); + test('should set the `disabled` state when the slotted input is disabled', async ({ fastPage }) => { + const { element } = fastPage; + const input = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input slot="input" disabled /> - </fluent-field> - `); - - await test.step('should set the `disabled` state when the input is disabled', async () => { - await expect(element).toHaveCustomState('disabled'); + `, }); - await test.step('should remove the `disabled` state when the input is enabled', async () => { - await element.evaluate((node: Field) => { - node.querySelector('input')?.removeAttribute('disabled'); - }); + await expect(element).toHaveCustomState('disabled'); - await expect(element).not.toHaveCustomState('disabled'); + await input.evaluate(node => { + node.removeAttribute('disabled'); }); + + await expect(element).not.toHaveCustomState('disabled'); }); - test('should set the `required` state when the slotted input is required', async ({ page }) => { - const element = page.locator('fluent-field'); + test('should set the `required` state when the slotted input is required', async ({ fastPage }) => { + const { element } = fastPage; + const input = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input slot="input" required /> - </fluent-field> - `); - - await test.step('should set the `required` state when the input is required', async () => { - await expect(element).toHaveCustomState('required'); + `, }); - await test.step('should remove the `required` state when the input is not required', async () => { - await element.evaluate((node: Field) => { - node.querySelector('input')?.removeAttribute('required'); - }); + await expect(element).toHaveCustomState('required'); - await expect(element).not.toHaveCustomState('required'); + await input.evaluate((node: Field) => { + node.removeAttribute('required'); }); + + await expect(element).not.toHaveCustomState('required'); }); - test('should set the `readonly` state when the slotted input is read-only', async ({ page }) => { - const element = page.locator('fluent-field'); + test('should set the `readonly` state when the slotted input is read-only', async ({ fastPage }) => { + const { element } = fastPage; + const input = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input slot="input" readonly /> - </fluent-field> - `); - - await test.step('should set the `readonly` state when the input is readonly', async () => { - await expect(element).toHaveCustomState('readonly'); + `, }); - await test.step('should remove the `readonly` state when the input is not readonly', async () => { - await element.evaluate((node: Field) => { - node.querySelector('input')?.removeAttribute('readonly'); - }); + await expect(element).toHaveCustomState('readonly'); - await expect(element).not.toHaveCustomState('readonly'); + await input.evaluate((node: Field) => { + node.removeAttribute('readonly'); }); + + await expect(element).not.toHaveCustomState('readonly'); }); test('should display the `valueMissing` validation message when the slotted input has the `value-missing` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" required /> <div id="message" slot="message" flag="value-missing">This field is required.</div> - </fluent-field> - `); + `, + }); await input.fill('foo'); @@ -108,18 +97,18 @@ test.describe('Field', () => { }); test('should display the `patternMismatch` validation message when the slotted input has the `pattern-mismatch` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" pattern="[0-9]+" /> <div id="message" slot="message" flag="pattern-mismatch">This field must contain only numbers.</div> - </fluent-field> - `); + `, + }); await input.fill('123'); @@ -139,18 +128,18 @@ test.describe('Field', () => { }); test('should display the `tooShort` validation message when the slotted input has the `too-short` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" minlength="3" /> <div id="message" slot="message" flag="too-short">This field must contain at least 3 characters.</div> - </fluent-field> - `); + `, + }); await input.fill('123'); @@ -170,18 +159,18 @@ test.describe('Field', () => { }); test('should display the `tooLong` validation message when the slotted input has the `too-long` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" maxlength="3" /> <div id="message" slot="message" flag="too-long">This field must contain at most 3 characters.</div> - </fluent-field> - `); + `, + }); await input.fill('123'); @@ -210,18 +199,18 @@ test.describe('Field', () => { }); test('should display the `rangeUnderflow` validation message when the slotted input has the `range-underflow` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" type="number" min="3" /> <div id="message" slot="message" flag="range-underflow">This field must contain a number greater than or equal to 3.</div> - </fluent-field> - `); + `, + }); await input.fill('3'); @@ -241,18 +230,18 @@ test.describe('Field', () => { }); test('should display the `rangeOverflow` validation message when the slotted input has the `range-overflow` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" type="number" max="3" /> <div id="message" slot="message" flag="range-overflow">This field must contain a number less than or equal to 3.</div> - </fluent-field> - `); + `, + }); await input.fill('3'); @@ -272,18 +261,18 @@ test.describe('Field', () => { }); test('should display the `stepMismatch` validation message when the slotted input has the `step-mismatch` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" type="number" step="2" /> <div id="message" slot="message" flag="step-mismatch">This field must contain a number that is a multiple of 2.</div> - </fluent-field> - `); + `, + }); await input.fill('4'); @@ -303,18 +292,18 @@ test.describe('Field', () => { }); test('should display the `typeMismatch` validation message when the slotted input has the `type-mismatch` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" type="email" /> <div id="message" slot="message" flag="type-mismatch">This field must be a valid email address.</div> - </fluent-field> - `); + `, + }); await input.fill('a@b.c'); @@ -334,18 +323,18 @@ test.describe('Field', () => { }); test('should display the `customError` validation message when the slotted input has the `custom-error` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" /> <div id="message" slot="message" flag="custom-error">This field has a custom error.</div> - </fluent-field> - `); + `, + }); await input.fill('foo'); @@ -375,18 +364,18 @@ test.describe('Field', () => { }); test('should display the `badInput` validation message when the slotted input has the `bad-input` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('#input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-text-input id="input" slot="input" type="text"></fluent-text-input> <div id="message" slot="message" flag="bad-input">I have no idea how you managed to do this.</div> - </fluent-field> - `); + `, + }); await expect(element).not.toHaveCustomState('bad-input'); @@ -403,18 +392,18 @@ test.describe('Field', () => { }); test('should display the `valid` validation message when the slotted input has the `valid` validity state', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); - const input = page.locator('#input'); - const message = page.locator('#message'); + const { element } = fastPage; + const input = element.locator('input'); + const message = element.locator('#message'); - await page.setContent(/* html */ ` - <fluent-field> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <input id="input" slot="input" /> <div required id="message" slot="message" flag="valid">This field is valid.</div> - </fluent-field> - `); + `, + }); await input.fill('foo'); @@ -426,31 +415,33 @@ test.describe('Field', () => { }); test('should arrange the label and input in the correct order when the `labelPosition` property is set to `above`', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-field label-position="above"> + await fastPage.setTemplate({ + attributes: { 'label-position': 'above' }, + innerHTML: /* html */ ` <label slot="label">Label</label> <input slot="input" id="input" /> - </fluent-field> - `); + `, + }); await expect(element.locator('input:below(label)')).toHaveCount(1); }); test('should arrange the label and input in the correct order when the `labelPosition` property is set to `before`', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-field label-position="before"> + await fastPage.setTemplate({ + attributes: { 'label-position': 'before' }, + innerHTML: /* html */ ` <label slot="label">Label</label> <input slot="input" id="input" /> - </fluent-field> - `); + `, + }); await expect(element.locator('input:right-of(label)')).toHaveCount(1); @@ -462,16 +453,17 @@ test.describe('Field', () => { }); test('should arrange the label and input in the correct order when the `labelPosition` property is set to `after`', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-field'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-field label-position="after"> + await fastPage.setTemplate({ + attributes: { 'label-position': 'after' }, + innerHTML: /* html */ ` <label slot="label">Label</label> <input slot="input" id="input" /> - </fluent-field> - `); + `, + }); await expect(element.locator('input:left-of(label)')).toHaveCount(1); diff --git a/packages/web-components/src/field/field.ts b/packages/web-components/src/field/field.ts index eab51e895e7017..4b16550e0caa3c 100644 --- a/packages/web-components/src/field/field.ts +++ b/packages/web-components/src/field/field.ts @@ -205,7 +205,7 @@ export class BaseField extends FASTElement { * @internal */ public setStates() { - if (this.$fastController.isConnected) { + if (this.elementInternals && this.input) { toggleState(this.elementInternals, 'disabled', !!this.input.disabled); toggleState(this.elementInternals, 'readonly', !!this.input.readOnly); toggleState(this.elementInternals, 'required', !!this.input.required); diff --git a/packages/web-components/src/image/image.spec.ts b/packages/web-components/src/image/image.spec.ts index 5ff754a011e079..6d44c8a4042b60 100644 --- a/packages/web-components/src/image/image.spec.ts +++ b/packages/web-components/src/image/image.spec.ts @@ -1,38 +1,23 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Image } from './image.js'; +import { ImageFit, ImageShape } from './image.options.js'; test.describe('Image', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-image--image')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-image')); + test.use({ + tagName: 'fluent-image', + innerHTML: /* html */ ` + <img alt="Short image description" src="/300x100.png" /> + `, }); - test('should initialize to the `block` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-image'); - - await page.setContent(/* html */ ` - <fluent-image block> - <img alt="Short image description" src="300x100.png" /> - </fluent-image> - `); - - await expect(element).toHaveJSProperty('block', true); - - await element.evaluate((node: Image) => { - node.block = false; - }); + test('should set the `block` property to match the `block` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).not.toHaveJSProperty('block', true); - }); + await fastPage.setTemplate({ attributes: { block: true } }); - test('should add a custom state of `block` when a value of true is provided', async ({ page }) => { - const element = page.locator('fluent-image'); + await expect(element).toHaveAttribute('block'); - await element.evaluate((node: Image) => { - node.block = true; - }); + await expect(element).toHaveJSProperty('block', true); await expect(element).toHaveCustomState('block'); @@ -40,33 +25,21 @@ test.describe('Image', () => { node.block = false; }); - await expect(element).not.toHaveCustomState('block'); - }); - - test('should initialize to the `bordered` attribute', async ({ page }) => { - const element = page.locator('fluent-image'); + await expect(element).not.toHaveAttribute('block'); - await page.setContent(/* html */ ` - <fluent-image bordered> - <img alt="Short image description" src="300x100.png" /> - </fluent-image> - `); + await expect(element).not.toHaveJSProperty('block', true); - await expect(element).toHaveJSProperty('bordered', true); + await expect(element).not.toHaveCustomState('block'); + }); - await element.evaluate((node: Image) => { - node.bordered = undefined; - }); + test('should set the `bordered` property to match the `bordered` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).not.toHaveJSProperty('bordered', true); - }); + await fastPage.setTemplate({ attributes: { bordered: true } }); - test('should add a custom state of `bordered` when a value of true is provided', async ({ page }) => { - const element = page.locator('fluent-image'); + await expect(element).toHaveAttribute('bordered'); - await element.evaluate((node: Image) => { - node.bordered = true; - }); + await expect(element).toHaveJSProperty('bordered', true); await expect(element).toHaveCustomState('bordered'); @@ -74,33 +47,21 @@ test.describe('Image', () => { node.bordered = false; }); - await expect(element).not.toHaveCustomState('bordered'); - }); - - test('should initialize to the `shadow` attribute', async ({ page }) => { - const element = page.locator('fluent-image'); + await expect(element).not.toHaveAttribute('bordered'); - await page.setContent(/* html */ ` - <fluent-image shadow> - <img alt="Short image description" src="300x100.png" /> - </fluent-image> - `); + await expect(element).toHaveJSProperty('bordered', false); - await expect(element).toHaveJSProperty('shadow', true); + await expect(element).not.toHaveCustomState('bordered'); + }); - await element.evaluate((node: Image) => { - node.shadow = undefined; - }); + test('should set the `shadow` property to match the `shadow` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).not.toHaveJSProperty('shadow', true); - }); + await fastPage.setTemplate({ attributes: { shadow: true } }); - test('should add a custom state of `shadow` when a value of true is provided', async ({ page }) => { - const element = page.locator('fluent-image'); + await expect(element).toHaveAttribute('shadow'); - await element.evaluate((node: Image) => { - node.shadow = true; - }); + await expect(element).toHaveJSProperty('shadow', true); await expect(element).toHaveCustomState('shadow'); @@ -108,128 +69,42 @@ test.describe('Image', () => { node.shadow = false; }); - await expect(element).not.toHaveCustomState('shadow'); - }); - - test('should initialize to the `fit` attribute', async ({ page }) => { - const element = page.locator('fluent-image'); - - await page.setContent(/* html */ ` - <fluent-image fit="default"> - <img alt="Short image description" src="300x100.png" /> - </fluent-image> - `); - - await expect(element).toHaveJSProperty('fit', 'default'); - - await element.evaluate((node: Image) => { - node.fit = 'none'; - }); - - await expect(element).toHaveJSProperty('fit', 'none'); - - await element.evaluate((node: Image) => { - node.fit = 'center'; - }); - - await expect(element).toHaveJSProperty('fit', 'center'); - - await element.evaluate((node: Image) => { - node.fit = 'contain'; - }); - - await expect(element).toHaveJSProperty('fit', 'contain'); - - await element.evaluate((node: Image) => { - node.fit = 'cover'; - }); - - await expect(element).toHaveJSProperty('fit', 'cover'); - }); - - test('should add a custom state matching the `fit` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-image'); - - await element.evaluate((node: Image) => { - node.fit = 'contain'; - }); - - await expect(element).toHaveCustomState('fit-contain'); - - await element.evaluate((node: Image) => { - node.fit = 'none'; - }); - - await expect(element).not.toHaveCustomState('fit-contain'); - - await expect(element).toHaveCustomState('fit-none'); - - await element.evaluate((node: Image) => { - node.fit = 'cover'; - }); + await expect(element).not.toHaveAttribute('shadow'); - await expect(element).not.toHaveCustomState('fit-none'); + await expect(element).toHaveJSProperty('shadow', false); - await expect(element).toHaveCustomState('fit-cover'); + await expect(element).not.toHaveCustomState('shadow'); }); - test('should initialize to the `shape` attribute', async ({ page }) => { - const element = page.locator('fluent-image'); - - await page.setContent(/* html */ ` - <fluent-image shape="circular"> - <img alt="Short image description" src="300x100.png" /> - </fluent-image> - `); + test('should set the `fit` property to match the `fit` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveJSProperty('shape', 'circular'); - - await element.evaluate((node: Image) => { - node.shape = 'rounded'; - }); + for (const fit of Object.values(ImageFit)) { + await test.step(`should set the \`fit\` property to "${fit}"`, async () => { + await fastPage.setTemplate({ attributes: { fit } }); - await expect(element).toHaveJSProperty('shape', 'rounded'); + await expect(element).toHaveAttribute('fit', fit); - await element.evaluate((node: Image) => { - node.shape = 'square'; - }); + await expect(element).toHaveJSProperty('fit', fit); - await expect(element).toHaveJSProperty('shape', 'square'); + await expect(element).toHaveCustomState(`fit-${fit}`); + }); + } }); - test('should add a custom state matching the `shape` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-image'); - - await element.evaluate((node: Image) => { - node.shape = 'circular'; - }); - - await expect(element).toHaveCustomState('circular'); + test('should set the `shape` property to match the `shape` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Image) => { - node.shape = 'rounded'; - }); - - await expect(element).not.toHaveCustomState('circular'); - - await expect(element).toHaveCustomState('rounded'); - - await element.evaluate((node: Image) => { - node.shape = 'square'; - }); - - await expect(element).not.toHaveCustomState('rounded'); - - await expect(element).toHaveCustomState('square'); - - await element.evaluate((node: Image) => { - node.shape = undefined; - }); + for (const shape of Object.values(ImageShape)) { + await test.step(`should set the \`shape\` property to "${shape}"`, async () => { + await fastPage.setTemplate({ attributes: { shape } }); - await expect(element).not.toHaveCustomState('rounded'); + await expect(element).toHaveAttribute('shape', shape); - await expect(element).not.toHaveCustomState('square'); + await expect(element).toHaveJSProperty('shape', shape); - await expect(element).not.toHaveCustomState('circular'); + await expect(element).toHaveCustomState(shape); + }); + } }); }); diff --git a/packages/web-components/src/label/label.spec.ts b/packages/web-components/src/label/label.spec.ts index 47a2b46e264af8..4785b64d0c6587 100644 --- a/packages/web-components/src/label/label.spec.ts +++ b/packages/web-components/src/label/label.spec.ts @@ -1,120 +1,91 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Label } from './label.js'; +import { LabelSize, LabelWeight } from './label.options.js'; test.describe('Label', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-label--default')); + test.use({ tagName: 'fluent-label' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-label')); - }); - - test('should reflect size attribute', async ({ page }) => { - const element = page.locator('fluent-label'); - - await element.evaluate((node: Label) => { - node.size = 'small'; - }); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveAttribute('size', 'small'); + for (const size of Object.values(LabelSize)) { + await test.step(`should set the \`size\` property to "${size}"`, async () => { + await fastPage.setTemplate({ attributes: { size } }); - await expect(element).toHaveJSProperty('size', 'small'); - - await expect(element).toHaveCustomState('small'); - - await element.evaluate((node: Label) => { - node.size = 'medium'; - }); + await expect(element).toHaveAttribute('size', size); - await expect(element).toHaveAttribute('size', 'medium'); + await expect(element).toHaveJSProperty('size', size); - await expect(element).toHaveJSProperty('size', 'medium'); - - await expect(element).not.toHaveCustomState('small'); - - await expect(element).toHaveCustomState('medium'); + await expect(element).toHaveCustomState(size); + }); + } + }); - await element.evaluate((node: Label) => { - node.size = 'large'; - }); + test('should set the `weight` property to match the `weight` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveAttribute('size', 'large'); + for (const weight of Object.values(LabelWeight)) { + await test.step(`should set the \`weight\` property to "${weight}"`, async () => { + await fastPage.setTemplate({ attributes: { weight } }); - await expect(element).toHaveJSProperty('size', 'large'); + await expect(element).toHaveAttribute('weight', weight); - await expect(element).not.toHaveCustomState('medium'); + await expect(element).toHaveJSProperty('weight', weight); - await expect(element).toHaveCustomState('large'); + await expect(element).toHaveCustomState(weight); + }); + } }); - test('should reflect weight attribute', async ({ page }) => { - const element = page.locator('fluent-label'); + test('should set the `disabled` property to match the `disabled` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Label) => { - node.weight = 'regular'; - }); + await fastPage.setTemplate({ attributes: { disabled: true } }); - await expect(element).toHaveAttribute('weight', 'regular'); + await expect(element).toHaveAttribute('disabled'); - await expect(element).toHaveJSProperty('weight', 'regular'); + await expect(element).toHaveJSProperty('disabled', true); - await expect(element).toHaveCustomState('regular'); + await expect(element).toHaveCustomState('disabled'); await element.evaluate((node: Label) => { - node.weight = 'semibold'; + node.disabled = false; }); - await expect(element).toHaveAttribute('weight', 'semibold'); - - await expect(element).toHaveJSProperty('weight', 'semibold'); + await expect(element).not.toHaveAttribute('disabled'); - await expect(element).not.toHaveCustomState('regular'); + await expect(element).toHaveJSProperty('disabled', false); - await expect(element).toHaveCustomState('semibold'); + await expect(element).not.toHaveCustomState('disabled'); }); - test('should reflect disabled attribute', async ({ page }) => { - const element = page.locator('fluent-label'); - - await page.setContent(/* html */ ` - <fluent-label disabled>Label</fluent-label> - `); - - await expect(element).toHaveAttribute('disabled', ''); - - await expect(element).toHaveJSProperty('disabled', true); - - await expect(element).toHaveCustomState('disabled'); - }); + test('should set the `required` property to match the `required` attribute', async ({ fastPage }) => { + const { element } = fastPage; - test('should reflect required attribute and show asterisk', async ({ page }) => { - const element = page.locator('fluent-label'); + await fastPage.setTemplate({ attributes: { required: true } }); - await page.setContent(/* html */ ` - <fluent-label required>Label</fluent-label> - `); - - const asterisk = element.locator('span.asterisk'); - - await expect(element).toHaveAttribute('required', ''); + await expect(element).toHaveAttribute('required'); await expect(element).toHaveJSProperty('required', true); - await expect(asterisk).toBeVisible(); - }); + await test.step('should display an asterisk when the `required` attribute is set', async () => { + const asterisk = element.locator('span.asterisk'); - test('should hide asterisk when required attribute is not set', async ({ page }) => { - const element = page.locator('fluent-label'); + await expect(asterisk).toBeVisible(); + }); - await page.setContent(/* html */ ` - <fluent-label>Label</fluent-label> - `); + await element.evaluate((node: Label) => { + node.required = false; + }); - const asterisk = element.locator('span.asterisk'); - await expect(element).not.toHaveAttribute('required', ''); + await expect(element).not.toHaveAttribute('required'); await expect(element).toHaveJSProperty('required', false); - await expect(asterisk).toBeHidden(); + await test.step('should NOT display an asterisk when the `required` attribute is NOT set', async () => { + const asterisk = element.locator('span.asterisk'); + + await expect(asterisk).toBeHidden(); + }); }); }); diff --git a/packages/web-components/src/link/link.spec.ts b/packages/web-components/src/link/link.spec.ts index 1092d1f6edf56d..bafd3f290ac2ac 100644 --- a/packages/web-components/src/link/link.spec.ts +++ b/packages/web-components/src/link/link.spec.ts @@ -1,9 +1,9 @@ -import { spinalCase } from '@microsoft/fast-web-utilities'; -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Link } from './link.js'; +import { LinkAppearance } from './link.options.js'; -const proxyAttributes = { +const attributes = { + download: 'download', href: 'href', ping: 'ping', hreflang: 'en-GB', @@ -13,68 +13,44 @@ const proxyAttributes = { type: 'foo', }; -// Regular Attributes -const attributes = { - appearance: 'subtle', - ...proxyAttributes, -}; - test.describe('Link', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-link--appearance')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-link')); - }); - - for (const [attribute, value] of Object.entries(attributes)) { - const attributeSpinalCase = spinalCase(attribute); - - test(`should set the regular attribute: \`${attributeSpinalCase}\` to \`${value}\` on the element`, async ({ - page, - }) => { - const element = page.locator('fluent-link'); + test.use({ tagName: 'fluent-link' }); - await page.setContent(/* html */ ` - <fluent-link ${attributeSpinalCase}="${value}"></fluent-link> - `); + test(`should set each property to match its corresponding attribute`, async ({ fastPage }) => { + const { element } = fastPage; + const anchor = element.locator('a'); - await expect(element).toHaveJSProperty(`${attribute}`, `${value}`); - }); - } - - for (const [attribute, value] of Object.entries(proxyAttributes)) { - test(`should set the regular attribute: \`${attribute}\` to \`${value}\` on the internal proxy`, async ({ - page, - }) => { - const element = page.locator('fluent-link'); - const proxy = element.locator('a'); + for (const [attribute, value] of Object.entries(attributes)) { + await test.step(`should set the \`${attribute}\` property to match the \`${attribute}\` attribute`, async () => { + await fastPage.setTemplate({ attributes: { [attribute]: value } }); - await page.setContent(/* html */ ` - <fluent-link ${attribute}="${value}"></fluent-link> - `); + await expect(element).toHaveAttribute(attribute, value); - await expect(proxy).toHaveAttribute(`${attribute}`, `${value}`); - }); - } + await expect(element).toHaveJSProperty(attribute, value); + }); - test('should add a custom state matching the `appearance` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-link'); + await test.step(`should set the \`${attribute}\` attribute on the internal anchor element`, async () => { + await expect(anchor).toHaveAttribute(attribute, value); + }); + } + }); - await element.evaluate((node: Link) => { - node.appearance = 'subtle'; - }); + test('should set the `appearance` property to match the `appearance` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveCustomState('subtle'); + for (const appearance of Object.values(LinkAppearance)) { + await test.step(appearance, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); - await element.evaluate((node: Link) => { - node.appearance = undefined; - }); + await expect(element).toHaveJSProperty('appearance', appearance); - await expect(element).not.toHaveCustomState('subtle'); + await expect(element).toHaveAttribute('appearance', appearance); + }); + } }); - test('should add a custom state of `inline` when true', async ({ page }) => { - const element = page.locator('fluent-link'); + test('should add an "inline" state when the `inline` property is true', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((node: Link) => { node.inline = true; diff --git a/packages/web-components/src/menu-list/menu-list.spec.ts b/packages/web-components/src/menu-list/menu-list.spec.ts index a0081bd1901f1f..a48eac4893edd5 100644 --- a/packages/web-components/src/menu-list/menu-list.spec.ts +++ b/packages/web-components/src/menu-list/menu-list.spec.ts @@ -1,84 +1,64 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { MenuItem } from '../menu-item/menu-item.js'; import { MenuItemRole } from '../menu-item/menu-item.options.js'; test.describe('Menu', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-menulist--menu-list')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-menu-list')); + test.use({ + tagName: 'fluent-menu-list', + waitFor: ['fluent-menu-item'], + innerHTML: /* html */ ` + <fluent-menu-item>Menu item 1</fluent-menu-item> + <fluent-menu-item>Menu item 2</fluent-menu-item> + <fluent-menu-item>Menu item 3</fluent-menu-item> + <fluent-menu-item>Menu item 4</fluent-menu-item> + `, }); - test('should have a role of `menu`', async ({ page }) => { - const element = page.locator('fluent-menu-list'); - - await page.setContent(/* html */ ` - <fluent-menu-list> - <fluent-menu-item>Menu item</fluent-menu-item> - </fluent-menu-list> - `); + test('should have a role of `menu`', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', 'menu'); }); - test('should set `tabindex` of the first focusable menu item to 0', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should set `tabindex` of the first focusable menu item to 0', async ({ fastPage }) => { + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> - <fluent-menu-item>Menu item</fluent-menu-item> - <fluent-menu-item>Menu item</fluent-menu-item> - </fluent-menu-list> - `); - await expect(menuItems.first()).toHaveAttribute('tabindex', '0'); }); - test('should NOT set any `tabindex` on non-menu-item elements', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should NOT set any `tabindex` on non-menu-item elements', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item>Menu item</fluent-menu-item> <div class="divider">Not a menu item</div> - </fluent-menu-list> - `); + `, + }); const divider = element.locator('div.divider'); - expect(await divider.getAttribute('tabindex')).toBeNull(); + await expect(divider).not.toHaveAttribute('tabindex'); }); - test('should focus on first menu item when focus is called', async ({ page }) => { - const element = page.locator('fluent-menu-list'); - const menuItems = element.locator('fluent-menu-item'); - - await page.setContent(/* html */ ` - <fluent-menu-list> - <fluent-menu-item>Menu item</fluent-menu-item> - <fluent-menu-item>Menu item</fluent-menu-item> - </fluent-menu-list> - `); - - await element.waitFor({ state: 'attached' }); + test('should focus on first menu item when `focus()` is called', async ({ fastPage }) => { + const { element } = fastPage; + const firstItem = element.locator('fluent-menu-item').first(); - await expect(menuItems.first()).toHaveAttribute('tabindex', '0'); + await expect(firstItem).toHaveAttribute('tabindex', '0'); await element.evaluate(node => { node.focus(); }); - await expect(menuItems.first()).toBeFocused(); + await expect(firstItem).toBeFocused(); }); - test('should not throw when focus is called with no items', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should not throw when `focus()` is called with no items', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-menu-list></fluent-menu-list> - `); + await fastPage.setTemplate({ innerHTML: '' }); await element.evaluate(node => { node.focus(); @@ -87,10 +67,10 @@ test.describe('Menu', () => { await expect(element).not.toBeFocused(); }); - test('should not throw when focus is called before initialization is complete', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should not throw when `focus()` is called before initialization is complete', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(''); + await fastPage.setTemplate(''); await page.evaluate(() => { const menu = document.createElement('fluent-menu-list'); @@ -103,16 +83,16 @@ test.describe('Menu', () => { await expect(element).not.toBeFocused(); }); - test('should focus disabled items', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should focus disabled items', async ({ fastPage }) => { + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item disabled>Menu item</fluent-menu-item> <fluent-menu-item>Menu item</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); const firstMenuItem = menuItems.first(); @@ -127,31 +107,29 @@ test.describe('Menu', () => { }); for (const role of Object.values(MenuItemRole)) { - test(`should accept elements as focusable child with "${role}" role`, async ({ page }) => { - await page.setContent(/* html */ ` - <fluent-menu-list> - <div role="${role}">Menu item</div> - </fluent-menu-list> - `); + test(`should accept elements as focusable child with "${role}" role`, async ({ fastPage, page }) => { + await fastPage.setTemplate({ + innerHTML: /* html */ ` <div role="${role}">Menu item</div> `, + }); - await expect(page.getByRole(role as MenuItemRole).first()).toHaveAttribute('tabindex', '0'); + await expect(page.getByRole(role)).toHaveAttribute('tabindex', '0'); }); } - test('should not navigate to hidden items when changed after connection', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should not navigate to hidden items when changed after connection', async ({ fastPage }) => { + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item>Menu item 1</fluent-menu-item> <fluent-menu-item>Menu item 2</fluent-menu-item> <fluent-menu-item>Menu item 3</fluent-menu-item> <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); - await expect.soft(menuItems).toHaveCount(4); + await expect(menuItems).toHaveCount(4); await menuItems.nth(2).evaluate(node => node.toggleAttribute('hidden')); @@ -194,24 +172,20 @@ test.describe('Menu', () => { await expect(menuItems.nth(2)).toBeFocused(); }); - test('should treat all checkbox menu items as individually selectable items', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should treat all checkbox menu items as individually selectable items', async ({ fastPage }) => { + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item role="menuitemcheckbox">Menu item 1</fluent-menu-item> <fluent-menu-item role="menuitemcheckbox">Menu item 2</fluent-menu-item> <fluent-menu-item role="menuitemcheckbox">Menu item 3</fluent-menu-item> <fluent-menu-item role="menuitemcheckbox">Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); - - const menuItemsCount = await menuItems.count(); - - for (let i = 0; i < menuItemsCount; i++) { - const item = menuItems.nth(i); + `, + }); + for (const item of await menuItems.all()) { await expect(item).toHaveJSProperty('elementInternals.ariaChecked', 'false'); await item.click(); @@ -225,18 +199,18 @@ test.describe('Menu', () => { }); test(`should treat all radio menu items as a radiogroup and limit selection to one item within the group`, async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-menu-list'); + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item role="menuitemradio">Menu item 1</fluent-menu-item> <fluent-menu-item role="menuitemradio">Menu item 2</fluent-menu-item> <fluent-menu-item role="menuitemradio">Menu item 3</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); await menuItems.first().click(); @@ -264,20 +238,20 @@ test.describe('Menu', () => { }); test('should use elements with `[role="separator"]` to divide radio menu items into different radio groups', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-menu-list'); + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item role="menuitemradio">Menu item 1</fluent-menu-item> <fluent-menu-item role="menuitemradio">Menu item 2</fluent-menu-item> <fluent-divider role="separator"></fluent-divider> <fluent-menu-item role="menuitemradio">Menu item 3</fluent-menu-item> <fluent-menu-item role="menuitemradio">Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); await test.step('should select the first item in the first group', async () => { await menuItems.nth(0).click(); @@ -316,21 +290,10 @@ test.describe('Menu', () => { }); }); - test('should navigate the menu on arrow up/down keys', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should navigate the menu on arrow up/down keys', async ({ fastPage }) => { + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); - - await element.waitFor({ state: 'attached' }); - await element.evaluate(node => { node.focus(); }); @@ -353,13 +316,13 @@ test.describe('Menu', () => { }); test('should navigate to submenu, close it with escape key, and return focus to the first menu item', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-menu-list'); + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item >Menu item 1 <fluent-menu-list slot="submenu"> @@ -368,8 +331,8 @@ test.describe('Menu', () => { <fluent-menu-item>Menu item 1.3</fluent-menu-item> </fluent-menu-list> </fluent-menu-item> - </fluent-menu-list> - `); + `, + }); await element.first().evaluate(node => { node.focus(); @@ -384,18 +347,18 @@ test.describe('Menu', () => { await expect(menuItems.first()).toBeFocused(); }); - test('should not navigate to hidden items when set before connection', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should not navigate to hidden items when set before connection', async ({ fastPage }) => { + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item>Menu item 1</fluent-menu-item> <fluent-menu-item hidden="hidden">Menu item 2</fluent-menu-item> <fluent-menu-item>Menu item 3</fluent-menu-item> <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); await element.evaluate(node => { node.focus(); @@ -421,39 +384,30 @@ test.describe('Menu', () => { }); test('should set the data-indent attribute to 0 correctly on all MenuItem elements when role of menuitem and not content in start slot', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-menu-list'); + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> - <fluent-menu-item>Menu Item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); - for (const item of await menuItems.all()) { await expect(item).toHaveAttribute('data-indent', '0'); } }); test('should set the data-indent attribute to 1 correctly on all MenuItem elements when a menuitem in the menu as a role of menuitemcheckbox', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-menu-list'); + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item role="menuitemcheckbox"></fluent-menu-item> <fluent-menu-item>Menu item 2</fluent-menu-item> <fluent-menu-item>Menu item 3</fluent-menu-item> <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); for (const item of await menuItems.all()) { await expect(item).toHaveAttribute('data-indent', '1'); @@ -461,19 +415,19 @@ test.describe('Menu', () => { }); test('should set the data-indent attribute to 1 correctly on all MenuItem elements when a menuitem in the menu as a role of menuitemradio', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-menu-list'); + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item role="menuitemradio"></fluent-menu-item> <fluent-menu-item>Menu item 2</fluent-menu-item> <fluent-menu-item>Menu item 3</fluent-menu-item> <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); for (const item of await menuItems.all()) { await expect(item).toHaveAttribute('data-indent', '1'); @@ -481,13 +435,13 @@ test.describe('Menu', () => { }); test('should set the data-indent attribute to 2 correctly on all MenuItem elements when a menuitem in the menu has a role of menuitemcheckbox and content in the start slot', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-menu-list'); + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item role="menuitemcheckbox"> Item 1 <span slot="start" class="start">Icon</span> @@ -495,8 +449,8 @@ test.describe('Menu', () => { <fluent-menu-item>Menu item 2</fluent-menu-item> <fluent-menu-item>Menu item 3</fluent-menu-item> <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); for (const item of await menuItems.all()) { await expect(item).toHaveAttribute('data-indent', '2'); @@ -504,19 +458,19 @@ test.describe('Menu', () => { }); test('should set the data-indent attribute to 2 correctly on all MenuItem elements when a menuitem in the menu has a role of menuitemradio and content in the start slot', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-menu-list'); + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-item role="menuitemradio"> Item 1 <span slot="start" class="start">Icon</span> </fluent-menu-item> <fluent-menu-item>Menu item 2</fluent-menu-item> <fluent-menu-item>Menu item 3</fluent-menu-item> <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - `); + `, + }); for (const item of await menuItems.all()) { await expect(item).toHaveAttribute('data-indent', '2'); @@ -524,17 +478,17 @@ test.describe('Menu', () => { }); test.describe('`change` event', () => { - test('should emit `change` event when `checked` property changed', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should emit `change` event when `checked` property changed', async ({ fastPage }) => { + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> - <fluent-menu-item role="menuitemradio">Menu Item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> + await fastPage.setTemplate(/* html */ ` + <fluent-menu-list> + <fluent-menu-item role="menuitemradio">Menu Item 1</fluent-menu-item> + <fluent-menu-item>Menu item 2</fluent-menu-item> + <fluent-menu-item>Menu item 3</fluent-menu-item> + <fluent-menu-item>Menu item 4</fluent-menu-item> + </fluent-menu-list> `); const [wasChanged] = await Promise.all([ @@ -551,17 +505,17 @@ test.describe('Menu', () => { expect(wasChanged).toEqual(true); }); - test('should emit change event when menu-item checked and unchecked', async ({ page }) => { - const element = page.locator('fluent-menu-list'); + test('should emit change event when menu-item checked and unchecked', async ({ fastPage }) => { + const { element } = fastPage; const menuItems = element.locator('fluent-menu-item'); - await page.setContent(/* html */ ` - <fluent-menu-list> - <fluent-menu-item role="menuitemradio">Menu Item 1</fluent-menu-item> - <fluent-menu-item checked role="menuitemradio">Menu item 2</fluent-menu-item> - <fluent-menu-item role="menuitemradio">Menu item 3</fluent-menu-item> - <fluent-menu-item role="menuitemradio">Menu item 4</fluent-menu-item> - </fluent-menu-list> + await fastPage.setTemplate(/* html */ ` + <fluent-menu-list> + <fluent-menu-item role="menuitemradio">Menu Item 1</fluent-menu-item> + <fluent-menu-item checked role="menuitemradio">Menu item 2</fluent-menu-item> + <fluent-menu-item role="menuitemradio">Menu item 3</fluent-menu-item> + <fluent-menu-item role="menuitemradio">Menu item 4</fluent-menu-item> + </fluent-menu-list> `); let wasChanged = menuItems.nth(0).evaluate((node: MenuItem) => { diff --git a/packages/web-components/src/menu/menu.spec.ts b/packages/web-components/src/menu/menu.spec.ts index da0563f264a5bc..40544fdf1396c8 100644 --- a/packages/web-components/src/menu/menu.spec.ts +++ b/packages/web-components/src/menu/menu.spec.ts @@ -1,79 +1,42 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import type { Menu } from './menu.js'; +import { expect, test } from '../../test/playwright/index.js'; test.describe('Menu', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-menu--default')); - - await page.waitForFunction(() => - Promise.all([ - customElements.whenDefined('fluent-menu'), - customElements.whenDefined('fluent-menu-list'), - customElements.whenDefined('fluent-menu-item'), - customElements.whenDefined('fluent-menu-button'), - ]), - ); + test.use({ + innerHTML: /* html */ ` + <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> + <fluent-menu-list> + <fluent-menu-item>Menu item 1</fluent-menu-item> + <fluent-menu-item>Menu item 2</fluent-menu-item> + <fluent-menu-item>Menu item 3</fluent-menu-item> + <fluent-menu-item>Menu item 4</fluent-menu-item> + </fluent-menu-list> + `, + tagName: 'fluent-menu', + waitFor: ['fluent-menu-list', 'fluent-menu-item', 'fluent-menu-button'], }); - test('should have menu-list be initially hidden', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should have menu-list be initially hidden', async ({ fastPage }) => { + const { element } = fastPage; const menuList = element.locator('fluent-menu-list'); - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); - await expect(menuList).toBeHidden(); }); - test('should be visible when the button is clicked', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should be visible when the button is clicked', async ({ fastPage }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); - await menuButton.click(); await expect(menuList).toBeVisible(); }); - test('should be hidden when the button is clicked again', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should be hidden when the button is clicked again', async ({ fastPage }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); - await menuButton.click(); await expect(menuList).toBeVisible(); @@ -83,24 +46,12 @@ test.describe('Menu', () => { await expect(menuList).toBeHidden(); }); - test('should be hidden when an item is clicked', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should be hidden when an item is clicked', async ({ fastPage }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); const menuItems = menuList.locator('fluent-menu-item'); - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); - await menuButton.click(); await expect(menuList).toBeVisible(); @@ -110,24 +61,12 @@ test.describe('Menu', () => { await expect(menuList).toBeHidden(); }); - test('should close when an item is keyboard clicked', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should close when an item is focused and the enter key is pressed', async ({ fastPage, page }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); const menuItems = menuList.locator('fluent-menu-item'); - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); - await menuButton.click(); await expect(menuList).toBeVisible(); @@ -139,115 +78,69 @@ test.describe('Menu', () => { await expect(menuList).toBeHidden(); }); - test('should be hidden when clicked outside', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should close when an item is focused and the escape key is pressed', async ({ fastPage, page }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); - - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); + const menuItems = menuList.locator('fluent-menu-item'); await menuButton.click(); await expect(menuList).toBeVisible(); - await page.mouse.click(0, 0); + await menuItems.first().focus(); + + await page.keyboard.press('Escape'); await expect(menuList).toBeHidden(); }); - test('should be hidden when the escape key is pressed', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should close when the mouse is clicked outside the menu', async ({ fastPage, page }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); - await menuButton.click(); await expect(menuList).toBeVisible(); - await page.keyboard.press('Escape'); + await page.mouse.click(0, 0); await expect(menuList).toBeHidden(); }); - test('should be hidden when the escape key is pressed on an item', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should close when the escape key is pressed', async ({ fastPage, page }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); - const menuItems = menuList.locator('fluent-menu-item'); - - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); await menuButton.click(); await expect(menuList).toBeVisible(); - await menuItems.first().focus(); - await page.keyboard.press('Escape'); await expect(menuList).toBeHidden(); }); - test('should open on hover when openOnHover is true', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should NOT open on hover when the `openOnHover` property is false', async ({ fastPage }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); - await expect(menuList).toBeHidden(); await menuButton.hover(); await expect(menuList).toBeHidden(); + }); - await page.mouse.move(0, 0); + test('should open on hover when the `openOnHover` property is true', async ({ fastPage }) => { + const { element } = fastPage; + const menuButton = element.locator('fluent-menu-button'); + const menuList = element.locator('fluent-menu-list'); - await element.evaluate((x: Menu) => { - x.openOnHover = true; - }); + await fastPage.setTemplate({ attributes: { 'open-on-hover': true } }); await expect(menuList).toBeHidden(); @@ -256,99 +149,85 @@ test.describe('Menu', () => { await expect(menuList).toBeVisible(); }); - test('should open on context when openOnContext is true', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should NOT open on context when the `openOnContext` property is false', async ({ fastPage }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); const menuList = element.locator('fluent-menu-list'); - page.setContent(/* html */ ` - <fluent-menu> - <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> - <fluent-menu-list> - <fluent-menu-item>Menu item 1</fluent-menu-item> - <fluent-menu-item>Menu item 2</fluent-menu-item> - <fluent-menu-item>Menu item 3</fluent-menu-item> - <fluent-menu-item>Menu item 4</fluent-menu-item> - </fluent-menu-list> - </fluent-menu> - `); - await expect(menuList).toBeHidden(); await menuButton.click({ button: 'right' }); await expect(menuList).toBeHidden(); + }); - await element.evaluate((x: Menu) => { - x.openOnContext = true; - }); + test('should open on context when the `openOnContext` property is true', async ({ fastPage }) => { + const { element } = fastPage; + const menuButton = element.locator('fluent-menu-button'); + const menuList = element.locator('fluent-menu-list'); + + await fastPage.setTemplate({ attributes: { 'open-on-context': true } }); await expect(menuList).toBeHidden(); - await menuButton.dispatchEvent('contextmenu'); + await menuButton.click({ button: 'right' }); await expect(menuList).toBeVisible(); }); - // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 - test.skip('should focus first item after closing a submenu', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should focus the first item when a submenu is closed', async ({ fastPage }) => { + const { element } = fastPage; + const menuButton = element.locator('fluent-menu-button'); - const menuList = element.locator('fluent-menu-list'); + const menuList = element.locator('fluent-menu-list:not([slot])'); const menuItems = menuList.locator('fluent-menu-item'); - page.setContent(/* html */ ` - <fluent-menu> + const submenuList = element.locator('fluent-menu-list[slot="submenu"]'); + + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-menu-button appearance="primary" slot="trigger">Toggle Menu</fluent-menu-button> <fluent-menu-list> <fluent-menu-item> - Item 1 + Menu item 1 <fluent-menu-list slot="submenu"> <fluent-menu-item> Subitem 1 </fluent-menu-item> <fluent-menu-item> Subitem 2 </fluent-menu-item> + <fluent-menu-item> Subitem 3 </fluent-menu-item> </fluent-menu-list> </fluent-menu-item> - - <fluent-menu-item role="menuitemcheckbox"> Item 2 </fluent-menu-item> - <fluent-menu-item role="menuitemcheckbox"> Item 3 </fluent-menu-item> - - <fluent-divider role="separator" aria-orientation="horizontal" orientation="horizontal"></fluent-divider> - + <fluent-menu-item>Menu item 2</fluent-menu-item> + <fluent-menu-item>Menu item 3</fluent-menu-item> <fluent-menu-item>Menu item 4</fluent-menu-item> - <fluent-menu-item>Menu item 5</fluent-menu-item> - <fluent-menu-item>Menu item 6</fluent-menu-item> - - <fluent-menu-item>Menu item 7</fluent-menu-item> - <fluent-menu-item>Menu item 8</fluent-menu-item> </fluent-menu-list> - </fluent-menu> - `); + `, + }); await menuButton.click(); - await expect(menuList.first()).toBeVisible(); + await expect(menuList).toBeVisible(); - await expect(menuList.last()).toBeHidden(); + await expect(submenuList).toBeHidden(); await menuItems.first().focus(); - await page.keyboard.press('ArrowRight'); + await element.press('ArrowRight'); - await expect(menuList.last()).toBeVisible(); + await expect(submenuList).toBeVisible(); - await page.keyboard.press('ArrowLeft'); + await element.press('ArrowLeft'); - await expect(menuList.last()).toBeHidden(); + await expect(submenuList).toBeHidden(); - await expect(menuList.first()).toBeVisible(); + await expect(menuList).toBeVisible(); await expect(menuItems.first()).toBeFocused(); }); - test('should focus trigger after menu is closed', async ({ page }) => { - const element = page.locator('fluent-menu'); + test('should focus trigger after menu is closed', async ({ fastPage, page }) => { + const { element } = fastPage; const menuButton = element.locator('fluent-menu-button'); - page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-menu> <fluent-menu-button appearance="primary" slot="trigger" icon-only></fluent-menu-button> <fluent-button appearance="primary" slot="primary-action">Primary Action</fluent-menu-button> diff --git a/packages/web-components/src/message-bar/message-bar.integration.spec.ts b/packages/web-components/src/message-bar/message-bar.integration.spec.ts deleted file mode 100644 index 3e04a0142dc2e8..00000000000000 --- a/packages/web-components/src/message-bar/message-bar.integration.spec.ts +++ /dev/null @@ -1,104 +0,0 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import type { MessageBar } from './message-bar.js'; - -test.describe('Message Bar', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-messagebar--default')); - await page.waitForFunction(() => customElements.whenDefined('fluent-message-bar')); - }); - - test('should include a role of status', async ({ page }) => { - const element = page.locator('fluent-message-bar'); - - await expect(element).toHaveJSProperty('elementInternals.role', 'status'); - }); - - test('should set and retrieve the `intent` property correctly', async ({ page }) => { - const element = page.locator('fluent-message-bar'); - - await element.evaluate((node: MessageBar) => { - node.intent = 'success'; - }); - - await expect(element).toHaveJSProperty('intent', 'success'); - await expect(element).toHaveCustomState('success'); - - await element.evaluate((node: MessageBar) => { - node.intent = 'warning'; - }); - - await expect(element).toHaveJSProperty('intent', 'warning'); - await expect(element).not.toHaveCustomState('success'); - await expect(element).toHaveCustomState('warning'); - - await element.evaluate((node: MessageBar) => { - node.intent = 'error'; - }); - - await expect(element).toHaveJSProperty('intent', 'error'); - await expect(element).not.toHaveCustomState('warning'); - await expect(element).toHaveCustomState('error'); - - await element.evaluate((node: MessageBar) => { - node.intent = 'info'; - }); - - await expect(element).toHaveJSProperty('intent', 'info'); - await expect(element).not.toHaveCustomState('error'); - await expect(element).toHaveCustomState('info'); - }); - - test('should set and retrieve the `shape` property correctly', async ({ page }) => { - const element = page.locator('fluent-message-bar'); - - await element.evaluate((node: MessageBar) => { - node.shape = 'square'; - }); - - await expect(element).toHaveJSProperty('shape', 'square'); - await expect(element).toHaveCustomState('square'); - - await element.evaluate((node: MessageBar) => { - node.shape = 'rounded'; - }); - - await expect(element).toHaveJSProperty('shape', 'rounded'); - await expect(element).not.toHaveCustomState('square'); - await expect(element).toHaveCustomState('rounded'); - }); - - // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 - test.skip('should set and retrieve the `layout` property correctly', async ({ page }) => { - const element = page.locator('fluent-message-bar'); - - await element.evaluate((node: MessageBar) => { - node.layout = 'multiline'; - }); - - await expect(element).toHaveJSProperty('layout', 'multiline'); - expect(await element.evaluate((node: MessageBar) => node.getAttribute('layout'))).toBe('multiline'); - - await element.evaluate((node: MessageBar) => { - node.layout = 'singleline'; - }); - - await expect(element).toHaveJSProperty('layout', 'singleline'); - expect(await element.evaluate((node: MessageBar) => node.getAttribute('layout'))).toBe('singleline'); - }); - - test('should emit dismiss event when dismissMessageBar is called', async ({ page }) => { - const element = page.locator('fluent-message-bar'); - await element.evaluate((node: MessageBar) => { - node.addEventListener('dismiss', () => { - node.setAttribute('dismissed', 'true'); - }); - }); - - await element.evaluate((node: MessageBar) => { - node.dismissMessageBar(); - }); - - await expect(element).toHaveAttribute('dismissed', 'true'); - }); -}); diff --git a/packages/web-components/src/message-bar/message-bar.spec.ts b/packages/web-components/src/message-bar/message-bar.spec.ts new file mode 100644 index 00000000000000..5a63b491ac24f2 --- /dev/null +++ b/packages/web-components/src/message-bar/message-bar.spec.ts @@ -0,0 +1,73 @@ +import { expect, test } from '../../test/playwright/index.js'; +import type { MessageBar } from './message-bar.js'; +import { MessageBarIntent, MessageBarLayout, MessageBarShape } from './message-bar.options.js'; + +test.describe('Message Bar', () => { + test.use({ + tagName: 'fluent-message-bar', + waitFor: ['fluent-button'], + }); + + test('should include a role of status', async ({ fastPage }) => { + const { element } = fastPage; + + await expect(element).toHaveJSProperty('elementInternals.role', 'status'); + }); + + test('should set the `intent` property to match the `intent` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const intent of Object.values(MessageBarIntent)) { + await test.step(intent, async () => { + await fastPage.setTemplate({ attributes: { intent } }); + + await expect(element).toHaveJSProperty('intent', intent); + + await expect(element).toHaveAttribute('intent', intent); + }); + } + }); + + test('should set the `shape` property to match the `shape` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const shape of Object.values(MessageBarShape)) { + await test.step(shape, async () => { + await fastPage.setTemplate({ attributes: { shape } }); + + await expect(element).toHaveJSProperty('shape', shape); + + await expect(element).toHaveAttribute('shape', shape); + }); + } + }); + + // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 + test('should set the `layout` property to match the `layout` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const layout of Object.values(MessageBarLayout)) { + await test.step(layout, async () => { + await fastPage.setTemplate({ attributes: { layout } }); + + await expect(element).toHaveJSProperty('layout', layout); + + await expect(element).toHaveAttribute('layout', layout); + }); + } + }); + + test('should emit a `dismiss` event when `dismissMessageBar()` is called', async ({ fastPage }) => { + const { element } = fastPage; + + const didDismiss = element.evaluate( + node => new Promise(resolve => node.addEventListener('dismiss', () => resolve(true))), + ); + + await element.evaluate((node: MessageBar) => { + node.dismissMessageBar(); + }); + + await expect(didDismiss).resolves.toBe(true); + }); +}); diff --git a/packages/web-components/src/progress-bar/progress-bar.spec.ts b/packages/web-components/src/progress-bar/progress-bar.spec.ts index a39baa7ef63d85..10cd4638fe0249 100644 --- a/packages/web-components/src/progress-bar/progress-bar.spec.ts +++ b/packages/web-components/src/progress-bar/progress-bar.spec.ts @@ -1,70 +1,58 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { ProgressBar } from './progress-bar.js'; +import { ProgressBarShape, ProgressBarThickness, ProgressBarValidationState } from './progress-bar.options.js'; test.describe('Progress Bar', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-progressbar--default')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-progress-bar')); + test.use({ + tagName: 'fluent-progress-bar', }); - test('should include a role of progressbar', async ({ page }) => { - const element = page.locator('fluent-progress-bar'); + test('should include a role of progressbar', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', 'progressbar'); }); - test('should set the `aria-valuenow` attribute with the `value` property when provided', async ({ page }) => { - const element = page.locator('fluent-progress-bar'); + test('should set the `aria-valuenow` attribute to match the `value` property', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-progress-bar value="50"></fluent-progress-bar> - `); + await fastPage.setTemplate({ attributes: { value: '50' } }); await expect(element).toHaveJSProperty('elementInternals.ariaValueNow', '50'); }); - test('should set the `aria-valuemin` attribute with the `min` property when provided', async ({ page }) => { - const element = page.locator('fluent-progress-bar'); + test('should set the `aria-valuemin` attribute to match the `min` property', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-progress-bar min="50"></fluent-progress-bar> - `); + await fastPage.setTemplate({ attributes: { min: '50' } }); await expect(element).toHaveJSProperty('elementInternals.ariaValueMin', '50'); }); - test('should set the `aria-valuemax` attribute with the `max` property when provided', async ({ page }) => { - const element = page.locator('fluent-progress-bar'); + test('should set the `aria-valuemax` attribute to match the `max` property', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-progress-bar max="50"></fluent-progress-bar> - `); + await fastPage.setTemplate({ attributes: { max: '50' } }); await expect(element).toHaveJSProperty('elementInternals.ariaValueMax', '50'); }); - test('should return the `percentComplete` property as a value between 0 and 100 when `min` and `max` are unset', async ({ - page, + test('should set the `percentComplete` property to match the `value` property as a percentage between 0 and 100 when `min` and `max` are unset', async ({ + fastPage, }) => { - const element = page.locator('fluent-progress-bar'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-progress-bar value="50"></fluent-progress-bar> - `); + await fastPage.setTemplate({ attributes: { value: '50' } }); await expect(element).toHaveJSProperty('percentComplete', 50); }); - test('should set the `percentComplete` property to match the current `value` in the range of `min` and `max`', async ({ - page, + test('should set the `percentComplete` property to match the `value` property as a percentage between `min` and `max`', async ({ + fastPage, }) => { - const element = page.locator('fluent-progress-bar'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-progress-bar value="0"></fluent-progress-bar> - `); + await fastPage.setTemplate({ attributes: { value: '0' } }); await expect(element).toHaveJSProperty('percentComplete', 0); @@ -93,76 +81,51 @@ test.describe('Progress Bar', () => { await expect(element).toHaveJSProperty('percentComplete', 0); }); - test('should set and retrieve the `thickness` property correctly', async ({ page }) => { - const element = page.locator('fluent-progress-bar'); + test('should set the `thickness` property to match the `thickness` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: ProgressBar) => { - node.thickness = 'medium'; - }); + for (const thickness of Object.values(ProgressBarThickness)) { + await test.step(thickness, async () => { + await fastPage.setTemplate({ attributes: { thickness } }); - await expect(element).toHaveJSProperty('thickness', 'medium'); - await expect(element).toHaveCustomState('medium'); + await expect(element).toHaveAttribute('thickness', thickness); - await element.evaluate((node: ProgressBar) => { - node.thickness = 'large'; - }); + await expect(element).toHaveJSProperty('thickness', thickness); - await expect(element).toHaveJSProperty('thickness', 'large'); - await expect(element).not.toHaveCustomState('medium'); - await expect(element).toHaveCustomState('large'); + await expect(element).toHaveCustomState(thickness); + }); + } }); - test('should set and retrieve the `shape` property correctly', async ({ page }) => { - const element = page.locator('fluent-progress-bar'); + test('should set the `shape` property to match the `shape` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: ProgressBar) => { - node.shape = 'square'; - }); + for (const shape of Object.values(ProgressBarShape)) { + await test.step(shape, async () => { + await fastPage.setTemplate({ attributes: { shape } }); - await expect(element).toHaveJSProperty('shape', 'square'); - await expect(element).toHaveCustomState('square'); + await expect(element).toHaveAttribute('shape', shape); - await element.evaluate((node: ProgressBar) => { - node.shape = 'rounded'; - }); + await expect(element).toHaveJSProperty('shape', shape); - await expect(element).toHaveJSProperty('shape', 'rounded'); - await expect(element).not.toHaveCustomState('square'); - await expect(element).toHaveCustomState('rounded'); + await expect(element).toHaveCustomState(shape); + }); + } }); - test('should set and retrieve the `validationState` property correctly', async ({ page }) => { - const element = page.locator('fluent-progress-bar'); + test('should set the `validationState` property to match the `validation-state` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: ProgressBar) => { - node.validationState = 'success'; - }); + for (const validationState of Object.values(ProgressBarValidationState)) { + await test.step(validationState, async () => { + await fastPage.setTemplate({ attributes: { 'validation-state': validationState } }); - await expect(element).toHaveJSProperty('validationState', 'success'); - await expect(element).toHaveCustomState('success'); + await expect(element).toHaveAttribute('validation-state', validationState); - await element.evaluate((node: ProgressBar) => { - node.validationState = 'warning'; - }); - - await expect(element).toHaveJSProperty('validationState', 'warning'); - await expect(element).not.toHaveCustomState('success'); - await expect(element).toHaveCustomState('warning'); - - await element.evaluate((node: ProgressBar) => { - node.validationState = 'error'; - }); - - await expect(element).toHaveJSProperty('validationState', 'error'); - await expect(element).not.toHaveCustomState('warning'); - await expect(element).toHaveCustomState('error'); - - await element.evaluate((node: ProgressBar) => { - node.validationState = null; - }); + await expect(element).toHaveJSProperty('validationState', validationState); - await expect(element).not.toHaveCustomState('success'); - await expect(element).not.toHaveCustomState('warning'); - await expect(element).not.toHaveCustomState('error'); + await expect(element).toHaveCustomState(validationState); + }); + } }); }); diff --git a/packages/web-components/src/radio-group/radio-group.spec.ts b/packages/web-components/src/radio-group/radio-group.spec.ts index c7f8df7215555d..05531bd6eedf21 100644 --- a/packages/web-components/src/radio-group/radio-group.spec.ts +++ b/packages/web-components/src/radio-group/radio-group.spec.ts @@ -1,71 +1,57 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Radio } from '../radio/index.js'; import type { RadioGroup } from './radio-group.js'; test.describe('RadioGroup', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-radiogroup--radio-group')); - - await page.waitForFunction(() => - Promise.all([customElements.whenDefined('fluent-radio'), customElements.whenDefined('fluent-radio-group')]), - ); + test.use({ + tagName: 'fluent-radio-group', + waitFor: ['fluent-radio'], + innerHTML: '', }); - test('should have a role of `radiogroup`', async ({ page }) => { - const element = page.locator('fluent-radio-group'); - - await page.setContent(/* html */ ` - <fluent-radio-group></fluent-radio-group> - `); + test('should have a role of `radiogroup`', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', 'radiogroup'); }); - test('should set a default `aria-orientation` value when `orientation` is not defined', async ({ page }) => { - const element = page.locator('fluent-radio-group'); - - await page.setContent(/* html */ ` - <fluent-radio-group></fluent-radio-group> - `); + test('should set a default `aria-orientation` value when `orientation` is not defined', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'horizontal'); }); - test('should set the `aria-orientation` attribute equal to the `orientation` value', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should set the `aria-orientation` attribute equal to the `orientation` value', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-radio-group></fluent-radio-group> - `); + await test.step('horizontal', async () => { + await fastPage.setTemplate({ attributes: { orientation: 'horizontal' } }); - await element.evaluate((node: RadioGroup) => { - node.orientation = 'horizontal'; + await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'horizontal'); }); - await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'horizontal'); + await test.step('vertical', async () => { + await element.evaluate(node => { + node.setAttribute('orientation', 'vertical'); + }); - await element.evaluate((node: RadioGroup) => { - node.orientation = 'vertical'; + await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'vertical'); }); - - await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'vertical'); }); - test('should set the `aria-setsize` and `aria-posinset` attributes on the radios', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should set the `aria-setsize` and `aria-posinset` attributes on the radios', async ({ fastPage }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + `, + }); await expect(radios.nth(0)).toHaveAttribute('aria-posinset', '1'); - await expect(radios.nth(0)).toHaveAttribute('aria-setsize', '3'); await expect(radios.nth(1)).toHaveAttribute('aria-posinset', '2'); @@ -75,66 +61,58 @@ test.describe('RadioGroup', () => { await expect(radios.nth(2)).toHaveAttribute('aria-setsize', '3'); }); - test('should NOT modify child radio elements disabled state when the `disabled` attribute is present', async ({ - page, + test('should NOT modify the "disabled" state for child radios when the `disabled` attribute is present', async ({ + fastPage, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio></fluent-radio> - <fluent-radio disabled></fluent-radio> - <fluent-radio></fluent-radio> - </fluent-radio-group> - `); - - const hasDisabledAttribute = await element.evaluate((node: Element) => node.hasAttribute('disabled')); - expect(hasDisabledAttribute).toBe(false); - const firstRadio = radios.nth(0); const secondRadio = radios.nth(1); const thirdRadio = radios.nth(2); - const expectedFirst = await firstRadio.evaluate((node: Radio) => node.hasAttribute('disabled')); - const expectedSecond = await secondRadio.evaluate((node: Radio) => node.hasAttribute('disabled')); - const expectedThird = await thirdRadio.evaluate((node: Radio) => node.hasAttribute('disabled')); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio></fluent-radio> + <fluent-radio disabled></fluent-radio> + <fluent-radio></fluent-radio> + `, + }); + + await expect(element).not.toHaveAttribute('disabled'); - expect(await firstRadio.evaluate((radio: Radio) => radio.hasAttribute('disabled'))).toEqual(expectedFirst); + await expect(firstRadio).not.toHaveAttribute('disabled'); - expect(await secondRadio.evaluate((radio: Radio) => radio.hasAttribute('disabled'))).toEqual(expectedSecond); + await expect(secondRadio).toHaveAttribute('disabled'); - expect(await thirdRadio.evaluate((radio: Radio) => radio.hasAttribute('disabled'))).toEqual(expectedThird); + await expect(thirdRadio).not.toHaveAttribute('disabled'); element.evaluate((node: RadioGroup) => { node.toggleAttribute('disabled'); }); - const hasDisabledAttributeAfter = await element.evaluate((node: Element) => node.hasAttribute('disabled')); - - expect(hasDisabledAttributeAfter).toBe(true); + await expect(element).toHaveAttribute('disabled'); - expect(await firstRadio.evaluate((radio: Radio) => radio.hasAttribute('disabled'))).toEqual(expectedFirst); + await expect(firstRadio).not.toHaveAttribute('disabled'); - expect(await secondRadio.evaluate((radio: Radio) => radio.hasAttribute('disabled'))).toEqual(expectedSecond); + await expect(secondRadio).toHaveAttribute('disabled'); - expect(await thirdRadio.evaluate((radio: Radio) => radio.hasAttribute('disabled'))).toEqual(expectedThird); + await expect(thirdRadio).not.toHaveAttribute('disabled'); }); - test('should NOT be focusable when disabled', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should NOT be focusable when disabled', async ({ fastPage, page }) => { + const { element } = fastPage; const first = page.locator('button', { hasText: 'First' }); const second = page.locator('button', { hasText: 'Second' }); - await page.setContent(/* html */ ` - <button>First</button> - <fluent-radio-group disabled> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - </fluent-radio-group> - <button>Second</button> + await fastPage.setTemplate(/* html */ ` + <button>First</button> + <fluent-radio-group disabled> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + </fluent-radio-group> + <button>Second</button> `); await expect(element).toHaveAttribute('disabled'); @@ -148,29 +126,26 @@ test.describe('RadioGroup', () => { await expect(second).toBeFocused(); }); - test('should NOT be focusable via click when disabled', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should NOT be focusable via click when disabled', async ({ fastPage, page }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); + const button = page.locator('button', { hasText: 'Button' }); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <button>Button</button> <fluent-radio-group> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> </fluent-radio-group> - `); - - const radioItemsCount = await radios.count(); - const button = page.locator('button', { hasText: 'Button' }); + `); await button.focus(); await expect(button).toBeFocused(); - for (let i = 0; i < radioItemsCount; i++) { - const item = radios.nth(i); - await item.click(); - await expect(item).toBeFocused(); + for (const radio of await radios.all()) { + await radio.click(); + await expect(radio).toBeFocused(); } await element.evaluate(node => node.setAttribute('disabled', '')); @@ -179,9 +154,7 @@ test.describe('RadioGroup', () => { expect(isDisabled).toBe(true); - for (let i = 0; i < radioItemsCount; i++) { - const item = radios.nth(i); - + for (const radio of await radios.all()) { // Using page.evaluate to manually simulate what would happen with a click event const isClickable = await page.evaluate(el => { const event = new MouseEvent('click', { @@ -192,38 +165,40 @@ test.describe('RadioGroup', () => { // The return value of dispatchEvent will be false if any event listener called preventDefault, or true otherwise. return el?.dispatchEvent(event); - }, await item.elementHandle()); + }, await radio.elementHandle()); // Since the radio group is disabled, the click event should be canceled, so we expect isClickable to be false - await expect(isClickable).toBe(false); + expect(isClickable).toBe(false); } }); - test('should set tabindex of 0 to a child radio with a matching `value`', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should set tabindex of 0 to a child radio with a matching `value`', async ({ fastPage }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group value="foo"> - <fluent-radio value="foo"></fluent-radio> - <fluent-radio value="bar"></fluent-radio> - <fluent-radio value="baz"></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + attributes: { + value: 'foo', + }, + innerHTML: /* html */ ` + <fluent-radio value="foo"></fluent-radio> + <fluent-radio value="bar"></fluent-radio> + <fluent-radio value="baz"></fluent-radio> + `, + }); await expect(radios.nth(0)).toHaveAttribute('tabindex', '0'); }); - test('should check the first radio with a matching `value`', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should check the first radio with a matching `value`', async ({ fastPage }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-radio-group value="bar"> <fluent-radio id="radio-1" name="radio" value="foo"></fluent-radio> <fluent-radio id="radio-2" name="radio" value="bar"></fluent-radio> <fluent-radio id="radio-3" name="radio" value="baz"></fluent-radio> - </fluent-radio-group> `); await expect(radios.nth(0)).toHaveJSProperty('checked', false); @@ -234,12 +209,13 @@ test.describe('RadioGroup', () => { }); test('radio should remain checked after it is set to disabled and uncheck when a new radio is checked', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-radio-group> <fluent-radio id="radio-1" name="radio" value="foo"></fluent-radio> <fluent-radio id="radio-2" name="radio" value="bar"></fluent-radio> @@ -265,11 +241,11 @@ test.describe('RadioGroup', () => { await expect(radios.nth(2)).toHaveJSProperty('checked', true); }); - test('should emit `change` event when using keyboard', async ({ page }) => { + test('should emit `change` event when using keyboard', async ({ fastPage, page }) => { const element = page.locator('fluent-radio-group'); const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-radio-group> <fluent-radio id="radio-1" name="radio" value="foo"></fluent-radio> <fluent-radio id="radio-2" name="radio" value="bar"></fluent-radio> @@ -289,18 +265,20 @@ test.describe('RadioGroup', () => { await expect(wasChanged).resolves.toBeTruthy(); }); - // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 - test.skip('should set a child radio with a matching `value` to `checked` when value changes', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should set a child radio with a matching `value` to `checked` when value changes', async ({ fastPage }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group value="foo"> - <fluent-radio value="foo"></fluent-radio> - <fluent-radio value="bar"></fluent-radio> - <fluent-radio value="baz"></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + attributes: { + value: 'foo', + }, + innerHTML: /* html */ ` + <fluent-radio value="foo"></fluent-radio> + <fluent-radio value="bar"></fluent-radio> + <fluent-radio value="baz"></fluent-radio> + `, + }); await element.evaluate((node: RadioGroup) => { node.value = 'bar'; @@ -313,19 +291,18 @@ test.describe('RadioGroup', () => { await expect(radios.nth(2)).toHaveJSProperty('checked', false); }); - // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 - test.skip('should mark only the last radio defaulted to checked as checked', async ({ page }) => { - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio value="foo" checked></fluent-radio> - <fluent-radio value="bar" checked></fluent-radio> - <fluent-radio value="baz" checked></fluent-radio> - </fluent-radio-group> - `); - - const element = page.locator('fluent-radio-group'); + test('should mark only the last radio defaulted to checked as checked', async ({ fastPage }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio value="foo" checked></fluent-radio> + <fluent-radio value="bar" checked></fluent-radio> + <fluent-radio value="baz" checked></fluent-radio> + `, + }); + expect(await radios.evaluateAll((radios: Radio[]) => radios.filter(radio => radio.checked).length)).toBe(1); await expect(radios.nth(0)).toHaveJSProperty('checked', false); @@ -335,17 +312,18 @@ test.describe('RadioGroup', () => { await expect(radios.nth(2)).toHaveJSProperty('checked', true); }); - test('should mark radio matching value on radio-group over any checked attributes', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should mark radio matching value on radio-group over any checked attributes', async ({ fastPage }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group value="foo"> - <fluent-radio value="foo"></fluent-radio> - <fluent-radio value="bar" checked></fluent-radio> - <fluent-radio value="baz"></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + attributes: { value: 'foo' }, + innerHTML: /* html */ ` + <fluent-radio value="foo"></fluent-radio> + <fluent-radio value="bar" checked></fluent-radio> + <fluent-radio value="baz"></fluent-radio> + `, + }); expect(await radios.evaluateAll((radios: Radio[]) => radios.filter(radio => radio.checked).length)).toBe(1); @@ -358,18 +336,18 @@ test.describe('RadioGroup', () => { await expect(radios.nth(2)).toHaveJSProperty('checked', false); }); - test('should allow resetting of elements by the parent form', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should allow resetting of elements by the parent form', async ({ fastPage, page }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <form> - <fluent-radio-group> - <fluent-radio name="radio" value="foo"></fluent-radio> - <fluent-radio name="radio" value="bar" checked></fluent-radio> - <fluent-radio name="radio" value="baz"></fluent-radio> - </fluent-radio-group> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio-group> + <fluent-radio name="radio" value="foo"></fluent-radio> + <fluent-radio name="radio" value="bar" checked></fluent-radio> + <fluent-radio name="radio" value="baz"></fluent-radio> + </fluent-radio-group> + </form> `); const form = page.locator('form'); @@ -399,17 +377,17 @@ test.describe('RadioGroup', () => { await expect(radios.nth(2)).toHaveJSProperty('checked', false); }); - test('should focus the first radio when the radio group is focused', async ({ page }) => { - const element = page.locator('fluent-radio-group'); + test('should focus the first radio when the radio group is focused', async ({ fastPage, page }) => { + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + `, + }); await page.keyboard.press('Tab'); @@ -417,18 +395,19 @@ test.describe('RadioGroup', () => { }); test('should focus the second radio when the radio group is focused and the first radio is disabled', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio disabled></fluent-radio> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio disabled></fluent-radio> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + `, + }); await page.keyboard.press('Tab'); @@ -436,34 +415,38 @@ test.describe('RadioGroup', () => { }); test('should focus the third radio when the radio group is focused and the first two radios are disabled', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio disabled></fluent-radio> - <fluent-radio disabled></fluent-radio> - <fluent-radio></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio disabled></fluent-radio> + <fluent-radio disabled></fluent-radio> + <fluent-radio></fluent-radio> + `, + }); await page.keyboard.press('Tab'); await expect(radios.nth(2)).toBeFocused(); }); - test('should NOT focus any radio when the radio group is focused and all radios are disabled', async ({ page }) => { - const element = page.locator('fluent-radio-group'); - - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio disabled></fluent-radio> - <fluent-radio disabled></fluent-radio> - <fluent-radio disabled></fluent-radio> - </fluent-radio-group> - `); + test('should NOT focus any radio when the radio group is focused and all radios are disabled', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio disabled></fluent-radio> + <fluent-radio disabled></fluent-radio> + <fluent-radio disabled></fluent-radio> + `, + }); await page.keyboard.press('Tab'); @@ -471,19 +454,20 @@ test.describe('RadioGroup', () => { }); // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 - test.skip('should move focus to the next radio when the radio group is focused and the arrow down key is pressed', async ({ + test('should move focus to the next radio when the radio group is focused and the arrow down key is pressed', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + `, + }); await page.keyboard.press('Tab'); @@ -507,93 +491,100 @@ test.describe('RadioGroup', () => { }); test('should adopt the `name` of the radios when every radio has the same `name` and the radio group has no `name` attribute', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-radio-group'); - - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio name="foo"></fluent-radio> - <fluent-radio name="foo"></fluent-radio> - <fluent-radio name="foo"></fluent-radio> - </fluent-radio-group> - `); + const { element } = fastPage; + + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio name="foo"></fluent-radio> + <fluent-radio name="foo"></fluent-radio> + <fluent-radio name="foo"></fluent-radio> + `, + }); await expect(element).toHaveJSProperty('name', 'foo'); }); test('should NOT adopt the `name` of the radios when the radios have different `name` attributes', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-radio-group'); - - await page.setContent(/* html */ ` - <fluent-radio-group> - <fluent-radio name="foo"></fluent-radio> - <fluent-radio name="bar"></fluent-radio> - <fluent-radio name="baz"></fluent-radio> - </fluent-radio-group> - `); + const { element } = fastPage; + + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-radio name="foo"></fluent-radio> + <fluent-radio name="bar"></fluent-radio> + <fluent-radio name="baz"></fluent-radio> + `, + }); await expect(element).not.toHaveAttribute('name'); }); // @FIXME: This test is failing on OSX - https://github.com/microsoft/fluentui/issues/33172 - test.skip('should set the `name` attribute of the radios to the `name` attribute of the radio group', async ({ - page, + test('should set the `name` attribute of the radios to the `name` attribute of the radio group', async ({ + fastPage, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group name="foo"> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - <fluent-radio></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + attributes: { name: 'foo' }, + innerHTML: /* html */ ` + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + <fluent-radio></fluent-radio> + `, + }); + + for (const radio of await radios.all()) { + await expect(radio).toHaveAttribute('name', 'foo'); - expect(await radios.evaluateAll((radios: Radio[]) => radios.every(radio => radio.name === 'foo'))).toBe(true); + await expect(radio).toHaveJSProperty('name', 'foo'); + } }); test('should override the `name` attribute of the radios with the `name` attribute of the radio group', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <fluent-radio-group name="foo"> - <fluent-radio name="bar"></fluent-radio> - <fluent-radio name="baz"></fluent-radio> - <fluent-radio name="qux"></fluent-radio> - </fluent-radio-group> - `); + await fastPage.setTemplate({ + attributes: { name: 'foo' }, + innerHTML: /* html */ ` + <fluent-radio name="bar"></fluent-radio> + <fluent-radio name="baz"></fluent-radio> + <fluent-radio name="qux"></fluent-radio> + `, + }); await expect(element).toHaveAttribute('name', 'foo'); - expect( - await radios.evaluateAll((radios: Radio[]) => radios.every(radio => radio.getAttribute('name') === 'foo')), - ).toBe(true); + for (const radio of await radios.all()) { + await expect(radio).toHaveAttribute('name', 'foo'); - expect(await radios.evaluateAll((radios: Radio[]) => radios.every(radio => radio.name === 'foo'))).toBe(true); + await expect(radio).toHaveJSProperty('name', 'foo'); + } }); test('should submit the value of the checked radio when the radio group is in a form and the form is submitted', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <form> - <fluent-radio-group name="radio"> - <fluent-radio value="foo"></fluent-radio> - <fluent-radio value="bar"></fluent-radio> - <fluent-radio value="baz"></fluent-radio> - </fluent-radio-group> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio-group name="radio"> + <fluent-radio value="foo"></fluent-radio> + <fluent-radio value="bar"></fluent-radio> + <fluent-radio value="baz"></fluent-radio> + </fluent-radio-group> + <button type="submit">submit</button> + </form> `); const button = page.locator('button'); @@ -606,20 +597,21 @@ test.describe('RadioGroup', () => { }); test('should NOT submit the value of the checked radio when the radio group is in a form and the form is submitted and the radio group is disabled', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <form> - <fluent-radio-group name="radio" disabled> - <fluent-radio value="foo"></fluent-radio> - <fluent-radio value="bar"></fluent-radio> - <fluent-radio value="baz"></fluent-radio> - </fluent-radio-group> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio-group name="radio" disabled> + <fluent-radio value="foo"></fluent-radio> + <fluent-radio value="bar"></fluent-radio> + <fluent-radio value="baz"></fluent-radio> + </fluent-radio-group> + <button type="submit">submit</button> + </form> `); const button = page.locator('button'); @@ -632,20 +624,21 @@ test.describe('RadioGroup', () => { }); test('should NOT submit the value of the checked radio when the radio group is in a form and the form is submitted and the radio group has no name', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); - await page.setContent(/* html */ ` - <form> - <fluent-radio-group> - <fluent-radio value="foo"></fluent-radio> - <fluent-radio value="bar"></fluent-radio> - <fluent-radio value="baz"></fluent-radio> - </fluent-radio-group> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio-group> + <fluent-radio value="foo"></fluent-radio> + <fluent-radio value="bar"></fluent-radio> + <fluent-radio value="baz"></fluent-radio> + </fluent-radio-group> + <button type="submit">submit</button> + </form> `); const button = page.locator('button'); @@ -658,13 +651,14 @@ test.describe('RadioGroup', () => { }); test('should NOT submit the value of the checked radio when the radio group is in a form and the form is submitted and the radio group has no radios', async ({ + fastPage, page, }) => { - await page.setContent(/* html */ ` - <form> - <fluent-radio-group name="radio" value="foo"></fluent-radio-group> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio-group name="radio" value="foo"></fluent-radio-group> + <button type="submit">submit</button> + </form> `); const button = page.locator('button'); @@ -675,21 +669,22 @@ test.describe('RadioGroup', () => { }); test('should NOT submit the value of the checked radio when the radio group is in a form and the form is submitted and the radio group has no enabled radios', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio-group'); + const { element } = fastPage; const radios = element.locator('fluent-radio'); const button = page.locator('button'); - await page.setContent(/* html */ ` - <form> - <fluent-radio-group name="radio"> - <fluent-radio disabled value="foo"></fluent-radio> - <fluent-radio disabled value="bar"></fluent-radio> - <fluent-radio disabled value="baz"></fluent-radio> - </fluent-radio-group> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio-group name="radio"> + <fluent-radio disabled value="foo"></fluent-radio> + <fluent-radio disabled value="bar"></fluent-radio> + <fluent-radio disabled value="baz"></fluent-radio> + </fluent-radio-group> + <button type="submit">submit</button> + </form> `); await radios.nth(1).click(); diff --git a/packages/web-components/src/radio/radio.spec.ts b/packages/web-components/src/radio/radio.spec.ts index 6e8cf6ae074913..c66f05634b45f5 100644 --- a/packages/web-components/src/radio/radio.spec.ts +++ b/packages/web-components/src/radio/radio.spec.ts @@ -1,30 +1,17 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Radio } from './radio.js'; test.describe('Radio', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-radio--radio')); + test.use({ tagName: 'fluent-radio' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-radio')); - }); - - test('should have a role of `radio`', async ({ page }) => { - const element = page.locator('fluent-radio'); - - await page.setContent(/* html */ ` - <fluent-radio>Radio</fluent-radio> - `); + test('should have a role of `radio`', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', 'radio'); }); - test('should set ARIA attributes to match the state', async ({ page }) => { - const element = page.locator('fluent-radio'); - - await page.setContent(/* html */ ` - <fluent-radio>Radio</fluent-radio> - `); + test('should set ARIA attributes to match the state', async ({ fastPage }) => { + const { element } = fastPage; await test.step('ariaChecked', async () => { await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'false'); @@ -51,128 +38,97 @@ test.describe('Radio', () => { }); }); - test('should set a tabindex of 0 on the element', async ({ page }) => { - const element = page.locator('fluent-radio'); - - await page.setContent(/* html */ ` - <fluent-radio>Radio</fluent-radio> - `); + test('should set a `tabindex` of 0 on the element', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveAttribute('tabindex', '0'); }); - test('should NOT set a tabindex when disabled is `true`', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should set the tabindex to -1 when disabled is `true`', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-radio disabled></fluent-radio> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); - await expect(element).not.toHaveAttribute('tabindex', ''); + await expect(element).toHaveAttribute('tabindex', '-1'); }); - test('should initialize to the initial value if no value property is set', async ({ page }) => { - const element = page.locator('fluent-radio'); - - await page.setContent(/* html */ ` - <fluent-radio>Radio</fluent-radio> - `); + test('should initialize to the initial value if no value property is set', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('value', 'on'); await expect(element).toHaveJSProperty('initialValue', 'on'); }); - test('should initialize to the provided value attribute if set pre-connection', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should initialize to the provided value attribute if set pre-connection', async ({ fastPage, page }) => { + await fastPage.setTemplate(''); - await page.setContent(/* html */ ` - <fluent-radio>Radio</fluent-radio> - `); + const value = await page.evaluate(() => { + const radio = document.createElement('fluent-radio') as Radio; + radio.setAttribute('value', 'foo'); - await element.evaluate((node: Radio) => node.setAttribute('value', 'foo')); + return radio.value; + }); - await expect(element).toHaveJSProperty('value', 'foo'); + expect(value).toBe('foo'); }); - test('should initialize to the provided value attribute if set post-connection', async ({ page }) => { - const element = page.locator('fluent-radio'); - - await page.setContent(/* html */ ` - <fluent-radio>Radio</fluent-radio> - `); + test('should initialize to the provided value attribute if set post-connection', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((node: Radio) => node.setAttribute('value', 'foo')); await expect(element).toHaveJSProperty('value', 'foo'); }); - test('should initialize to the provided value property if set pre-connection', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should initialize to the provided value property if set pre-connection', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-radio value="foo"></fluent-radio> - `); + await fastPage.setTemplate({ attributes: { value: 'foo' } }); await expect(element).toHaveJSProperty('value', 'foo'); }); - test('should fire an event when spacebar is pressed', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should fire an event when spacebar is pressed', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-radio>Radio</fluent-radio> - `); + const wasPressed = element.evaluate( + node => new Promise(resolve => node.addEventListener('keydown', () => resolve(true))), + ); + + await element.focus(); - const [wasPressed] = await Promise.all([ - element.evaluate( - (node: Radio) => - new Promise(resolve => - node.addEventListener('keydown', () => resolve(true), { - once: true, - }), - ), - ), - // FIXME: Playwright's keyboard API is not working as expected. - element.evaluate(node => node.dispatchEvent(new KeyboardEvent('keydown', { key: ' ' }))), - ]); - - expect(wasPressed).toBeTruthy(); + await element.press(' '); + + await expect(wasPressed).resolves.toBe(true); }); - test('should NOT fire events when clicked', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should NOT fire events when clicked', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-radio>Radio</fluent-radio> - `); + const wasNotClicked = await page.evaluate(el => { + const event = new KeyboardEvent('click', { + bubbles: true, + cancelable: true, + view: window, + }); - const [wasClicked] = await Promise.all([ - element.evaluate( - (node: Radio) => - new Promise(resolve => - node.addEventListener('click', () => resolve(false), { - once: true, - }), - ), - ), - element.evaluate(node => { - node.dispatchEvent(new MouseEvent('click')); - }), - ]); - - expect(wasClicked).toBeFalsy(); + // The return value of dispatchEvent will be false if any event listener called preventDefault, or true otherwise. + return el?.dispatchEvent(event); + }, await element.elementHandle()); + + expect(wasNotClicked).toEqual(true); }); test.describe('whose parent form has its reset() method invoked', () => { - test('should set its checked property to false if the checked attribute is unset', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should set its checked property to false if the checked attribute is unset', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-radio>Radio</fluent-radio> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio>Radio</fluent-radio> + </form> `); await element.evaluate((node: Radio) => { @@ -188,14 +144,14 @@ test.describe('Radio', () => { await expect(element).toHaveJSProperty('checked', false); }); - test('should set its `checked` property to true if the `checked` attribute is set', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should set its `checked` property to true if the `checked` attribute is set', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-radio checked></fluent-radio> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio checked></fluent-radio> + </form> `); await expect(element).toHaveAttribute('checked'); @@ -218,15 +174,16 @@ test.describe('Radio', () => { }); test('should put the control into a clean state, where `checked` attribute modifications modify the `checked` property prior to user or programmatic interaction', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio'); + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-radio>Radio</fluent-radio> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio>Radio</fluent-radio> + </form> `); await element.evaluate((node: Radio) => { @@ -249,14 +206,14 @@ test.describe('Radio', () => { }); }); - test('should set the `checked` property to false if the `checked` attribute is unset', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should set the `checked` property to false if the `checked` attribute is unset', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-radio></fluent-radio> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio></fluent-radio> + </form> `); await expect(element).toHaveJSProperty('checked', false); @@ -274,14 +231,14 @@ test.describe('Radio', () => { await expect(element).toHaveJSProperty('checked', false); }); - test('should set its checked property to true if the checked attribute is set', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should set its checked property to true if the checked attribute is set', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-radio></fluent-radio> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio></fluent-radio> + </form> `); await expect(element).toHaveJSProperty('checked', false); @@ -300,15 +257,16 @@ test.describe('Radio', () => { }); test('should put the control into a clean state, where `checked` attribute modifications change the `checked` property prior to user or programmatic interaction', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-radio'); + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-radio required></fluent-radio> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio required></fluent-radio> + </form> `); await element.evaluate((node: Radio) => { @@ -325,27 +283,27 @@ test.describe('Radio', () => { await expect(element).toHaveJSProperty('checked', false); await element.evaluate((node: Radio) => { - node.setAttribute('checked', ''); + node.toggleAttribute('checked', true); }); - expect(await element.evaluate((node: Radio) => node.value)).toBeTruthy(); + await expect(element).toHaveJSProperty('checked', true); }); - test('should NOT submit the value of the radio when checked', async ({ page }) => { - const element = page.locator('fluent-radio'); + test('should NOT submit the value of the radio when checked', async ({ fastPage, page }) => { + const { element } = fastPage; const submitButton = page.locator('button'); - await page.setContent(/* html */ ` - <form> - <fluent-radio name="radio" value="foo"></fluent-radio> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-radio name="radio" value="foo"></fluent-radio> + <button type="submit">submit</button> + </form> `); await element.click(); await submitButton.click(); - expect(page.url()).not.toContain('?radio=foo'); + await expect(page).not.toHaveURL(/\?radio=foo/); }); }); diff --git a/packages/web-components/src/rating-display/rating-display.spec.ts b/packages/web-components/src/rating-display/rating-display.spec.ts index 8cb709821172c1..3cd1da4c7b8148 100644 --- a/packages/web-components/src/rating-display/rating-display.spec.ts +++ b/packages/web-components/src/rating-display/rating-display.spec.ts @@ -1,76 +1,72 @@ -import { type Locator, test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import { RatingDisplaySize } from './rating-display.options.js'; import type { RatingDisplay } from './rating-display.js'; test.describe('Rating Display', () => { - let element: Locator; - - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-rating-display--default')); - await page.waitForFunction(() => customElements.whenDefined('fluent-rating-display')); - - element = page.locator('fluent-rating-display'); + test.use({ + tagName: 'fluent-rating-display', }); - test('should not set any default attributes and custom states', async ({ page }) => { + test('should not set any default attributes and custom states', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toBeVisible(); - await expect(element).not.toHaveAttribute('color'); - await expect(element).not.toHaveAttribute('compact'); - await expect(element).not.toHaveAttribute('count'); - await expect(element).not.toHaveAttribute('icon-view-box'); - await expect(element).not.toHaveAttribute('max'); - await expect(element).not.toHaveAttribute('size'); - await expect(page.locator('.count-label')).toBeHidden(); - - expect(await element.evaluate((node: RatingDisplay) => node.color)).toBeUndefined(); - expect(await element.evaluate((node: RatingDisplay) => node.size)).toBeUndefined(); + for (const attribute of ['color', 'compact', 'count', 'icon-view-box', 'max', 'size']) { + await expect(element).not.toHaveAttribute(attribute); + } + await expect(element.locator('.count-label')).toBeHidden(); + + await expect(element).toHaveJSProperty('color', undefined); + await expect(element).toHaveJSProperty('size', undefined); }); - test('should set the correct accessibility attributes', async ({ page }) => { - await page.setContent(`<fluent-rating-display value="3.5" count="100"></fluent-rating-display>`); + test('should set the correct accessibility attributes', async ({ fastPage }) => { + const { element } = fastPage; + await fastPage.setTemplate({ attributes: { value: '3.5', count: '100' } }); await expect(element).toHaveJSProperty('elementInternals.role', 'img'); - await expect(page.locator('svg').first()).toHaveAttribute('aria-hidden', 'true'); - await expect(page.locator('.value-label')).toHaveAttribute('aria-hidden', 'true'); - await expect(page.locator('.count-label')).toHaveAttribute('aria-hidden', 'true'); + await expect(element.locator('svg').first()).toHaveAttribute('aria-hidden', 'true'); + await expect(element.locator('.value-label')).toHaveAttribute('aria-hidden', 'true'); + await expect(element.locator('.count-label')).toHaveAttribute('aria-hidden', 'true'); }); test('should display the correct number of filled icons and label text based on the `value` attribute', async ({ - page, + fastPage, }) => { - await page.setContent(`<fluent-rating-display value="3.5"></fluent-rating-display>`); + const { element } = fastPage; + await fastPage.setTemplate({ attributes: { value: '3.5' } }); await expect(element).toHaveJSProperty('value', 3.5); - await expect(page.locator('.value-label')).toHaveText('3.5'); - await expect(page.locator('svg[aria-hidden="true"]')).toHaveCount(10); + await expect(element.locator('.value-label')).toHaveText('3.5'); + await expect(element.locator('svg[aria-hidden="true"]')).toHaveCount(10); // Based on the `value` attribute, the 7th icon should be set as selected - await expect(page.locator('svg:nth-child(7 of [aria-hidden="true"])')).toHaveAttribute('selected'); + await expect(element.locator('svg:nth-child(7 of [aria-hidden="true"])')).toHaveAttribute('selected'); // The first 7 icons should have the default filled color (colorPaletteMarigoldBackground3) - for (const icon of await page.locator('svg:nth-child(-n+7 of [aria-hidden="true"])').all()) { + for (const icon of await element.locator('svg:nth-child(-n+7 of [aria-hidden="true"])').all()) { await expect(icon).toHaveCSS('fill', 'rgb(234, 163, 0)'); } // Other icons after the selected icon should have the default unfilled color (colorPaletteMarigoldBackground2) - for (const icon of await page.locator('svg:nth-child(n+8 of [aria-hidden="true"])').all()) { + for (const icon of await element.locator('svg:nth-child(n+8 of [aria-hidden="true"])').all()) { await expect(icon).toHaveCSS('fill', 'rgb(249, 226, 174)'); } }); - test('should use the right icon color based on the `color` attribute', async ({ page }) => { - await page.setContent(`<fluent-rating-display value="4"></fluent-rating-display>`); - - expect(await element.evaluate((node: RatingDisplay) => node.color)).toBeUndefined(); + test('should use the right icon color based on the `color` attribute', async ({ fastPage }) => { + const { element } = fastPage; + const filledIcons = element.locator('svg:nth-child(-n+8 of [aria-hidden="true"])'); + const unfilledIcons = element.locator('svg:nth-child(n+9 of [aria-hidden="true"])'); + await fastPage.setTemplate({ attributes: { value: '4' } }); + await expect(element).toHaveJSProperty('color', undefined); // Assert correct color for filled icons - for (const icon of await page.locator('svg:nth-child(-n+8 of [aria-hidden="true"])').all()) { + for (const icon of await filledIcons.all()) { await expect(icon).toHaveCSS('fill', 'rgb(234, 163, 0)'); } // Assert correct color for unfilled icons - for (const icon of await page.locator('svg:nth-child(n+9 of [aria-hidden="true"])').all()) { + for (const icon of await unfilledIcons.all()) { await expect(icon).toHaveCSS('fill', 'rgb(249, 226, 174)'); } @@ -78,14 +74,14 @@ test.describe('Rating Display', () => { node.color = 'brand'; }); - expect(await element.evaluate((node: RatingDisplay) => node.color)).toBe('brand'); + await expect(element).toHaveJSProperty('color', 'brand'); await expect(element).toHaveCustomState('brand'); - for (const icon of await page.locator('svg:nth-child(-n+8 of [aria-hidden="true"])').all()) { + for (const icon of await filledIcons.all()) { await expect(icon).toHaveCSS('fill', 'rgb(15, 108, 189)'); } - for (const icon of await page.locator('svg:nth-child(n+9 of [aria-hidden="true"])').all()) { + for (const icon of await unfilledIcons.all()) { await expect(icon).toHaveCSS('fill', 'rgb(180, 214, 250)'); } @@ -93,43 +89,47 @@ test.describe('Rating Display', () => { node.color = 'neutral'; }); - expect(await element.evaluate((node: RatingDisplay) => node.color)).toBe('neutral'); + await expect(element).toHaveJSProperty('color', 'neutral'); await expect(element).toHaveCustomState('neutral'); - for (const icon of await page.locator('svg:nth-child(-n+8 of [aria-hidden="true"])').all()) { + for (const icon of await filledIcons.all()) { await expect(icon).toHaveCSS('fill', 'rgb(36, 36, 36)'); } - for (const icon of await page.locator('svg:nth-child(n+9 of [aria-hidden="true"])').all()) { + for (const icon of await unfilledIcons.all()) { await expect(icon).toHaveCSS('fill', 'rgb(224, 224, 224)'); } }); - test('should display the compact version', async ({ page }) => { - await page.setContent(`<fluent-rating-display value="4.5" compact="true"></fluent-rating-display>`); + test('should display the compact version', async ({ fastPage }) => { + const { element } = fastPage; + const svgs = element.locator('svg[aria-hidden="true"]'); + await fastPage.setTemplate({ attributes: { value: '4.5', compact: 'true' } }); await expect(element).toHaveJSProperty('compact', true); - await expect(page.locator('svg[aria-hidden="true"]')).toHaveCount(2); - await expect(page.locator('svg[aria-hidden="true"]').last()).toHaveAttribute('selected'); - await expect(page.locator('.value-label')).toHaveText('4.5'); + await expect(svgs).toHaveCount(2); + await expect(svgs.last()).toHaveAttribute('selected'); + await expect(element.locator('.value-label')).toHaveText('4.5'); - for (const icon of await page.locator('svg[aria-hidden="true"]').all()) { + for (const icon of await svgs.all()) { await expect(icon).toHaveCSS('fill', 'rgb(234, 163, 0)'); } }); - test('should display the count text', async ({ page }) => { - await page.setContent(`<fluent-rating-display value="3" count="1000"></fluent-rating-display>`); + test('should display the count text', async ({ fastPage }) => { + const { element } = fastPage; + await fastPage.setTemplate({ attributes: { value: '3', count: '1000' } }); await expect(element).toHaveJSProperty('count', 1000); - await expect(page.locator('.value-label')).toHaveText('3'); - await expect(page.locator('.count-label')).toHaveText('1,000'); + await expect(element.locator('.value-label')).toHaveText('3'); + await expect(element.locator('.count-label')).toHaveText('1,000'); }); - test('should set the correct icon `viewBox` based on the `icon-view-box` attribute', async ({ page }) => { - await page.setContent(`<fluent-rating-display value="2.2"></fluent-rating-display>`); + test('should set the correct icon `viewBox` based on the `icon-view-box` attribute', async ({ fastPage }) => { + const { element } = fastPage; + await fastPage.setTemplate({ attributes: { value: '2.2' } }); - const icon: Locator = page.locator('svg[aria-hidden="true"]').last(); + const icon = element.locator('svg[aria-hidden="true"]').last(); // Should set the default value when the attribute is not provided await expect(icon).toHaveAttribute('viewBox', '0 0 20 20'); @@ -141,21 +141,24 @@ test.describe('Rating Display', () => { await expect(icon).toHaveAttribute('viewBox', '0 0 12 12'); }); - test('should display the correct number of icons based on the `max` attribute', async ({ page }) => { - await page.setContent(`<fluent-rating-display value="8" max="10"></fluent-rating-display>`); + test('should display the correct number of icons based on the `max` attribute', async ({ fastPage }) => { + const { element } = fastPage; + const svgs = element.locator('svg[aria-hidden="true"]'); + await fastPage.setTemplate({ attributes: { value: '8', max: '10' } }); await expect(element).toHaveJSProperty('max', 10); - await expect(page.locator('svg[aria-hidden="true"]')).toHaveCount(20); - await expect(page.locator('svg:nth-child(16 of [aria-hidden="true"])')).toHaveAttribute('selected'); + await expect(svgs).toHaveCount(20); + await expect(svgs.nth(15)).toHaveAttribute('selected'); }); - test('should display the component in the correct size based on the `size` attribute', async ({ page }) => { - await page.setContent(`<fluent-rating-display value="1.3"></fluent-rating-display>`); + test('should display the component in the correct size based on the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; + const icon = element.locator('svg[aria-hidden="true"]').last(); + const value = element.locator('.value-label'); - const icon: Locator = page.locator('svg[aria-hidden="true"]').last(); - const value: Locator = page.locator('.value-label'); + await fastPage.setTemplate({ attributes: { value: '1.3' } }); - expect(await element.evaluate((node: RatingDisplay) => node.size)).toBeUndefined(); + await expect(element).toHaveJSProperty('size', undefined); await expect(icon).toHaveCSS('width', '16px'); await expect(icon).toHaveCSS('height', '16px'); @@ -167,7 +170,6 @@ test.describe('Rating Display', () => { node.size = 'small'; }); - expect(await element.evaluate((node: RatingDisplay) => node.size)).toBe('small'); await expect(element).toHaveCustomState('small'); await expect(element).toHaveJSProperty('size', RatingDisplaySize.small); @@ -181,7 +183,6 @@ test.describe('Rating Display', () => { node.size = 'large'; }); - expect(await element.evaluate((node: RatingDisplay) => node.size)).toBe('large'); await expect(element).toHaveCustomState('large'); await expect(element).toHaveJSProperty('size', RatingDisplaySize.large); @@ -192,12 +193,18 @@ test.describe('Rating Display', () => { await expect(value).toHaveCSS('margin-inline-start', '6px'); }); - test('should use custom icons when provided', async ({ page }) => { - await page.setContent( - `<fluent-rating-display value="4.1"><svg slot="icon"><path d="M10 2C5.58172 2 2 5.58172 2 10C2 14.4183 5.58172 18 10 18C14.4183 18 18 14.4183 18 10C18 5.58172 14.4183 2 10 2Z" /></svg></fluent-rating-display>`, - ); + test('should use custom icons when provided', async ({ fastPage }) => { + const { element } = fastPage; + await fastPage.setTemplate({ + attributes: { value: '4.1' }, + innerHTML: /* html */ ` + <svg slot="icon"> + <path d="M10 2C5.58172 2 2 5.58172 2 10C2 14.4183 5.58172 18 10 18C14.4183 18 18 14.4183 18 10C18 5.58172 14.4183 2 10 2Z" /> + </svg> + `, + }); - const icon: Locator = page.locator('svg[aria-hidden="true"]').last(); + const icon = element.locator('svg[aria-hidden="true"]').last(); // Check for <path> as a direct child to verify that the custom icon is being used await expect(icon.locator('> path')).toBeVisible(); diff --git a/packages/web-components/src/slider/slider.spec.ts b/packages/web-components/src/slider/slider.spec.ts index ac63388a34df0a..6b418625873a77 100644 --- a/packages/web-components/src/slider/slider.spec.ts +++ b/packages/web-components/src/slider/slider.spec.ts @@ -1,34 +1,23 @@ -import type { Direction } from '@microsoft/fast-web-utilities'; -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Slider } from './slider.js'; +import { SliderSize } from './slider.options.js'; test.describe('Slider', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-slider--slider')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-slider')); + test.use({ + tagName: 'fluent-slider', }); // Foundation tests - test('should have a default role of `slider`', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + test('should have a default role of `slider`', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', 'slider'); }); test('should have default empty string values if `min`, `max`, and `step` attributes are not set', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + const { element } = fastPage; await expect(element).toHaveJSProperty('min', ''); @@ -37,10 +26,10 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('step', ''); }); - test('should reference connected <label> elements', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should reference connected `<label>` elements', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <label for="slider">Label 1</label> <fluent-slider id="slider"></fluent-slider> <label for="slider">Label 2</label> @@ -53,96 +42,67 @@ test.describe('Slider', () => { expect(await element.evaluate((el: Slider) => el.labels[1].textContent)).toBe('Label 2'); }); - test('should set a `tabindex` of 0', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + test('should set a `tabindex` of 0', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveAttribute('tabindex', '0'); }); test('should set a default `elementInternals.ariaOrientation` when `orientation` is not defined', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'horizontal'); }); - test('should initialize to the initial value if no value property is set', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + test('should initialize to the initial value if no value property is set', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('value', '50'); }); - test('should NOT set default `elementInternals.ariaDisabled` when `disabled` is not defined', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + test('should NOT set default `elementInternals.ariaDisabled` when `disabled` is not defined', async ({ + fastPage, + }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.ariaDisabled', 'false'); }); - test('should set `elementInternals.ariaDisabled` when `disabled` is present', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should set `elementInternals.ariaDisabled` when the `disabled` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider disabled></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await expect(element).toHaveJSProperty('elementInternals.ariaDisabled', 'true'); }); - test('should set the `elementInternals.ariaDisabled` when `disabled` value is true', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should set the `elementInternals.ariaDisabled` when `disabled` property is true', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + await expect(element).toHaveJSProperty('elementInternals.ariaDisabled', 'false'); await element.evaluate((node: Slider) => { node.disabled = true; }); await expect(element).toHaveJSProperty('elementInternals.ariaDisabled', 'true'); - - await element.evaluate((node: Slider) => { - node.disabled = false; - }); - - await expect(element).toHaveJSProperty('elementInternals.ariaDisabled', 'false'); }); - test('should NOT set a tabindex when `disabled` value is true', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should set a negative `tabindex` when `disabled` is true', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); - await element.evaluate((node: Slider) => { - node.disabled = true; - }); - - await expect(element).not.toHaveAttribute('tabindex', '0'); + await expect(element).toHaveAttribute('tabindex', '-1'); }); - test('should be enabled/disabled by the associated fieldset', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should be enabled/disabled by the associated fieldset', async ({ fastPage, page }) => { + const { element } = fastPage; + const fieldset = page.locator('fieldset'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fieldset> <fluent-slider></fluent-slider> @@ -150,8 +110,6 @@ test.describe('Slider', () => { </form> `); - const fieldset = page.locator('fieldset'); - await fieldset.evaluate((node: HTMLFieldSetElement) => (node.disabled = true)); // The `disabled` property and attribute should not be affected. @@ -177,113 +135,67 @@ test.describe('Slider', () => { await expect(element).toHaveAttribute('tabindex', '0'); }); - test('should set `elementInternals.ariaOrientation` equal to the `orientation` value', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); - - await element.evaluate((node: Slider) => { - node.orientation = 'horizontal'; - }); + test('should set `elementInternals.ariaOrientation` to `horizontal` when `orientation` is set to `horizontal`', async ({ + fastPage, + }) => { + const { element } = fastPage; + await fastPage.setTemplate({ attributes: { orientation: 'horizontal' } }); await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'horizontal'); - - await element.evaluate((node: Slider) => { - node.orientation = 'vertical'; - }); - - await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'vertical'); }); - test('should set direction equal to the `direction` value', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); - - await element.evaluate((node: Slider) => { - node.direction = 'ltr' as Direction; - }); - - await expect(element).toHaveJSProperty('direction', 'ltr'); - - await element.evaluate((node: Slider) => { - node.direction = 'rtl' as Direction; - }); + test('should set `elementInternals.ariaOrientation` to `vertical` when `orientation` is set to `vertical`', async ({ + fastPage, + }) => { + const { element } = fastPage; + await fastPage.setTemplate({ attributes: { orientation: 'vertical' } }); - await expect(element).toHaveJSProperty('direction', 'rtl'); + await expect(element).toHaveJSProperty('elementInternals.ariaOrientation', 'vertical'); }); - test('should set and retrieve the `size` property correctly', async ({ page }) => { - const element = page.locator('fluent-slider'); + for (const size of Object.values(SliderSize)) { + test(`should set the \`size\` property to \`${size}\` when the \`size\` attribute is set to \`${size}\``, async ({ + fastPage, + }) => { + const { element } = fastPage; - await element.evaluate((node: Slider) => { - node.size = 'small'; - }); + await fastPage.setTemplate({ attributes: { size } }); - await expect(element).toHaveJSProperty('size', 'small'); + await expect(element).toHaveJSProperty('size', size); - await element.evaluate((node: Slider) => { - node.size = 'medium'; + await expect(element).toHaveCustomState(size); }); + } - await expect(element).toHaveJSProperty('size', 'medium'); - }); - - test('should set `elementInternals.ariaValueNow` with the `value` property when provided', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + test('should set `elementInternals.ariaValueNow` with the `value` property when provided', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Slider) => { - node.value = '8'; - }); + await fastPage.setTemplate({ attributes: { value: '8' } }); await expect(element).toHaveJSProperty('elementInternals.ariaValueNow', '8'); }); - test('should set `elementInternals.ariaValueMin` with the `min` property when provided', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + test('should set `elementInternals.ariaValueMin` with the `min` property when provided', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Slider) => { - node.min = '0'; - }); + await fastPage.setTemplate({ attributes: { min: '0' } }); await expect(element).toHaveJSProperty('elementInternals.ariaValueMin', '0'); }); test('should set `elementInternals.ariaValueMax` attribute with the `max` property when provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + const { element } = fastPage; - await element.evaluate((node: Slider) => { - node.max = '75'; - }); + await fastPage.setTemplate({ attributes: { max: '75' } }); await expect(element).toHaveJSProperty('elementInternals.ariaValueMax', '75'); }); test.describe('valueAsNumber', () => { - test('should allow setting value with number', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + test('should allow setting value with number', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((node: Slider) => { node.valueAsNumber = 8; @@ -292,29 +204,19 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('value', '8'); }); - test('should allow reading value as number', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should allow reading value as number', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); - - await element.evaluate((node: Slider) => { - node.value = '8'; - }); + await fastPage.setTemplate({ attributes: { value: '8' } }); await expect(element).toHaveJSProperty('valueAsNumber', 8); }); }); test('should set `elementInternals.ariaValueText` attribute with the result of the valueTextFormatter() method', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + const { element } = fastPage; await element.evaluate((node: Slider) => { node.valueTextFormatter = () => 'Seventy Five Years'; @@ -331,12 +233,10 @@ test.describe('Slider', () => { }); test.describe('increment and decrement methods', () => { - test('should increment the value when the `increment()` method is invoked', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should increment the value when the `increment()` method is invoked', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="0" max="100" value="50" step="5"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '0', max: '100', value: '50', step: '5' } }); await element.evaluate((node: Slider) => { node.increment(); @@ -346,12 +246,10 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('elementInternals.ariaValueNow', '55'); }); - test('should decrement the value when the `decrement()` method is invoked', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should decrement the value when the `decrement()` method is invoked', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="0" max="100" value="50" step="5"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '0', max: '100', value: '50', step: '5' } }); await element.evaluate((node: Slider) => { node.decrement(); @@ -362,13 +260,11 @@ test.describe('Slider', () => { }); test('should increment the value when the `increment()` method is invoked and step is not provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-slider'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="0" max="100" value="50"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '0', max: '100', value: '50' } }); await element.evaluate((node: Slider) => { node.increment(); @@ -379,13 +275,11 @@ test.describe('Slider', () => { }); test('should decrement the value when the `decrement()` method is invoked and step is not provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-slider'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="0" max="100" value="50"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '0', max: '100', value: '50' } }); await element.evaluate((node: Slider) => { node.decrement(); @@ -396,20 +290,16 @@ test.describe('Slider', () => { }); }); - test('should increase or decrease the slider value on arrow left/right keys', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should increase or decrease the slider value on arrow left/right keys', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-slider min="0" max="100"></fluent-slider> </form> `); - await element.waitFor({ state: 'attached' }); - - await element.evaluate(node => { - node.focus(); - }); + await element.focus(); await element.evaluate((node: Slider) => { node.value = '7'; @@ -426,20 +316,16 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('value', '7'); }); - test('should increase or decrease the slider value on arrow up/down keys', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should increase or decrease the slider value on arrow up/down keys', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-slider min="0" max="100"></fluent-slider> </form> `); - await element.waitFor({ state: 'attached' }); - - await element.evaluate(node => { - node.focus(); - }); + await element.focus(); await element.evaluate((node: Slider) => { node.value = '7'; @@ -457,13 +343,11 @@ test.describe('Slider', () => { }); test('should constrain and normalize the value between `min` and `max` when the value is out of range', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-slider'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="0" max="100"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '0', max: '100' } }); await element.evaluate((node: Slider) => { node.value = '200'; @@ -481,13 +365,11 @@ test.describe('Slider', () => { }); test('should return string values for `min`, `max`, and `step` regardless the value types were used to set', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-slider'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="10" max="100" step="20"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '0', max: '100', step: '20' } }); await element.evaluate<void, any>(node => { node.min = 20; @@ -500,12 +382,10 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('step', '10'); }); - test('should set to empty strings if `min`, `max`, and `step` to be set as invalid values', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should set to empty strings if `min`, `max`, and `step` to be set as invalid values', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="10" max="200" step="20"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '10', max: '200', step: '20' } }); await element.evaluate<void, any>(node => { node.min = undefined; @@ -518,23 +398,22 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('step', ''); }); - test('should initialize to the provided value attribute if set pre-connection', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should initialize to the provided value attribute when set pre-connection', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider value="4"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { value: '4' } }); await element.waitFor({ state: 'attached' }); await expect(element).toHaveJSProperty('value', '4'); + await expect(element).toHaveJSProperty('elementInternals.ariaValueNow', '4'); }); - test('should initialize to the provided value property if set pre-connection', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should initialize to the provided value property when set pre-connection', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(''); + await fastPage.setTemplate(''); await page.evaluate(() => { const slider = document.createElement('fluent-slider') as Slider; @@ -548,12 +427,8 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('elementInternals.ariaValueNow', '3'); }); - test('should initialize to the provided value attribute if set post-connection', async ({ page }) => { - const element = page.locator('fluent-slider'); - - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + test('should initialize to the provided value attribute when set post-connection', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((node: Slider) => { node.setAttribute('value', '3'); @@ -563,12 +438,10 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('elementInternals.ariaValueNow', '3'); }); - test('should update the `stepMultiplier` when the `step` attribute has been updated', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should update the `stepMultiplier` when the `step` attribute has been updated', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider step="2" value="4"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { step: '2', value: '4' } }); await element.evaluate((node: Slider) => { node.increment(); @@ -585,10 +458,13 @@ test.describe('Slider', () => { }); test.describe('when the associated form’s reset() method is invoked', () => { - test('should reset its `value` property to the midpoint if no `value` attribute is set', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should reset its `value` property to the midpoint if no `value` attribute is set', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-slider></fluent-slider> </form> @@ -609,10 +485,13 @@ test.describe('Slider', () => { await expect(element).toHaveJSProperty('value', '50'); }); - test('should reset its `value` property to match the `value` attribute when it is set', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should reset its `value` property to match the `value` attribute when it is set', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-slider min="0" max="100"></fluent-slider> </form> @@ -639,12 +518,13 @@ test.describe('Slider', () => { }); test('should put the control into a clean state, where the value attribute changes the value property prior to user or programmatic interaction', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-slider'); + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-slider min="0" max="100"></fluent-slider> </form> @@ -675,102 +555,80 @@ test.describe('Slider', () => { }); test.describe('`change` event', () => { - test('should emit `change` event when `value` property changed', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should emit `change` event when `value` property changed', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + const wasChanged = element.evaluate( + node => new Promise(resolve => node.addEventListener('change', () => resolve(true))), + ); - const [wasChanged] = await Promise.all([ - element.evaluate( - node => new Promise(resolve => node.addEventListener('change', () => resolve(true), { once: true })), - ), - element.evaluate((node: Slider) => { - node.value = '10'; - }), - ]); + await element.evaluate((node: Slider) => { + node.value = '10'; + }); - expect(wasChanged).toEqual(true); + await expect(wasChanged).resolves.toEqual(true); }); - test('should emit `change` event if the `value` attribute changed', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should emit `change` event if the `value` attribute changed', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider></fluent-slider> - `); + const wasChanged = element.evaluate( + node => new Promise(resolve => node.addEventListener('change', () => resolve(true))), + ); - const [wasChanged] = await Promise.all([ - element.evaluate( - node => new Promise(resolve => node.addEventListener('change', () => resolve(true), { once: true })), - ), - element.evaluate((node: Slider) => { - node.setAttribute('value', '10'); - }), - ]); + element.evaluate((node: Slider) => { + node.setAttribute('value', '10'); + }); - expect(wasChanged).toEqual(true); + await expect(wasChanged).resolves.toEqual(true); }); - test('should emit `change` event if changes on `min` causes `value` change', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should emit `change` event if changes on `min` causes `value` change', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="10" value="20" max="30"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '10', value: '20', max: '30' } }); + + const wasChanged = element.evaluate( + node => new Promise(resolve => node.addEventListener('change', () => resolve(true))), + ); - const [wasChanged] = await Promise.all([ - element.evaluate( - node => new Promise(resolve => node.addEventListener('change', () => resolve(true), { once: true })), - ), - element.evaluate((node: Slider) => { - node.min = '21'; - }), - ]); + await element.evaluate((node: Slider) => { + node.min = '21'; + }); - expect(wasChanged).toEqual(true); + await expect(wasChanged).resolves.toEqual(true); }); - test('should emit `change` event if changes on `max` causes `value` change', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should emit `change` event if changes on `max` causes `value` change', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="10" value="20" max="30"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '10', value: '20', max: '30' } }); - const [wasChanged] = await Promise.all([ - element.evaluate( - node => new Promise(resolve => node.addEventListener('change', () => resolve(true), { once: true })), - ), - element.evaluate((node: Slider) => { - node.max = '19'; - }), - ]); + const wasChanged = element.evaluate( + node => new Promise(resolve => node.addEventListener('change', () => resolve(true))), + ); - expect(wasChanged).toEqual(true); + await element.evaluate((node: Slider) => { + node.max = '19'; + }); + + await expect(wasChanged).resolves.toEqual(true); }); - test('should emit `change` event if changes on `step` causes `value` change', async ({ page }) => { - const element = page.locator('fluent-slider'); + test('should emit `change` event if changes on `step` causes `value` change', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-slider min="10" value="20" step="10" max="30"></fluent-slider> - `); + await fastPage.setTemplate({ attributes: { min: '10', value: '20', step: '10', max: '30' } }); + + const wasChanged = element.evaluate( + node => new Promise(resolve => node.addEventListener('change', () => resolve(true))), + ); + + await element.evaluate((node: Slider) => { + node.step = '11'; + }); - const [wasChanged] = await Promise.all([ - element.evaluate( - node => - new Promise(resolve => { - node.addEventListener('change', () => resolve(true)); - }), - ), - element.evaluate((node: Slider) => { - node.step = '11'; - }), - ]); - - expect(wasChanged).toEqual(true); + await expect(wasChanged).resolves.toEqual(true); }); }); }); diff --git a/packages/web-components/src/spinner/spinner.spec.ts b/packages/web-components/src/spinner/spinner.spec.ts index 8e84fef20c3498..6510c6ccff3f73 100644 --- a/packages/web-components/src/spinner/spinner.spec.ts +++ b/packages/web-components/src/spinner/spinner.spec.ts @@ -1,58 +1,36 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import type { Spinner } from './spinner.js'; +import { expect, test } from '../../test/playwright/index.js'; import { SpinnerAppearance, SpinnerSize } from './spinner.options.js'; test.describe('Spinner', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-spinner--default')); - - await page.waitForFunction(() => customElements.whenDefined('fluent-spinner')); + test.use({ + tagName: 'fluent-spinner', }); - for (const thisAppearance of Object.values(SpinnerAppearance)) { - test(`should set and retrieve the \`appearance\` property correctly to ${thisAppearance}`, async ({ page }) => { - const element = page.locator('fluent-spinner'); - - await element.evaluate((node: Spinner, appearance) => { - node.appearance = appearance; - }, thisAppearance as SpinnerAppearance); - - await expect(element).toHaveJSProperty('appearance', thisAppearance); - - await test.step('should add a custom state matching the `appearance` attribute when provided', async () => { - for (const appearance of Object.values(SpinnerAppearance)) { - // eslint-disable-next-line playwright/no-conditional-in-test - if (appearance === thisAppearance) { - await expect(element).toHaveCustomState(appearance); - } else { - await expect(element).not.toHaveCustomState(appearance); - } - } + test('should set the `appearance` property to match the `appearance` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const appearance of Object.values(SpinnerAppearance)) { + await test.step(appearance, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); + + await expect(element).toHaveJSProperty('appearance', appearance); + + await expect(element).toHaveAttribute('appearance', appearance); }); - }); - } - - for (const thisSize of Object.values(SpinnerSize)) { - test(`should set and retrieve the \`size\` property correctly to ${thisSize}`, async ({ page }) => { - const element = page.locator('fluent-spinner'); - - await element.evaluate((node: Spinner, size) => { - node.size = size; - }, thisSize as SpinnerSize); - - await expect(element).toHaveJSProperty('size', thisSize); - - await test.step('should add a custom state matching the `appearance` attribute when provided', async () => { - for (const size of Object.values(SpinnerSize)) { - // eslint-disable-next-line playwright/no-conditional-in-test - if (size === thisSize) { - await expect(element).toHaveCustomState(size); - } else { - await expect(element).not.toHaveCustomState(size); - } - } + } + }); + + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const size of Object.values(SpinnerSize)) { + await test.step(size, async () => { + await fastPage.setTemplate({ attributes: { size } }); + + await expect(element).toHaveJSProperty('size', size); + + await expect(element).toHaveAttribute('size', size); }); - }); - } + } + }); }); diff --git a/packages/web-components/src/switch/switch.spec.ts b/packages/web-components/src/switch/switch.spec.ts index 3b9617428ea86c..08df8fd0568e0d 100644 --- a/packages/web-components/src/switch/switch.spec.ts +++ b/packages/web-components/src/switch/switch.spec.ts @@ -1,42 +1,27 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Switch } from './switch.js'; test.describe('Switch', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-switch--switch')); + test.use({ tagName: 'fluent-switch' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-switch')); - }); - - test('should have a role of `switch`', async ({ page }) => { - const element = page.locator('fluent-switch'); - - await page.setContent(/* html */ ` - <fluent-switch></fluent-switch> - `); + test('should have a role of `switch`', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', 'switch'); }); - test('should set the `ariaChecked` property to `false` when `checked` is not defined', async ({ page }) => { - const element = page.locator('fluent-switch'); - - await page.setContent(/* html */ ` - <fluent-switch></fluent-switch> - `); + test('should set the `ariaChecked` property to `false` when `checked` is not defined', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).not.toHaveAttribute('checked'); await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'false'); }); - test('should set the `ariaChecked` property equal to the `checked` property', async ({ page }) => { - const element = page.locator('fluent-switch'); + test('should set the `ariaChecked` property equal to the `checked` property', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-switch checked></fluent-switch> - `); + await fastPage.setTemplate({ attributes: { checked: true } }); await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'true'); @@ -47,68 +32,48 @@ test.describe('Switch', () => { await expect(element).toHaveJSProperty('elementInternals.ariaChecked', 'false'); }); - test('should NOT set a default `aria-required` value when `required` is not defined', async ({ page }) => { - const element = page.locator('fluent-switch'); - - await page.setContent(/* html */ ` - <fluent-switch></fluent-switch> - `); + test('should NOT set a default `aria-required` value when `required` is not defined', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).not.toHaveAttribute('required'); await expect(element).not.toHaveAttribute('aria-required'); }); - test('should be focusable by default', async ({ page }) => { - const element = page.locator('fluent-switch'); - - await page.setContent(/* html */ ` - <fluent-switch></fluent-switch> - `); + test('should be focusable by default', async ({ fastPage }) => { + const { element } = fastPage; await element.focus(); await expect(element).toBeFocused(); }); - test('should NOT be focusable when the `disabled` attribute is set', async ({ page }) => { - const element = page.locator('fluent-switch'); + test('should NOT be focusable when the `disabled` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-switch disabled></fluent-switch> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await element.focus(); await expect(element).not.toBeFocused(); }); - test('should initialize to the initial value if no value property is set', async ({ page }) => { - const element = page.locator('fluent-switch'); - - await page.setContent(/* html */ ` - <fluent-switch></fluent-switch> - `); + test('should initialize to the initial value if no `value` property is set', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('value', 'on'); }); - test('should initialize to the provided `value` attribute when set pre-connection', async ({ page }) => { - const element = page.locator('fluent-switch'); + test('should initialize to the provided `value` attribute when set pre-connection', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-switch value="foo"></fluent-switch> - `); + await fastPage.setTemplate({ attributes: { value: 'foo' } }); await expect(element).toHaveJSProperty('value', 'foo'); }); - test('should initialize to the provided `value` attribute when set post-connection', async ({ page }) => { - const element = page.locator('fluent-switch'); - - await page.setContent(/* html */ ` - <fluent-switch></fluent-switch> - `); + test('should initialize to the provided `value` attribute when set post-connection', async ({ fastPage }) => { + const { element } = fastPage; const expectedValue = 'foobar'; @@ -119,12 +84,8 @@ test.describe('Switch', () => { await expect(element).toHaveJSProperty('value', expectedValue); }); - test('should initialize to the provided `value` property when set pre-connection', async ({ page }) => { - // const element = page.locator('fluent-switch'); - - await page.setContent(/* html */ ` - <fluent-switch></fluent-switch> - `); + test('should initialize to the provided `value` property when set pre-connection', async ({ fastPage, page }) => { + await fastPage.setTemplate(''); const expectedValue = 'foobar'; @@ -133,48 +94,48 @@ test.describe('Switch', () => { node.value = expectedValue; - return Promise.resolve(node.value); + return node.value; }, expectedValue); expect(value).toBe(expectedValue); }); - test('should be invalid when unchecked', async ({ page }) => { - const element = page.locator('fluent-switch'); + test('should be invalid when unchecked', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <form> - <fluent-switch required></fluent-switch> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-switch required></fluent-switch> + </form> `); - expect(await element.evaluate((node: Switch) => node.validity.valueMissing)).toBe(true); + await expect(element).toHaveJSProperty('validity.valueMissing', true); }); - test('should be valid when checked', async ({ page }) => { - const element = page.locator('fluent-switch'); + test('should be valid when checked', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <form> - <fluent-switch required></fluent-switch> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-switch required></fluent-switch> + </form> `); await element.click(); await expect(element).toHaveJSProperty('checked', true); - expect(await element.evaluate((node: Switch) => node.validity.valueMissing)).toBe(false); + await expect(element).toHaveJSProperty('validity.valueMissing', false); }); - test('should set the `checked` property to false if the `checked` attribute is unset', async ({ page }) => { - const element = page.locator('fluent-switch'); + test('should set the `checked` property to false if the `checked` attribute is unset', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-switch></fluent-switch> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-switch></fluent-switch> + </form> `); await expect(element).toHaveJSProperty('checked', false); @@ -192,14 +153,14 @@ test.describe('Switch', () => { await expect(element).toHaveJSProperty('checked', false); }); - test('should set its checked property to true if the checked attribute is set', async ({ page }) => { - const element = page.locator('fluent-switch'); + test('should set its checked property to true if the checked attribute is set', async ({ fastPage, page }) => { + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-switch></fluent-switch> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-switch></fluent-switch> + </form> `); await expect(element).toHaveJSProperty('checked', false); @@ -218,15 +179,16 @@ test.describe('Switch', () => { }); test('should put the control into a clean state, where `checked` attribute modifications change the `checked` property prior to user or programmatic interaction', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-switch'); + const { element } = fastPage; const form = page.locator('form'); - await page.setContent(/* html */ ` - <form> - <fluent-switch required></fluent-switch> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-switch required></fluent-switch> + </form> `); await element.evaluate((node: Switch) => { @@ -246,39 +208,39 @@ test.describe('Switch', () => { node.setAttribute('checked', ''); }); - expect(await element.evaluate((node: Switch) => node.value)).toBeTruthy(); + await expect(element).toHaveJSProperty('value', 'on'); }); - test('should submit the value of the switch when checked', async ({ page }) => { - const element = page.locator('fluent-switch'); + test('should submit the value of the switch when checked', async ({ fastPage, page }) => { + const { element } = fastPage; const submitButton = page.locator('button'); - await page.setContent(/* html */ ` - <form> - <fluent-switch name="switch" value="foo"></fluent-switch> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-switch name="switch" value="foo"></fluent-switch> + <button type="submit">submit</button> + </form> `); await element.click(); await submitButton.click(); - expect(page.url()).toContain('?switch=foo'); + await expect(page).toHaveURL(/\?switch=foo/); }); - test('should submit the values of multiple switches when checked', async ({ page }) => { + test('should submit the values of multiple switches when checked', async ({ fastPage, page }) => { const switches = page.locator('fluent-switch'); const element1 = switches.nth(0); const element2 = switches.nth(1); const submitButton = page.locator('button'); - await page.setContent(/* html */ ` - <form> - <fluent-switch name="switch" value="foo"></fluent-switch> - <fluent-switch name="switch" value="bar"></fluent-switch> - <button type="submit">submit</button> - </form> + await fastPage.setTemplate(/* html */ ` + <form> + <fluent-switch name="switch" value="foo"></fluent-switch> + <fluent-switch name="switch" value="bar"></fluent-switch> + <button type="submit">submit</button> + </form> `); await element1.click(); @@ -286,6 +248,6 @@ test.describe('Switch', () => { await submitButton.click(); - expect(page.url()).toContain('?switch=foo&switch=bar'); + await expect(page).toHaveURL(/\?switch=foo&switch=bar/); }); }); diff --git a/packages/web-components/src/tab-panel/tab-panel.spec.ts b/packages/web-components/src/tab-panel/tab-panel.spec.ts index ceb8738db7c26c..5462d948ff8359 100644 --- a/packages/web-components/src/tab-panel/tab-panel.spec.ts +++ b/packages/web-components/src/tab-panel/tab-panel.spec.ts @@ -1,30 +1,17 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; test.describe('TabPanel', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-tabs--tabs-default')); + test.use({ tagName: 'fluent-tab-panel' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-tab-panel')); - }); - - test('should have a role of `tabpanel`', async ({ page }) => { - const element = page.locator('fluent-tab-panel'); - - await page.setContent(/* html */ ` - <fluent-tab-panel></fluent-tab-panel> - `); - - await expect(element).toHaveAttribute('role', 'tabpanel'); - }); - - test('should have a slot attribute of `tabpanel`', async ({ page }) => { - const element = page.locator('fluent-tab-panel'); + test('should set defaults', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-tab-panel></fluent-tab-panel> - `); + await test.step('should have a role of `tabpanel`', async () => { + await expect(element).toHaveAttribute('role', 'tabpanel'); + }); - await expect(element).toHaveAttribute('slot', 'tabpanel'); + await test.step('should have a slot attribute of `tabpanel`', async () => { + await expect(element).toHaveAttribute('slot', 'tabpanel'); + }); }); }); diff --git a/packages/web-components/src/tab/tab.spec.ts b/packages/web-components/src/tab/tab.spec.ts index aa83c6f4d379d3..87c88d2b487b1a 100644 --- a/packages/web-components/src/tab/tab.spec.ts +++ b/packages/web-components/src/tab/tab.spec.ts @@ -1,41 +1,30 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Tab } from './tab.js'; test.describe('Tab', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-tabs--tabs-default')); + test.use({ tagName: 'fluent-tab' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-tab')); - }); - - test('should have a role of `tab`', async ({ page }) => { - const element = page.locator('fluent-tab').nth(0); + test('should set defaults', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveAttribute('role', 'tab'); - }); - - test('should have a slot attribute of `tab`', async ({ page }) => { - const element = page.locator('fluent-tab').nth(0); + await test.step('should have a role of `tab`', async () => { + await expect(element).toHaveAttribute('role', 'tab'); + }); - await expect(element).toHaveAttribute('slot', 'tab'); + await test.step('should have a slot attribute of `tab`', async () => { + await expect(element).toHaveAttribute('slot', 'tab'); + }); }); - test('should set the `aria-disabled` attribute when `disabled` is true', async ({ page }) => { - const element = page.locator('fluent-tab').nth(0); + test('should set the `aria-disabled` attribute when `disabled` is true', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).not.toHaveAttribute('aria-disabled'); - await element.nth(0).evaluate((node: Tab) => { + await element.evaluate((node: Tab) => { node.disabled = true; }); await expect(element).toHaveAttribute('aria-disabled', 'true'); - - await element.nth(0).evaluate((node: Tab) => { - node.disabled = false; - }); - - await expect(element).toHaveAttribute('aria-disabled', 'false'); }); }); diff --git a/packages/web-components/src/tablist/tablist.spec.ts b/packages/web-components/src/tablist/tablist.spec.ts index 19c12d76750c09..5d91ada7d5a96c 100644 --- a/packages/web-components/src/tablist/tablist.spec.ts +++ b/packages/web-components/src/tablist/tablist.spec.ts @@ -1,30 +1,25 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Tab } from '../tab/tab.js'; import type { Tablist } from './tablist.js'; import { TablistAppearance, TablistSize } from './tablist.options.js'; test.describe('Tablist', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-tabs--tabs-default')); - - await page.waitForFunction(() => - Promise.all([customElements.whenDefined('fluent-tablist'), customElements.whenDefined('fluent-tab')]), - ); + test.use({ + tagName: 'fluent-tablist', + waitFor: ['fluent-tab'], + innerHTML: /* html */ ` + <fluent-tab>Tab one</fluent-tab> + <fluent-tab>Tab two</fluent-tab> + <fluent-tab>Tab three</fluent-tab> + `, }); - test('should reset tab indicator offset and scale for horizontal orientation after animation', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should reset tab indicator offset and scale for horizontal orientation after animation', async ({ + fastPage, + }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); - await tabs.nth(2).click(); await expect(element).toHaveCSS('--tabIndicatorOffset', '0px'); @@ -32,19 +27,11 @@ test.describe('Tablist', () => { await expect(element).toHaveCSS('--tabIndicatorScale', '1'); }); - test('should animate the active tab indicator', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should animate the active tab indicator', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); const tab = tabs.nth(2); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); - await expect(tab).not.toHaveAttribute('data-animate'); await tab.click(); @@ -52,16 +39,8 @@ test.describe('Tablist', () => { await expect(tab).toHaveAttribute('data-animate', 'true'); }); - test('should have reflect disabled attribute on control', async ({ page }) => { - const element = page.locator('fluent-tablist'); - - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); + test('should have reflect disabled attribute on control', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).not.toHaveAttribute('disabled'); @@ -72,48 +51,24 @@ test.describe('Tablist', () => { await expect(element).toHaveAttribute('disabled'); }); - test('should have role of `tablist`', async ({ page }) => { - const element = page.locator('fluent-tablist'); - - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); + test('should have role of `tablist`', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveAttribute('role', 'tablist'); }); test('should set a default orientation value of `horizontal` when `orientation` is not provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-tablist'); - - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); + const { element } = fastPage; await expect(element).toHaveJSProperty('orientation', 'horizontal'); }); - test('should set an `id` attribute on the active tab when an `id` is provided', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should set an `id` attribute on the active tab when an `id` is provided', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); - const tabCount = await tabs.count(); for (let i = 0; i < tabCount; i++) { @@ -129,19 +84,11 @@ test.describe('Tablist', () => { test.describe('`id` NOT provided', () => { test('should set an `id` attribute on tab items with a unique ID when an `id` is NOT provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-tablist'); + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); - const tabCount = await tabs.count(); for (let i = 0; i < tabCount; i++) { @@ -158,18 +105,10 @@ test.describe('Tablist', () => { } }); - test('should default the first tab as the active index if `activeid` is NOT provided', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should default the first tab as the active index if `activeid` is NOT provided', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); - await expect(tabs.nth(0)).toHaveAttribute('aria-selected', 'true'); await expect(element).toHaveJSProperty('activeTabIndex', 0); @@ -177,18 +116,12 @@ test.describe('Tablist', () => { }); test.describe('active tab', () => { - test('should set an `aria-selected` attribute on the active tab when `activeid` is provided', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should set an `aria-selected` attribute on the active tab when `activeid` is provided', async ({ + fastPage, + }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); - const secondTab = tabs.nth(1); const secondTabId = await secondTab.getAttribute('id'); @@ -200,18 +133,12 @@ test.describe('Tablist', () => { await expect(secondTab).toHaveAttribute('aria-selected', 'true'); }); - test('should update `aria-selected` attribute on the active tab when `activeId` is updated', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should update `aria-selected` attribute on the active tab when `activeId` is updated', async ({ + fastPage, + }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); - await expect(tabs.nth(0)).toHaveAttribute('aria-selected', 'true'); const secondTab = tabs.nth(1); @@ -226,65 +153,55 @@ test.describe('Tablist', () => { }); }); - for (const appearance of Object.values(TablistAppearance)) { - test(`should set appearance to \`${appearance}\``, async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should set the `appearance` property to match the `appearance` attribute', async ({ fastPage }) => { + const { element } = fastPage; - page.setContent(/* html */ ` - <fluent-tablist appearance="${appearance}"> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); + for (const appearance of Object.values(TablistAppearance)) { + await test.step(appearance, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); - await expect(element).toHaveJSProperty('appearance', appearance); + await expect(element).toHaveJSProperty('appearance', appearance); - await expect(element).toHaveCustomState(appearance); - }); - } + await expect(element).toHaveAttribute('appearance', appearance); + }); + } + }); - for (const size of Object.values(TablistSize)) { - test(`should set size to \`${size}\``, async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - page.setContent(/* html */ ` - <fluent-tablist size="${size}"> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); + for (const size of Object.values(TablistSize)) { + await test.step(size, async () => { + await fastPage.setTemplate({ attributes: { size } }); - await expect(element).toHaveJSProperty('size', size); + await expect(element).toHaveJSProperty('size', size); - await expect(element).toHaveCustomState(size); - }); - } + await expect(element).toHaveAttribute('size', size); + }); + } + }); - test.skip('should not allow selecting a tab that has been disabled after it has been connected', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should not allow selecting a tab that has been disabled after it has been connected', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab id="tab-1">Tab one</fluent-tab> - <fluent-tab id="tab-2">Tab two</fluent-tab> - <fluent-tab id="tab-3">Tab three</fluent-tab> - </fluent-tablist> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-tab id="tab-1">Tab one</fluent-tab> + <fluent-tab id="tab-2">Tab two</fluent-tab> + <fluent-tab id="tab-3">Tab three</fluent-tab> + `, + }); const firstTab = tabs.nth(0); - const firstTabId = await firstTab.getAttribute('id'); + await expect(firstTab).toHaveId('tab-1'); - expect(firstTabId).toBe('tab-1'); + await element.evaluate((node: Tablist) => { + node.activeid = 'tab-1'; + }); - await element.evaluate((node: Tablist, firstTabId) => { - node.activeid = `${firstTabId}`; - }, firstTabId); - - await expect(element).toHaveJSProperty('activeid', firstTabId); + await expect(element).toHaveJSProperty('activeid', 'tab-1'); const secondTab = tabs.nth(1); @@ -292,30 +209,23 @@ test.describe('Tablist', () => { node.disabled = true; }); - await secondTab.evaluate(node => { - node.dispatchEvent( - new MouseEvent('click', { - bubbles: true, - cancelable: true, - view: window, - }), - ); - }); + // eslint-disable-next-line playwright/no-force-option + await secondTab.click({ force: true }); - await expect(element).toHaveJSProperty('activeid', firstTabId); + await expect(element).toHaveJSProperty('activeid', 'tab-1'); }); - test('should allow selecting tab that has been enabled after it has been connected', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should allow selecting tab that has been enabled after it has been connected', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab disabled>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-tab>Tab one</fluent-tab> + <fluent-tab disabled>Tab two</fluent-tab> + <fluent-tab>Tab three</fluent-tab> + `, + }); const firstTab = tabs.nth(0); @@ -345,17 +255,17 @@ test.describe('Tablist', () => { await expect(element).toHaveJSProperty('activeid', secondTabId); }); - test('should not allow selecting hidden tab using arrow keys', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should not allow selecting hidden tab using arrow keys', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab hidden>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - </fluent-tablist> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-tab>Tab one</fluent-tab> + <fluent-tab hidden>Tab two</fluent-tab> + <fluent-tab>Tab three</fluent-tab> + `, + }); const firstTab = tabs.nth(0); @@ -373,17 +283,17 @@ test.describe('Tablist', () => { await expect(element).toHaveJSProperty('activeid', thirdTabId); }); - test('should not allow selecting hidden tab by pressing End', async ({ page }) => { - const element = page.locator('fluent-tablist'); + test('should not allow selecting hidden tab by pressing End', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - page.setContent(/* html */ ` - <fluent-tablist> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab hidden>Tab three</fluent-tab> - </fluent-tablist> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-tab>Tab one</fluent-tab> + <fluent-tab>Tab two</fluent-tab> + <fluent-tab hidden>Tab three</fluent-tab> + `, + }); const firstTab = tabs.nth(0); diff --git a/packages/web-components/src/tabs/tabs.spec.ts b/packages/web-components/src/tabs/tabs.spec.ts index 1028637618e3ac..9ed5421cd9e96a 100644 --- a/packages/web-components/src/tabs/tabs.spec.ts +++ b/packages/web-components/src/tabs/tabs.spec.ts @@ -1,37 +1,28 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Tab } from '../tab/tab.js'; import type { Tabs } from './tabs.js'; import { TabsAppearance, TabsSize } from './tabs.options.js'; test.describe('Tabs', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-tabs--tabs-default')); - - await page.waitForFunction(() => - Promise.all([ - customElements.whenDefined('fluent-tabs'), - customElements.whenDefined('fluent-tab'), - customElements.whenDefined('fluent-tab-panel'), - ]), - ); + test.use({ + tagName: 'fluent-tabs', + waitFor: ['fluent-tab', 'fluent-tab-panel'], + innerHTML: /* html */ ` + <fluent-tab>Tab one</fluent-tab> + <fluent-tab>Tab two</fluent-tab> + <fluent-tab>Tab three</fluent-tab> + <fluent-tab-panel>Tab panel one</fluent-tab-panel> + <fluent-tab-panel>Tab panel two</fluent-tab-panel> + <fluent-tab-panel>Tab panel three</fluent-tab-panel> + `, }); - test('should reset tab indicator offset and scale for horizontal orientation after animation', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should reset tab indicator offset and scale for horizontal orientation after animation', async ({ + fastPage, + }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); - const tab = tabs.nth(2); await tab.click(); @@ -41,21 +32,10 @@ test.describe('Tabs', () => { await expect(element).toHaveCSS('--tabIndicatorScale', '1'); }); - test('should animate the active tab indicator', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should animate the active tab indicator', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); - const tab = tabs.nth(2); await expect(tab).not.toHaveAttribute('data-animate'); @@ -65,12 +45,8 @@ test.describe('Tabs', () => { await expect(tab).toHaveAttribute('data-animate', 'true'); }); - test('should have reflect disabled attribute on control', async ({ page }) => { - const element = page.locator('fluent-tabs'); - - await page.setContent(/* html */ ` - <fluent-tabs></fluent-tabs> - `); + test('should have reflect disabled attribute on control', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).not.toHaveAttribute('disabled'); @@ -81,37 +57,25 @@ test.describe('Tabs', () => { await expect(element).toHaveAttribute('disabled'); }); - test('should have an internal element with a role of `tablist`', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should have an internal element with a role of `tablist`', async ({ fastPage }) => { + const { element } = fastPage; const tablist = element.locator('.tablist'); - await page.setContent(/* html */ ` - <fluent-tabs></fluent-tabs> - `); - await expect(tablist).toHaveAttribute('role', 'tablist'); }); test('should set a default orientation value of `horizontal` when `orientation` is not provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-tabs'); - - await page.setContent(/* html */ ` - <fluent-tabs></fluent-tabs> - `); + const { element } = fastPage; await expect(element).toHaveJSProperty('orientation', 'horizontal'); }); - test('should set an `id` attribute on the active tab when an `id` is provided', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should set an `id` attribute on the active tab when an `id` is provided', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs></fluent-tabs> - `); - const tabCount = await tabs.count(); for (let i = 0; i < tabCount; i++) { @@ -127,20 +91,12 @@ test.describe('Tabs', () => { test.describe('`id` NOT provided', () => { test('should set an `id` attribute on tab items with a unique ID when an `id` is NOT provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-tabs'); + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs></fluent-tabs> - `); - - const tabCount = await tabs.count(); - - for (let i = 0; i < tabCount; i++) { - const tab = tabs.nth(i); - + for (const tab of await tabs.all()) { const id = await tab.getAttribute('id'); // The ID function may not start at 0 so we need to check that the ID is unique @@ -153,21 +109,13 @@ test.describe('Tabs', () => { }); test('should set `aria-labelledby` on the tab panel and `aria-controls` on the tab which corresponds to the matching ID when IDs are NOT provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-tabs'); + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs></fluent-tabs> - `); - - const tabCount = await tabs.count(); - - for (let i = 0; i < tabCount; i++) { - const tab = tabs.nth(i); - - const panelId = (await tab.getAttribute('aria-controls')) as string; + for (const tab of await tabs.all()) { + const panelId = await tab.getAttribute('aria-controls'); expect(panelId).toMatch(/panel-\d+/); @@ -175,32 +123,24 @@ test.describe('Tabs', () => { await expect(tabPanel).toHaveCount(1); - const tabId = (await tab.getAttribute('id')) as string; + const tabId = await tab.getAttribute('id'); expect(tabId).toMatch(/tab-\d+/); - await expect(tabPanel).toHaveAttribute('aria-labelledby', tabId); + await expect(tabPanel).toHaveAttribute('aria-labelledby', tabId!); - await expect(tab).toHaveAttribute('aria-controls', panelId); + await expect(tab).toHaveAttribute('aria-controls', panelId!); } }); test('should set `aria-labelledby` on the tab panel and `aria-controls` on the tab which corresponds to the matching ID when IDs are NOT provided and additional tabs and panels are added', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-tabs'); + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs></fluent-tabs> - `); - - let tabCount = await tabs.count(); - - for (let i = 0; i < tabCount; i++) { - const tab = tabs.nth(i); - - const panelId = (await tab.getAttribute('aria-controls')) as string; + for (const tab of await tabs.all()) { + const panelId = await tab.getAttribute('aria-controls'); expect(panelId).toMatch(/panel-\d+/); @@ -208,16 +148,16 @@ test.describe('Tabs', () => { await expect(tabPanel).toHaveCount(1); - const tabId = (await tab.getAttribute('id')) as string; + const tabId = await tab.getAttribute('id'); expect(tabId).toMatch(/tab-\d+/); - await expect(tabPanel).toHaveAttribute('aria-labelledby', tabId); + await expect(tabPanel).toHaveAttribute('aria-labelledby', tabId!); - await expect(tab).toHaveAttribute('aria-controls', panelId); + await expect(tab).toHaveAttribute('aria-controls', panelId!); } - await element.evaluate<void, Tabs>(node => { + await element.evaluate(node => { const tabs = Array.from(node.querySelectorAll('fluent-tab')); const newTab = document.createElement('fluent-tab'); @@ -229,12 +169,8 @@ test.describe('Tabs', () => { node.insertBefore(newPanel, tabs[1]); }); - tabCount = await tabs.count(); - - for (let i = 0; i < tabCount; i++) { - const tab = tabs.nth(i); - - const panelId = (await tab.getAttribute('aria-controls')) as string; + for (const tab of await tabs.all()) { + const panelId = await tab.getAttribute('aria-controls'); expect(panelId).toMatch(/panel-\d+/); @@ -242,31 +178,20 @@ test.describe('Tabs', () => { await expect(tabPanel).toHaveCount(1); - const tabId = (await tab.getAttribute('id')) as string; + const tabId = await tab.getAttribute('id'); expect(tabId).toMatch(/tab-\d+/); - await expect(tabPanel).toHaveAttribute('aria-labelledby', tabId); + await expect(tabPanel).toHaveAttribute('aria-labelledby', tabId!); - await expect(tab).toHaveAttribute('aria-controls', panelId); + await expect(tab).toHaveAttribute('aria-controls', panelId!); } }); - test('should default the first tab as the active index if `activeid` is NOT provided', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should default the first tab as the active index if `activeid` is NOT provided', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); - await expect(tabs.nth(0)).toHaveAttribute('aria-selected', 'true'); await expect(element).toHaveJSProperty('activeTabIndex', 0); @@ -274,21 +199,12 @@ test.describe('Tabs', () => { }); test.describe('active tab', () => { - test('should set an `aria-selected` attribute on the active tab when `activeid` is provided', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should set an `aria-selected` attribute on the active tab when `activeid` is provided', async ({ + fastPage, + }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); - const secondTab = tabs.nth(1); const secondTabId = await secondTab.getAttribute('id'); @@ -300,28 +216,19 @@ test.describe('Tabs', () => { await expect(secondTab).toHaveAttribute('aria-selected', 'true'); }); - test('should update `aria-selected` attribute on the active tab when `activeId` is updated', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should update `aria-selected` attribute on the active tab when `activeId` is updated', async ({ + fastPage, + }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); - await expect(tabs.nth(0)).toHaveAttribute('aria-selected', 'true'); const secondTab = tabs.nth(1); const secondTabId = `${await secondTab.getAttribute('id')}`; - await element.evaluate((node: Tabs, secondTabId) => { + await element.evaluate((node, secondTabId) => { node.setAttribute('activeId', secondTabId); }, secondTabId); @@ -331,22 +238,11 @@ test.describe('Tabs', () => { test.describe('active tabpanel', () => { test('should set an `aria-labelledby` attribute on the tabpanel with a value of the tab id when `activeid` is provided', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-tabs'); + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); - const secondTab = tabs.nth(1); const secondTabId = `${await secondTab.getAttribute('id')}`; @@ -360,19 +256,8 @@ test.describe('Tabs', () => { await expect(tabPanels.nth(1)).toHaveAttribute('aria-labelledby', secondTabId); }); - test('should set an attribute of hidden if the tabpanel is not active', async ({ page }) => { - const element = page.locator('fluent-tabs'); - - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); + test('should set an attribute of hidden if the tabpanel is not active', async ({ fastPage }) => { + const { element } = fastPage; const tabPanels = element.locator('fluent-tab-panel'); @@ -384,56 +269,59 @@ test.describe('Tabs', () => { }); }); - for (const appearance of Object.values(TabsAppearance)) { - test(`should set appearance to \`${appearance}\``, async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should set the `appearance` property to match the `appearance` attribute', async ({ fastPage }) => { + const { element } = fastPage; - page.setContent(/* html */ ` - <fluent-tabs appearance="${appearance}"></fluent-tabs> - `); + for (const appearance of Object.values(TabsAppearance)) { + await test.step(appearance, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); - await expect(element).toHaveJSProperty('appearance', appearance); - }); - } + await expect(element).toHaveJSProperty('appearance', appearance); + + await expect(element).toHaveAttribute('appearance', appearance); + }); + } + }); - for (const size of Object.values(TabsSize)) { - test(`should set size to \`${size}\``, async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - page.setContent(/* html */ ` - <fluent-tabs size="${size}"></fluent-tabs> - `); + for (const size of Object.values(TabsSize)) { + await test.step(size, async () => { + await fastPage.setTemplate({ attributes: { size } }); - await expect(element).toHaveJSProperty('size', size); - }); - } + await expect(element).toHaveJSProperty('size', size); - test('should not allow selecting a tab that has been disabled after it has been connected', async ({ page }) => { - const element = page.locator('fluent-tabs'); + await expect(element).toHaveAttribute('size', size); + }); + } + }); + + test('should not allow selecting a tab that has been disabled after it has been connected', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); const firstTab = tabs.first(); const secondTab = tabs.nth(1); - await page.setContent(/* html */ ` - <fluent-tabs activeid="tab-1"> - <fluent-tab id="tab-1">Tab one</fluent-tab> - <fluent-tab id="tab-2">Tab two</fluent-tab> - <fluent-tab id="tab-3">Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); + await fastPage.setTemplate({ + attributes: { activeid: 'tab-1' }, + innerHTML: /* html */ ` + <fluent-tab id="tab-1">Tab one</fluent-tab> + <fluent-tab id="tab-2">Tab two</fluent-tab> + <fluent-tab id="tab-3">Tab three</fluent-tab> + <fluent-tab-panel>Tab panel one</fluent-tab-panel> + <fluent-tab-panel>Tab panel two</fluent-tab-panel> + <fluent-tab-panel>Tab panel three</fluent-tab-panel> + `, + }); for (const tab of await tabs.all()) { await expect(tab).toBeEnabled(); } - const firstTabId = await firstTab.getAttribute('id'); - - expect(firstTabId).toBe('tab-1'); + await expect(firstTab).toHaveId('tab-1'); - await expect(element).toHaveJSProperty('activeid', firstTabId); + await expect(element).toHaveJSProperty('activeid', 'tab-1'); await secondTab.evaluate((node: Tab) => { node.disabled = true; @@ -442,23 +330,23 @@ test.describe('Tabs', () => { // eslint-disable-next-line playwright/no-force-option await secondTab.click({ force: true }); - await expect(element).toHaveJSProperty('activeid', firstTabId); + await expect(element).toHaveJSProperty('activeid', 'tab-1'); }); - test('should allow selecting tab that has been enabled after it has been connected', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should allow selecting tab that has been enabled after it has been connected', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab disabled>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-tab>Tab one</fluent-tab> + <fluent-tab disabled>Tab two</fluent-tab> + <fluent-tab>Tab three</fluent-tab> + <fluent-tab-panel>Tab panel one</fluent-tab-panel> + <fluent-tab-panel>Tab panel two</fluent-tab-panel> + <fluent-tab-panel>Tab panel three</fluent-tab-panel> + `, + }); const firstTab = tabs.nth(0); @@ -483,29 +371,25 @@ test.describe('Tabs', () => { node.disabled = false; }); - await (await element.elementHandle())?.waitForElementState('stable'); - await secondTab.click(); await expect(element).toHaveJSProperty('activeid', secondTabId); }); - test('should not allow selecting hidden tab using arrow keys', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should not allow selecting hidden tab using arrow keys', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - test.slow(); - - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab hidden>Tab two</fluent-tab> - <fluent-tab>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-tab>Tab one</fluent-tab> + <fluent-tab hidden>Tab two</fluent-tab> + <fluent-tab>Tab three</fluent-tab> + <fluent-tab-panel>Tab panel one</fluent-tab-panel> + <fluent-tab-panel>Tab panel two</fluent-tab-panel> + <fluent-tab-panel>Tab panel three</fluent-tab-panel> + `, + }); const firstTab = tabs.nth(0); @@ -523,20 +407,20 @@ test.describe('Tabs', () => { await expect(element).toHaveJSProperty('activeid', thirdTabId); }); - test('should not allow selecting hidden tab by pressing End', async ({ page }) => { - const element = page.locator('fluent-tabs'); + test('should not allow selecting hidden tab by pressing End', async ({ fastPage }) => { + const { element } = fastPage; const tabs = element.locator('fluent-tab'); - await page.setContent(/* html */ ` - <fluent-tabs> - <fluent-tab>Tab one</fluent-tab> - <fluent-tab>Tab two</fluent-tab> - <fluent-tab hidden>Tab three</fluent-tab> - <fluent-tab-panel>Tab panel one</fluent-tab-panel> - <fluent-tab-panel>Tab panel two</fluent-tab-panel> - <fluent-tab-panel>Tab panel three</fluent-tab-panel> - </fluent-tabs> - `); + await fastPage.setTemplate({ + innerHTML: /* html */ ` + <fluent-tab>Tab one</fluent-tab> + <fluent-tab>Tab two</fluent-tab> + <fluent-tab hidden>Tab three</fluent-tab> + <fluent-tab-panel>Tab panel one</fluent-tab-panel> + <fluent-tab-panel>Tab panel two</fluent-tab-panel> + <fluent-tab-panel>Tab panel three</fluent-tab-panel> + `, + }); const firstTab = tabs.nth(0); diff --git a/packages/web-components/src/text-input/text-input.spec.ts b/packages/web-components/src/text-input/text-input.spec.ts index 839ec937ef5a7b..162db99bae4be5 100644 --- a/packages/web-components/src/text-input/text-input.spec.ts +++ b/packages/web-components/src/text-input/text-input.spec.ts @@ -1,141 +1,112 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { TextInput } from './text-input.js'; import { ImplicitSubmissionBlockingTypes } from './text-input.options.js'; test.describe('TextInput', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-textinput--default')); + test.use({ tagName: 'fluent-text-input' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-text-input')); - }); - - test('should focus the element when the `autofocus` attribute is present', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should focus the element when the `autofocus` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input autofocus></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { autofocus: true } }); await expect(element).toBeFocused(); }); - test('should set the `disabled` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `disabled` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input disabled></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await expect(control).toBeDisabled(); }); - test('should set the `readonly` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `readonly` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input readonly></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { readonly: true } }); await expect(control).toHaveAttribute('readonly'); }); - test('should set the `required` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `required` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input required></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { required: true } }); await expect(control).toHaveAttribute('required'); }); - test('should set the `spellcheck` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `spellcheck` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input spellcheck="true"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { spellcheck: 'true' } }); await expect(control).toHaveAttribute('spellcheck', 'true'); }); - test('should set the `maxlength` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `maxlength` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input maxlength="14"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { maxlength: '14' } }); await expect(control).toHaveAttribute('maxlength', '14'); }); - test('should set the `minlength` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `minlength` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input minlength="14"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { minlength: '14' } }); await expect(control).toHaveAttribute('minlength', '14'); }); - test('should set the `name` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `name` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input name="foo"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { name: 'foo' } }); await expect(control).toHaveAttribute('name', 'foo'); }); - test('should set the `placeholder` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `placeholder` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input placeholder="foo"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { placeholder: 'foo' } }); await expect(control).toHaveAttribute('placeholder', 'foo'); }); - test('should set the `size` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `size` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input size="4"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { size: '4' } }); await expect(control).toHaveAttribute('size', '4'); }); - test('should set the `list` attribute on the internal control', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `list` attribute on the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input list="listId"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { list: 'listId' } }); await expect(control).toHaveAttribute('list', 'listId'); }); - test('should reflect `control-size` attribute values', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should reflect `control-size` attribute values', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input control-size="small"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { 'control-size': 'small' } }); await expect(element).toHaveAttribute('control-size', 'small'); await expect(element).toHaveJSProperty('controlSize', 'small'); @@ -160,12 +131,10 @@ test.describe('TextInput', () => { await expect(element).toHaveJSProperty('controlSize', 'small'); }); - test('should add a custom state matching the `size` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should add a custom state matching the `size` attribute when provided', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input control-size="small"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { 'control-size': 'small' } }); await element.evaluate((node: TextInput) => { node.controlSize = 'small'; @@ -196,12 +165,10 @@ test.describe('TextInput', () => { await expect(element).not.toHaveCustomState('large'); }); - test('should reflect `appearance` attribute values', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should reflect `appearance` attribute values', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: TextInput) => { - node.appearance = 'outline'; - }); + await fastPage.setTemplate({ attributes: { appearance: 'outline' } }); await expect(element).toHaveAttribute('appearance', 'outline'); await expect(element).toHaveJSProperty('appearance', 'outline'); @@ -226,12 +193,8 @@ test.describe('TextInput', () => { await expect(element).toHaveJSProperty('appearance', 'filled-lighter'); }); - test('should add a custom state matching the `appearance` attribute when provided', async ({ page }) => { - const element = page.locator('fluent-text-input'); - - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); + test('should add a custom state matching the `appearance` attribute when provided', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((node: TextInput) => { node.appearance = 'outline'; @@ -269,30 +232,24 @@ test.describe('TextInput', () => { await expect(element).not.toHaveCustomState('filled-lighter'); }); - test('should have an undefined `value` property when no `value` attribute is set', async ({ page }) => { - const element = page.locator('fluent-text-input'); - - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); + test('should have an undefined `value` property when no `value` attribute is set', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('value', undefined); }); - test('should initialize to the provided `value` attribute when set before connection', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should initialize to the provided `value` attribute when set before connection', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input value="foo"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { value: 'foo' } }); await expect(element).toHaveJSProperty('value', 'foo'); }); - test('should initialize to the provided `value` property if set pre-connection', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should initialize to the provided `value` property if set pre-connection', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(''); + await fastPage.setTemplate(''); await page.evaluate(() => { const textInput = document.createElement('fluent-text-input') as TextInput; @@ -305,14 +262,10 @@ test.describe('TextInput', () => { await expect(element).toHaveJSProperty('value', 'foo'); }); - test('should initialize to the provided `value` attribute if set post-connection', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should initialize to the provided `value` attribute if set post-connection', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); - await element.evaluate(node => { node.setAttribute('value', 'foo'); }); @@ -323,15 +276,11 @@ test.describe('TextInput', () => { }); test('should NOT initialize to the provided `value` attribute if set post-connection and the control has a dirty value', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); - await control.fill('bar'); await element.evaluate(node => { @@ -343,94 +292,87 @@ test.describe('TextInput', () => { await expect(control).toHaveValue('bar'); }); - test('should hide the label when no default slotted content is provided', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should hide the label when no default slotted content is provided', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('label'); - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); - await expect(label).toBeHidden(); }); - test('should hide the label when start content is provided', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should hide the label when start content is provided', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('label'); - await page.setContent(/* html */ ` - <fluent-text-input> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <div slot="start"></div> - </fluent-text-input> - `); + `, + }); await expect(label).toBeHidden(); }); - test('should hide the label when end content is provided', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should hide the label when end content is provided', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('label'); - await page.setContent(/* html */ ` - <fluent-text-input> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <div slot="end"></div> - </fluent-text-input> - `); + `, + }); await expect(label).toBeHidden(); }); - test('should hide the label when start and end content are provided', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should hide the label when start and end content are provided', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('label'); - await page.setContent(/* html */ ` - <fluent-text-input> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <div slot="start"></div> <div slot="end"></div> - </fluent-text-input> - `); + `, + }); await expect(label).toBeHidden(); }); - test('should hide the label when space-only text nodes are slotted', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should hide the label when space-only text nodes are slotted', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('label'); - await page.setContent(/* html */ `<fluent-text-input>\n \n</fluent-text-input>`); + await fastPage.setTemplate({ + innerHTML: '\n \n', + }); await expect(element).toHaveText(/\n\s\n/); await expect(label).toBeHidden(); }); - test('should fire a `change` event when the internal control emits a `change` event', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should fire a `change` event when the internal control emits a `change` event', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); + const wasChanged = element.evaluate( + node => + new Promise(resolve => { + node.addEventListener('change', () => resolve(true)); + }), + ); - const [wasChanged] = await Promise.all([ - element.evaluate( - node => - new Promise(resolve => { - node.addEventListener('change', () => resolve(true)); - }), - ), - element.evaluate((node: TextInput) => node.control.dispatchEvent(new Event('change'))), - ]); + await element.evaluate((node: TextInput) => node.control.dispatchEvent(new Event('change'))); - expect(wasChanged).toBeTruthy(); + await expect(wasChanged).resolves.toBe(true); }); - test('should be invalid when the `required` attribute is set and the `value` property is empty', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should be invalid when the `required` attribute is set and the `value` property is empty', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input required></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { required: true } }); await expect(element).toHaveJSProperty('validity.valueMissing', true); @@ -438,25 +380,23 @@ test.describe('TextInput', () => { }); test('should be valid when the `required` attribute is set and the `value` property is not empty', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input required value="some-value"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { required: true, value: 'foo' } }); await expect(element).toHaveJSProperty('validity.valid', true); await expect(element).toHaveJSProperty('validity.valueMissing', false); }); - test('should be valid when the `minlength` attribute is set and the `value` attribute is empty', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should be valid when the `minlength` attribute is set and the `value` attribute is empty', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input minlength="1"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { minlength: '10' } }); await expect(element).toHaveJSProperty('validity.valid', true); @@ -464,13 +404,11 @@ test.describe('TextInput', () => { }); test('should be valid when the `value` attribute length is less than the `minlength` attribute and the value is not dirty', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input type="password" minlength="10" value="123456789"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { minlength: '10', value: '123456789' } }); await expect(element).toHaveJSProperty('validity.valid', true); @@ -478,13 +416,11 @@ test.describe('TextInput', () => { }); test('should be valid when the `value` attribute is not set and the `maxlength` attribute is set', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input maxlength="10"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { maxlength: '10' } }); await expect(element).toHaveJSProperty('validity.valid', true); @@ -492,88 +428,76 @@ test.describe('TextInput', () => { }); test('should report valid validity when the `value` attribute has a length which exceeds the `maxlength`', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input type="password" maxlength="10" value="12345678901"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { maxlength: '10', value: '123456789' } }); await expect(element).toHaveJSProperty('validity.tooLong', false); }); test('should report valid validity when the `value` is shorter than `maxlength` and the element is `required`', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input type="password" maxlength="10" required value="123456789"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { required: true, maxlength: '10', value: '123456789' } }); await expect(element).toHaveJSProperty('validity.tooLong', false); }); - test('should report valid validity when the `value` property matches the `pattern` property', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should report valid validity when the `value` property matches the `pattern` property', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input type="password" pattern="\\d+" value="123456789"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { pattern: '\\d+', value: '123456789' } }); await expect(element).toHaveJSProperty('validity.patternMismatch', false); }); - test('should report invalid validity when `value` does not match `pattern`', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should report invalid validity when `value` does not match `pattern`', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input type="password" pattern="value" value="other value"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { pattern: 'value', value: 'other value' } }); await expect(element).toHaveJSProperty('validity.patternMismatch', true); }); - test('should report valid validity when `value` is an empty string', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should report valid validity when `value` is an empty string', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input type="email"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { pattern: 'value', value: '' } }); await expect(element).toHaveJSProperty('validity.typeMismatch', false); }); - test('should have invalid invalidity with a `typeMismatch` when `value` is not a valid email', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should have invalid invalidity with a `typeMismatch` when `value` is not a valid email', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input type="email" value="not an email"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { type: 'email', value: 'not an email' } }); await expect(element).toHaveJSProperty('validity.typeMismatch', true); }); - test('should be invalid when `value` is not a valid URL', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should be invalid when `value` is not a valid URL', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input type="url" value="not a url"></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { type: 'url', value: 'not a url' } }); await expect(element).toHaveJSProperty('validity.valid', false); await expect(element).toHaveJSProperty('validity.typeMismatch', true); }); - test('should not accept user input when the `readonly` attribute is present', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should not accept user input when the `readonly` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input readonly></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { readonly: true } }); await control.fill('foo', { // eslint-disable-next-line playwright/no-force-option @@ -583,13 +507,11 @@ test.describe('TextInput', () => { await expect(control).toHaveValue(''); }); - test('should not accept user input when the `disabled` attribute is present', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should not accept user input when the `disabled` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <fluent-text-input disabled></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await control.fill('foo', { // eslint-disable-next-line playwright/no-force-option @@ -600,33 +522,29 @@ test.describe('TextInput', () => { }); test('should set the `willValidate` property to `false` when the `disabled` attribute is present', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input disabled></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await expect(element).toHaveJSProperty('willValidate', false); }); test('should set the `willValidate` property to `false` when the `readonly` attribute is present', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text-input readonly></fluent-text-input> - `); + await fastPage.setTemplate({ attributes: { readonly: true } }); await expect(element).toHaveJSProperty('willValidate', false); }); - test('should set the `form` property to the parent form element', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `form` property to the parent form element', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="foo"> <fluent-text-input></fluent-text-input> </form> @@ -635,20 +553,18 @@ test.describe('TextInput', () => { await expect(element).toHaveJSProperty('form.id', 'foo'); }); - test('should set the `form` property to `null` when the element is not in a form', async ({ page }) => { - const element = page.locator('fluent-text-input'); - - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); + test('should set the `form` property to `null` when the element is not in a form', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('form', null); }); - test('should set the `form` property to the form element referenced by the `form` attribute', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should set the `form` property to the form element referenced by the `form` attribute', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="foo"> <fluent-text-input form="foo"></fluent-text-input> </form> @@ -658,11 +574,11 @@ test.describe('TextInput', () => { }); test('should set the `form` property to `null` when the element is in a form with the `form` attribute set to an invalid value', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="foo"> <fluent-text-input form="bar"></fluent-text-input> </form> @@ -671,11 +587,14 @@ test.describe('TextInput', () => { await expect(element).toHaveJSProperty('form', null); }); - test('should submit the form via implicit submission when the form has no other controls', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should submit the form via implicit submission when the form has no other controls', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="form" action="foo"> <fluent-text-input name="testinput"></fluent-text-input> </form> @@ -689,11 +608,14 @@ test.describe('TextInput', () => { expect(page.url()).toMatch(/foo\?testinput=hello$/); }); - test('should submit the form via implicit submission when the form contains a submit button', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should submit the form via implicit submission when the form contains a submit button', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="form" action="foo"> <fluent-text-input name="testinput"></fluent-text-input> <button type="submit">Submit</button> @@ -708,12 +630,13 @@ test.describe('TextInput', () => { }); test('should submit the form via implicit submission when the form has no other implicit submission blocking controls', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="form" action="foo"> <fluent-text-input name="testinput"></fluent-text-input> <button type="reset">Reset</button> @@ -730,16 +653,16 @@ test.describe('TextInput', () => { test.describe('should NOT submit the form via implicit submission when the form has other implicit submission blocking controls', () => { for (const type of ImplicitSubmissionBlockingTypes) { - test(`Blocking type: ${type}`, async ({ page }) => { - const element = page.locator('fluent-text-input'); + test(`Blocking type: ${type}`, async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` - <form id="form" action="foo"> - <fluent-text-input name="testinput"></fluent-text-input> - <input name="extrainput" type="${type}" value="extravalue" /> - </form> - `); + await fastPage.setTemplate(/* html */ ` + <form id="form" action="foo"> + <fluent-text-input name="testinput"></fluent-text-input> + <input name="extrainput" type="${type}" value="extravalue" /> + </form> + `); await control.fill('hello'); @@ -751,11 +674,12 @@ test.describe('TextInput', () => { }); test('should prevent form submission when the `required` attribute is set and the `value` property is empty', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="form" action="foo"> <fluent-text-input name="testinput" required></fluent-text-input> </form> @@ -766,11 +690,11 @@ test.describe('TextInput', () => { expect(page.url()).not.toMatch(/foo/); }); - test('should NOT prevent form submission when the `readonly` attribute is set', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should NOT prevent form submission when the `readonly` attribute is set', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> <fluent-text-input name="testinput" readonly></fluent-text-input> </form> @@ -782,12 +706,13 @@ test.describe('TextInput', () => { }); test('should allow comma-separated values when the `multiple` attribute is set and the `type` is "email"', async ({ + fastPage, page, }) => { - const element = page.locator('fluent-text-input'); + const { element } = fastPage; const control = element.locator('input'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form action="foo"> <fluent-text-input name="testinput" multiple type="email"></fluent-text-input> </form> @@ -800,20 +725,20 @@ test.describe('TextInput', () => { expect(page.url()).toMatch(/foo\?testinput=hello%40example\.com%2Cworld%40example\.com/); }); - test('should allow focusable start and end slotted content to be focused', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should allow focusable start and end slotted content to be focused', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('input'); const start = element.locator('[slot="start"]'); const end = element.locator('[slot="end"]'); const label = element.locator('text=Label'); - await page.setContent(/* html */ ` - <fluent-text-input> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <span>Label</span> <button slot="start">start</button> <button slot="end">end</button> - </fluent-text-input> - `); + `, + }); await page.keyboard.press('Tab'); @@ -834,12 +759,12 @@ test.describe('TextInput', () => { }); }); - test('should reset the value to an empty string when the form is reset', async ({ page }) => { - const element = page.locator('fluent-text-input'); + test('should reset the value to an empty string when the form is reset', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('input'); const reset = page.locator('button'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="form" action="foo"> <fluent-text-input name="testinput"></fluent-text-input> <button type="reset">Reset</button> @@ -855,12 +780,8 @@ test.describe('TextInput', () => { await expect(control).toHaveValue(''); }); - test('should change the `value` property when the `current-value` attribute changes', async ({ page }) => { - const element = page.locator('fluent-text-input'); - - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); + test('should change the `value` property when the `current-value` attribute changes', async ({ fastPage, page }) => { + const { element } = fastPage; await element.evaluate(node => { node.setAttribute('current-value', 'foo'); @@ -869,12 +790,8 @@ test.describe('TextInput', () => { await expect(element).toHaveJSProperty('value', 'foo'); }); - test('should change the `value` property when the `currentValue` property changes', async ({ page }) => { - const element = page.locator('fluent-text-input'); - - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); + test('should change the `value` property when the `currentValue` property changes', async ({ fastPage, page }) => { + const { element } = fastPage; await element.evaluate((node: TextInput) => { node.currentValue = 'foo'; @@ -883,12 +800,8 @@ test.describe('TextInput', () => { await expect(element).toHaveJSProperty('value', 'foo'); }); - test('should set the `current-value` attribute to match the `value` property', async ({ page }) => { - const element = page.locator('fluent-text-input'); - - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); + test('should set the `current-value` attribute to match the `value` property', async ({ fastPage, page }) => { + const { element } = fastPage; await expect(element).not.toHaveAttribute('current-value'); @@ -899,12 +812,8 @@ test.describe('TextInput', () => { await expect(element).toHaveAttribute('current-value', 'foo'); }); - test('should set the `currentValue` property to match the `value` property', async ({ page }) => { - const element = page.locator('fluent-text-input'); - - await page.setContent(/* html */ ` - <fluent-text-input></fluent-text-input> - `); + test('should set the `currentValue` property to match the `value` property', async ({ fastPage, page }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('currentValue', undefined); diff --git a/packages/web-components/src/text/text.spec.ts b/packages/web-components/src/text/text.spec.ts index 288a7b89392bdf..8b329b405074b2 100644 --- a/packages/web-components/src/text/text.spec.ts +++ b/packages/web-components/src/text/text.spec.ts @@ -1,104 +1,184 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import type { Text } from './text.js'; +import { expect, test } from '../../test/playwright/index.js'; import { TextAlign, TextFont, TextSize, TextWeight } from './text.options.js'; test.describe('Text Component', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-text--text')); + test.use({ tagName: 'fluent-text' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-text')); - }); + test(`should set the \`nowrap\` property to true when the \`nowrap\` attribute is present`, async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { nowrap: true } }); + + await expect(element).toHaveJSProperty('nowrap', true); - for (const attribute of ['nowrap', 'truncate', 'italic', 'underline', 'strikethrough', 'block']) { - test(`should set and reflect and update the ${attribute} attribute and property when provided`, async ({ - page, - }) => { - const element = page.locator('fluent-text'); + await expect(element).toHaveCustomState('nowrap'); - await page.setContent(/* html */ ` - <fluent-text ${attribute}>Text</fluent-text> - `); + await test.step('should set the `nowrap` property to false when the `nowrap` attribute is removed', async () => { + await fastPage.setTemplate({ attributes: {} }); - await expect(element).toHaveAttribute(attribute); + await expect(element).toHaveJSProperty('nowrap', false); + + await expect(element).not.toHaveCustomState('nowrap'); + }); + }); - await expect(element).toHaveJSProperty(attribute, true); + test(`should set the \`truncate\` property to true when the \`truncate\` attribute is present`, async ({ + fastPage, + }) => { + const { element } = fastPage; - await expect(element).toHaveCustomState(attribute); + await fastPage.setTemplate({ attributes: { truncate: true } }); - await element.evaluate((node: any, attribute) => { - node[attribute] = false; - }, attribute); + await expect(element).toHaveJSProperty('truncate', true); - await expect(element).not.toHaveAttribute(attribute); + await expect(element).toHaveCustomState('truncate'); - await expect(element).toHaveJSProperty(attribute, false); + await test.step('should set the `truncate` property to false when the `truncate` attribute is removed', async () => { + await fastPage.setTemplate({ attributes: {} }); - await expect(element).not.toHaveCustomState(attribute); + await expect(element).toHaveJSProperty('truncate', false); + + await expect(element).not.toHaveCustomState('truncate'); }); - } + }); + + test(`should set the \`italic\` property to true when the \`italic\` attribute is present`, async ({ fastPage }) => { + const { element } = fastPage; - for (const value of Object.values(TextSize)) { - test(`should set and reflect the size attribute to \`${value}\` when provided`, async ({ page }) => { - const element = page.locator('fluent-text'); + await fastPage.setTemplate({ attributes: { italic: true } }); - await page.setContent(/* html */ ` - <fluent-text size="${value}">Text</fluent-text> - `); + await expect(element).toHaveJSProperty('italic', true); - await expect(element).toHaveJSProperty('size', value); + await expect(element).toHaveCustomState('italic'); - await expect(element).toHaveAttribute('size', value); + await test.step('should set the `italic` property to false when the `italic` attribute is removed', async () => { + await fastPage.setTemplate({ attributes: {} }); - await expect(element).toHaveCustomState(`size-${value}`); + await expect(element).toHaveJSProperty('italic', false); + + await expect(element).not.toHaveCustomState('italic'); }); - } + }); - for (const value of Object.values(TextWeight)) { - test(`should set and reflect the weight attribute to the \`${value}\` when provided`, async ({ page }) => { - const element = page.locator('fluent-text'); + test(`should set the \`underline\` property to true when the \`underline\` attribute is present`, async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-text weight="${value}">Text</fluent-text> - `); + await fastPage.setTemplate({ attributes: { underline: true } }); - await expect(element).toHaveJSProperty('weight', value); + await expect(element).toHaveJSProperty('underline', true); - await expect(element).toHaveAttribute('weight', value); + await expect(element).toHaveCustomState('underline'); - await expect(element).toHaveCustomState(value); + await test.step('should set the `underline` property to false when the `underline` attribute is removed', async () => { + await fastPage.setTemplate({ attributes: {} }); + + await expect(element).toHaveJSProperty('underline', false); + + await expect(element).not.toHaveCustomState('underline'); }); - } + }); - for (const value of Object.values(TextAlign)) { - test(`should set and reflect the align attribute to \`${value}\` when provided`, async ({ page }) => { - const element = page.locator('fluent-text'); + test(`should set the \`strikethrough\` property to true when the \`strikethrough\` attribute is present`, async ({ + fastPage, + }) => { + const { element } = fastPage; - await element.evaluate((node: Text, alignValue: string) => { - node.align = alignValue as TextAlign; - }, value as string); + await fastPage.setTemplate({ attributes: { strikethrough: true } }); - await expect(element).toHaveJSProperty('align', value); + await expect(element).toHaveJSProperty('strikethrough', true); - await expect(element).toHaveAttribute('align', value); + await expect(element).toHaveCustomState('strikethrough'); - await expect(element).toHaveCustomState(value); + await test.step('should set the `strikethrough` property to false when the `strikethrough` attribute is removed', async () => { + await fastPage.setTemplate({ attributes: {} }); + + await expect(element).toHaveJSProperty('strikethrough', false); + + await expect(element).not.toHaveCustomState('strikethrough'); }); - } + }); - for (const value of Object.values(TextFont)) { - test(`should set and reflect the font attribute to \`${value}\` when provided`, async ({ page }) => { - const element = page.locator('fluent-text'); + test(`should set the \`block\` property to true when the \`block\` attribute is present`, async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: Text, fontValue: string) => { - node.font = fontValue as TextFont; - }, value as string); + await fastPage.setTemplate({ attributes: { block: true } }); - await expect(element).toHaveJSProperty('font', value); + await expect(element).toHaveJSProperty('block', true); - await expect(element).toHaveAttribute('font', value); + await expect(element).toHaveCustomState('block'); - await expect(element).toHaveCustomState(value); + await test.step('should set the `block` property to false when the `block` attribute is removed', async () => { + await fastPage.setTemplate({ attributes: {} }); + + await expect(element).toHaveJSProperty('block', false); + + await expect(element).not.toHaveCustomState('block'); }); - } + }); + + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const size of Object.values(TextSize)) { + await test.step(size, async () => { + await fastPage.setTemplate({ attributes: { size } }); + + await expect(element).toHaveJSProperty('size', size); + + await expect(element).toHaveAttribute('size', size); + + await expect(element).toHaveCustomState(`size-${size}`); + }); + } + }); + + test('should set the `weight` property to match the `weight` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const weight of Object.values(TextWeight)) { + await test.step(weight, async () => { + await fastPage.setTemplate({ attributes: { weight } }); + + await expect(element).toHaveJSProperty('weight', weight); + + await expect(element).toHaveAttribute('weight', weight); + + await expect(element).toHaveCustomState(weight); + }); + } + }); + + test('should set the `align` property to match the `align` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const align of Object.values(TextAlign)) { + await test.step(align, async () => { + await fastPage.setTemplate({ attributes: { align } }); + + await expect(element).toHaveJSProperty('align', align); + + await expect(element).toHaveAttribute('align', align); + + await expect(element).toHaveCustomState(align); + }); + } + }); + + test('should set the `font` property to match the `font` attribute', async ({ fastPage }) => { + const { element } = fastPage; + + for (const font of Object.values(TextFont)) { + await test.step(font, async () => { + await fastPage.setTemplate({ attributes: { font } }); + + await expect(element).toHaveJSProperty('font', font); + + await expect(element).toHaveAttribute('font', font); + + await expect(element).toHaveCustomState(font); + }); + } + }); }); diff --git a/packages/web-components/src/textarea/textarea.spec.ts b/packages/web-components/src/textarea/textarea.spec.ts index 6828d283b9cb2c..0127cc809002c3 100644 --- a/packages/web-components/src/textarea/textarea.spec.ts +++ b/packages/web-components/src/textarea/textarea.spec.ts @@ -1,52 +1,42 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; -import { LabelSize } from '../label/label.options.js'; +import { expect, test } from '../../test/playwright/index.js'; import { TextAreaAppearance, TextAreaResize, TextAreaSize } from './textarea.options.js'; import type { TextArea } from './textarea.js'; test.describe('TextArea', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-textarea--text-area')); - await page.waitForFunction(() => customElements.whenDefined('fluent-textarea')); + test.use({ + tagName: 'fluent-textarea', + waitFor: ['fluent-label'], }); // TODO: This should test 'elementInternals.role' as 'textbox' when Reference Target is widely supported. - test('should not have a role on element internals', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); + test('should not have a role on element internals', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.role', null); }); - test("should always return 'textarea' for the `type` prop", async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); + test("should always return 'textarea' for the `type` prop", async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('type', 'textarea'); }); - test('should pass down attributes to the internal control', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should pass down attributes to the internal control', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea - required - disabled - readonly - spellcheck - autocomplete="on" - maxlength="100" - minlength="10" - placeholder="Placeholder" - ></fluent-textarea> - `); + await fastPage.setTemplate({ + attributes: { + required: true, + disabled: true, + readonly: true, + spellcheck: true, + autocomplete: 'on', + maxlength: '100', + minlength: '10', + placeholder: 'Placeholder', + }, + }); await expect(control).toHaveJSProperty('required', true); await expect(control).toHaveJSProperty('disabled', true); @@ -58,10 +48,10 @@ test.describe('TextArea', () => { await expect(control).toHaveJSProperty('placeholder', 'Placeholder'); }); - test('should be associated with the given external labels', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should be associated with the given external labels', async ({ fastPage, page }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <label for="textarea" data-testid="label1">Text area</label> <fluent-textarea id="textarea"></fluent-textarea> <label for="textarea" data-testid="label2">Text area</lable> @@ -74,11 +64,11 @@ test.describe('TextArea', () => { expect(labelsValue).toStrictEqual([label1El, label2El]); }); - test('should be focused when associated external label is clicked', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should be focused when associated external label is clicked', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <label for="textarea" data-testid="label">Text area</label> <fluent-textarea id="textarea"></fluent-textarea> `); @@ -90,13 +80,11 @@ test.describe('TextArea', () => { await expect(control).toBeFocused(); }); - test('should have the control focused when `focus()` is called', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should have the control focused when `focus()` is called', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea id="textarea"></fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { id: 'textarea' } }); await element.evaluate((el: TextArea) => { el.focus(); @@ -106,12 +94,8 @@ test.describe('TextArea', () => { }); test.describe('visual styles', () => { - test('should have default custom states', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); + test('should have default custom states', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveCustomState('outline'); await expect(element).not.toHaveCustomState('auto-resize'); @@ -120,40 +104,28 @@ test.describe('TextArea', () => { await expect(element).not.toHaveCustomState('resize'); }); - test('should toggle appearance states', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea appearance="filled-darker"></fluent-textarea> - `); - - await expect(element).toHaveCustomState('filled-darker'); - await expect(element).not.toHaveCustomState('filled-lighter'); - await expect(element).not.toHaveCustomState('outline'); + test('should set the `appearance` property to match the `appearance` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: TextArea) => { - node.appearance = 'filled-lighter'; - }); + for (const appearance of Object.values(TextAreaAppearance)) { + await test.step(appearance, async () => { + await fastPage.setTemplate({ attributes: { appearance } }); - await expect(element).toHaveCustomState('filled-lighter'); - await expect(element).not.toHaveCustomState('filled-darker'); - await expect(element).not.toHaveCustomState('outline'); + await expect(element).toHaveJSProperty('appearance', appearance); - await element.evaluate((node: TextArea) => { - node.removeAttribute('appearance'); - }); + await expect(element).toHaveAttribute('appearance', appearance); - await expect(element).toHaveCustomState('outline'); - await expect(element).not.toHaveCustomState('filled-lighter'); - await expect(element).not.toHaveCustomState('filled-darker'); + await expect(element).toHaveCustomState(appearance); + }); + } }); - test('should toggle auto-resize state', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should toggle auto-resize state', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea auto-resize></fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { 'auto-resize': true } }); + + await expect(element).toHaveJSProperty('autoResize', true); await expect(element).toHaveCustomState('auto-resize'); @@ -161,15 +133,17 @@ test.describe('TextArea', () => { node.autoResize = false; }); + await expect(element).not.toHaveAttribute('auto-resize'); + await expect(element).not.toHaveCustomState('auto-resize'); }); - test('should toggle block state', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should toggle block state', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea block></fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { block: true } }); + + await expect(element).toHaveJSProperty('block', true); await expect(element).toHaveCustomState('block'); @@ -177,21 +151,21 @@ test.describe('TextArea', () => { node.block = false; }); + await expect(element).not.toHaveAttribute('block'); + await expect(element).not.toHaveCustomState('block'); }); - test('should toggle display-shadow state', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should toggle display-shadow state', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea display-shadow></fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { 'display-shadow': true } }); // Expecting `false` because the default appearance, outline, shouldn’t have shadow await expect(element).not.toHaveCustomState('display-shadow'); - await element.evaluate((el: TextArea, apperance: TextAreaAppearance) => { - el.appearance = apperance; + await element.evaluate((el: TextArea, appearance) => { + el.appearance = appearance; }, TextAreaAppearance.filledDarker); await expect(element).toHaveCustomState('display-shadow'); @@ -202,85 +176,51 @@ test.describe('TextArea', () => { await expect(element).not.toHaveCustomState('display-shadow'); - await element.evaluate((el: TextArea, apperance: TextAreaAppearance) => { + await element.evaluate((el: TextArea, appearance: TextAreaAppearance) => { el.displayShadow = true; - el.appearance = apperance; + el.appearance = appearance; }, TextAreaAppearance.filledLighter); await expect(element).toHaveCustomState('display-shadow'); }); - test('should toggle resize states', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea resize="both"></fluent-textarea> - `); - - await expect(element).toHaveCustomState('resize'); - await expect(element).toHaveCustomState('resize-both'); - await expect(element).not.toHaveCustomState('resize-vertical'); - await expect(element).not.toHaveCustomState('resize-horizontal'); - - await element.evaluate((node: TextArea, resize: TextAreaResize) => { - node.resize = resize; - }, TextAreaResize.horizontal); + test('should set the `resize` property to match the `resize` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await expect(element).toHaveCustomState('resize'); - await expect(element).toHaveCustomState('resize-horizontal'); - await expect(element).not.toHaveCustomState('resize-vertical'); - await expect(element).not.toHaveCustomState('resize-both'); + for (const resize of Object.values(TextAreaResize)) { + await test.step(resize, async () => { + await fastPage.setTemplate({ attributes: { resize } }); - await element.evaluate((node: TextArea, resize: TextAreaResize) => { - node.resize = resize; - }, TextAreaResize.vertical); + await expect(element).toHaveJSProperty('resize', resize); - await expect(element).toHaveCustomState('resize'); - await expect(element).toHaveCustomState('resize-vertical'); - await expect(element).not.toHaveCustomState('resize-horizontal'); - await expect(element).not.toHaveCustomState('resize-both'); + await expect(element).toHaveAttribute('resize', resize); - await element.evaluate((node: TextArea, resize: TextAreaResize) => { - node.resize = resize; - }, TextAreaResize.none); - - await expect(element).not.toHaveCustomState('resize'); - await expect(element).not.toHaveCustomState('resize-horizontal'); - await expect(element).not.toHaveCustomState('resize-vertical'); + await expect(element).toHaveCustomState(`resize-${resize}`); + }); + } }); - test('should toggle size states', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea size="small"></fluent-textarea> - `); - - await expect(element).toHaveCustomState('small'); - await expect(element).not.toHaveCustomState('large'); + test('should set the `size` property to match the `size` attribute', async ({ fastPage }) => { + const { element } = fastPage; - await element.evaluate((node: TextArea, size: TextAreaSize) => { - node.size = size; - }, TextAreaSize.large); + for (const size of Object.values(TextAreaSize)) { + await test.step(size, async () => { + await fastPage.setTemplate({ attributes: { size } }); - await expect(element).toHaveCustomState('large'); - await expect(element).not.toHaveCustomState('small'); + await expect(element).toHaveJSProperty('size', size); - await element.evaluate((node: TextArea) => { - node.removeAttribute('size'); - }); + await expect(element).toHaveAttribute('size', size); - await expect(element).not.toHaveCustomState('small'); - await expect(element).not.toHaveCustomState('large'); + await expect(element).toHaveCustomState(size); + }); + } }); - test('should toggle user-invalid state', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should toggle user-invalid state', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea required></fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { required: true } }); await expect(element).not.toHaveCustomState('user-valid'); await expect(element).not.toHaveCustomState('user-invalid'); @@ -300,54 +240,51 @@ test.describe('TextArea', () => { }); test.describe('internal label', () => { - test('should not display label if no elements assigned to the `label` slot', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should not display label if no elements assigned to the `label` slot', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('label'); - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); - await expect(label).toBeHidden(); }); - test('should display label when defined and associate to the internal textarea', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should display label when defined and associate to the internal textarea', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('label'); const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-label slot="label">Details</fluent-label> - </fluent-textarea> - `); + `, + }); await expect(label).toBeVisible(); await expect(control).toHaveAccessibleName('Details'); }); - test('should not include `label` slotted elements in its value', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should not include `label` slotted elements in its value', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea> + await fastPage.setTemplate({ + innerHTML: /* html */ ` <fluent-label slot="label">Details</fluent-label> Some text - </fluent-textarea> - `); + `, + }); await expect(element).toHaveJSProperty('value', 'Some text'); }); - test('should downstream `required` to the label', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should downstream `required` to the label', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('fluent-label'); - await page.setContent(/* html */ ` - <fluent-textarea required> + await fastPage.setTemplate({ + attributes: { required: true }, + innerHTML: /* html */ ` <fluent-label slot="label">Details</fluent-label> - </fluent-textarea> - `); + `, + }); await expect(label).toHaveJSProperty('required', true); @@ -358,15 +295,16 @@ test.describe('TextArea', () => { await expect(label).toHaveJSProperty('required', false); }); - test('should downstream `disabled` to the label', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should downstream `disabled` to the label', async ({ fastPage }) => { + const { element } = fastPage; const label = element.locator('fluent-label'); - await page.setContent(/* html */ ` - <fluent-textarea disabled> + await fastPage.setTemplate({ + attributes: { disabled: true }, + innerHTML: /* html */ ` <fluent-label slot="label">Details</fluent-label> - </fluent-textarea> - `); + `, + }); await expect(label).toHaveJSProperty('disabled', true); @@ -377,81 +315,55 @@ test.describe('TextArea', () => { await expect(label).toHaveJSProperty('disabled', false); }); - test('should downstream `size` to the label', async ({ page }) => { - const element = page.locator('fluent-textarea'); - const label = element.locator('fluent-label'); - - await page.setContent(/* html */ ` - <fluent-textarea size="${TextAreaSize.small}"> - <fluent-label slot="label">Details</fluent-label> - </fluent-textarea> - `); - - await expect(label).toHaveJSProperty('size', LabelSize.small); - - await element.evaluate((el: TextArea, size: TextAreaSize) => { - el.size = size; - }, TextAreaSize.medium); + for (const size of Object.values(TextAreaSize)) { + test(`should downstream \`${size}\` size to the label`, async ({ fastPage }) => { + const { element } = fastPage; + const label = element.locator('fluent-label'); - await expect(label).toHaveJSProperty('size', LabelSize.medium); - - await element.evaluate((el: TextArea, size: TextAreaSize) => { - el.size = size; - }, TextAreaSize.large); - - await expect(label).toHaveJSProperty('size', LabelSize.large); + await fastPage.setTemplate({ + attributes: { size }, + innerHTML: /* html */ ` + <fluent-label slot="label">Details</fluent-label> + `, + }); - await element.evaluate((el: TextArea) => { - el.size = undefined; + await expect(label).toHaveJSProperty('size', size); }); - - await expect(label).toHaveJSProperty('size', undefined); - }); + } }); test.describe('`value` and `defaultValue` props', () => { - test('should have `defaultValue` as empty string if no children', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); + test('should have `defaultValue` as empty string if no children', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('defaultValue', ''); await expect(element).toHaveJSProperty('value', ''); }); - test('should have `defaultValue` as its inner text if has text content', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should have `defaultValue` as its inner text if has text content', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea> - some text - </fluent-textarea> - `); + await fastPage.setTemplate({ + innerHTML: 'some text', + }); await expect(element).toHaveJSProperty('defaultValue', 'some text'); await expect(element).toHaveJSProperty('value', 'some text'); }); - test('should have `defaultValue` as its inner HTML if has HTML content', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent( - ['<fluent-textarea>', ' <div>some text</div>', ' <p>more text</p>', '</fluent-textarea>'].join('\n'), - ); + test('should have `defaultValue` as its inner HTML if has HTML content', async ({ fastPage, page }) => { + const { element } = fastPage; const expectedValue = '<div>some text</div><p>more text</p>'; + + await fastPage.setTemplate({ innerHTML: expectedValue }); + await expect(element).toHaveJSProperty('defaultValue', expectedValue); await expect(element).toHaveJSProperty('value', expectedValue); }); - test('should have `defaultValue` as set to `defaultValue` prop', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); + test('should have `defaultValue` as set to `defaultValue` prop', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((el: TextArea) => { el.defaultValue = 'some text'; @@ -461,12 +373,8 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('value', 'some text'); }); - test('should not have `defaultValue` as set to `value` prop', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); + test('should not have `defaultValue` as set to `value` prop', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((el: TextArea) => { el.value = 'some text'; @@ -476,12 +384,8 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('value', 'some text'); }); - test('should have `defaultValue` as set to `innerText`', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); + test('should have `defaultValue` as set to `innerText`', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((el: TextArea) => { el.innerText = ' some\ntext '; @@ -491,12 +395,8 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('value', 'some<br>text'); }); - test('should have `defaultValue` as set to `textContent`', async ({ page }) => { - const element = page.locator('fluent-textarea'); - - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); + test('should have `defaultValue` as set to `textContent`', async ({ fastPage }) => { + const { element } = fastPage; await element.evaluate((el: TextArea) => { el.textContent = ' some\ntext '; @@ -506,10 +406,13 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('value', 'some\ntext'); }); - test('should have `defaultValue` as set to the `defaultValue` prop before connected', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should have `defaultValue` as set to the `defaultValue` prop before connected', async ({ + fastPage, + page, + }) => { + const { element } = fastPage; - await page.setContent(''); + await fastPage.setTemplate(''); await page.evaluate(() => { const textarea = document.createElement('fluent-textarea') as TextArea; textarea.defaultValue = 'some text'; @@ -520,11 +423,11 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('value', 'some text'); }); - test('should set `value` before connected', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should set `value` before connected', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(''); + await fastPage.setTemplate(''); await page.evaluate(() => { const textarea = document.createElement('fluent-textarea') as TextArea; textarea.value = 'some text'; @@ -537,13 +440,11 @@ test.describe('TextArea', () => { }); // This behavior is consistent with the built-in `<textarea>` element - test('should only downstream to the `value` prop before user interaction', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should only downstream to the `value` prop before user interaction', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea>1</fluent-textarea> - `); + await fastPage.setTemplate({ innerHTML: '1' }); await element.evaluate((el: TextArea) => { el.defaultValue = '2'; @@ -572,12 +473,10 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('defaultValue', '4'); }); - test('should never be upstreamed by the `value` prop', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should never be upstreamed by the `value` prop', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea>1</fluent-textarea> - `); + await fastPage.setTemplate({ innerHTML: '1' }); await element.evaluate((el: TextArea) => { el.value = '2'; @@ -587,14 +486,10 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('defaultValue', '1'); }); - test('should return the text length of the value with `textLength` prop', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should return the text length of the value with `textLength` prop', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea></fluent-textarea> - `); - await control.fill('123456\n7890 '); await expect(element).toHaveJSProperty('textLength', 12); @@ -602,13 +497,11 @@ test.describe('TextArea', () => { }); test.describe('validity and validation message', () => { - test('should set `valueMissing` flag if required and value is empty', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should set `valueMissing` flag if required and value is empty', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea required></fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { required: true } }); await expect(element).toHaveJSProperty('validity.valueMissing', true); @@ -630,12 +523,10 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('validity.valid', true); }); - test('should set `tooShort` flag if value is shorter than `minlength`', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should set `tooShort` flag if value is shorter than `minlength`', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea minlength="10"></fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { minlength: '10' } }); // `tooShort` is not set until user interacted. await expect(element).toHaveJSProperty('validity.tooShort', false); @@ -653,13 +544,11 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('validity.valid', true); }); - test('should set `tooLong` flag if value is longer than `maxlength`', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should set `tooLong` flag if value is longer than `maxlength`', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea maxlength="3">12345</fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { maxlength: '3' }, innerHTML: '12345' }); // `tooLong` is not set until user interacted. await expect(element).toHaveJSProperty('validity.tooLong', false); @@ -694,12 +583,10 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('validity.valid', true); }); - test('should always be valid if disabled', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should always be valid if disabled', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea required disabled></fluent-textarea> - `); + await fastPage.setTemplate({ attributes: { disabled: true, required: true } }); await expect(element).toHaveJSProperty('validity.valid', true); @@ -711,10 +598,10 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('validity.valid', false); }); - test('should always be valid if read-only', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should always be valid if read-only', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <fluent-textarea required readonly></fluent-textarea> `); @@ -728,58 +615,93 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('validity.valid', false); }); - // TODO: Update validation messages for other browsers. - test('should set the correct validation messages', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should set the correct validation message for `valueMissing` validity state', async ({ + fastPage, + browserName, + }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea required></fluent-textarea> - `); + const messages: Record<string, string> = { + chromium: 'Please fill out this field.', + edge: 'Please fill out this field.', + firefox: 'Please fill out this field.', + webkit: 'Fill out this field', + }; - await expect(element).toHaveJSProperty('validationMessage', 'Please fill out this field.'); + await fastPage.setTemplate({ attributes: { required: true } }); + + await expect.soft(element).toHaveJSProperty('validationMessage', messages[browserName]); await control.fill('12345'); await expect(element).toHaveJSProperty('validationMessage', ''); + }); - await element.evaluate((el: TextArea) => { - el.setAttribute('minlength', '6'); - }); + test('should set the correct validation message for `tooShort` validity state', async ({ + fastPage, + browserName, + }) => { + const { element } = fastPage; - await expect(element).toHaveJSProperty( - 'validationMessage', - 'Please lengthen this text to 6 characters or more (you are currently using 5 characters).', - ); + const messages: Record<string, string> = { + chromium: 'Please lengthen this text to 6 characters or more (you are currently using 5 characters).', + firefox: 'Please use at least 6 characters (you are currently using 5 characters).', + webkit: 'Use at least 6 characters', + }; + + await fastPage.setTemplate({ attributes: { minlength: '6' } }); + + await element.pressSequentially('12345'); + + await expect.soft(element).toHaveJSProperty('validationMessage', messages[browserName]); await element.press('6'); await expect(element).toHaveJSProperty('validationMessage', ''); + }); - await element.pressSequentially('78'); + test('should set the correct validation message for `tooLong` validity state', async ({ + fastPage, + browserName, + }) => { + const { element } = fastPage; + const control = element.locator('textarea'); - await element.evaluate((el: TextArea) => { - el.setAttribute('maxlength', '7'); - }); + const messages: Record<string, string> = { + chromium: 'Please shorten this text to 7 characters or less (you are currently using 8 characters).', + edge: 'Please shorten this text to 7 characters or less (you are currently using 8 characters).', + firefox: 'Please shorten this text to 7 characters or less (you are currently using 8 characters).', + webkit: 'Use no more than 7 characters', + }; - await expect(element).toHaveJSProperty( - 'validationMessage', - 'Please shorten this text to 7 characters or less (you are currently using 8 characters).', - ); + await control.fill('12345678'); - await element.evaluate((el: TextArea) => { - el.setAttribute('disabled', ''); + await element.evaluate((node: TextArea) => { + node.setAttribute('maxlength', '7'); }); + await expect(element).toHaveJSProperty('validationMessage', messages[browserName]); + + await element.press('Backspace'); + + await expect(element).toHaveJSProperty('validationMessage', ''); + }); + + test('should NOT show validation message when disabled', async ({ fastPage }) => { + const { element } = fastPage; + + await fastPage.setTemplate({ attributes: { required: true, disabled: true } }); + await expect(element).toHaveJSProperty('validationMessage', ''); }); }); test.describe('with form', () => { - test('should connect to the given `<form>` element', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should connect to the given `<form>` element', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form id="form1"> <fluent-textarea></fluent-textarea> </form> @@ -795,11 +717,11 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('form.id', 'form2'); }); - test('should be disabled when the parent `<fieldset>` is disabled', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should be disabled when the parent `<fieldset>` is disabled', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fieldset> <fluent-textarea></fluent-textarea> @@ -833,13 +755,13 @@ test.describe('TextArea', () => { }); test.describe('form reset', () => { - test('should reset value to empty if no `defaultValue`', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should reset value to empty if no `defaultValue`', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('textarea'); const form = page.locator('form'); const reset = form.locator('button[type=reset]'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-textarea></fluent-textarea> <button type="reset"></button> @@ -855,12 +777,12 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('value', ''); }); - test('should reset value to `defaultvalue`', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should reset value to `defaultvalue`', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('textarea'); const reset = page.locator('button[type="reset"]'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-textarea>1234</fluent-textarea> <button type="reset"></button> @@ -878,12 +800,12 @@ test.describe('TextArea', () => { await expect(element).toHaveJSProperty('value', '1234'); }); - test('should reset value to updated `defaultValue`', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should reset value to updated `defaultValue`', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('textarea'); const reset = page.locator('button[type="reset"]'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-textarea>1234</fluent-textarea> <button type="reset"></button> @@ -904,12 +826,12 @@ test.describe('TextArea', () => { }); }); - test('should set form value', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should set form value', async ({ fastPage, page }) => { + const { element } = fastPage; const control = element.locator('textarea'); const form = page.locator('form'); - await page.setContent(/* html */ ` + await fastPage.setTemplate(/* html */ ` <form> <fluent-textarea name="content"></fluent-textarea> </form> @@ -931,13 +853,11 @@ test.describe('TextArea', () => { }); test.describe('`select` events', () => { - test('should emit when text is selected', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should emit when text is selected', async ({ fastPage }) => { + const { element } = fastPage; const control = element.locator('textarea'); - await page.setContent(/* html */ ` - <fluent-textarea>12345</fluent-textarea> - `); + await fastPage.setTemplate({ innerHTML: '12345' }); const [wasSelected] = await Promise.all([ element.evaluate( @@ -949,12 +869,10 @@ test.describe('TextArea', () => { expect(wasSelected).toBe(true); }); - test('should emit when `select()` is called', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should emit when `select()` is called', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea>12345</fluent-textarea> - `); + await fastPage.setTemplate({ innerHTML: '12345' }); const [wasSelected] = await Promise.all([ element.evaluate( @@ -970,12 +888,10 @@ test.describe('TextArea', () => { }); test.describe('`change` events', () => { - test('should emit if value changed before blur', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should emit a `change` event when value changes and the control loses focus', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea>12345</fluent-textarea> - `); + await fastPage.setTemplate({ innerHTML: '12345' }); const [wasChanged] = await Promise.all([ element.evaluate( @@ -990,40 +906,25 @@ test.describe('TextArea', () => { expect(wasChanged).toBe(true); }); - test('should not emit if value didn’t change before blur', async ({ page }) => { - const element = page.locator('fluent-textarea'); + test('should NOT emit a `change` event when the value is the same and the control loses focus', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-textarea>12345</fluent-textarea> - `); + await fastPage.setTemplate({ innerHTML: '12345' }); - const [wasChanged] = await Promise.all([ - element.evaluate(el => { - return new Promise(resolve => { - // If, after 1 second, the promise hasn’t fulfilled, consider the - // event didn’t fire. - const timeout = setTimeout(() => { - resolve(false); - }, 1000); - - el.addEventListener( - 'change', - () => { - clearTimeout(timeout); - resolve(true); - }, - { once: true }, - ); - }); - }), - (async () => { - await element.press('0'); - await element.press('Backspace'); - await element.blur(); - })(), - ]); + const wasChanged = element.evaluate(node => + Promise.race([ + new Promise(resolve => node.addEventListener('change', () => resolve(true))), + new Promise(resolve => setTimeout(() => resolve(false), 100)), + ]), + ); + + await element.press('0'); + await element.press('Backspace'); + await element.blur(); - expect(wasChanged).toBe(false); + await expect(wasChanged).resolves.toBe(false); }); }); }); diff --git a/packages/web-components/src/theme/set-theme.spec.ts b/packages/web-components/src/theme/set-theme.spec.ts index 047e8bb88875f2..883943b72d0ec6 100644 --- a/packages/web-components/src/theme/set-theme.spec.ts +++ b/packages/web-components/src/theme/set-theme.spec.ts @@ -1,5 +1,4 @@ -import { expect, test } from '@playwright/test'; -import { fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { setTheme as _setTheme, Theme } from './set-theme.js'; @@ -20,16 +19,12 @@ declare global { } test.describe('setTheme()', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('theme-settheme--set-theme')); - }); - - test('should set and uset global tokens', async ({ page }) => { + test('should set and uset global tokens', async ({ fastPage, page }) => { const html = page.locator('html'); const body = page.locator('body'); const div = page.locator('div'); - await page.setContent(`<div></div>`); + await fastPage.setTemplate(`<div></div>`); await page.evaluate(theme => { window.setTheme(theme); @@ -66,11 +61,11 @@ test.describe('setTheme()', () => { await expect(div).toHaveCSS('--bar', ''); }); - test.skip('should set and unset tokens in a light DOM subtree', async ({ page }) => { + test('should set and unset tokens in a light DOM subtree', async ({ fastPage, page }) => { const div = page.locator('div'); const span = page.locator('span'); - await page.setContent(`<div><span></span></div>`); + await fastPage.setTemplate(`<div><span></span></div>`); await page.evaluate(theme => { window.setTheme(theme); @@ -100,12 +95,11 @@ test.describe('setTheme()', () => { await expect(span).toHaveCSS('--bar', 'bar1'); }); - test('should set and unset tokens in a shadow DOM tree', async ({ page }) => { + test('should set and unset tokens in a shadow DOM tree', async ({ fastPage, page }) => { const div = page.locator('div'); const span = page.locator('span'); - // Using Declarative Shadow DOM with `page.setContent()` doesn’t work in Firefox. - await page.setContent('<div></div>'); + await fastPage.setTemplate('<div></div>'); await div.evaluate((node: HTMLDivElement) => { node.attachShadow({ mode: 'open' }); node.shadowRoot!.innerHTML = '<span></span>'; @@ -139,15 +133,15 @@ test.describe('setTheme()', () => { await expect(span).toHaveCSS('--bar', 'bar1'); }); - test.skip('should not inherit token values from light DOM subtree once tokens are set in the shadow DOM tree', async ({ + test('should not inherit token values from light DOM subtree once tokens are set in the shadow DOM tree', async ({ + fastPage, page, }) => { const parent = page.locator('div.parent'); const host = page.locator('div.host'); const span = host.locator('span'); - // Using Declarative Shadow DOM with `page.setContent()` doesn’t work in Firefox. - await page.setContent(` + await fastPage.setTemplate(/* html */ ` <div class="parent"> <div class="host"></div> </div> diff --git a/packages/web-components/src/theme/set-theme.ts b/packages/web-components/src/theme/set-theme.ts index 9e18a00880a8c7..cb1a8da3880b58 100644 --- a/packages/web-components/src/theme/set-theme.ts +++ b/packages/web-components/src/theme/set-theme.ts @@ -1,3 +1,4 @@ +import { Updates } from '@microsoft/fast-element'; import { uniqueId } from '@microsoft/fast-web-utilities'; /** @@ -208,9 +209,10 @@ function forceRepaint(element: HTMLElement) { const currentValue = element.style.getPropertyValue(name); element.style.setProperty(name, tempValue); - requestAnimationFrame(() => { - element.style.setProperty(name, currentValue); - }); + + Updates.process(); + + element.style.setProperty(name, currentValue); } /** diff --git a/packages/web-components/src/toggle-button/toggle-button.spec.ts b/packages/web-components/src/toggle-button/toggle-button.spec.ts index 07e46ca5f9f12e..5bc019f24b997a 100644 --- a/packages/web-components/src/toggle-button/toggle-button.spec.ts +++ b/packages/web-components/src/toggle-button/toggle-button.spec.ts @@ -1,41 +1,26 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; test.describe('Toggle Button', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-button-toggle-button--button')); + test.use({ tagName: 'fluent-toggle-button' }); - await page.waitForFunction(() => customElements.whenDefined('fluent-toggle-button')); - }); - - test('should have the `aria-pressed` attribute set to `false` by default', async ({ page }) => { - const element = page.locator('fluent-toggle-button'); - - await page.setContent(/* html */ ` - <fluent-toggle-button>Toggle</fluent-toggle-button> - `); + test('should have the `aria-pressed` attribute set to `false` by default', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.ariaPressed', 'false'); }); test('should set the `aria-pressed` attribute to `true` when the `pressed` attribute is present', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-toggle-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-toggle-button pressed>Toggle</fluent-toggle-button> - `); + await fastPage.setTemplate({ attributes: { pressed: true } }); await expect(element).toHaveJSProperty('elementInternals.ariaPressed', 'true'); }); - test('should toggle the `pressed` attribute when clicked', async ({ page }) => { - const element = page.locator('fluent-toggle-button'); - - await page.setContent(/* html */ ` - <fluent-toggle-button>Toggle</fluent-toggle-button> - `); + test('should toggle the `pressed` attribute when clicked', async ({ fastPage }) => { + const { element } = fastPage; await expect(element).toHaveJSProperty('elementInternals.ariaPressed', 'false'); @@ -55,13 +40,11 @@ test.describe('Toggle Button', () => { }); test('should NOT toggle the `pressed` attribute when clicked when the `disabled` attribute is present', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-toggle-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-toggle-button disabled>Toggle</fluent-toggle-button> - `); + await fastPage.setTemplate({ attributes: { disabled: true } }); await expect(element).toHaveJSProperty('elementInternals.ariaPressed', 'false'); @@ -81,13 +64,11 @@ test.describe('Toggle Button', () => { }); test('should NOT toggle the `pressed` attribute when clicked when the `disabled-focusable` attribute is present', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-toggle-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-toggle-button disabled-focusable>Toggle</fluent-toggle-button> - `); + await fastPage.setTemplate({ attributes: { 'disabled-focusable': true } }); await expect(element).toHaveJSProperty('elementInternals.ariaPressed', 'false'); @@ -106,34 +87,30 @@ test.describe('Toggle Button', () => { await expect(element).not.toHaveCustomState('pressed'); }); - test('should set the `aria-pressed` attribute to `mixed` when the `mixed` attribute is present', async ({ page }) => { - const element = page.locator('fluent-toggle-button'); + test('should set the `aria-pressed` attribute to `mixed` when the `mixed` attribute is present', async ({ + fastPage, + }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-toggle-button mixed>Toggle</fluent-toggle-button> - `); + await fastPage.setTemplate({ attributes: { mixed: true } }); await expect(element).toHaveJSProperty('elementInternals.ariaPressed', 'mixed'); }); - test('should set the `pressed` state when the `mixed` attribute is present', async ({ page }) => { - const element = page.locator('fluent-toggle-button'); + test('should set the `pressed` state when the `mixed` attribute is present', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-toggle-button mixed>Toggle</fluent-toggle-button> - `); + await fastPage.setTemplate({ attributes: { mixed: true } }); await expect(element).toHaveCustomState('pressed'); }); test('should set the `aria-pressed` attribute to match the `pressed` attribute when the `mixed` attribute is removed', async ({ - page, + fastPage, }) => { - const element = page.locator('fluent-toggle-button'); + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-toggle-button mixed pressed>Toggle</fluent-toggle-button> - `); + await fastPage.setTemplate({ attributes: { mixed: true, pressed: true } }); await expect(element).toHaveJSProperty('elementInternals.ariaPressed', 'mixed'); @@ -144,12 +121,10 @@ test.describe('Toggle Button', () => { await expect(element).toHaveJSProperty('elementInternals.ariaPressed', 'true'); }); - test('should persist the `pressed` state when the `mixed` attribute is removed', async ({ page }) => { - const element = page.locator('fluent-toggle-button'); + test('should persist the `pressed` state when the `mixed` attribute is removed', async ({ fastPage }) => { + const { element } = fastPage; - await page.setContent(/* html */ ` - <fluent-toggle-button mixed pressed>Toggle</fluent-toggle-button> - `); + await fastPage.setTemplate({ attributes: { mixed: true, pressed: true } }); await expect(element).toHaveCustomState('pressed'); diff --git a/packages/web-components/src/tooltip/tooltip.spec.ts b/packages/web-components/src/tooltip/tooltip.spec.ts index f9dbe1aecc1073..4f6054137d9959 100644 --- a/packages/web-components/src/tooltip/tooltip.spec.ts +++ b/packages/web-components/src/tooltip/tooltip.spec.ts @@ -1,20 +1,9 @@ -import { test } from '@playwright/test'; -import { expect, fixtureURL } from '../helpers.tests.js'; +import { expect, test } from '../../test/playwright/index.js'; import type { Tooltip } from './tooltip.js'; import type { TooltipPositioningOption } from './tooltip.options.js'; test.describe('Tooltip', () => { - test.beforeEach(async ({ page }) => { - await page.goto(fixtureURL('components-tooltip--docs')); - await page.waitForFunction(() => customElements.whenDefined('fluent-tooltip')); - - await page.setContent(/* html */ ` - <div style="position: absolute; inset: 200px"> - <button id="target">Target</button> - <fluent-tooltip anchor="target">This is a tooltip</fluent-tooltip> - </div> - `); - }); + test.use({ tagName: 'fluent-tooltip' }); /** * ARIA APG Tooltip Pattern {@link https://www.w3.org/WAI/ARIA/apg/patterns/tooltip/ } @@ -22,139 +11,204 @@ test.describe('Tooltip', () => { * The element that serves as the tooltip container has role tooltip. * The element that triggers the tooltip references the tooltip element with aria-describedby. */ - test('escape key should hide the tooltip', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('escape key should hide the tooltip', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target">This is a tooltip</fluent-tooltip> + </div> + `); + await button.focus(); + await expect(element).toBeVisible(); + await page.keyboard.press('Escape'); + await expect(element).toBeHidden(); }); - test('should have the role set to `tooltip`', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('should have the role set to `tooltip`', async ({ fastPage }) => { + const { element } = fastPage; + await expect(element).toHaveJSProperty('elementInternals.role', 'tooltip'); }); - test('should have the `aria-describedby` attribute set to the tooltip id', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('should have the `aria-describedby` attribute set to the tooltip id', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target">This is a tooltip</fluent-tooltip> + </div> + `); + await expect(element).toHaveAttribute('id'); + const id = await element.evaluate((node: Tooltip) => node.id); + await expect(button).toHaveAttribute('aria-describedby', id); }); - test('should not be visible by default', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('should not be visible by default', async ({ fastPage }) => { + const { element } = fastPage; + await expect(element).toBeHidden(); }); - test('should show the tooltip on hover', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('should show the tooltip on hover', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target">This is a tooltip</fluent-tooltip> + </div> + `); + await expect(element).toBeHidden(); + await button.hover(); + await expect(element).toBeVisible(); }); - test('should show the tooltip on focus', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('should show the tooltip on focus', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target">This is a tooltip</fluent-tooltip> + </div> + `); + await expect(element).toBeHidden(); + await button.focus(); + await expect(element).toBeVisible(); + await button.blur(); + await expect(element).toBeHidden(); }); - test('default placement should be set to `above`', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('default placement should be set to `above`', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); + + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target">This is a tooltip</fluent-tooltip> + </div> + `); + await expect(element).not.toHaveAttribute('positioning', 'above'); - // show the element to get the position await button.focus(); await expect(element).toBeVisible(); const buttonTop = await button.evaluate((node: HTMLElement) => node.getBoundingClientRect().top); const elementBottom = await element.evaluate((node: HTMLElement) => node.getBoundingClientRect().bottom); - await expect(buttonTop).toBeGreaterThan(elementBottom); + expect(buttonTop).toBeGreaterThan(elementBottom); }); - test('position should be set to `above` when `positioning` is set to `above`', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('position should be set to `above` when `positioning` is set to `above`', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target">This is a tooltip</fluent-tooltip> + </div> + `); + await element.evaluate((node: Tooltip) => { node.positioning = 'above' as TooltipPositioningOption; }); + await expect(element).toHaveAttribute('positioning', 'above'); - // show the element to get the position await button.focus(); const buttonTop = await button.evaluate((node: HTMLElement) => node.getBoundingClientRect().top); + const elementBottom = await element.evaluate((node: HTMLElement) => node.getBoundingClientRect().bottom); - await expect(buttonTop).toBeGreaterThan(elementBottom); + expect(buttonTop).toBeGreaterThan(elementBottom); }); - test('position should be set to `below` when `positioning` is set to `below`', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('position should be set to `below` when `positioning` is set to `below`', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); - await element.evaluate((node: Tooltip) => { - node.positioning = 'below' as TooltipPositioningOption; - }); - await expect(element).toHaveAttribute('positioning', 'below'); + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target" positioning="below">This is a tooltip</fluent-tooltip> + </div> + `); + + await expect(element).toHaveJSProperty('positioning', 'below'); - // show the element to get the position await button.focus(); const buttonBottom = await button.evaluate((node: HTMLElement) => node.getBoundingClientRect().bottom); const elementTop = await element.evaluate((node: HTMLElement) => node.getBoundingClientRect().top); - await expect(buttonBottom).toBeLessThan(elementTop); + expect(buttonBottom).toBeLessThan(elementTop); }); - test('position should be set to `before` when `positioning` is set to `before`', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('position should be set to `before` when `positioning` is set to `before`', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); - await element.evaluate((node: Tooltip) => { - node.positioning = 'before' as TooltipPositioningOption; - }); - await expect(element).toHaveAttribute('positioning', 'before'); + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target" positioning="before">This is a tooltip</fluent-tooltip> + </div> + `); + + await expect(element).toHaveJSProperty('positioning', 'before'); - // show the element to get the position await button.focus(); const buttonLeft = await button.evaluate((node: HTMLElement) => node.getBoundingClientRect().left); const elementRight = await element.evaluate((node: HTMLElement) => node.getBoundingClientRect().right); - await expect(buttonLeft).toBeGreaterThan(elementRight); + expect(buttonLeft).toBeGreaterThan(elementRight); }); - test('position should be set to `after` when `positioning` is set to `after`', async ({ page }) => { - const element = page.locator('fluent-tooltip'); + test('position should be set to `after` when `positioning` is set to `after`', async ({ fastPage, page }) => { + const { element } = fastPage; const button = page.locator('button'); - await element.evaluate((node: Tooltip) => { - node.positioning = 'after' as TooltipPositioningOption; - }); - await expect(element).toHaveAttribute('positioning', 'after'); + await fastPage.setTemplate(/* html */ ` + <div style="position: absolute; inset: 200px"> + <button id="target">Target</button> + <fluent-tooltip anchor="target" positioning="after">This is a tooltip</fluent-tooltip> + </div> + `); + + await expect(element).toHaveJSProperty('positioning', 'after'); - // show the element to get the position await button.focus(); const buttonRight = await button.evaluate((node: HTMLElement) => node.getBoundingClientRect().right); const elementLeft = await element.evaluate((node: HTMLElement) => node.getBoundingClientRect().left); - await expect(buttonRight).toBeLessThan(elementLeft); + expect(buttonRight).toBeLessThan(elementLeft); }); }); diff --git a/packages/web-components/src/tooltip/tooltip.ts b/packages/web-components/src/tooltip/tooltip.ts index 955669af4b47e6..7843c0aeaee12b 100644 --- a/packages/web-components/src/tooltip/tooltip.ts +++ b/packages/web-components/src/tooltip/tooltip.ts @@ -1,4 +1,4 @@ -import { attr, FASTElement, nullableNumberConverter } from '@microsoft/fast-element'; +import { attr, FASTElement, nullableNumberConverter, Updates } from '@microsoft/fast-element'; import { uniqueId } from '@microsoft/fast-web-utilities'; import type { TooltipPositioningOption } from './tooltip.options.js'; @@ -44,6 +44,17 @@ export class Tooltip extends FASTElement { @attr public positioning?: TooltipPositioningOption; + /** + * Updates the fallback styles when the positioning changes. + * + * @internal + */ + public positioningChanged(): void { + if (!SUPPORTS_CSS_ANCHOR_POSITIONING) { + this.setFallbackStyles(); + } + } + /** * The id of the anchor element for the tooltip */ @@ -84,6 +95,11 @@ export class Tooltip extends FASTElement { const describedBy = this.anchorElement.getAttribute('aria-describedby'); this.anchorElement.setAttribute('aria-describedby', describedBy ? `${describedBy} ${this.id}` : this.id); + this.anchorElement.addEventListener('focus', this.focusAnchorHandler); + this.anchorElement.addEventListener('blur', this.blurAnchorHandler); + this.anchorElement.addEventListener('mouseenter', this.mouseenterAnchorHandler); + this.anchorElement.addEventListener('mouseleave', this.mouseleaveAnchorHandler); + if (SUPPORTS_CSS_ANCHOR_POSITIONING) { if (!SUPPORTS_HTML_ANCHOR_POSITIONING) { // @ts-expect-error - Baseline 2024 @@ -91,67 +107,10 @@ export class Tooltip extends FASTElement { // @ts-expect-error - Baseline 2024 this.style.positionAnchor = anchorName; } - } else { - // Provide style fallback for browsers that do not support anchor positioning - if (!this.anchorPositioningStyleElement) { - this.anchorPositioningStyleElement = document.createElement('style'); - document.head.append(this.anchorPositioningStyleElement); - } - - // Given a position with <direction>-<alignment> format, return the proper CSS properties - // eslint-disable-next-line prefer-const - let [direction, alignment] = this.positioning?.split('-') ?? []; - - if (alignment === undefined && (direction === 'above' || direction === 'below')) { - alignment = 'centerX'; - } - if (alignment === undefined && (direction === 'before' || direction === 'after')) { - alignment = 'centerY'; - } - - const directionCSSMap = { - above: `bottom: anchor(${anchorName} top);`, - below: `top: anchor(${anchorName} bottom);`, - before: `right: anchor(${anchorName} left);`, - after: `left: anchor(${anchorName} right);`, - } as const; - - type DirectionMapOption = keyof typeof directionCSSMap; - const directionCSS = directionCSSMap[direction as DirectionMapOption] ?? directionCSSMap.above; - - const alignmentCSSMap = { - start: `left: anchor(${anchorName} left);`, - end: `right: anchor(${anchorName} right);`, - top: `top: anchor(${anchorName} top);`, - bottom: `bottom: anchor(${anchorName} bottom);`, - centerX: `left: anchor(${anchorName} center); translate: -50% 0;`, - centerY: `top: anchor(${anchorName} center); translate: 0 -50%;`, - } as const; - - type AlignmentMapOption = keyof typeof alignmentCSSMap; - const alignmentCSS = alignmentCSSMap[alignment as AlignmentMapOption] ?? alignmentCSSMap.centerX; - - this.anchorPositioningStyleElement.textContent = ` - #${this.anchor} { - anchor-name: ${anchorName}; - } - #${this.id} { - inset: unset; - ${directionCSS} - ${alignmentCSS} - position: absolute; - } - `; - - if (window.CSS_ANCHOR_POLYFILL) { - window.CSS_ANCHOR_POLYFILL.call({ element: this.anchorPositioningStyleElement }); - } + return; } - this.anchorElement.addEventListener('focus', this.focusAnchorHandler); - this.anchorElement.addEventListener('blur', this.blurAnchorHandler); - this.anchorElement.addEventListener('mouseenter', this.mouseenterAnchorHandler); - this.anchorElement.addEventListener('mouseleave', this.mouseleaveAnchorHandler); + Updates.enqueue(() => this.setFallbackStyles()); } public disconnectedCallback(): void { @@ -170,7 +129,6 @@ export class Tooltip extends FASTElement { public showTooltip(delay: number = this.defaultDelay): void { setTimeout(() => { this.setAttribute('aria-hidden', 'false'); - //// @ts-expect-error - Baseline 2024 this.showPopover(); }, delay); } @@ -189,7 +147,6 @@ export class Tooltip extends FASTElement { } this.setAttribute('aria-hidden', 'true'); - //// @ts-expect-error - Baseline 2024 this.hidePopover(); }, delay); } @@ -210,6 +167,68 @@ export class Tooltip extends FASTElement { * Hide the tooltip on blur */ public blurAnchorHandler = () => this.hideTooltip(0); + + private setFallbackStyles(): void { + if (!this.anchorElement) { + return; + } + // @ts-expect-error - Baseline 2024 + const anchorName = this.anchorElement.style.anchorName || `--${this.anchor}`; + + // Provide style fallback for browsers that do not support anchor positioning + if (!this.anchorPositioningStyleElement) { + this.anchorPositioningStyleElement = document.createElement('style'); + document.head.append(this.anchorPositioningStyleElement); + } + + let [direction, alignment] = this.positioning?.split('-') ?? []; + + if (!alignment) { + if (direction === 'above' || direction === 'below') { + alignment = 'centerX'; + } + if (direction === 'before' || direction === 'after') { + alignment = 'centerY'; + } + } + + const directionCSSMap = { + above: `bottom: anchor(top);`, + below: `top: anchor(bottom);`, + before: `right: anchor(left);`, + after: `left: anchor(right);`, + } as const; + + const directionCSS = directionCSSMap[direction as keyof typeof directionCSSMap] ?? directionCSSMap.above; + + const alignmentCSSMap = { + start: `left: anchor(left);`, + end: `right: anchor(right);`, + top: `top: anchor(top);`, + bottom: `bottom: anchor(bottom);`, + centerX: `left: anchor(center); translate: -50% 0;`, + centerY: `top: anchor(center); translate: 0 -50%;`, + } as const; + + const alignmentCSS = alignmentCSSMap[alignment as keyof typeof alignmentCSSMap] ?? alignmentCSSMap.centerX; + + this.anchorPositioningStyleElement.textContent = /* css */ ` + #${this.anchor} { + anchor-name: ${anchorName}; + } + #${this.id} { + inset: unset; + position-anchor: ${anchorName}; + position: absolute; + ${directionCSS} + ${alignmentCSS} + } + `; + + if (window.CSS_ANCHOR_POLYFILL) { + window.CSS_ANCHOR_POLYFILL.call({ element: this.anchorPositioningStyleElement }); + } + } } declare global { diff --git a/packages/web-components/test/harness/index.html b/packages/web-components/test/harness/index.html new file mode 100644 index 00000000000000..9e66c747610523 --- /dev/null +++ b/packages/web-components/test/harness/index.html @@ -0,0 +1,11 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Fluent Web Components Test Harness</title> + </head> + <body> + <script type="module" src="/src/main.ts"></script> + </body> +</html> diff --git a/packages/web-components/test/harness/src/main.ts b/packages/web-components/test/harness/src/main.ts new file mode 100644 index 00000000000000..2ca1a2fa2d4ebb --- /dev/null +++ b/packages/web-components/test/harness/src/main.ts @@ -0,0 +1,17 @@ +if (!CSS.supports('anchor-name: --foo')) { + import('@oddbird/css-anchor-positioning/fn').then(({ default: applyPolyfill }) => { + Object.defineProperty(window, 'CSS_ANCHOR_POLYFILL', { + value: applyPolyfill, + }); + }); +} + +import { webLightTheme } from '@fluentui/tokens'; +import { setTheme } from '../../../src/theme/set-theme.js'; +import '../../../src/index-rollup.js'; + +setTheme(webLightTheme); + +Object.defineProperty(window, 'setTheme', { + value: setTheme, +}); diff --git a/packages/web-components/test/harness/vite.config.ts b/packages/web-components/test/harness/vite.config.ts new file mode 100644 index 00000000000000..6c7c44543a3bb0 --- /dev/null +++ b/packages/web-components/test/harness/vite.config.ts @@ -0,0 +1,23 @@ +import type { UserConfig } from 'vite'; + +export default { + clearScreen: false, + publicDir: '../../public', + esbuild: { + target: 'ES2019', + }, + server: { + port: 5173, + strictPort: true, + debug: true, + }, + build: { + outDir: './dist', + minify: false, + }, + preview: { + port: 5173, + strictPort: true, + open: false, + }, +} as UserConfig; diff --git a/packages/web-components/src/helpers.tests.ts b/packages/web-components/test/playwright/assertions.ts similarity index 64% rename from packages/web-components/src/helpers.tests.ts rename to packages/web-components/test/playwright/assertions.ts index 46d72c8403a92f..6ec5a905a99514 100644 --- a/packages/web-components/src/helpers.tests.ts +++ b/packages/web-components/test/playwright/assertions.ts @@ -1,35 +1,4 @@ -import qs from 'qs'; -import { expect as baseExpect, type ExpectMatcherState, type Locator } from '@playwright/test'; - -/** - * Returns a formatted URL for a given Storybook fixture. - * - * @param id - the Storybook fixture ID - * @param args - Story args - * @returns - the local URL for the Storybook fixture iframe - */ -export function fixtureURL(id: string = 'debug--blank', args?: Record<string, any>): string { - const params: Record<string, any> = { id }; - if (args) { - params.args = qs - .stringify(args, { - allowDots: true, - delimiter: ';', - format: 'RFC1738', - encode: false, - }) - .replace(/=/g, ':') - .replace(/\//g, '--'); - } - - const url = qs.stringify(params, { - addQueryPrefix: true, - format: 'RFC1738', - encode: false, - }); - - return url; -} +import { expect as baseExpect, ExpectMatcherState, type Locator } from '@playwright/test'; /** * Evaluate whether an element has the given state or not on its `elementInternals` property. @@ -39,7 +8,7 @@ export function fixtureURL(id: string = 'debug--blank', args?: Record<string, an * @param expected - Whether the given state is expected to exist. * @param has - Whether the element is expected to have or not have the given state, defaults to `true`. */ -async function toHaveCustomState( +export async function toHaveCustomState( this: ExpectMatcherState, locator: Locator, state: string, @@ -80,7 +49,3 @@ async function toHaveCustomState( actual: matcherResult?.actual, }; } - -export const expect = baseExpect.extend({ - toHaveCustomState, -}); diff --git a/packages/web-components/test/playwright/fast-fixture.ts b/packages/web-components/test/playwright/fast-fixture.ts new file mode 100644 index 00000000000000..374b96bc075793 --- /dev/null +++ b/packages/web-components/test/playwright/fast-fixture.ts @@ -0,0 +1,87 @@ +import type { Locator, Page } from '@playwright/test'; + +/** + * A fixture for testing FAST components. + */ +export class FASTFixture { + /** + * The Playwright locator for the custom element. + */ + public readonly element: Locator; + + /** + * The tag name of the custom element. + */ + private readonly tagName: string; + + /** + * The inner HTML of the custom element. + */ + private readonly innerHTML: string; + + constructor(public readonly page: Page, tagName: string, innerHTML: string) { + this.tagName = tagName; + this.innerHTML = innerHTML; + this.element = this.page.locator(this.tagName); + } + + async goto() { + await this.page.goto('/'); + } + + private defaultTemplate( + tagName: string = this.tagName, + attributes: Record<string, string | true> = {}, + innerHTML: string = this.innerHTML, + ) { + const attributesString = Object.entries(attributes) + .map(([key, value]) => { + if (value === true) { + return key; + } + + return `${key}="${value.replace(/"/g, '')}"`; + }) + .join(' '); + + return `<${tagName} ${attributesString}>${innerHTML}</${tagName}>`; + } + + async setTemplate( + templateOrOptions?: + | string + | { + attributes?: Record<string, string | true>; + innerHTML?: string; + }, + ): Promise<void> { + const template = + typeof templateOrOptions === 'string' + ? templateOrOptions + : this.defaultTemplate(this.tagName, templateOrOptions?.attributes, templateOrOptions?.innerHTML); + + const body = this.page.locator('body'); + + await body.evaluateHandle((node, template) => { + const fragment = document.createRange().createContextualFragment(template); + node.innerHTML = ''; + node.append(fragment); + }, template); + + const bodyHandle = await body.elementHandle(); + if (bodyHandle) { + await bodyHandle.waitForElementState('stable'); + } + } + + async waitForCustomElement(tagName: string = this.tagName, ...tagNames: string[]) { + if (!tagName && !tagNames.length) { + return; + } + + await this.page.waitForFunction( + (tagNames: string[]) => Promise.all(tagNames.map(t => customElements.whenDefined(t))), + [tagName, ...tagNames], + ); + } +} diff --git a/packages/web-components/test/playwright/index.ts b/packages/web-components/test/playwright/index.ts new file mode 100644 index 00000000000000..97266a2d53c464 --- /dev/null +++ b/packages/web-components/test/playwright/index.ts @@ -0,0 +1,43 @@ +import { expect as baseExpect, test as baseTest } from '@playwright/test'; +import { FASTFixture } from './fast-fixture.js'; +import { toHaveCustomState } from './assertions.js'; + +type FixtureOptions = { + /** + * Additional HTML to insert into the element. + */ + innerHTML: string; + /** + * The tag name of the custom element to test. + */ + tagName: string; + /** + * Additional custom elements to wait for before running the test. + */ + waitFor: string[]; +}; + +type Fixtures = { + fastPage: FASTFixture; +}; + +export const test = baseTest.extend<Fixtures & FixtureOptions>({ + innerHTML: ['', { option: true }], + + tagName: ['', { option: true }], + + waitFor: [[], { option: true }], + + fastPage: async ({ page, innerHTML, tagName, waitFor }, use) => { + const fastPage = new FASTFixture(page, tagName, innerHTML); + await fastPage.goto(); + await fastPage.waitForCustomElement(tagName, ...waitFor); + await fastPage.setTemplate(); + + await use(fastPage); + }, +}); + +export const expect = baseExpect.extend({ + toHaveCustomState, +}); diff --git a/packages/web-components/tsconfig.lib.json b/packages/web-components/tsconfig.lib.json index 13c3609d2e1c95..a3ed513184b3bb 100644 --- a/packages/web-components/tsconfig.lib.json +++ b/packages/web-components/tsconfig.lib.json @@ -9,5 +9,5 @@ "importHelpers": true }, "include": ["src"], - "exclude": ["**/*.stories.*", "**/*.test.*", "**/*.spec.*"] + "exclude": ["**/*.stories.*", "**/*.spec.*"] } diff --git a/packages/web-components/tsconfig.spec.json b/packages/web-components/tsconfig.spec.json index d365f731b4c263..0257385abedf9e 100644 --- a/packages/web-components/tsconfig.spec.json +++ b/packages/web-components/tsconfig.spec.json @@ -6,5 +6,5 @@ "outDir": "dist/esm", "types": ["node"] }, - "include": ["src/**/*.test.*", "src/**/*.spec.*"] + "include": ["src/**/*.spec.*"] } diff --git a/yarn.lock b/yarn.lock index 7457e12fc332e5..778a15f50d30c8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1720,120 +1720,130 @@ esquery "^1.6.0" jsdoc-type-pratt-parser "~4.0.0" -"@esbuild/aix-ppc64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.20.1.tgz#eafa8775019b3650a77e8310ba4dbd17ca7af6d5" - integrity sha512-m55cpeupQ2DbuRGQMMZDzbv9J9PgVelPjlcmM5kxHnrBdBx6REaEd7LamYV7Dm8N7rCyR/XwU6rVP8ploKtIkA== - -"@esbuild/android-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.20.1.tgz#68791afa389550736f682c15b963a4f37ec2f5f6" - integrity sha512-hCnXNF0HM6AjowP+Zou0ZJMWWa1VkD77BXe959zERgGJBBxB+sV+J9f/rcjeg2c5bsukD/n17RKWXGFCO5dD5A== - -"@esbuild/android-arm@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.20.1.tgz#38c91d8ee8d5196f7fbbdf4f0061415dde3a473a" - integrity sha512-4j0+G27/2ZXGWR5okcJi7pQYhmkVgb4D7UKwxcqrjhvp5TKWx3cUjgB1CGj1mfdmJBQ9VnUGgUhign+FPF2Zgw== - -"@esbuild/android-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.20.1.tgz#93f6190ce997b313669c20edbf3645fc6c8d8f22" - integrity sha512-MSfZMBoAsnhpS+2yMFYIQUPs8Z19ajwfuaSZx+tSl09xrHZCjbeXXMsUF/0oq7ojxYEpsSo4c0SfjxOYXRbpaA== - -"@esbuild/darwin-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.20.1.tgz#0d391f2e81fda833fe609182cc2fbb65e03a3c46" - integrity sha512-Ylk6rzgMD8klUklGPzS414UQLa5NPXZD5tf8JmQU8GQrj6BrFA/Ic9tb2zRe1kOZyCbGl+e8VMbDRazCEBqPvA== - -"@esbuild/darwin-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.20.1.tgz#92504077424584684862f483a2242cfde4055ba2" - integrity sha512-pFIfj7U2w5sMp52wTY1XVOdoxw+GDwy9FsK3OFz4BpMAjvZVs0dT1VXs8aQm22nhwoIWUmIRaE+4xow8xfIDZA== - -"@esbuild/freebsd-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.1.tgz#a1646fa6ba87029c67ac8a102bb34384b9290774" - integrity sha512-UyW1WZvHDuM4xDz0jWun4qtQFauNdXjXOtIy7SYdf7pbxSWWVlqhnR/T2TpX6LX5NI62spt0a3ldIIEkPM6RHw== - -"@esbuild/freebsd-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.20.1.tgz#41c9243ab2b3254ea7fb512f71ffdb341562e951" - integrity sha512-itPwCw5C+Jh/c624vcDd9kRCCZVpzpQn8dtwoYIt2TJF3S9xJLiRohnnNrKwREvcZYx0n8sCSbvGH349XkcQeg== - -"@esbuild/linux-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.20.1.tgz#f3c1e1269fbc9eedd9591a5bdd32bf707a883156" - integrity sha512-cX8WdlF6Cnvw/DO9/X7XLH2J6CkBnz7Twjpk56cshk9sjYVcuh4sXQBy5bmTwzBjNVZze2yaV1vtcJS04LbN8w== - -"@esbuild/linux-arm@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.20.1.tgz#4503ca7001a8ee99589c072801ce9d7540717a21" - integrity sha512-LojC28v3+IhIbfQ+Vu4Ut5n3wKcgTu6POKIHN9Wpt0HnfgUGlBuyDDQR4jWZUZFyYLiz4RBBBmfU6sNfn6RhLw== - -"@esbuild/linux-ia32@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.20.1.tgz#98c474e3e0cbb5bcbdd8561a6e65d18f5767ce48" - integrity sha512-4H/sQCy1mnnGkUt/xszaLlYJVTz3W9ep52xEefGtd6yXDQbz/5fZE5dFLUgsPdbUOQANcVUa5iO6g3nyy5BJiw== - -"@esbuild/linux-loong64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.20.1.tgz#a8097d28d14b9165c725fe58fc438f80decd2f33" - integrity sha512-c0jgtB+sRHCciVXlyjDcWb2FUuzlGVRwGXgI+3WqKOIuoo8AmZAddzeOHeYLtD+dmtHw3B4Xo9wAUdjlfW5yYA== - -"@esbuild/linux-mips64el@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.20.1.tgz#c44f6f0d7d017c41ad3bb15bfdb69b690656b5ea" - integrity sha512-TgFyCfIxSujyuqdZKDZ3yTwWiGv+KnlOeXXitCQ+trDODJ+ZtGOzLkSWngynP0HZnTsDyBbPy7GWVXWaEl6lhA== - -"@esbuild/linux-ppc64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.20.1.tgz#0765a55389a99237b3c84227948c6e47eba96f0d" - integrity sha512-b+yuD1IUeL+Y93PmFZDZFIElwbmFfIKLKlYI8M6tRyzE6u7oEP7onGk0vZRh8wfVGC2dZoy0EqX1V8qok4qHaw== - -"@esbuild/linux-riscv64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.20.1.tgz#e4153b032288e3095ddf4c8be07893781b309a7e" - integrity sha512-wpDlpE0oRKZwX+GfomcALcouqjjV8MIX8DyTrxfyCfXxoKQSDm45CZr9fanJ4F6ckD4yDEPT98SrjvLwIqUCgg== - -"@esbuild/linux-s390x@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.20.1.tgz#b9ab8af6e4b73b26d63c1c426d7669a5d53eb5a7" - integrity sha512-5BepC2Au80EohQ2dBpyTquqGCES7++p7G+7lXe1bAIvMdXm4YYcEfZtQrP4gaoZ96Wv1Ute61CEHFU7h4FMueQ== - -"@esbuild/linux-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.20.1.tgz#0b25da17ac38c3e11cdd06ca3691d4d6bef2755f" - integrity sha512-5gRPk7pKuaIB+tmH+yKd2aQTRpqlf1E4f/mC+tawIm/CGJemZcHZpp2ic8oD83nKgUPMEd0fNanrnFljiruuyA== - -"@esbuild/netbsd-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.20.1.tgz#3148e48406cd0d4f7ba1e0bf3f4d77d548c98407" - integrity sha512-4fL68JdrLV2nVW2AaWZBv3XEm3Ae3NZn/7qy2KGAt3dexAgSVT+Hc97JKSZnqezgMlv9x6KV0ZkZY7UO5cNLCg== - -"@esbuild/openbsd-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.20.1.tgz#7b73e852986a9750192626d377ac96ac2b749b76" - integrity sha512-GhRuXlvRE+twf2ES+8REbeCb/zeikNqwD3+6S5y5/x+DYbAQUNl0HNBs4RQJqrechS4v4MruEr8ZtAin/hK5iw== - -"@esbuild/sunos-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.20.1.tgz#402a441cdac2eee98d8be378c7bc23e00c1861c5" - integrity sha512-ZnWEyCM0G1Ex6JtsygvC3KUUrlDXqOihw8RicRuQAzw+c4f1D66YlPNNV3rkjVW90zXVsHwZYWbJh3v+oQFM9Q== - -"@esbuild/win32-arm64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.20.1.tgz#36c4e311085806a6a0c5fc54d1ac4d7b27e94d7b" - integrity sha512-QZ6gXue0vVQY2Oon9WyLFCdSuYbXSoxaZrPuJ4c20j6ICedfsDilNPYfHLlMH7vGfU5DQR0czHLmJvH4Nzis/A== - -"@esbuild/win32-ia32@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.20.1.tgz#0cf933be3fb9dc58b45d149559fe03e9e22b54fe" - integrity sha512-HzcJa1NcSWTAU0MJIxOho8JftNp9YALui3o+Ny7hCh0v5f90nprly1U3Sj1Ldj/CvKKdvvFsCRvDkpsEMp4DNw== - -"@esbuild/win32-x64@0.20.1": - version "0.20.1" - resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.20.1.tgz#77583b6ea54cee7c1410ebbd54051b6a3fcbd8ba" - integrity sha512-0MBh53o6XtI6ctDnRMeQ+xoCN8kD2qI1rY1KgF/xdWQwoFeKou7puvDfV8/Wv4Ctx2rRpET/gGdz3YlNtNACSA== +"@esbuild/aix-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz#38848d3e25afe842a7943643cbcd387cc6e13461" + integrity sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA== + +"@esbuild/android-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz#f592957ae8b5643129fa889c79e69cd8669bb894" + integrity sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg== + +"@esbuild/android-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-arm/-/android-arm-0.24.2.tgz#72d8a2063aa630308af486a7e5cbcd1e134335b3" + integrity sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q== + +"@esbuild/android-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/android-x64/-/android-x64-0.24.2.tgz#9a7713504d5f04792f33be9c197a882b2d88febb" + integrity sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw== + +"@esbuild/darwin-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz#02ae04ad8ebffd6e2ea096181b3366816b2b5936" + integrity sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA== + +"@esbuild/darwin-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz#9ec312bc29c60e1b6cecadc82bd504d8adaa19e9" + integrity sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA== + +"@esbuild/freebsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz#5e82f44cb4906d6aebf24497d6a068cfc152fa00" + integrity sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg== + +"@esbuild/freebsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz#3fb1ce92f276168b75074b4e51aa0d8141ecce7f" + integrity sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q== + +"@esbuild/linux-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz#856b632d79eb80aec0864381efd29de8fd0b1f43" + integrity sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg== + +"@esbuild/linux-arm@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz#c846b4694dc5a75d1444f52257ccc5659021b736" + integrity sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA== + +"@esbuild/linux-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz#f8a16615a78826ccbb6566fab9a9606cfd4a37d5" + integrity sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw== + +"@esbuild/linux-loong64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz#1c451538c765bf14913512c76ed8a351e18b09fc" + integrity sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ== + +"@esbuild/linux-mips64el@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz#0846edeefbc3d8d50645c51869cc64401d9239cb" + integrity sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw== + +"@esbuild/linux-ppc64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz#8e3fc54505671d193337a36dfd4c1a23b8a41412" + integrity sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw== + +"@esbuild/linux-riscv64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz#6a1e92096d5e68f7bb10a0d64bb5b6d1daf9a694" + integrity sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q== + +"@esbuild/linux-s390x@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz#ab18e56e66f7a3c49cb97d337cd0a6fea28a8577" + integrity sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw== + +"@esbuild/linux-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz#8140c9b40da634d380b0b29c837a0b4267aff38f" + integrity sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q== + +"@esbuild/netbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz#65f19161432bafb3981f5f20a7ff45abb2e708e6" + integrity sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw== + +"@esbuild/netbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz#7a3a97d77abfd11765a72f1c6f9b18f5396bcc40" + integrity sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw== + +"@esbuild/openbsd-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz#58b00238dd8f123bfff68d3acc53a6ee369af89f" + integrity sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A== + +"@esbuild/openbsd-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz#0ac843fda0feb85a93e288842936c21a00a8a205" + integrity sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA== + +"@esbuild/sunos-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz#8b7aa895e07828d36c422a4404cc2ecf27fb15c6" + integrity sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig== + +"@esbuild/win32-arm64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz#c023afb647cabf0c3ed13f0eddfc4f1d61c66a85" + integrity sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ== + +"@esbuild/win32-ia32@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz#96c356132d2dda990098c8b8b951209c3cd743c2" + integrity sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA== + +"@esbuild/win32-x64@0.24.2": + version "0.24.2" + resolved "https://registry.yarnpkg.com/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz#34aa0b52d0fbb1a654b596acfa595f0c7b77a77b" + integrity sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg== "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0": version "4.4.0" @@ -3103,6 +3113,16 @@ dependencies: "@octokit/openapi-types" "^12.11.0" +"@oddbird/css-anchor-positioning@0.4.0": + version "0.4.0" + resolved "https://registry.yarnpkg.com/@oddbird/css-anchor-positioning/-/css-anchor-positioning-0.4.0.tgz#c72be5f1510e727c80465c15ad01ce270a1daf69" + integrity sha512-K3iVeBnuXIaDj4/rrFxPJBPEgghBsofL/64hiegkqkyPBk79c0h6r6gSlNCXrtf1b0cWiC55BV6PC1Y0Ph/1NQ== + dependencies: + "@floating-ui/dom" "^1.6.12" + "@types/css-tree" "^2.3.8" + css-tree "^3.0.0" + nanoid "^5.0.8" + "@opentelemetry/api@^1.0.1": version "1.0.3" resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.0.3.tgz#13a12ae9e05c2a782f7b5e84c3cbfda4225eaf80" @@ -3631,6 +3651,96 @@ estree-walker "^2.0.2" picomatch "^2.3.1" +"@rollup/rollup-android-arm-eabi@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.28.0.tgz#462e7ecdd60968bc9eb95a20d185e74f8243ec1b" + integrity sha512-wLJuPLT6grGZsy34g4N1yRfYeouklTgPhH1gWXCYspenKYD0s3cR99ZevOGw5BexMNywkbV3UkjADisozBmpPQ== + +"@rollup/rollup-android-arm64@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.28.0.tgz#78a2b8a8a55f71a295eb860a654ae90a2b168f40" + integrity sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA== + +"@rollup/rollup-darwin-arm64@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.28.0.tgz#5b783af714f434f1e66e3cdfa3817e0b99216d84" + integrity sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q== + +"@rollup/rollup-darwin-x64@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.28.0.tgz#f72484e842521a5261978034e18e20f778a2850d" + integrity sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w== + +"@rollup/rollup-freebsd-arm64@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.28.0.tgz#3c919dff72b2fe344811a609c674a8347b033f62" + integrity sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ== + +"@rollup/rollup-freebsd-x64@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.28.0.tgz#b62a3a8365b363b3fdfa6da11a9188b6ab4dca7c" + integrity sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA== + +"@rollup/rollup-linux-arm-gnueabihf@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.28.0.tgz#0d02cc55bd229bd8ca5c54f65f916ba5e0591c94" + integrity sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w== + +"@rollup/rollup-linux-arm-musleabihf@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.28.0.tgz#c51d379263201e88a60e92bd8e90878f0c044425" + integrity sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg== + +"@rollup/rollup-linux-arm64-gnu@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.28.0.tgz#93ce2addc337b5cfa52b84f8e730d2e36eb4339b" + integrity sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg== + +"@rollup/rollup-linux-arm64-musl@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.28.0.tgz#730af6ddc091a5ba5baac28a3510691725dc808b" + integrity sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw== + +"@rollup/rollup-linux-powerpc64le-gnu@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.28.0.tgz#b5565aac20b4de60ca1e557f525e76478b5436af" + integrity sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ== + +"@rollup/rollup-linux-riscv64-gnu@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.28.0.tgz#d488290bf9338bad4ae9409c4aa8a1728835a20b" + integrity sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g== + +"@rollup/rollup-linux-s390x-gnu@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.28.0.tgz#eb2e3f3a06acf448115045c11a5a96868c95a556" + integrity sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw== + +"@rollup/rollup-linux-x64-gnu@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.28.0.tgz#065952ef2aea7e837dc7e02aa500feeaff4fc507" + integrity sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw== + +"@rollup/rollup-linux-x64-musl@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.28.0.tgz#3435d484d05f5c4d1ffd54541b4facce2887103a" + integrity sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw== + +"@rollup/rollup-win32-arm64-msvc@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.28.0.tgz#69682a2a10d9fedc334f87583cfca83c39c08077" + integrity sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg== + +"@rollup/rollup-win32-ia32-msvc@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.28.0.tgz#b64470f9ac79abb386829c56750b9a4711be3332" + integrity sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A== + +"@rollup/rollup-win32-x64-msvc@4.28.0": + version "4.28.0" + resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.28.0.tgz#cb313feef9ac6e3737067fdf34f42804ac65a6f2" + integrity sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ== + "@rushstack/node-core-library@3.50.1": version "3.50.1" resolved "https://registry.yarnpkg.com/@rushstack/node-core-library/-/node-core-library-3.50.1.tgz#d4aa4602460f29bbf0662052969b65129384da23" @@ -4952,6 +5062,11 @@ dependencies: "@types/node" "*" +"@types/css-tree@^2.3.8": + version "2.3.9" + resolved "https://registry.yarnpkg.com/@types/css-tree/-/css-tree-2.3.9.tgz#54c404e0a803e7e660fdc08c84fe73ee5266cece" + integrity sha512-g1FE6xkPDP4tsccmTd6jIugjKZdxIDqAf9h2pc+4LsGgYbOyfa9phNjBHYbm6FtwIlNfT1NBx3f2zSeqO7aRAw== + "@types/d3-array@3.2.1", "@types/d3-array@^3.0.0": version "3.2.1" resolved "https://registry.yarnpkg.com/@types/d3-array/-/d3-array-3.2.1.tgz#1f6658e3d2006c4fceac53fde464166859f8b8c5" @@ -5111,10 +5226,10 @@ dependencies: "@types/estree" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" - integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== +"@types/estree@*", "@types/estree@1.0.6", "@types/estree@^1.0.0", "@types/estree@^1.0.5": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== "@types/estree@0.0.39": version "0.0.39" @@ -9093,6 +9208,14 @@ css-select@~1.2.0: domutils "1.5.1" nth-check "~1.0.1" +css-tree@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-3.0.1.tgz#bea6deaea60bb5bcf416adfb1ecf607a8d9471f6" + integrity sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q== + dependencies: + mdn-data "2.12.1" + source-map-js "^1.0.1" + css-what@2.1: version "2.1.3" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz#a6d7604573365fe74686c3f311c56513d88285f2" @@ -10639,34 +10762,36 @@ esbuild-register@^3.5.0: dependencies: debug "^4.3.4" -esbuild@0.20.1, esbuild@^0.18.0, esbuild@^0.20.0: - version "0.20.1" - resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.20.1.tgz#1e4cbb380ad1959db7609cb9573ee77257724a3e" - integrity sha512-OJwEgrpWm/PCMsLVWXKqvcjme3bHNpOgN7Tb6cQnR5n0TPbQx1/Xrn7rqM+wn17bYeT6MGB5sn1Bh5YiGi70nA== +esbuild@0.24.2, esbuild@^0.18.0, esbuild@^0.20.0, esbuild@^0.24.2: + version "0.24.2" + resolved "https://registry.yarnpkg.com/esbuild/-/esbuild-0.24.2.tgz#b5b55bee7de017bff5fb8a4e3e44f2ebe2c3567d" + integrity sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA== optionalDependencies: - "@esbuild/aix-ppc64" "0.20.1" - "@esbuild/android-arm" "0.20.1" - "@esbuild/android-arm64" "0.20.1" - "@esbuild/android-x64" "0.20.1" - "@esbuild/darwin-arm64" "0.20.1" - "@esbuild/darwin-x64" "0.20.1" - "@esbuild/freebsd-arm64" "0.20.1" - "@esbuild/freebsd-x64" "0.20.1" - "@esbuild/linux-arm" "0.20.1" - "@esbuild/linux-arm64" "0.20.1" - "@esbuild/linux-ia32" "0.20.1" - "@esbuild/linux-loong64" "0.20.1" - "@esbuild/linux-mips64el" "0.20.1" - "@esbuild/linux-ppc64" "0.20.1" - "@esbuild/linux-riscv64" "0.20.1" - "@esbuild/linux-s390x" "0.20.1" - "@esbuild/linux-x64" "0.20.1" - "@esbuild/netbsd-x64" "0.20.1" - "@esbuild/openbsd-x64" "0.20.1" - "@esbuild/sunos-x64" "0.20.1" - "@esbuild/win32-arm64" "0.20.1" - "@esbuild/win32-ia32" "0.20.1" - "@esbuild/win32-x64" "0.20.1" + "@esbuild/aix-ppc64" "0.24.2" + "@esbuild/android-arm" "0.24.2" + "@esbuild/android-arm64" "0.24.2" + "@esbuild/android-x64" "0.24.2" + "@esbuild/darwin-arm64" "0.24.2" + "@esbuild/darwin-x64" "0.24.2" + "@esbuild/freebsd-arm64" "0.24.2" + "@esbuild/freebsd-x64" "0.24.2" + "@esbuild/linux-arm" "0.24.2" + "@esbuild/linux-arm64" "0.24.2" + "@esbuild/linux-ia32" "0.24.2" + "@esbuild/linux-loong64" "0.24.2" + "@esbuild/linux-mips64el" "0.24.2" + "@esbuild/linux-ppc64" "0.24.2" + "@esbuild/linux-riscv64" "0.24.2" + "@esbuild/linux-s390x" "0.24.2" + "@esbuild/linux-x64" "0.24.2" + "@esbuild/netbsd-arm64" "0.24.2" + "@esbuild/netbsd-x64" "0.24.2" + "@esbuild/openbsd-arm64" "0.24.2" + "@esbuild/openbsd-x64" "0.24.2" + "@esbuild/sunos-x64" "0.24.2" + "@esbuild/win32-arm64" "0.24.2" + "@esbuild/win32-ia32" "0.24.2" + "@esbuild/win32-x64" "0.24.2" escalade@^3.1.1, escalade@^3.1.2: version "3.1.2" @@ -12286,7 +12411,7 @@ fs.realpath@^1.0.0: resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= -fsevents@2.3.2, fsevents@^2.3.2, fsevents@~2.3.2: +fsevents@2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -12299,6 +12424,11 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" +fsevents@^2.3.2, fsevents@~2.3.2, fsevents@~2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + fsevents@~2.1.1: version "2.1.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz#fb738703ae8d2f9fe900c33836ddebee8b97f23e" @@ -16631,6 +16761,11 @@ mdast-util-to-string@^3.0.0, mdast-util-to-string@^3.1.0: dependencies: "@types/mdast" "^3.0.0" +mdn-data@2.12.1: + version "2.12.1" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.12.1.tgz#10cb462215c13d95c92ff60d0fb3becac1bbb924" + integrity sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q== + mdurl@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" @@ -17484,6 +17619,11 @@ nanoid@^3.3.6, nanoid@^3.3.7: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.8.tgz#b1be3030bee36aaff18bacb375e5cce521684baf" integrity sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w== +nanoid@^5.0.8: + version "5.0.9" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-5.0.9.tgz#977dcbaac055430ce7b1e19cf0130cea91a20e50" + integrity sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q== + nanomatch@^1.2.9: version "1.2.13" resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" @@ -18702,10 +18842,10 @@ periscopic@^3.0.0: estree-walker "^3.0.0" is-reference "^3.0.0" -picocolors@^1.0.0, picocolors@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" - integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew== +picocolors@^1.0.0, picocolors@^1.0.1, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.0, picomatch@^2.3.1: version "2.3.1" @@ -18983,14 +19123,14 @@ postcss@8.4.31: picocolors "^1.0.0" source-map-js "^1.0.2" -postcss@^8.1.4, postcss@^8.4.33: - version "8.4.40" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.40.tgz#eb81f2a4dd7668ed869a6db25999e02e9ad909d8" - integrity sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q== +postcss@^8.1.4, postcss@^8.4.33, postcss@^8.4.49: + version "8.4.49" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19" + integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA== dependencies: nanoid "^3.3.7" - picocolors "^1.0.1" - source-map-js "^1.2.0" + picocolors "^1.1.1" + source-map-js "^1.2.1" prefix-style@2.0.1: version "2.0.1" @@ -20609,6 +20749,33 @@ rollup@2.79.2: optionalDependencies: fsevents "~2.3.2" +rollup@^4.23.0: + version "4.28.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.28.0.tgz#eb8d28ed43ef60a18f21d0734d230ee79dd0de77" + integrity sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ== + dependencies: + "@types/estree" "1.0.6" + optionalDependencies: + "@rollup/rollup-android-arm-eabi" "4.28.0" + "@rollup/rollup-android-arm64" "4.28.0" + "@rollup/rollup-darwin-arm64" "4.28.0" + "@rollup/rollup-darwin-x64" "4.28.0" + "@rollup/rollup-freebsd-arm64" "4.28.0" + "@rollup/rollup-freebsd-x64" "4.28.0" + "@rollup/rollup-linux-arm-gnueabihf" "4.28.0" + "@rollup/rollup-linux-arm-musleabihf" "4.28.0" + "@rollup/rollup-linux-arm64-gnu" "4.28.0" + "@rollup/rollup-linux-arm64-musl" "4.28.0" + "@rollup/rollup-linux-powerpc64le-gnu" "4.28.0" + "@rollup/rollup-linux-riscv64-gnu" "4.28.0" + "@rollup/rollup-linux-s390x-gnu" "4.28.0" + "@rollup/rollup-linux-x64-gnu" "4.28.0" + "@rollup/rollup-linux-x64-musl" "4.28.0" + "@rollup/rollup-win32-arm64-msvc" "4.28.0" + "@rollup/rollup-win32-ia32-msvc" "4.28.0" + "@rollup/rollup-win32-x64-msvc" "4.28.0" + fsevents "~2.3.2" + rst-selector-parser@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/rst-selector-parser/-/rst-selector-parser-2.2.3.tgz#81b230ea2fcc6066c89e3472de794285d9b03d91" @@ -21258,10 +21425,10 @@ source-list-map@^2.0.0: resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz#3993bd873bfc48479cca9ea3a547835c7c154b34" integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== -"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2, source-map-js@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af" - integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg== +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== source-map-loader@4.0.0: version "4.0.0" @@ -21571,7 +21738,7 @@ string-length@^5.0.1: char-regex "^2.0.0" strip-ansi "^7.0.1" -"string-width-cjs@npm:string-width@^4.2.0": +"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -21606,15 +21773,6 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" -string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: - version "4.2.3" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" - integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.1" - string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -21715,7 +21873,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1": +"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -21750,13 +21908,6 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" -strip-ansi@^6.0.0, strip-ansi@^6.0.1: - version "6.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" - integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== - dependencies: - ansi-regex "^5.0.1" - strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -23637,6 +23788,17 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" +vite@6.0.7: + version "6.0.7" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.7.tgz#f0f8c120733b04af52b4a1e3e7cb54eb851a799b" + integrity sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ== + dependencies: + esbuild "^0.24.2" + postcss "^8.4.49" + rollup "^4.23.0" + optionalDependencies: + fsevents "~2.3.3" + w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" @@ -24074,7 +24236,7 @@ workspace-tools@^0.27.0: js-yaml "^4.1.0" micromatch "^4.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -24109,15 +24271,6 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From b4a12e8c011441b0d0af21a78091b36074f81ef6 Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Thu, 9 Jan 2025 04:07:18 +0000 Subject: [PATCH 11/78] release: applying package updates - web-components --- ...-ec172ca8-23f3-4d01-a969-6504fa67a87a.json | 7 ------- ...-fc912571-691c-494a-b4de-9a632a76a26c.json | 7 ------- packages/web-components/CHANGELOG.json | 21 +++++++++++++++++++ packages/web-components/CHANGELOG.md | 12 ++++++++++- packages/web-components/package.json | 2 +- 5 files changed, 33 insertions(+), 16 deletions(-) delete mode 100644 change/@fluentui-web-components-ec172ca8-23f3-4d01-a969-6504fa67a87a.json delete mode 100644 change/@fluentui-web-components-fc912571-691c-494a-b4de-9a632a76a26c.json diff --git a/change/@fluentui-web-components-ec172ca8-23f3-4d01-a969-6504fa67a87a.json b/change/@fluentui-web-components-ec172ca8-23f3-4d01-a969-6504fa67a87a.json deleted file mode 100644 index c76de2b97d0c97..00000000000000 --- a/change/@fluentui-web-components-ec172ca8-23f3-4d01-a969-6504fa67a87a.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Allow field states to be set regardless of connection status", - "packageName": "@fluentui/web-components", - "email": "863023+radium-v@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-web-components-fc912571-691c-494a-b4de-9a632a76a26c.json b/change/@fluentui-web-components-fc912571-691c-494a-b4de-9a632a76a26c.json deleted file mode 100644 index 87d09789bbf038..00000000000000 --- a/change/@fluentui-web-components-fc912571-691c-494a-b4de-9a632a76a26c.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "fix: radio-group emit change with keyboard and disabled radio unchecks", - "packageName": "@fluentui/web-components", - "email": "jes@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/packages/web-components/CHANGELOG.json b/packages/web-components/CHANGELOG.json index b815e91343186c..910eaf1123eb5e 100644 --- a/packages/web-components/CHANGELOG.json +++ b/packages/web-components/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/web-components", "entries": [ + { + "date": "Thu, 09 Jan 2025 04:07:00 GMT", + "tag": "@fluentui/web-components_v3.0.0-beta.76", + "version": "3.0.0-beta.76", + "comments": { + "prerelease": [ + { + "author": "863023+radium-v@users.noreply.github.com", + "package": "@fluentui/web-components", + "commit": "2247d505c62e3f464f53b77362175580144ebd56", + "comment": "Allow field states to be set regardless of connection status" + }, + { + "author": "jes@microsoft.com", + "package": "@fluentui/web-components", + "commit": "479f2f31226381d03c7a12788fb0bae55cd558c4", + "comment": "fix: radio-group emit change with keyboard and disabled radio unchecks" + } + ] + } + }, { "date": "Mon, 23 Dec 2024 04:07:55 GMT", "tag": "@fluentui/web-components_v3.0.0-beta.75", diff --git a/packages/web-components/CHANGELOG.md b/packages/web-components/CHANGELOG.md index c166b3f8f93943..baea4c5c33bbe3 100644 --- a/packages/web-components/CHANGELOG.md +++ b/packages/web-components/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/web-components -This log was last generated on Mon, 23 Dec 2024 04:07:55 GMT and should not be manually modified. +This log was last generated on Thu, 09 Jan 2025 04:07:00 GMT and should not be manually modified. <!-- Start content --> +## [3.0.0-beta.76](https://github.com/microsoft/fluentui/tree/@fluentui/web-components_v3.0.0-beta.76) + +Thu, 09 Jan 2025 04:07:00 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/web-components_v3.0.0-beta.75..@fluentui/web-components_v3.0.0-beta.76) + +### Changes + +- Allow field states to be set regardless of connection status ([PR #33023](https://github.com/microsoft/fluentui/pull/33023) by 863023+radium-v@users.noreply.github.com) +- fix: radio-group emit change with keyboard and disabled radio unchecks ([PR #33585](https://github.com/microsoft/fluentui/pull/33585) by jes@microsoft.com) + ## [3.0.0-beta.75](https://github.com/microsoft/fluentui/tree/@fluentui/web-components_v3.0.0-beta.75) Mon, 23 Dec 2024 04:07:55 GMT diff --git a/packages/web-components/package.json b/packages/web-components/package.json index 7f7baa31a7b64a..4b79588c2a395e 100644 --- a/packages/web-components/package.json +++ b/packages/web-components/package.json @@ -1,7 +1,7 @@ { "name": "@fluentui/web-components", "description": "A library of Fluent Web Components", - "version": "3.0.0-beta.75", + "version": "3.0.0-beta.76", "author": { "name": "Microsoft", "url": "https://discord.gg/FcSNfg4" From b8d423da1cd0507c189f52f6ac175915df45a02f Mon Sep 17 00:00:00 2001 From: Valentyna <vkozlova@microsoft.com> Date: Thu, 9 Jan 2025 04:10:02 -0800 Subject: [PATCH 12/78] feat(react-color-picker): added alpha input field (#33536) Co-authored-by: Dmytro Kirpa <kirpadv@gmail.com> --- .../ColorPickerDefault.stories.tsx | 51 +++++++++++++++++-- 1 file changed, 48 insertions(+), 3 deletions(-) diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx index 3d903f1a6eb8b7..394822d70e8309 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx @@ -50,7 +50,7 @@ const useStyles = makeStyles({ width: '80px', }, spinButton: { - width: '50px', + minWidth: '60px', }, }); @@ -62,17 +62,20 @@ type RgbKey = 'r' | 'g' | 'b'; export const Default = () => { const hexId = useId('hex-input'); + const alphaId = useId('alpha-input'); const styles = useStyles(); const [color, setColor] = React.useState(DEFAULT_COLOR_HSV); const [hex, setHex] = React.useState(tinycolor(color).toHexString()); const [rgb, setRgb] = React.useState(tinycolor(color).toRgb()); + const [alpha, setAlpha] = React.useState(color.a); const [namedColor, setNamedColor] = React.useState(''); const handleChange: ColorPickerProps['onColorChange'] = (_, data) => { setColor({ ...data.color, a: data.color.a ?? 1 }); setHex(tinycolor(data.color).toHexString()); setRgb(tinycolor(data.color).toRgb()); + setAlpha(data.color.a ?? 1); const _namedColor = tinycolor(`hsl(${data.color.h},100%,50%)`).toName(); if (_namedColor) { setNamedColor(_namedColor); @@ -96,6 +99,26 @@ export const Default = () => { } }; + const onAlphaChange: SpinButtonProps['onChange'] = React.useCallback( + (_ev, data) => { + const value = data.value ?? parseFloat(data.displayValue ?? ''); + + if (Number.isNaN(value) || value < 0 || value > 1) { + return; + } + + const newColor = tinycolor({ ...color, a: value }); + + if (newColor.isValid) { + setColor(newColor.toHsv()); + setHex(newColor.toHex()); + setRgb(newColor.toRgb()); + setAlpha(newColor.a); + } + }, + [setAlpha, setRgb, setHex, setColor, color], + ); + const colorAriaAttributes = { 'aria-label': 'ColorPicker', 'aria-roledescription': '2D slider', @@ -110,7 +133,6 @@ export const Default = () => { <AlphaSlider aria-label="Alpha" aria-valuetext={`${color.a * 100}%`} /> </ColorPicker> <div className={styles.inputFields}> - <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toRgbString() }} /> <InputHexField id={hexId} value={hex} @@ -119,6 +141,7 @@ export const Default = () => { const newColor = tinycolor(value); if (newColor.isValid) { setColor(newColor.toHsv()); + setRgb(newColor.toRgb()); } setHex(oldValue => (HEX_COLOR_REGEX.test(value) ? value : oldValue)); }} @@ -126,8 +149,9 @@ export const Default = () => { <InputRgbField label="Red" value={rgb.r} name="r" onChange={onRgbChange} /> <InputRgbField label="Green" value={rgb.g} name="g" onChange={onRgbChange} /> <InputRgbField label="Blue" value={rgb.b} name="b" onChange={onRgbChange} /> + <InputAlphaField id={alphaId} value={alpha} onChange={onAlphaChange} /> </div> - <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toHexString() }} /> + <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toRgbString() }} /> </div> ); }; @@ -182,6 +206,27 @@ const InputRgbField = ({ ); }; +const InputAlphaField = ({ + label = 'Alpha', + value, + onChange, + id, +}: { + value: number; + label?: string; + onChange?: SpinButtonProps['onChange']; + id: string; +}) => { + const styles = useStyles(); + + return ( + <div className={styles.colorFieldWrapper}> + <Label htmlFor={id}>{label}</Label> + <SpinButton min={0} max={1} className={styles.spinButton} value={value} step={0.01} onChange={onChange} id={id} /> + </div> + ); +}; + const handleOnBlur = (e: React.FocusEvent<HTMLInputElement>) => { const value = tinycolor(e.target.value); if (!value.isValid) { From 1eedd057c2d900d69c2245294245704dc02a9bf7 Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Thu, 9 Jan 2025 13:18:05 +0100 Subject: [PATCH 13/78] fix(workspace-plugin): fail build executor process if generate-api failed (#33558) --- .../executor/libs/proj/tsconfig.lib.json | 6 ++++-- .../src/executors/build/executor.spec.ts | 19 +++++++++++++++++-- .../src/executors/build/lib/shared.ts | 5 +++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/tools/workspace-plugin/src/executors/build/__fixtures__/executor/libs/proj/tsconfig.lib.json b/tools/workspace-plugin/src/executors/build/__fixtures__/executor/libs/proj/tsconfig.lib.json index 0dfe54218565f7..7b3b02933dd526 100644 --- a/tools/workspace-plugin/src/executors/build/__fixtures__/executor/libs/proj/tsconfig.lib.json +++ b/tools/workspace-plugin/src/executors/build/__fixtures__/executor/libs/proj/tsconfig.lib.json @@ -2,7 +2,9 @@ "extends": "./tsconfig.json", "compilerOptions": { "outDir": "./dist/out-tsc", - "declaration": true + "declaration": true, + "types": [] }, - "include": ["src/*.ts"] + "include": ["src/*.ts"], + "exclude": ["src/*.spec.ts"] } diff --git a/tools/workspace-plugin/src/executors/build/executor.spec.ts b/tools/workspace-plugin/src/executors/build/executor.spec.ts index ea26f7c24e6527..a690d8b1bcb4b7 100644 --- a/tools/workspace-plugin/src/executors/build/executor.spec.ts +++ b/tools/workspace-plugin/src/executors/build/executor.spec.ts @@ -3,7 +3,7 @@ import { type ExecutorContext, logger, stripIndents } from '@nx/devkit'; import { BuildExecutorSchema } from './schema'; import executor from './executor'; import { join } from 'node:path'; -import { existsSync, readFileSync, readdirSync } from 'node:fs'; +import { existsSync, readFileSync, readdirSync, appendFileSync, writeFileSync } from 'node:fs'; // ===== mocks start ===== import { rm } from 'node:fs/promises'; @@ -73,7 +73,7 @@ const measureStartMock = measureStart as jest.Mock; const measureEndMock = measureEnd as jest.Mock; describe('Build Executor', () => { - it('can run', async () => { + it('runs build and api-generation and fails on api update', async () => { // mute api extractor - START jest.spyOn(console, 'warn').mockImplementation(() => { return; @@ -263,5 +263,20 @@ describe('Build Executor', () => { }); " `); + + // ================== + // update api public surface to simulate out of date api.md which will fail the executor + // ================== + + const publicApiFilePath = join(workspaceRoot, 'libs/proj/src/index.ts'); + const originalApiContent = readFileSync(publicApiFilePath); + appendFileSync(publicApiFilePath, `export const hello='new public api';\n`); + + // force api-extractor to generate api.md and not fail on Local/CI + process.env.__FORCE_API_MD_UPDATE__ = ''; + const outputFailed = await executor(options, context); + expect(outputFailed.success).toBe(false); + + writeFileSync(publicApiFilePath, originalApiContent, 'utf-8'); }, 60000); }); diff --git a/tools/workspace-plugin/src/executors/build/lib/shared.ts b/tools/workspace-plugin/src/executors/build/lib/shared.ts index 8d6af2b6f2724d..ac044df1af0a5a 100644 --- a/tools/workspace-plugin/src/executors/build/lib/shared.ts +++ b/tools/workspace-plugin/src/executors/build/lib/shared.ts @@ -9,8 +9,9 @@ export async function runInParallel(...tasks: Tasks[]): Promise<boolean> { const processes = tasks.map(task => task()); return Promise.all(processes) - .then(() => { - return true; + .then(results => { + // if one of the processes failed (returned false) we need to force returning `false` to propagate `false` to final executor result which will fail the process chain + return results.indexOf(false) !== -1 ? false : true; }) .catch(err => { logger.error(err); From 95af8ed946f334198a8d26c3ae939dab1163911d Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Thu, 9 Jan 2025 14:22:32 +0100 Subject: [PATCH 14/78] ci:prevent running pipelines on forks (#33584) --- .github/workflows/azure-static-web-apps-deploy.yml | 1 + .github/workflows/bundle-size-base.yml | 1 + .github/workflows/bundle-size-comment.yml | 2 +- .github/workflows/bundle-size.yml | 1 + .github/workflows/check-packages.yml | 3 +++ .github/workflows/check-tooling.yml | 1 + .github/workflows/create-milestone.yml | 1 + .github/workflows/docsite-publish-ghpages.yml | 2 +- .github/workflows/pr-housekeeping.yml | 2 ++ .github/workflows/pr-vrt-comment.yml | 2 +- .github/workflows/pr-vrt.yml | 1 + .github/workflows/pr-website-deploy-comment.yml | 2 +- .github/workflows/pr-website-deploy.yml | 1 + .github/workflows/pr.yml | 2 ++ 14 files changed, 18 insertions(+), 4 deletions(-) diff --git a/.github/workflows/azure-static-web-apps-deploy.yml b/.github/workflows/azure-static-web-apps-deploy.yml index 1e049feb7b0b2c..bd29d2351ec5a1 100644 --- a/.github/workflows/azure-static-web-apps-deploy.yml +++ b/.github/workflows/azure-static-web-apps-deploy.yml @@ -13,6 +13,7 @@ permissions: jobs: build_and_deploy: + if: ${{ github.repository_owner == 'microsoft' }} runs-on: ubuntu-latest name: Build and Deploy Job steps: diff --git a/.github/workflows/bundle-size-base.yml b/.github/workflows/bundle-size-base.yml index cf71367ac61bc0..1c2aa9fb32bfd4 100644 --- a/.github/workflows/bundle-size-base.yml +++ b/.github/workflows/bundle-size-base.yml @@ -18,6 +18,7 @@ env: jobs: bundle-size-base: + if: ${{ github.repository_owner == 'microsoft' }} # TODO: use macos-14-xlarge (arm) for faster builds once https://github.com/Azure/cli/issues/172 will be fixed runs-on: ubuntu-latest permissions: diff --git a/.github/workflows/bundle-size-comment.yml b/.github/workflows/bundle-size-comment.yml index 9f2c116816e7c4..14715007aec7e8 100644 --- a/.github/workflows/bundle-size-comment.yml +++ b/.github/workflows/bundle-size-comment.yml @@ -8,7 +8,7 @@ on: jobs: comment: runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} + if: ${{ github.repository_owner == 'microsoft' }} && ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} permissions: pull-requests: write steps: diff --git a/.github/workflows/bundle-size.yml b/.github/workflows/bundle-size.yml index e523e3066e049e..adeabf8c750305 100644 --- a/.github/workflows/bundle-size.yml +++ b/.github/workflows/bundle-size.yml @@ -16,6 +16,7 @@ env: jobs: bundle-size: + if: ${{ github.repository_owner == 'microsoft' }} runs-on: macos-14-xlarge permissions: contents: 'read' diff --git a/.github/workflows/check-packages.yml b/.github/workflows/check-packages.yml index 8fadfbeedb554e..338a77e578bd90 100644 --- a/.github/workflows/check-packages.yml +++ b/.github/workflows/check-packages.yml @@ -5,6 +5,7 @@ on: jobs: dependency-deduplication: runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'microsoft' }} steps: - uses: actions/checkout@v4 with: @@ -37,6 +38,7 @@ jobs: dependency-mismatches: runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'microsoft' }} steps: - uses: actions/checkout@v4 with: @@ -63,6 +65,7 @@ jobs: change-files: runs-on: ubuntu-latest + if: ${{ github.repository_owner == 'microsoft' }} steps: - uses: actions/checkout@v4 with: diff --git a/.github/workflows/check-tooling.yml b/.github/workflows/check-tooling.yml index d43b425484aa17..9004893bb3bc49 100644 --- a/.github/workflows/check-tooling.yml +++ b/.github/workflows/check-tooling.yml @@ -14,6 +14,7 @@ env: jobs: check-tools: + if: ${{ github.repository_owner == 'microsoft' }} strategy: matrix: os: [ubuntu-latest, windows-latest] diff --git a/.github/workflows/create-milestone.yml b/.github/workflows/create-milestone.yml index 36fac805beb64a..14acf3cf83f372 100644 --- a/.github/workflows/create-milestone.yml +++ b/.github/workflows/create-milestone.yml @@ -10,6 +10,7 @@ permissions: jobs: create-milestone: + if: ${{ github.repository_owner == 'microsoft' }} name: Create this month's milestone runs-on: ubuntu-latest steps: diff --git a/.github/workflows/docsite-publish-ghpages.yml b/.github/workflows/docsite-publish-ghpages.yml index d22b389deedd2d..66754ab9603647 100644 --- a/.github/workflows/docsite-publish-ghpages.yml +++ b/.github/workflows/docsite-publish-ghpages.yml @@ -10,7 +10,7 @@ on: jobs: check: runs-on: ubuntu-latest - if: ${{ contains(github.event.head_commit.message, 'applying package updates') || github.event_name == 'workflow_dispatch' }} + if: ${{ github.repository_owner == 'microsoft' }} && ${{ contains(github.event.head_commit.message, 'applying package updates') || github.event_name == 'workflow_dispatch' }} outputs: status: ${{ steps.verify-react-components-changed.outputs.any_changed == 'true' || github.event_name == 'workflow_dispatch' }} diff --git a/.github/workflows/pr-housekeeping.yml b/.github/workflows/pr-housekeeping.yml index cc099a3290ad1c..2b6d63086c61da 100644 --- a/.github/workflows/pr-housekeeping.yml +++ b/.github/workflows/pr-housekeeping.yml @@ -9,6 +9,7 @@ permissions: jobs: label: + if: ${{ github.repository_owner == 'microsoft' }} runs-on: ubuntu-latest steps: - uses: actions/labeler@v5 @@ -18,6 +19,7 @@ jobs: configuration-path: .github/labeler.yml assign-to-current-milestone: + if: ${{ github.repository_owner == 'microsoft' }} runs-on: ubuntu-latest steps: - name: Assign to latest milestone diff --git a/.github/workflows/pr-vrt-comment.yml b/.github/workflows/pr-vrt-comment.yml index c5f4ac082b1f9b..39f8960881ce12 100644 --- a/.github/workflows/pr-vrt-comment.yml +++ b/.github/workflows/pr-vrt-comment.yml @@ -18,7 +18,7 @@ env: jobs: run_vr_diff: runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} + if: ${{ github.repository_owner == 'microsoft' }} && ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} outputs: pr_number: ${{ steps.pr_number.outputs.result }} permissions: diff --git a/.github/workflows/pr-vrt.yml b/.github/workflows/pr-vrt.yml index c0e49517d55bfc..344a1783f9f858 100644 --- a/.github/workflows/pr-vrt.yml +++ b/.github/workflows/pr-vrt.yml @@ -18,6 +18,7 @@ permissions: jobs: generate_vrt_screenshots: + if: ${{ github.repository_owner == 'microsoft' }} runs-on: macos-14-xlarge steps: - uses: actions/checkout@v4 diff --git a/.github/workflows/pr-website-deploy-comment.yml b/.github/workflows/pr-website-deploy-comment.yml index d636e5ad9ddcde..a5ae23eb4be542 100644 --- a/.github/workflows/pr-website-deploy-comment.yml +++ b/.github/workflows/pr-website-deploy-comment.yml @@ -17,7 +17,7 @@ env: jobs: deploy: runs-on: ubuntu-latest - if: ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} + if: ${{ github.repository_owner == 'microsoft' }} && ${{ github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success' }} outputs: pr_number: ${{ steps.pr_number.outputs.result }} website_url: ${{ steps.website_url.outputs.id }} diff --git a/.github/workflows/pr-website-deploy.yml b/.github/workflows/pr-website-deploy.yml index 862324e3e5c93f..c834640b268682 100644 --- a/.github/workflows/pr-website-deploy.yml +++ b/.github/workflows/pr-website-deploy.yml @@ -16,6 +16,7 @@ env: jobs: bundle: + if: ${{ github.repository_owner == 'microsoft' }} runs-on: macos-14-xlarge permissions: contents: 'read' diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index 91d1fb2e791014..5712801a144c5d 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -23,6 +23,7 @@ env: jobs: main: + if: ${{ github.repository_owner == 'microsoft' }} runs-on: macos-14-xlarge permissions: contents: 'read' @@ -81,6 +82,7 @@ jobs: git diff-index --quiet HEAD -- || exit 1 e2e: + if: ${{ github.repository_owner == 'microsoft' }} # TODO: switch to macos once problematic tests are fixed # https://github.com/microsoft/fluentui/issues/33173 # https://github.com/microsoft/fluentui/issues/33172 From 90ccf40771d9d992b824b52e33fe750a67eda097 Mon Sep 17 00:00:00 2001 From: krkshitij <110246001+krkshitij@users.noreply.github.com> Date: Fri, 10 Jan 2025 16:51:30 +0530 Subject: [PATCH 15/78] feat(react-charting): center align bars with auto barWidth in plotly mode (#33603) --- ...-5e13d62c-9372-4a66-84d6-a1e6cab63291.json | 7 +++++ .../react-charting/etc/react-charting.api.md | 3 +++ .../DeclarativeChart/PlotlySchemaAdapter.ts | 3 +++ .../GroupedVerticalBarChart.base.tsx | 27 +++++++++++++++---- .../GroupedVerticalBarChart.types.tsx | 6 +++++ .../VerticalBarChart.base.tsx | 18 +++++++++++-- .../VerticalBarChart.types.ts | 6 +++++ .../VerticalStackedBarChart.base.tsx | 18 +++++++++++-- .../VerticalStackedBarChart.types.ts | 6 +++++ 9 files changed, 85 insertions(+), 9 deletions(-) create mode 100644 change/@fluentui-react-charting-5e13d62c-9372-4a66-84d6-a1e6cab63291.json diff --git a/change/@fluentui-react-charting-5e13d62c-9372-4a66-84d6-a1e6cab63291.json b/change/@fluentui-react-charting-5e13d62c-9372-4a66-84d6-a1e6cab63291.json new file mode 100644 index 00000000000000..15228db009078d --- /dev/null +++ b/change/@fluentui-react-charting-5e13d62c-9372-4a66-84d6-a1e6cab63291.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "feat: center align bars with auto barWidth in plotly mode", + "packageName": "@fluentui/react-charting", + "email": "110246001+krkshitij@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/react-charting/etc/react-charting.api.md b/packages/charts/react-charting/etc/react-charting.api.md index 9a02db813cebf4..3d1c49be07983f 100644 --- a/packages/charts/react-charting/etc/react-charting.api.md +++ b/packages/charts/react-charting/etc/react-charting.api.md @@ -637,6 +637,7 @@ export interface IGroupedVerticalBarChartProps extends ICartesianChartProps { // @deprecated legendColor?: string; maxBarWidth?: number; + mode?: 'default' | 'plotly'; onRenderCalloutPerDataPoint?: IRenderFunction<IGVBarChartSeriesPoint>; roundCorners?: boolean; // @deprecated @@ -1468,6 +1469,7 @@ export interface IVerticalBarChartProps extends ICartesianChartProps { lineLegendText?: string; lineOptions?: ILineChartLineOptions; maxBarWidth?: number; + mode?: 'default' | 'plotly'; onRenderCalloutPerDataPoint?: IRenderFunction<IVerticalBarChartDataPoint>; roundCorners?: boolean; styles?: IStyleFunctionOrObject<IVerticalBarChartStyleProps, IVerticalBarChartStyles>; @@ -1520,6 +1522,7 @@ export interface IVerticalStackedBarChartProps extends ICartesianChartProps { isCalloutForStack?: boolean; lineOptions?: ILineChartLineOptions; maxBarWidth?: number; + mode?: 'default' | 'plotly'; onBarClick?: (event: React_2.MouseEvent<SVGElement>, data: IVerticalStackedChartProps | IVSChartDataPoint) => void; onRenderCalloutPerDataPoint?: IRenderFunction<IVSChartDataPoint>; onRenderCalloutPerStack?: IRenderFunction<IVerticalStackedChartProps>; diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts index 181f88c9b5a60a..d570f55a927c4e 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts @@ -198,6 +198,7 @@ export const transformPlotlyJsonToVSBCProps = ( chartTitle, xAxisTitle, yAxisTitle, + mode: 'plotly', }; }; @@ -239,6 +240,7 @@ export const transformPlotlyJsonToGVBCProps = ( chartTitle, xAxisTitle, yAxisTitle, + mode: 'plotly', }; }; @@ -329,6 +331,7 @@ export const transformPlotlyJsonToVBCProps = ( chartTitle, xAxisTitle, yAxisTitle, + mode: 'plotly', }; }; diff --git a/packages/charts/react-charting/src/components/GroupedVerticalBarChart/GroupedVerticalBarChart.base.tsx b/packages/charts/react-charting/src/components/GroupedVerticalBarChart/GroupedVerticalBarChart.base.tsx index 9f45393ea1b222..7b0f476bbfeb9d 100644 --- a/packages/charts/react-charting/src/components/GroupedVerticalBarChart/GroupedVerticalBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/GroupedVerticalBarChart/GroupedVerticalBarChart.base.tsx @@ -32,6 +32,7 @@ import { getNextGradient, getNextColor, areArraysEqual, + calculateLongestLabelWidth, } from '../../utilities/index'; import { IAccessibilityProps, @@ -695,21 +696,22 @@ export class GroupedVerticalBarChartBase private _getDomainMargins = (containerWidth: number): IMargins => { this._domainMargin = MIN_DOMAIN_MARGIN; + /** Total width available to render the bars */ + const totalWidth = + containerWidth - (this.margins.left! + MIN_DOMAIN_MARGIN) - (this.margins.right! + MIN_DOMAIN_MARGIN); + /** Rate at which the space between the groups changes wrt the group width */ + const groupGapRate = this._xAxisInnerPadding / (1 - this._xAxisInnerPadding); + if (this._xAxisType === XAxisTypes.StringAxis) { if (isScalePaddingDefined(this.props.xAxisOuterPadding)) { // Setting the domain margin for string x-axis to 0 because the xAxisOuterPadding prop is now available // to adjust the space before the first group and after the last group. this._domainMargin = 0; } else if (this.props.barwidth !== 'auto') { - /** Total width available to render the bars */ - const totalWidth = - containerWidth - (this.margins.left! + MIN_DOMAIN_MARGIN) - (this.margins.right! + MIN_DOMAIN_MARGIN); // Update the bar width so that when CartesianChart rerenders, // the following calculations don't use the previous bar width. this._barWidth = getBarWidth(this.props.barwidth, this.props.maxBarWidth); const groupWidth = (this._keys.length + (this._keys.length - 1) * BAR_GAP_RATE) * this._barWidth; - /** Rate at which the space between the groups changes wrt the group width */ - const groupGapRate = this._xAxisInnerPadding / (1 - this._xAxisInnerPadding); /** Total width required to render the groups. Directly proportional to group width */ const reqWidth = (this._xAxisLabels.length + (this._xAxisLabels.length - 1) * groupGapRate) * groupWidth; @@ -717,6 +719,21 @@ export class GroupedVerticalBarChartBase // Center align the chart by setting equal left and right margins for domain this._domainMargin = MIN_DOMAIN_MARGIN + (totalWidth - reqWidth) / 2; } + } else if (this.props.mode === 'plotly' && this._xAxisLabels.length > 1) { + // Calculate the remaining width after rendering groups at their maximum allowable width + const groupBandwidth = totalWidth / (this._xAxisLabels.length + (this._xAxisLabels.length - 1) * groupGapRate); + const barBandwidth = groupBandwidth / (this._keys.length + (this._keys.length - 1) * BAR_GAP_RATE); + const barWidth = getBarWidth(this.props.barwidth, this.props.maxBarWidth, barBandwidth); + const groupWidth = (this._keys.length + (this._keys.length - 1) * BAR_GAP_RATE) * barWidth; + let reqWidth = (this._xAxisLabels.length + (this._xAxisLabels.length - 1) * groupGapRate) * groupWidth; + const margin1 = (totalWidth - reqWidth) / 2; + + // Calculate the remaining width after accounting for the space required to render x-axis labels + const step = calculateLongestLabelWidth(this._xAxisLabels) + 20; + reqWidth = (this._xAxisLabels.length - this._xAxisInnerPadding) * step; + const margin2 = (totalWidth - reqWidth) / 2; + + this._domainMargin = MIN_DOMAIN_MARGIN + Math.max(0, Math.min(margin1, margin2)); } } diff --git a/packages/charts/react-charting/src/components/GroupedVerticalBarChart/GroupedVerticalBarChart.types.tsx b/packages/charts/react-charting/src/components/GroupedVerticalBarChart/GroupedVerticalBarChart.types.tsx index 1a8f43ac0822c3..050d9ea4c99cf3 100644 --- a/packages/charts/react-charting/src/components/GroupedVerticalBarChart/GroupedVerticalBarChart.types.tsx +++ b/packages/charts/react-charting/src/components/GroupedVerticalBarChart/GroupedVerticalBarChart.types.tsx @@ -121,6 +121,12 @@ export interface IGroupedVerticalBarChartProps extends ICartesianChartProps { * The prop used to enable rounded corners for the chart. */ roundCorners?: boolean; + + /** + * Specifies the mode of the chart. + * @default 'default' + */ + mode?: 'default' | 'plotly'; } /** diff --git a/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.base.tsx b/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.base.tsx index 1f17a5f43ea113..484461c1a1cab8 100644 --- a/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.base.tsx @@ -53,6 +53,7 @@ import { formatDate, getNextGradient, areArraysEqual, + calculateLongestLabelWidth, } from '../../utilities/index'; import { IChart } from '../../types/index'; @@ -1237,6 +1238,8 @@ export class VerticalBarChartBase /** Total width available to render the bars */ const totalWidth = containerWidth - (this.margins.left! + MIN_DOMAIN_MARGIN) - (this.margins.right! + MIN_DOMAIN_MARGIN); + /** Rate at which the space between the bars changes wrt the bar width */ + const barGapRate = this._xAxisInnerPadding / (1 - this._xAxisInnerPadding); if (this._xAxisType === XAxisTypes.StringAxis) { if (isScalePaddingDefined(this.props.xAxisOuterPadding, this.props.xAxisPadding)) { @@ -1244,8 +1247,6 @@ export class VerticalBarChartBase // to adjust the space before the first bar and after the last bar. this._domainMargin = 0; } else if (this.props.barWidth !== 'auto') { - /** Rate at which the space between the bars changes wrt the bar width */ - const barGapRate = this._xAxisInnerPadding / (1 - this._xAxisInnerPadding); // Update the bar width so that when CartesianChart rerenders, // the following calculations don't use the previous bar width. this._barWidth = getBarWidth(this.props.barWidth, this.props.maxBarWidth); @@ -1256,6 +1257,19 @@ export class VerticalBarChartBase // Center align the chart by setting equal left and right margins for domain this._domainMargin = MIN_DOMAIN_MARGIN + (totalWidth - reqWidth) / 2; } + } else if (this.props.mode === 'plotly' && this._xAxisLabels.length > 1) { + // Calculate the remaining width after rendering bars at their maximum allowable width + const bandwidth = totalWidth / (this._xAxisLabels.length + (this._xAxisLabels.length - 1) * barGapRate); + const barWidth = getBarWidth(this.props.barWidth, this.props.maxBarWidth, bandwidth); + let reqWidth = (this._xAxisLabels.length + (this._xAxisLabels.length - 1) * barGapRate) * barWidth; + const margin1 = (totalWidth - reqWidth) / 2; + + // Calculate the remaining width after accounting for the space required to render x-axis labels + const step = calculateLongestLabelWidth(this._xAxisLabels) + 20; + reqWidth = (this._xAxisLabels.length - this._xAxisInnerPadding) * step; + const margin2 = (totalWidth - reqWidth) / 2; + + this._domainMargin = MIN_DOMAIN_MARGIN + Math.max(0, Math.min(margin1, margin2)); } } else { const data = (this.props.data?.map(point => point.x) as number[] | Date[] | undefined) || []; diff --git a/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.types.ts b/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.types.ts index 8094c91e73a120..aa62768cb0fb59 100644 --- a/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.types.ts +++ b/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.types.ts @@ -117,6 +117,12 @@ export interface IVerticalBarChartProps extends ICartesianChartProps { * The prop used to enable rounded corners for the chart. */ roundCorners?: boolean; + + /** + * Specifies the mode of the chart. + * @default 'default' + */ + mode?: 'default' | 'plotly'; } /** diff --git a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx index 3a45277290bdd2..bae69324657ec7 100644 --- a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx @@ -60,6 +60,7 @@ import { formatDate, getNextGradient, areArraysEqual, + calculateLongestLabelWidth, } from '../../utilities/index'; import { IChart } from '../../types/index'; @@ -1199,6 +1200,8 @@ export class VerticalStackedBarChartBase /** Total width available to render the bars */ const totalWidth = containerWidth - (this.margins.left! + MIN_DOMAIN_MARGIN) - (this.margins.right! + MIN_DOMAIN_MARGIN); + /** Rate at which the space between the bars changes wrt the bar width */ + const barGapRate = this._xAxisInnerPadding / (1 - this._xAxisInnerPadding); if (this._xAxisType === XAxisTypes.StringAxis) { if (isScalePaddingDefined(this.props.xAxisOuterPadding, this.props.xAxisPadding)) { @@ -1206,8 +1209,6 @@ export class VerticalStackedBarChartBase // to adjust the space before the first bar and after the last bar. this._domainMargin = 0; } else if (this.props.barWidth !== 'auto') { - /** Rate at which the space between the bars changes wrt the bar width */ - const barGapRate = this._xAxisInnerPadding / (1 - this._xAxisInnerPadding); // Update the bar width so that when CartesianChart rerenders, // the following calculations don't use the previous bar width. this._barWidth = getBarWidth(this.props.barWidth, this.props.maxBarWidth); @@ -1218,6 +1219,19 @@ export class VerticalStackedBarChartBase // Center align the chart by setting equal left and right margins for domain this._domainMargin = MIN_DOMAIN_MARGIN + (totalWidth - reqWidth) / 2; } + } else if (this.props.mode === 'plotly' && this._xAxisLabels.length > 1) { + // Calculate the remaining width after rendering bars at their maximum allowable width + const bandwidth = totalWidth / (this._xAxisLabels.length + (this._xAxisLabels.length - 1) * barGapRate); + const barWidth = getBarWidth(this.props.barWidth, this.props.maxBarWidth, bandwidth); + let reqWidth = (this._xAxisLabels.length + (this._xAxisLabels.length - 1) * barGapRate) * barWidth; + const margin1 = (totalWidth - reqWidth) / 2; + + // Calculate the remaining width after accounting for the space required to render x-axis labels + const step = calculateLongestLabelWidth(this._xAxisLabels) + 20; + reqWidth = (this._xAxisLabels.length - this._xAxisInnerPadding) * step; + const margin2 = (totalWidth - reqWidth) / 2; + + this._domainMargin = MIN_DOMAIN_MARGIN + Math.max(0, Math.min(margin1, margin2)); } } else { const data = (this.props.data?.map(point => point.xAxisPoint) as number[] | Date[] | undefined) || []; diff --git a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.types.ts b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.types.ts index 5e47df049599cf..5fa46b7dcf6d8d 100644 --- a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.types.ts +++ b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.types.ts @@ -155,6 +155,12 @@ export interface IVerticalStackedBarChartProps extends ICartesianChartProps { * The prop used to enable rounded corners for the chart. */ roundCorners?: boolean; + + /** + * Specifies the mode of the chart. + * @default 'default' + */ + mode?: 'default' | 'plotly'; } /** From 2f88d062a57e6dc44ecd65df2ab067652ae4c7ce Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Fri, 10 Jan 2025 14:47:12 +0100 Subject: [PATCH 16/78] fix: make api.md up to date (#33599) --- ...view-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json | 7 +++++++ ...view-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json | 7 +++++++ ...view-f95778aa-ad54-4ba0-9ef8-38237de444a8.json | 7 +++++++ ...ster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json | 7 +++++++ ...oast-b6083bc4-f97c-4ad1-a457-a150145f3543.json | 7 +++++++ ...ltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json | 7 +++++++ ...izer-d6716ae8-9732-454c-9c6f-65ab98953a42.json | 7 +++++++ .../library/etc/react-color-picker-preview.api.md | 9 +++++---- .../etc/react-motion-components-preview.api.md | 15 ++++++--------- .../library/etc/react-nav-preview.api.md | 4 +++- .../src/hooks/useIsNavigatingWithKeyboard.ts | 2 +- .../react-toast/library/etc/react-toast.api.md | 1 + .../library/etc/react-tooltip.api.md | 2 +- .../library/etc/react-virtualizer.api.md | 11 ++++------- 14 files changed, 70 insertions(+), 23 deletions(-) create mode 100644 change/@fluentui-react-color-picker-preview-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json create mode 100644 change/@fluentui-react-motion-components-preview-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json create mode 100644 change/@fluentui-react-nav-preview-f95778aa-ad54-4ba0-9ef8-38237de444a8.json create mode 100644 change/@fluentui-react-tabster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json create mode 100644 change/@fluentui-react-toast-b6083bc4-f97c-4ad1-a457-a150145f3543.json create mode 100644 change/@fluentui-react-tooltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json create mode 100644 change/@fluentui-react-virtualizer-d6716ae8-9732-454c-9c6f-65ab98953a42.json diff --git a/change/@fluentui-react-color-picker-preview-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json b/change/@fluentui-react-color-picker-preview-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json new file mode 100644 index 00000000000000..65b78e7e086001 --- /dev/null +++ b/change/@fluentui-react-color-picker-preview-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "fix: make api.md up to date", + "packageName": "@fluentui/react-color-picker-preview", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-motion-components-preview-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json b/change/@fluentui-react-motion-components-preview-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json new file mode 100644 index 00000000000000..1599dbedebc4be --- /dev/null +++ b/change/@fluentui-react-motion-components-preview-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "fix: make api.md up to date", + "packageName": "@fluentui/react-motion-components-preview", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-nav-preview-f95778aa-ad54-4ba0-9ef8-38237de444a8.json b/change/@fluentui-react-nav-preview-f95778aa-ad54-4ba0-9ef8-38237de444a8.json new file mode 100644 index 00000000000000..86031271d82853 --- /dev/null +++ b/change/@fluentui-react-nav-preview-f95778aa-ad54-4ba0-9ef8-38237de444a8.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "fix: make api.md up to date", + "packageName": "@fluentui/react-nav-preview", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-tabster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json b/change/@fluentui-react-tabster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json new file mode 100644 index 00000000000000..9931e30185f731 --- /dev/null +++ b/change/@fluentui-react-tabster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "docs: fix invalid TSdoc that is causing warnings within generate-api task", + "packageName": "@fluentui/react-tabster", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-toast-b6083bc4-f97c-4ad1-a457-a150145f3543.json b/change/@fluentui-react-toast-b6083bc4-f97c-4ad1-a457-a150145f3543.json new file mode 100644 index 00000000000000..6bf5ab81b5af14 --- /dev/null +++ b/change/@fluentui-react-toast-b6083bc4-f97c-4ad1-a457-a150145f3543.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "fix: make api.md up to date", + "packageName": "@fluentui/react-toast", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-tooltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json b/change/@fluentui-react-tooltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json new file mode 100644 index 00000000000000..985a836a6abda3 --- /dev/null +++ b/change/@fluentui-react-tooltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "fix: make api.md up to date", + "packageName": "@fluentui/react-tooltip", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-virtualizer-d6716ae8-9732-454c-9c6f-65ab98953a42.json b/change/@fluentui-react-virtualizer-d6716ae8-9732-454c-9c6f-65ab98953a42.json new file mode 100644 index 00000000000000..d4ed76c700480b --- /dev/null +++ b/change/@fluentui-react-virtualizer-d6716ae8-9732-454c-9c6f-65ab98953a42.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "fix: make api.md up to date", + "packageName": "@fluentui/react-virtualizer", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "none" +} diff --git a/packages/react-components/react-color-picker-preview/library/etc/react-color-picker-preview.api.md b/packages/react-components/react-color-picker-preview/library/etc/react-color-picker-preview.api.md index 5c78ccfa5aa480..0ff850de65940e 100644 --- a/packages/react-components/react-color-picker-preview/library/etc/react-color-picker-preview.api.md +++ b/packages/react-components/react-color-picker-preview/library/etc/react-color-picker-preview.api.md @@ -35,7 +35,7 @@ export const ColorArea: ForwardRefComponent<ColorAreaProps>; export const colorAreaClassNames: SlotClassNames<ColorAreaSlots>; // @public -export type ColorAreaProps = Omit<ComponentProps<Partial<ColorAreaSlots>>, 'color' | 'onChange'> & { +export type ColorAreaProps = Omit<ComponentProps<Partial<ColorAreaSlots>>, 'color' | 'onChange'> & Pick<ColorPickerProps, 'shape'> & { color?: HsvColor; defaultColor?: HsvColor; onChange?: EventHandler<ColorAreaOnColorChangeData>; @@ -50,7 +50,7 @@ export type ColorAreaSlots = { }; // @public -export type ColorAreaState = ComponentState<Required<ColorAreaSlots>> & Pick<ColorAreaProps, 'color'>; +export type ColorAreaState = ComponentState<Required<ColorAreaSlots>> & Pick<ColorAreaProps, 'color' | 'shape'>; // @public export const ColorPicker: ForwardRefComponent<ColorPickerProps>; @@ -62,6 +62,7 @@ export const colorPickerClassNames: SlotClassNames<ColorPickerSlots>; export type ColorPickerProps = Omit<ComponentProps<Partial<ColorPickerSlots>>, 'color'> & { color: HsvColor; onColorChange?: EventHandler<ColorPickerOnChangeData>; + shape?: 'rounded' | 'square'; }; // @public (undocumented) @@ -79,7 +80,7 @@ export const ColorSlider: ForwardRefComponent<ColorSliderProps>; export const colorSliderClassNames: SlotClassNames<ColorSliderSlots>; // @public -export type ColorSliderProps = Omit<ComponentProps<Partial<ColorSliderSlots>, 'input'>, 'defaultValue' | 'onChange' | 'value' | 'color'> & { +export type ColorSliderProps = Omit<ComponentProps<Partial<ColorSliderSlots>, 'input'>, 'defaultValue' | 'onChange' | 'value' | 'color'> & Pick<ColorPickerProps, 'shape'> & { channel?: string; onChange?: EventHandler<SliderOnChangeData>; vertical?: boolean; @@ -96,7 +97,7 @@ export type ColorSliderSlots = { }; // @public -export type ColorSliderState = ComponentState<ColorSliderSlots> & Pick<ColorSliderProps, 'vertical'>; +export type ColorSliderState = ComponentState<ColorSliderSlots> & Pick<ColorSliderProps, 'vertical' | 'shape'>; // @public export const renderAlphaSlider_unstable: (state: AlphaSliderState) => JSX.Element; diff --git a/packages/react-components/react-motion-components-preview/library/etc/react-motion-components-preview.api.md b/packages/react-components/react-motion-components-preview/library/etc/react-motion-components-preview.api.md index d9efd381278b6e..fba94f92528fba 100644 --- a/packages/react-components/react-motion-components-preview/library/etc/react-motion-components-preview.api.md +++ b/packages/react-components/react-motion-components-preview/library/etc/react-motion-components-preview.api.md @@ -36,6 +36,9 @@ export const createCollapsePresence: PresenceMotionFnCreator<CollapseVariantPara // @public export const createFadePresence: PresenceMotionCreator<FadeVariantParams>; +// @public +export const createScalePresence: PresenceMotionFnCreator<ScaleVariantParams_unstable, ScaleRuntimeParams_unstable>; + // @public export const Fade: PresenceComponent< {}>; @@ -46,19 +49,13 @@ export const FadeRelaxed: PresenceComponent< {}>; export const FadeSnappy: PresenceComponent< {}>; // @public -export const Scale: PresenceComponent< { -animateOpacity?: boolean | undefined; -}>; +export const Scale: PresenceComponent<ScaleRuntimeParams_unstable>; // @public (undocumented) -export const ScaleRelaxed: PresenceComponent< { -animateOpacity?: boolean | undefined; -}>; +export const ScaleRelaxed: PresenceComponent<ScaleRuntimeParams_unstable>; // @public (undocumented) -export const ScaleSnappy: PresenceComponent< { -animateOpacity?: boolean | undefined; -}>; +export const ScaleSnappy: PresenceComponent<ScaleRuntimeParams_unstable>; // (No @packageDocumentation comment for this package) diff --git a/packages/react-components/react-nav-preview/library/etc/react-nav-preview.api.md b/packages/react-components/react-nav-preview/library/etc/react-nav-preview.api.md index 70ed49272f741a..0ce49da49a38d3 100644 --- a/packages/react-components/react-nav-preview/library/etc/react-nav-preview.api.md +++ b/packages/react-components/react-nav-preview/library/etc/react-nav-preview.api.md @@ -228,7 +228,9 @@ export type NavDrawerProps = ComponentProps<NavDrawerSlots> & DrawerProps & NavP export type NavDrawerSlots = DrawerSlots; // @public -export type NavDrawerState = DrawerState & NavContextValue; +export type NavDrawerState = DrawerState & NavContextValue & { + size?: 'small' | 'medium' | 'large' | 'full'; +}; // @public export const NavItem: ForwardRefComponent<NavItemProps>; diff --git a/packages/react-components/react-tabster/src/hooks/useIsNavigatingWithKeyboard.ts b/packages/react-components/react-tabster/src/hooks/useIsNavigatingWithKeyboard.ts index ce23ff78a953cf..983dd7c14fb959 100644 --- a/packages/react-components/react-tabster/src/hooks/useIsNavigatingWithKeyboard.ts +++ b/packages/react-components/react-tabster/src/hooks/useIsNavigatingWithKeyboard.ts @@ -3,7 +3,7 @@ import { useKeyborgRef } from './useKeyborgRef'; /** * Instantiates [keyborg](https://github.com/microsoft/keyborg) and checks if the user is navigating with the keyboard. - * @returns {() => boolean} + * @returns */ export function useIsNavigatingWithKeyboard(): () => boolean { const keyborgRef = useKeyborgRef(); diff --git a/packages/react-components/react-toast/library/etc/react-toast.api.md b/packages/react-components/react-toast/library/etc/react-toast.api.md index d60e0e05c3769c..c5c8d6f1c179fc 100644 --- a/packages/react-components/react-toast/library/etc/react-toast.api.md +++ b/packages/react-components/react-toast/library/etc/react-toast.api.md @@ -133,6 +133,7 @@ export type ToastSlots = { // @public export type ToastState = ComponentState<ToastSlots> & { backgroundAppearance: BackgroundAppearanceContextValue; + intent?: ToastIntent | undefined; }; // @public (undocumented) diff --git a/packages/react-components/react-tooltip/library/etc/react-tooltip.api.md b/packages/react-components/react-tooltip/library/etc/react-tooltip.api.md index ada8f59ee9266d..d0d85dc974e426 100644 --- a/packages/react-components/react-tooltip/library/etc/react-tooltip.api.md +++ b/packages/react-components/react-tooltip/library/etc/react-tooltip.api.md @@ -56,7 +56,7 @@ export type TooltipState = ComponentState<TooltipSlots> & Pick<TooltipProps, 'mo // @public export type TooltipTriggerProps = { ref?: React_2.Ref<unknown>; -} & Pick<React_2.HTMLAttributes<HTMLElement>, 'aria-describedby' | 'aria-label' | 'aria-labelledby' | 'onBlur' | 'onFocus' | 'onPointerEnter' | 'onPointerLeave'>; +} & Pick<React_2.HTMLAttributes<HTMLElement>, 'aria-describedby' | 'aria-label' | 'aria-labelledby' | 'onBlur' | 'onFocus' | 'onPointerEnter' | 'onPointerLeave' | 'aria-haspopup' | 'aria-expanded'>; // @public export const useTooltip_unstable: (props: TooltipProps) => TooltipState; diff --git a/packages/react-components/react-virtualizer/library/etc/react-virtualizer.api.md b/packages/react-components/react-virtualizer/library/etc/react-virtualizer.api.md index 6b3c901b351b61..3bcd16bcd68144 100644 --- a/packages/react-components/react-virtualizer/library/etc/react-virtualizer.api.md +++ b/packages/react-components/react-virtualizer/library/etc/react-virtualizer.api.md @@ -6,10 +6,7 @@ import type { ComponentProps } from '@fluentui/react-utilities'; import type { ComponentState } from '@fluentui/react-utilities'; -import type { FC } from 'react'; -import type { MutableRefObject } from 'react'; import * as React_2 from 'react'; -import type { RefObject } from 'react'; import type { Slot } from '@fluentui/react-utilities'; import type { SlotClassNames } from '@fluentui/react-utilities'; @@ -132,7 +129,7 @@ export const useVirtualizerScrollViewStyles_unstable: (state: VirtualizerScrollV export const useVirtualizerStyles_unstable: (state: VirtualizerState) => VirtualizerState; // @public -export const Virtualizer: FC<VirtualizerProps>; +export const Virtualizer: React_2.FC<VirtualizerProps>; // @public export type VirtualizerChildRenderFunction = (index: number, isScrolling: boolean) => React_2.ReactNode; @@ -152,10 +149,10 @@ export const VirtualizerContextProvider: React_2.Provider<VirtualizerContextProp // @public (undocumented) export type VirtualizerDataRef = { - progressiveSizes: RefObject<number[]>; - nodeSizes: RefObject<number[]>; + progressiveSizes: React_2.RefObject<number[]>; + nodeSizes: React_2.RefObject<number[]>; setFlaggedIndex: (index: number | null) => void; - currentIndex: RefObject<number>; + currentIndex: React_2.RefObject<number>; }; // @public (undocumented) From cd3334a52470b0d6d07e075c7b4ad91f5a409d0a Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Fri, 10 Jan 2025 17:59:55 +0100 Subject: [PATCH 17/78] ci(ado): update storage baseline for bundle-size only if all bundle-size tasks passed (#33600) --- azure-pipelines.bundlesize.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/azure-pipelines.bundlesize.yml b/azure-pipelines.bundlesize.yml index 76d9ac3fe3febf..f919bace9f1300 100644 --- a/azure-pipelines.bundlesize.yml +++ b/azure-pipelines.bundlesize.yml @@ -22,6 +22,10 @@ jobs: filePath: yarn-ci.sh displayName: yarn + # TODO: these commented steps can be probably removed as we migrated these workflows to GHA + # - @{link file://./.github/workflows/bundle-size-comment.yml} + # - @{link file://./.github/workflows/bundle-size.yml} + # - script: | # yarn nx affected -t bundle-size --nxBail $(sinceArg) # displayName: build packages & create reports @@ -49,7 +53,7 @@ jobs: - task: AzureCLI@2 displayName: upload a report (base only) - condition: eq(variables.isPR, false) + condition: and(eq(variables.isPR, false), succeeded()) env: AZURE_TENANT_ID: $(AzureTenantId) AZURE_CLIENT_ID: $(AzureClientId) From befe9020d9198ff7f3d7e9042fc2c249c874b050 Mon Sep 17 00:00:00 2001 From: Mason Tejera <17346018+mltejera@users.noreply.github.com> Date: Fri, 10 Jan 2025 19:11:08 +0000 Subject: [PATCH 18/78] (fix)[react-nav-preview): Updating Nav animation speeds (#33588) --- ...t-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json | 7 +++++++ .../library/src/components/sharedNavStyles.styles.ts | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 change/@fluentui-react-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json diff --git a/change/@fluentui-react-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json b/change/@fluentui-react-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json new file mode 100644 index 00000000000000..15efc7af0656d4 --- /dev/null +++ b/change/@fluentui-react-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: Speeding up animations in Nav.", + "packageName": "@fluentui/react-nav-preview", + "email": "matejera@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts index c2e2ecdbba7623..fdcf64730d34d0 100644 --- a/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts @@ -13,12 +13,12 @@ export const navItemTokens = { backgroundColorHover: tokens.colorNeutralBackground4Hover, backgroundColorPressed: tokens.colorNeutralBackground4Pressed, animationTokens: { - animationDuration: tokens.durationFast, + animationDuration: tokens.durationFaster, animationFillMode: 'both', animationTimingFunction: tokens.curveAccelerateMid, }, transitionTokens: { - transitionDuration: tokens.durationFast, + transitionDuration: tokens.durationFaster, transitionTimingFunction: tokens.curveAccelerateMid, transitionProperty: 'background', }, From 74641ca04daeda5a6cd644513351d675ccd4dbad Mon Sep 17 00:00:00 2001 From: Ben Howell <48106640+behowell@users.noreply.github.com> Date: Fri, 10 Jan 2025 18:18:27 -0800 Subject: [PATCH 19/78] fix: Remove deprecation warning from Callout's preventDismissOnResize, etc. (#33493) Remove the `@deprecated` tag from Callout's `preventDismissOnResize`, `preventDismissOnScroll`, and `preventDismissOnFocus` properties, given that we have no plans to actually remove these APIs from v8. They still work fine, and provider a simpler API for common use cases. --- ...i-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json | 7 +++++++ packages/react/etc/react.api.md | 3 --- .../react/src/components/Callout/Callout.types.ts | 12 ++++++------ .../src/components/Callout/CalloutContent.base.tsx | 3 --- 4 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 change/@fluentui-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json diff --git a/change/@fluentui-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json b/change/@fluentui-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json new file mode 100644 index 00000000000000..bd7e3272e1794b --- /dev/null +++ b/change/@fluentui-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: Remove deprecation warning from Callout's preventDismissOnResize and similar props", + "packageName": "@fluentui/react", + "email": "behowell@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react/etc/react.api.md b/packages/react/etc/react.api.md index 94b006c3695750..9fe14cb8bfbb28 100644 --- a/packages/react/etc/react.api.md +++ b/packages/react/etc/react.api.md @@ -3243,11 +3243,8 @@ export interface ICalloutProps extends React_2.HTMLAttributes<HTMLDivElement>, R popupProps?: IPopupProps; preferScrollResizePositioning?: boolean; preventDismissOnEvent?: (ev: Event | React_2.FocusEvent | React_2.KeyboardEvent | React_2.MouseEvent) => boolean; - // @deprecated preventDismissOnLostFocus?: boolean; - // @deprecated preventDismissOnResize?: boolean; - // @deprecated preventDismissOnScroll?: boolean; role?: string; setInitialFocus?: boolean; diff --git a/packages/react/src/components/Callout/Callout.types.ts b/packages/react/src/components/Callout/Callout.types.ts index 6907bb11cb8989..b00e10355e5e69 100644 --- a/packages/react/src/components/Callout/Callout.types.ts +++ b/packages/react/src/components/Callout/Callout.types.ts @@ -87,23 +87,23 @@ export interface ICalloutProps extends React.HTMLAttributes<HTMLDivElement>, Rea isBeakVisible?: boolean; /** - * If true then the callout will not dismiss on scroll + * If true then the callout will not dismiss on scroll. + * *Note:* This property will be ignored if using `preventDismissOnEvent`. * @defaultvalue false - * @deprecated use preventDismissOnEvent callback instead */ preventDismissOnScroll?: boolean; /** - * If true then the callout will not dismiss on resize + * If true then the callout will not dismiss on resize. + * *Note:* This property will be ignored if using `preventDismissOnEvent`. * @defaultvalue false - * @deprecated use preventDismissOnEvent callback instead */ preventDismissOnResize?: boolean; /** - * If true then the callout will not dismiss when it loses focus + * If true then the callout will not dismiss when it loses focus. + * *Note:* This property will be ignored if using `preventDismissOnEvent`. * @defaultvalue false - * @deprecated use preventDismissOnEvent callback instead */ preventDismissOnLostFocus?: boolean; diff --git a/packages/react/src/components/Callout/CalloutContent.base.tsx b/packages/react/src/components/Callout/CalloutContent.base.tsx index e4acb42562bfc0..9355bc972c5159 100644 --- a/packages/react/src/components/Callout/CalloutContent.base.tsx +++ b/packages/react/src/components/Callout/CalloutContent.base.tsx @@ -337,11 +337,8 @@ function useDismissHandlers( { hidden, onDismiss, - // eslint-disable-next-line deprecation/deprecation preventDismissOnScroll, - // eslint-disable-next-line deprecation/deprecation preventDismissOnResize, - // eslint-disable-next-line deprecation/deprecation preventDismissOnLostFocus, dismissOnTargetClick, shouldDismissOnWindowFocus, From bf60a56cb23b3af90bcb62462c2423468eb9fa3c Mon Sep 17 00:00:00 2001 From: hamzamaimi <82286785+hamzamaimi@users.noreply.github.com> Date: Sun, 12 Jan 2025 00:01:47 +0100 Subject: [PATCH 20/78] Fix: updated regex validation for color theme designer input field (#33148) Co-authored-by: Makoto Morimoto <Humberto.Morimoto@microsoft.com> Co-authored-by: Humberto Makoto Morimoto Burgos <makotom@microsoft.com> --- .../theme-designer/src/components/Sidebar/Form.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/react-components/theme-designer/src/components/Sidebar/Form.tsx b/packages/react-components/theme-designer/src/components/Sidebar/Form.tsx index 1f85ac0a4d84ad..b6a71e81e27325 100644 --- a/packages/react-components/theme-designer/src/components/Sidebar/Form.tsx +++ b/packages/react-components/theme-designer/src/components/Sidebar/Form.tsx @@ -118,8 +118,10 @@ export const Form: React.FC = () => { }); }, [dispatch, debounceKeyColor, debounceHueTorsion, debounceVibrancy]); - const generateHexColor = (e: React.ChangeEvent<HTMLInputElement>) => - '#' + e.target.value.replace(/\W/g, '').toUpperCase(); + const generateHexColor = (e: React.ChangeEvent<HTMLInputElement>): string => { + return '#' + e.target.value.replace(/[^0-9A-F]/gi, '').toUpperCase(); + }; + const handleKeyColorChange = (e: React.ChangeEvent<HTMLInputElement>) => { // check if the newly inputted hex code has a # const newHexColor = generateHexColor(e); From 7fd4e13f9175ed9194d9ab4ce06089a372c29a08 Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Mon, 13 Jan 2025 07:21:41 +0000 Subject: [PATCH 21/78] release: applying package updates - react v8 --- ...-b39a56a4-8975-43fa-a958-fb3c555a2c11.json | 7 ----- ...-5e13d62c-9372-4a66-84d6-a1e6cab63291.json | 7 ----- packages/azure-themes/CHANGELOG.json | 15 +++++++++++ packages/azure-themes/CHANGELOG.md | 11 +++++++- packages/azure-themes/package.json | 4 +-- packages/charts/react-charting/CHANGELOG.json | 27 +++++++++++++++++++ packages/charts/react-charting/CHANGELOG.md | 13 ++++++++- packages/charts/react-charting/package.json | 6 ++--- packages/cra-template/package.json | 2 +- packages/fluent2-theme/CHANGELOG.json | 15 +++++++++++ packages/fluent2-theme/CHANGELOG.md | 11 +++++++- packages/fluent2-theme/package.json | 4 +-- packages/react-cards/CHANGELOG.json | 15 +++++++++++ packages/react-cards/CHANGELOG.md | 11 +++++++- packages/react-cards/package.json | 4 +-- .../library/package.json | 4 +-- packages/react-date-time/CHANGELOG.json | 15 +++++++++++ packages/react-date-time/CHANGELOG.md | 11 +++++++- packages/react-date-time/package.json | 4 +-- .../react-docsite-components/CHANGELOG.json | 21 +++++++++++++++ .../react-docsite-components/CHANGELOG.md | 12 ++++++++- .../react-docsite-components/package.json | 6 ++--- packages/react-examples/package.json | 14 +++++----- packages/react-experiments/CHANGELOG.json | 15 +++++++++++ packages/react-experiments/CHANGELOG.md | 11 +++++++- packages/react-experiments/package.json | 4 +-- packages/react-monaco-editor/CHANGELOG.json | 21 +++++++++++++++ packages/react-monaco-editor/CHANGELOG.md | 12 ++++++++- packages/react-monaco-editor/package.json | 6 ++--- packages/react/CHANGELOG.json | 15 +++++++++++ packages/react/CHANGELOG.md | 11 +++++++- packages/react/package.json | 2 +- packages/storybook/package.json | 6 ++--- packages/theme-samples/CHANGELOG.json | 15 +++++++++++ packages/theme-samples/CHANGELOG.md | 11 +++++++- packages/theme-samples/package.json | 4 +-- 36 files changed, 313 insertions(+), 59 deletions(-) delete mode 100644 change/@fluentui-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json delete mode 100644 change/@fluentui-react-charting-5e13d62c-9372-4a66-84d6-a1e6cab63291.json diff --git a/change/@fluentui-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json b/change/@fluentui-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json deleted file mode 100644 index bd7e3272e1794b..00000000000000 --- a/change/@fluentui-react-b39a56a4-8975-43fa-a958-fb3c555a2c11.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: Remove deprecation warning from Callout's preventDismissOnResize and similar props", - "packageName": "@fluentui/react", - "email": "behowell@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-charting-5e13d62c-9372-4a66-84d6-a1e6cab63291.json b/change/@fluentui-react-charting-5e13d62c-9372-4a66-84d6-a1e6cab63291.json deleted file mode 100644 index 15228db009078d..00000000000000 --- a/change/@fluentui-react-charting-5e13d62c-9372-4a66-84d6-a1e6cab63291.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "feat: center align bars with auto barWidth in plotly mode", - "packageName": "@fluentui/react-charting", - "email": "110246001+krkshitij@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/packages/azure-themes/CHANGELOG.json b/packages/azure-themes/CHANGELOG.json index d805638349bb4e..4aaf5704766b85 100644 --- a/packages/azure-themes/CHANGELOG.json +++ b/packages/azure-themes/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/azure-themes", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:23 GMT", + "tag": "@fluentui/azure-themes_v8.6.119", + "version": "8.6.119", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/azure-themes", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/azure-themes_v8.6.118", diff --git a/packages/azure-themes/CHANGELOG.md b/packages/azure-themes/CHANGELOG.md index 6d33570bd6959c..c5e0dc641af2fe 100644 --- a/packages/azure-themes/CHANGELOG.md +++ b/packages/azure-themes/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/azure-themes -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. <!-- Start content --> +## [8.6.119](https://github.com/microsoft/fluentui/tree/@fluentui/azure-themes_v8.6.119) + +Mon, 13 Jan 2025 07:21:23 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/azure-themes_v8.6.118..@fluentui/azure-themes_v8.6.119) + +### Patches + +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [8.6.118](https://github.com/microsoft/fluentui/tree/@fluentui/azure-themes_v8.6.118) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/azure-themes/package.json b/packages/azure-themes/package.json index 84b147bb49e9cc..49ed3c4f1ba138 100644 --- a/packages/azure-themes/package.json +++ b/packages/azure-themes/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/azure-themes", - "version": "8.6.118", + "version": "8.6.119", "description": "Azure themes for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" } diff --git a/packages/charts/react-charting/CHANGELOG.json b/packages/charts/react-charting/CHANGELOG.json index e5ceb86a70036d..39fddc4b97a2dc 100644 --- a/packages/charts/react-charting/CHANGELOG.json +++ b/packages/charts/react-charting/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-charting", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:22 GMT", + "tag": "@fluentui/react-charting_v5.23.40", + "version": "5.23.40", + "comments": { + "patch": [ + { + "author": "110246001+krkshitij@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "90ccf40771d9d992b824b52e33fe750a67eda097", + "comment": "feat: center align bars with auto barWidth in plotly mode" + }, + { + "author": "beachball", + "package": "@fluentui/react-charting", + "comment": "Bump @fluentui/theme-samples to v8.7.195", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + }, + { + "author": "beachball", + "package": "@fluentui/react-charting", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/react-charting_v5.23.39", diff --git a/packages/charts/react-charting/CHANGELOG.md b/packages/charts/react-charting/CHANGELOG.md index 9660401028e9d1..42e32365cd9654 100644 --- a/packages/charts/react-charting/CHANGELOG.md +++ b/packages/charts/react-charting/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-charting -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:22 GMT and should not be manually modified. <!-- Start content --> +## [5.23.40](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.40) + +Mon, 13 Jan 2025 07:21:22 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charting_v5.23.39..@fluentui/react-charting_v5.23.40) + +### Patches + +- feat: center align bars with auto barWidth in plotly mode ([PR #33603](https://github.com/microsoft/fluentui/pull/33603) by 110246001+krkshitij@users.noreply.github.com) +- Bump @fluentui/theme-samples to v8.7.195 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [5.23.39](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.39) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/charts/react-charting/package.json b/packages/charts/react-charting/package.json index f0c8be40c0d649..80f4f6edff1ebd 100644 --- a/packages/charts/react-charting/package.json +++ b/packages/charts/react-charting/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-charting", - "version": "5.23.39", + "version": "5.23.40", "description": "React web charting controls for Microsoft fluentui system.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -40,7 +40,7 @@ }, "dependencies": { "@fluentui/react-focus": "^8.9.20", - "@fluentui/theme-samples": "^8.7.194", + "@fluentui/theme-samples": "^8.7.195", "@microsoft/load-themed-styles": "^1.10.26", "@types/d3-array": "^3.0.0", "@types/d3-axis": "^3.0.0", @@ -66,7 +66,7 @@ "tslib": "^2.1.0" }, "peerDependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@types/react": ">=16.8.0 <19.0.0", "@types/react-dom": ">=16.8.0 <19.0.0", "react": ">=16.8.0 <19.0.0", diff --git a/packages/cra-template/package.json b/packages/cra-template/package.json index 4b7d2b9b1a85d3..53539c3f54f811 100644 --- a/packages/cra-template/package.json +++ b/packages/cra-template/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/cra-template", - "version": "8.4.195", + "version": "8.4.196", "description": "Create React App template for Fluent UI React (@fluentui/react)", "repository": { "type": "git", diff --git a/packages/fluent2-theme/CHANGELOG.json b/packages/fluent2-theme/CHANGELOG.json index c98ffb340e50a4..5accf0e86228d6 100644 --- a/packages/fluent2-theme/CHANGELOG.json +++ b/packages/fluent2-theme/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/fluent2-theme", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:23 GMT", + "tag": "@fluentui/fluent2-theme_v8.107.123", + "version": "8.107.123", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/fluent2-theme", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/fluent2-theme_v8.107.122", diff --git a/packages/fluent2-theme/CHANGELOG.md b/packages/fluent2-theme/CHANGELOG.md index 20c6586e7c4892..669e0f54e84205 100644 --- a/packages/fluent2-theme/CHANGELOG.md +++ b/packages/fluent2-theme/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/fluent2-theme -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. <!-- Start content --> +## [8.107.123](https://github.com/microsoft/fluentui/tree/@fluentui/fluent2-theme_v8.107.123) + +Mon, 13 Jan 2025 07:21:23 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/fluent2-theme_v8.107.122..@fluentui/fluent2-theme_v8.107.123) + +### Patches + +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [8.107.122](https://github.com/microsoft/fluentui/tree/@fluentui/fluent2-theme_v8.107.122) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/fluent2-theme/package.json b/packages/fluent2-theme/package.json index 390598b19b7209..c9bd931fde9043 100644 --- a/packages/fluent2-theme/package.json +++ b/packages/fluent2-theme/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/fluent2-theme", - "version": "8.107.122", + "version": "8.107.123", "description": "A Fluent2 theme for Fluent UI React 8.x", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" } diff --git a/packages/react-cards/CHANGELOG.json b/packages/react-cards/CHANGELOG.json index 4cbe3386256270..894fc0a4338fa7 100644 --- a/packages/react-cards/CHANGELOG.json +++ b/packages/react-cards/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-cards", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:23 GMT", + "tag": "@fluentui/react-cards_v0.205.195", + "version": "0.205.195", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-cards", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/react-cards_v0.205.194", diff --git a/packages/react-cards/CHANGELOG.md b/packages/react-cards/CHANGELOG.md index 6b5143a5965031..8842b2aa64790c 100644 --- a/packages/react-cards/CHANGELOG.md +++ b/packages/react-cards/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-cards -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. <!-- Start content --> +## [0.205.195](https://github.com/microsoft/fluentui/tree/@fluentui/react-cards_v0.205.195) + +Mon, 13 Jan 2025 07:21:23 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-cards_v0.205.194..@fluentui/react-cards_v0.205.195) + +### Patches + +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [0.205.194](https://github.com/microsoft/fluentui/tree/@fluentui/react-cards_v0.205.194) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/react-cards/package.json b/packages/react-cards/package.json index b4577baff1d012..d3b373b949b12f 100644 --- a/packages/react-cards/package.json +++ b/packages/react-cards/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-cards", - "version": "0.205.194", + "version": "0.205.195", "description": "Deprecated experimental Card container components for Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -33,7 +33,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@fluentui/foundation-legacy": "^8.4.23", "@fluentui/set-version": "^8.2.23", "@microsoft/load-themed-styles": "^1.10.26", diff --git a/packages/react-components/react-migration-v8-v9/library/package.json b/packages/react-components/react-migration-v8-v9/library/package.json index cddd7a5f762af6..47f25425991e63 100644 --- a/packages/react-components/react-migration-v8-v9/library/package.json +++ b/packages/react-components/react-migration-v8-v9/library/package.json @@ -19,8 +19,8 @@ }, "dependencies": { "@ctrl/tinycolor": "3.3.4", - "@fluentui/fluent2-theme": "^8.107.122", - "@fluentui/react": "^8.122.5", + "@fluentui/fluent2-theme": "^8.107.123", + "@fluentui/react": "^8.122.6", "@fluentui/react-components": "^9.57.0", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-hooks": "^8.8.16", diff --git a/packages/react-date-time/CHANGELOG.json b/packages/react-date-time/CHANGELOG.json index e294f99c2f0f5f..ae36148a7907cd 100644 --- a/packages/react-date-time/CHANGELOG.json +++ b/packages/react-date-time/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-date-time", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:23 GMT", + "tag": "@fluentui/react-date-time_v8.7.195", + "version": "8.7.195", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-date-time", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/react-date-time_v8.7.194", diff --git a/packages/react-date-time/CHANGELOG.md b/packages/react-date-time/CHANGELOG.md index efce8ba0cfdd80..b49bc61fd8e02c 100644 --- a/packages/react-date-time/CHANGELOG.md +++ b/packages/react-date-time/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-date-time -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. <!-- Start content --> +## [8.7.195](https://github.com/microsoft/fluentui/tree/@fluentui/react-date-time_v8.7.195) + +Mon, 13 Jan 2025 07:21:23 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-date-time_v8.7.194..@fluentui/react-date-time_v8.7.195) + +### Patches + +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [8.7.194](https://github.com/microsoft/fluentui/tree/@fluentui/react-date-time_v8.7.194) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/react-date-time/package.json b/packages/react-date-time/package.json index 1efd230ad16fcc..f487bb5a933dac 100644 --- a/packages/react-date-time/package.json +++ b/packages/react-date-time/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-date-time", - "version": "8.7.194", + "version": "8.7.195", "description": "Date and time related React components for building experiences for Microsoft 365.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" }, diff --git a/packages/react-docsite-components/CHANGELOG.json b/packages/react-docsite-components/CHANGELOG.json index 953fe83726c9bd..5d7a22a2596c23 100644 --- a/packages/react-docsite-components/CHANGELOG.json +++ b/packages/react-docsite-components/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-docsite-components", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:23 GMT", + "tag": "@fluentui/react-docsite-components_v8.13.160", + "version": "8.13.160", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + }, + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react-monaco-editor to v1.7.278", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/react-docsite-components_v8.13.159", diff --git a/packages/react-docsite-components/CHANGELOG.md b/packages/react-docsite-components/CHANGELOG.md index c79eb080c69f62..33839b07639803 100644 --- a/packages/react-docsite-components/CHANGELOG.md +++ b/packages/react-docsite-components/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-docsite-components -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. <!-- Start content --> +## [8.13.160](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.160) + +Mon, 13 Jan 2025 07:21:23 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-docsite-components_v8.13.159..@fluentui/react-docsite-components_v8.13.160) + +### Patches + +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) +- Bump @fluentui/react-monaco-editor to v1.7.278 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [8.13.159](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.159) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/react-docsite-components/package.json b/packages/react-docsite-components/package.json index 30d1083227846e..f4ee726ea14112 100644 --- a/packages/react-docsite-components/package.json +++ b/packages/react-docsite-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-docsite-components", - "version": "8.13.159", + "version": "8.13.160", "description": "Fluent UI React components for building documentation sites.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -35,14 +35,14 @@ "react-dom": ">=16.8.0 <19.0.0" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@fluentui/theme": "^2.6.64", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", "@fluentui/public-docsite-setup": "^0.3.34", "@fluentui/react-hooks": "^8.8.16", "@fluentui/set-version": "^8.2.23", - "@fluentui/react-monaco-editor": "^1.7.277", + "@fluentui/react-monaco-editor": "^1.7.278", "color-check": "0.0.2", "markdown-to-jsx": "^7.0.0", "office-ui-fabric-core": "^11.0.0", diff --git a/packages/react-examples/package.json b/packages/react-examples/package.json index 6acc283a63b1da..4b8954b9a8ddac 100644 --- a/packages/react-examples/package.json +++ b/packages/react-examples/package.json @@ -27,18 +27,18 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/azure-themes": "^8.6.118", + "@fluentui/azure-themes": "^8.6.119", "@fluentui/date-time-utilities": "^8.6.9", "@fluentui/dom-utilities": "^2.3.9", "@fluentui/example-data": "^8.4.25", "@fluentui/font-icons-mdl2": "^8.5.57", "@fluentui/foundation-legacy": "^8.4.23", "@fluentui/merge-styles": "^8.6.13", - "@fluentui/react": "^8.122.5", - "@fluentui/react-cards": "^0.205.194", - "@fluentui/react-charting": "^5.23.39", - "@fluentui/react-docsite-components": "^8.13.159", - "@fluentui/react-experiments": "^8.14.191", + "@fluentui/react": "^8.122.6", + "@fluentui/react-cards": "^0.205.195", + "@fluentui/react-charting": "^5.23.40", + "@fluentui/react-docsite-components": "^8.13.160", + "@fluentui/react-experiments": "^8.14.192", "@fluentui/react-file-type-icons": "^8.12.7", "@fluentui/react-focus": "^8.9.20", "@fluentui/react-hooks": "^8.8.16", @@ -47,7 +47,7 @@ "@fluentui/scheme-utilities": "^8.3.65", "@fluentui/style-utilities": "^8.11.6", "@fluentui/theme": "^2.6.64", - "@fluentui/theme-samples": "^8.7.194", + "@fluentui/theme-samples": "^8.7.195", "@fluentui/utilities": "^8.15.19", "@microsoft/load-themed-styles": "^1.10.26", "d3-fetch": "3.0.1", diff --git a/packages/react-experiments/CHANGELOG.json b/packages/react-experiments/CHANGELOG.json index d0177c7041f7a3..868b4ed9328a7a 100644 --- a/packages/react-experiments/CHANGELOG.json +++ b/packages/react-experiments/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-experiments", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:23 GMT", + "tag": "@fluentui/react-experiments_v8.14.192", + "version": "8.14.192", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-experiments", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/react-experiments_v8.14.191", diff --git a/packages/react-experiments/CHANGELOG.md b/packages/react-experiments/CHANGELOG.md index 597552adf1297e..b60f783ca0d8a9 100644 --- a/packages/react-experiments/CHANGELOG.md +++ b/packages/react-experiments/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-experiments -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. <!-- Start content --> +## [8.14.192](https://github.com/microsoft/fluentui/tree/@fluentui/react-experiments_v8.14.192) + +Mon, 13 Jan 2025 07:21:23 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-experiments_v8.14.191..@fluentui/react-experiments_v8.14.192) + +### Patches + +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [8.14.191](https://github.com/microsoft/fluentui/tree/@fluentui/react-experiments_v8.14.191) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/react-experiments/package.json b/packages/react-experiments/package.json index e2658817839fe1..f01f7b540cd0c9 100644 --- a/packages/react-experiments/package.json +++ b/packages/react-experiments/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-experiments", - "version": "8.14.191", + "version": "8.14.192", "description": "Experimental React components for building experiences for Microsoft 365.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -38,7 +38,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@fluentui/theme": "^2.6.64", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", diff --git a/packages/react-monaco-editor/CHANGELOG.json b/packages/react-monaco-editor/CHANGELOG.json index b649aef893a820..a9165e4ed2632c 100644 --- a/packages/react-monaco-editor/CHANGELOG.json +++ b/packages/react-monaco-editor/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-monaco-editor", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:23 GMT", + "tag": "@fluentui/react-monaco-editor_v1.7.278", + "version": "1.7.278", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + }, + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react-charting to v5.23.40", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/react-monaco-editor_v1.7.277", diff --git a/packages/react-monaco-editor/CHANGELOG.md b/packages/react-monaco-editor/CHANGELOG.md index 2610eace648b0d..347343e2e9ed51 100644 --- a/packages/react-monaco-editor/CHANGELOG.md +++ b/packages/react-monaco-editor/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-monaco-editor -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. <!-- Start content --> +## [1.7.278](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.278) + +Mon, 13 Jan 2025 07:21:23 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-monaco-editor_v1.7.277..@fluentui/react-monaco-editor_v1.7.278) + +### Patches + +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) +- Bump @fluentui/react-charting to v5.23.40 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [1.7.277](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.277) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/react-monaco-editor/package.json b/packages/react-monaco-editor/package.json index de09ff4bbac275..661f83943e8eef 100644 --- a/packages/react-monaco-editor/package.json +++ b/packages/react-monaco-editor/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-monaco-editor", - "version": "1.7.277", + "version": "1.7.278", "description": "Live React example editing using monaco", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -29,12 +29,12 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", "@fluentui/monaco-editor": "^1.3.24", "@fluentui/react-hooks": "^8.8.16", - "@fluentui/react-charting": "^5.23.39", + "@fluentui/react-charting": "^5.23.40", "raw-loader": "4.0.2", "react-syntax-highlighter": "^10.1.3", "tslib": "^2.1.0" diff --git a/packages/react/CHANGELOG.json b/packages/react/CHANGELOG.json index cb5cd89cc85b01..88716d9606fe0a 100644 --- a/packages/react/CHANGELOG.json +++ b/packages/react/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:22 GMT", + "tag": "@fluentui/react_v8.122.6", + "version": "8.122.6", + "comments": { + "patch": [ + { + "author": "behowell@microsoft.com", + "package": "@fluentui/react", + "commit": "74641ca04daeda5a6cd644513351d675ccd4dbad", + "comment": "fix: Remove deprecation warning from Callout's preventDismissOnResize and similar props" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/react_v8.122.5", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index dbf76e1ebe0846..7d8b9d600a8490 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:22 GMT and should not be manually modified. <!-- Start content --> +## [8.122.6](https://github.com/microsoft/fluentui/tree/@fluentui/react_v8.122.6) + +Mon, 13 Jan 2025 07:21:22 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react_v8.122.5..@fluentui/react_v8.122.6) + +### Patches + +- fix: Remove deprecation warning from Callout's preventDismissOnResize and similar props ([PR #33493](https://github.com/microsoft/fluentui/pull/33493) by behowell@microsoft.com) + ## [8.122.5](https://github.com/microsoft/fluentui/tree/@fluentui/react_v8.122.5) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/react/package.json b/packages/react/package.json index 90b98f3293d83b..8a452f08378d43 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react", - "version": "8.122.5", + "version": "8.122.6", "description": "Reusable React components for building web experiences.", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/storybook/package.json b/packages/storybook/package.json index ccf3ca88252d40..97be09debf8faf 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -22,11 +22,11 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@fluentui/theme": "^2.6.64", "@storybook/addon-essentials": "7.6.20", - "@fluentui/azure-themes": "^8.6.118", - "@fluentui/theme-samples": "^8.7.194", + "@fluentui/azure-themes": "^8.6.119", + "@fluentui/theme-samples": "^8.7.195", "tslib": "^2.1.0" }, "peerDependencies": { diff --git a/packages/theme-samples/CHANGELOG.json b/packages/theme-samples/CHANGELOG.json index b54d2d9b34977f..694a5edcd67cdf 100644 --- a/packages/theme-samples/CHANGELOG.json +++ b/packages/theme-samples/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/theme-samples", "entries": [ + { + "date": "Mon, 13 Jan 2025 07:21:23 GMT", + "tag": "@fluentui/theme-samples_v8.7.195", + "version": "8.7.195", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/theme-samples", + "comment": "Bump @fluentui/react to v8.122.6", + "commit": "bf60a56cb23b3af90bcb62462c2423468eb9fa3c" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 07:21:37 GMT", "tag": "@fluentui/theme-samples_v8.7.194", diff --git a/packages/theme-samples/CHANGELOG.md b/packages/theme-samples/CHANGELOG.md index 4f840e8fc6bd63..e21be703fbb89f 100644 --- a/packages/theme-samples/CHANGELOG.md +++ b/packages/theme-samples/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/theme-samples -This log was last generated on Wed, 08 Jan 2025 07:21:37 GMT and should not be manually modified. +This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. <!-- Start content --> +## [8.7.195](https://github.com/microsoft/fluentui/tree/@fluentui/theme-samples_v8.7.195) + +Mon, 13 Jan 2025 07:21:23 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/theme-samples_v8.7.194..@fluentui/theme-samples_v8.7.195) + +### Patches + +- Bump @fluentui/react to v8.122.6 ([PR #33148](https://github.com/microsoft/fluentui/pull/33148) by beachball) + ## [8.7.194](https://github.com/microsoft/fluentui/tree/@fluentui/theme-samples_v8.7.194) Wed, 08 Jan 2025 07:21:37 GMT diff --git a/packages/theme-samples/package.json b/packages/theme-samples/package.json index 53714d03b041ed..c89e224f28e127 100644 --- a/packages/theme-samples/package.json +++ b/packages/theme-samples/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/theme-samples", - "version": "8.7.194", + "version": "8.7.195", "description": "Sample themes for use with Fabric components.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -26,7 +26,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.5", + "@fluentui/react": "^8.122.6", "@fluentui/set-version": "^8.2.23", "@fluentui/scheme-utilities": "^8.3.65", "tslib": "^2.1.0" From e561700253aaaf2c6e17e5c70bf10c12c434bd96 Mon Sep 17 00:00:00 2001 From: Mason Tejera <17346018+mltejera@users.noreply.github.com> Date: Mon, 13 Jan 2025 18:45:46 +0000 Subject: [PATCH 22/78] [Fix](react-nav-preview): Changing nav item hover animation curves. (#33633) --- ...t-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json | 7 +++++++ .../library/src/components/sharedNavStyles.styles.ts | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 change/@fluentui-react-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json diff --git a/change/@fluentui-react-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json b/change/@fluentui-react-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json new file mode 100644 index 00000000000000..f180fa0c84851c --- /dev/null +++ b/change/@fluentui-react-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix - changing hover animation curve to linear.", + "packageName": "@fluentui/react-nav-preview", + "email": "matejera@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts b/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts index fdcf64730d34d0..43b9b4a28dae55 100644 --- a/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts +++ b/packages/react-components/react-nav-preview/library/src/components/sharedNavStyles.styles.ts @@ -15,11 +15,11 @@ export const navItemTokens = { animationTokens: { animationDuration: tokens.durationFaster, animationFillMode: 'both', - animationTimingFunction: tokens.curveAccelerateMid, + animationTimingFunction: tokens.curveLinear, }, transitionTokens: { transitionDuration: tokens.durationFaster, - transitionTimingFunction: tokens.curveAccelerateMid, + transitionTimingFunction: tokens.curveLinear, transitionProperty: 'background', }, }; From e7a954abbbe42a13ba302f28710a908cd34b72b9 Mon Sep 17 00:00:00 2001 From: Makoto Morimoto <Humberto.Morimoto@microsoft.com> Date: Mon, 13 Jan 2025 15:57:34 -0800 Subject: [PATCH 23/78] chore: Moving `@ctrl/tinycolor` dependency to be a caret dependency in production packages (#33611) Co-authored-by: Humberto Makoto Morimoto Burgos <makotom@microsoft.com> Co-authored-by: Martin Hochel <hochelmartin@gmail.com> --- ...icker-preview-8a924d25-d099-4172-ab21-290a69090030.json | 7 +++++++ ...gration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json | 7 +++++++ .../react-color-picker-preview/library/package.json | 2 +- .../react-color-picker-preview/stories/package.json | 1 - .../react-migration-v8-v9/library/package.json | 2 +- yarn.lock | 2 +- 6 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 change/@fluentui-react-color-picker-preview-8a924d25-d099-4172-ab21-290a69090030.json create mode 100644 change/@fluentui-react-migration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json diff --git a/change/@fluentui-react-color-picker-preview-8a924d25-d099-4172-ab21-290a69090030.json b/change/@fluentui-react-color-picker-preview-8a924d25-d099-4172-ab21-290a69090030.json new file mode 100644 index 00000000000000..448468fae0103b --- /dev/null +++ b/change/@fluentui-react-color-picker-preview-8a924d25-d099-4172-ab21-290a69090030.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages.", + "packageName": "@fluentui/react-color-picker-preview", + "email": "makotom@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-migration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json b/change/@fluentui-react-migration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json new file mode 100644 index 00000000000000..dac1b4b49e6557 --- /dev/null +++ b/change/@fluentui-react-migration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages.", + "packageName": "@fluentui/react-migration-v8-v9", + "email": "makotom@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-color-picker-preview/library/package.json b/packages/react-components/react-color-picker-preview/library/package.json index 6f3f46d0a1615c..04b24ee067e828 100644 --- a/packages/react-components/react-color-picker-preview/library/package.json +++ b/packages/react-components/react-color-picker-preview/library/package.json @@ -24,7 +24,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@ctrl/tinycolor": "3.3.4", + "@ctrl/tinycolor": "^3.3.4", "@fluentui/react-context-selector": "^9.1.71", "@fluentui/react-jsx-runtime": "^9.0.49", "@fluentui/react-shared-contexts": "^9.21.2", diff --git a/packages/react-components/react-color-picker-preview/stories/package.json b/packages/react-components/react-color-picker-preview/stories/package.json index 9659abb1243b41..43f559899ccdb3 100644 --- a/packages/react-components/react-color-picker-preview/stories/package.json +++ b/packages/react-components/react-color-picker-preview/stories/package.json @@ -3,7 +3,6 @@ "version": "0.0.0", "private": true, "devDependencies": { - "@ctrl/tinycolor": "3.3.4", "@fluentui/react-components": "*", "@fluentui/react-color-picker-preview": "*", "@fluentui/react-storybook-addon": "*", diff --git a/packages/react-components/react-migration-v8-v9/library/package.json b/packages/react-components/react-migration-v8-v9/library/package.json index 47f25425991e63..c7cc7dd2fc481f 100644 --- a/packages/react-components/react-migration-v8-v9/library/package.json +++ b/packages/react-components/react-migration-v8-v9/library/package.json @@ -18,7 +18,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@ctrl/tinycolor": "3.3.4", + "@ctrl/tinycolor": "^3.3.4", "@fluentui/fluent2-theme": "^8.107.123", "@fluentui/react": "^8.122.6", "@fluentui/react-components": "^9.57.0", diff --git a/yarn.lock b/yarn.lock index 778a15f50d30c8..5885094de87ceb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1498,7 +1498,7 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@ctrl/tinycolor@3.3.4": +"@ctrl/tinycolor@3.3.4", "@ctrl/tinycolor@^3.3.4": version "3.3.4" resolved "https://registry.yarnpkg.com/@ctrl/tinycolor/-/tinycolor-3.3.4.tgz#59691edd031eedc431bda1bdf601257c06289a40" integrity sha512-8vmPV/nIULFDWsnJalQJDqFLC2uTPx6A/ASA2t27QGp+7oXnbWWXCe0uV8xasIH2rGbI/XoB2vmkdP/94WvMrw== From 5964b11d0ac272f2ae10e1081b8f0d1e17497eef Mon Sep 17 00:00:00 2001 From: "Atishay Jain (atisjai)" <98592573+AtishayMsft@users.noreply.github.com> Date: Tue, 14 Jan 2025 05:46:45 +0530 Subject: [PATCH 24/78] feat(chart-web-components): Create chart web components - Donut and Horizontal Bar Chart (#33084) Co-authored-by: Anush Gupta <74965306+Anush2303@users.noreply.github.com> Co-authored-by: krkshitij <110246001+krkshitij@users.noreply.github.com> Co-authored-by: v-baambati <132879294+v-baambati@users.noreply.github.com> Co-authored-by: Kumar Kshitij <kumarkshitij@microsoft.com> --- .github/CODEOWNERS | 1 + apps/pr-deploy-site/just.config.ts | 1 + apps/pr-deploy-site/pr-deploy-site.js | 6 + ...-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json | 7 + .../charts/chart-web-components/.eslintignore | 8 + .../chart-web-components/.eslintrc.json | 74 ++ .../charts/chart-web-components/.gitignore | 1 + .../.storybook/docs-root.css | 473 ++++++++++++ .../chart-web-components/.storybook/main.cjs | 88 +++ .../.storybook/manager-head.html | 118 +++ .../.storybook/manager.mjs | 14 + .../.storybook/preview-body.html | 9 + .../.storybook/preview.mjs | 69 ++ .../chart-web-components/.storybook/theme.mjs | 34 + .../.storybook/tsconfig.json | 10 + .../charts/chart-web-components/README.md | 26 + .../chart-web-components/api-extractor.json | 35 + .../chart-web-components/docs/api-report.md | 150 ++++ .../charts/chart-web-components/package.json | 119 +++ .../chart-web-components/playwright.config.ts | 31 + .../charts/chart-web-components/project.json | 10 + .../public/SegoeUI-VF.ttf | Bin 0 -> 1844524 bytes .../chart-web-components/public/favicon.ico | Bin 0 -> 17174 bytes .../chart-web-components/public/favicon.png | Bin 0 -> 17174 bytes .../chart-web-components/public/shell.css | 82 ++ .../chart-web-components/rollup.bench.js | 21 + .../chart-web-components/rollup.config.js | 48 ++ .../chart-web-components/scripts/clean.js | 53 ++ .../chart-web-components/scripts/compile.js | 28 + .../scripts/run-benchmarks.js | 47 ++ .../scripts/setup-browser.cjs | 14 + .../scripts/transform-fragments.js | 34 + .../scripts/type-check.js | 63 ++ .../scripts/verify-packaging.js | 79 ++ .../src/donut-chart/define.ts | 4 + .../src/donut-chart/donut-chart.bench.ts | 12 + .../src/donut-chart/donut-chart.definition.ts | 18 + .../src/donut-chart/donut-chart.options.ts | 45 ++ .../src/donut-chart/donut-chart.spec.ts | 139 ++++ .../src/donut-chart/donut-chart.stories.ts | 39 + .../src/donut-chart/donut-chart.styles.ts | 159 ++++ .../src/donut-chart/donut-chart.template.ts | 70 ++ .../src/donut-chart/donut-chart.ts | 257 ++++++ .../src/donut-chart/index.ts | 4 + .../src/helpers.stories.ts | 101 +++ .../chart-web-components/src/helpers.tests.ts | 86 +++ .../src/horizontal-bar-chart/define.ts | 4 + .../horizontal-bar-chart.bench.ts | 12 + .../horizontal-bar-chart.definition.ts | 20 + .../horizontal-bar-chart.options.ts | 50 ++ .../horizontal-bar-chart.spec.ts | 730 ++++++++++++++++++ .../horizontal-bar-chart.stories.ts | 389 ++++++++++ .../horizontal-bar-chart.styles.ts | 190 +++++ .../horizontal-bar-chart.template.ts | 66 ++ .../horizontal-bar-chart.ts | 462 +++++++++++ .../src/horizontal-bar-chart/index.ts | 4 + .../chart-web-components/src/index-rollup.ts | 2 + .../charts/chart-web-components/src/index.ts | 7 + .../src/utils/benchmark-wrapper.ts | 22 + .../src/utils/chart-helpers.ts | 193 +++++ .../chart-web-components/tensile.config.js | 25 + .../tsconfig.api-extractor.json | 7 + .../charts/chart-web-components/tsconfig.json | 22 + .../chart-web-components/tsconfig.lib.json | 14 + .../chart-web-components/tsconfig.spec.json | 9 + .../charts/chart-web-components/tsdoc.json | 44 ++ tsconfig.base.wc.json | 1 + 67 files changed, 4960 insertions(+) create mode 100644 change/@fluentui-chart-web-components-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json create mode 100644 packages/charts/chart-web-components/.eslintignore create mode 100644 packages/charts/chart-web-components/.eslintrc.json create mode 100644 packages/charts/chart-web-components/.gitignore create mode 100644 packages/charts/chart-web-components/.storybook/docs-root.css create mode 100644 packages/charts/chart-web-components/.storybook/main.cjs create mode 100644 packages/charts/chart-web-components/.storybook/manager-head.html create mode 100644 packages/charts/chart-web-components/.storybook/manager.mjs create mode 100644 packages/charts/chart-web-components/.storybook/preview-body.html create mode 100644 packages/charts/chart-web-components/.storybook/preview.mjs create mode 100644 packages/charts/chart-web-components/.storybook/theme.mjs create mode 100644 packages/charts/chart-web-components/.storybook/tsconfig.json create mode 100644 packages/charts/chart-web-components/README.md create mode 100644 packages/charts/chart-web-components/api-extractor.json create mode 100644 packages/charts/chart-web-components/docs/api-report.md create mode 100644 packages/charts/chart-web-components/package.json create mode 100644 packages/charts/chart-web-components/playwright.config.ts create mode 100644 packages/charts/chart-web-components/project.json create mode 100644 packages/charts/chart-web-components/public/SegoeUI-VF.ttf create mode 100644 packages/charts/chart-web-components/public/favicon.ico create mode 100644 packages/charts/chart-web-components/public/favicon.png create mode 100644 packages/charts/chart-web-components/public/shell.css create mode 100644 packages/charts/chart-web-components/rollup.bench.js create mode 100644 packages/charts/chart-web-components/rollup.config.js create mode 100644 packages/charts/chart-web-components/scripts/clean.js create mode 100644 packages/charts/chart-web-components/scripts/compile.js create mode 100644 packages/charts/chart-web-components/scripts/run-benchmarks.js create mode 100644 packages/charts/chart-web-components/scripts/setup-browser.cjs create mode 100644 packages/charts/chart-web-components/scripts/transform-fragments.js create mode 100644 packages/charts/chart-web-components/scripts/type-check.js create mode 100644 packages/charts/chart-web-components/scripts/verify-packaging.js create mode 100644 packages/charts/chart-web-components/src/donut-chart/define.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/donut-chart.bench.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/donut-chart.definition.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/donut-chart.options.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/donut-chart.spec.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/donut-chart.stories.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/donut-chart.styles.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/donut-chart.template.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/donut-chart.ts create mode 100644 packages/charts/chart-web-components/src/donut-chart/index.ts create mode 100644 packages/charts/chart-web-components/src/helpers.stories.ts create mode 100644 packages/charts/chart-web-components/src/helpers.tests.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/define.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.bench.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.definition.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.options.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.spec.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.stories.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.styles.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.template.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.ts create mode 100644 packages/charts/chart-web-components/src/horizontal-bar-chart/index.ts create mode 100644 packages/charts/chart-web-components/src/index-rollup.ts create mode 100644 packages/charts/chart-web-components/src/index.ts create mode 100644 packages/charts/chart-web-components/src/utils/benchmark-wrapper.ts create mode 100644 packages/charts/chart-web-components/src/utils/chart-helpers.ts create mode 100644 packages/charts/chart-web-components/tensile.config.js create mode 100644 packages/charts/chart-web-components/tsconfig.api-extractor.json create mode 100644 packages/charts/chart-web-components/tsconfig.json create mode 100644 packages/charts/chart-web-components/tsconfig.lib.json create mode 100644 packages/charts/chart-web-components/tsconfig.spec.json create mode 100644 packages/charts/chart-web-components/tsdoc.json diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 397bb53cbb7247..6822b498246488 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -134,6 +134,7 @@ apps/chart-docsite @microsoft/charting-team #### Packages packages/azure-themes @Jacqueline-ms @robtaft-ms packages/react-conformance @microsoft/fluentui-react-build +packages/charts/chart-web-components @microsoft/charting-team packages/charts/react-charting @microsoft/charting-team packages/charts/react-charts-preview/library @microsoft/charting-team packages/charts/react-charts-preview/stories @microsoft/charting-team diff --git a/apps/pr-deploy-site/just.config.ts b/apps/pr-deploy-site/just.config.ts index 4a9cff295e94a2..34244cfedaaf2b 100644 --- a/apps/pr-deploy-site/just.config.ts +++ b/apps/pr-deploy-site/just.config.ts @@ -24,6 +24,7 @@ const dependencies = [ '@fluentui/public-docsite', '@fluentui/react', '@fluentui/react-charting', + '@fluentui/chart-web-components', '@fluentui/chart-docsite', '@fluentui/public-docsite-v9', '@fluentui/react-experiments', diff --git a/apps/pr-deploy-site/pr-deploy-site.js b/apps/pr-deploy-site/pr-deploy-site.js index c16475726733a1..ce4b6278494d8b 100644 --- a/apps/pr-deploy-site/pr-deploy-site.js +++ b/apps/pr-deploy-site/pr-deploy-site.js @@ -60,6 +60,12 @@ var siteInfo = [ icon: 'BarChart4', title: 'Charting', }, + { + package: '@fluentui/chart-web-components', + link: './chart-web-components/storybook/index.html', + icon: 'BarChart4', + title: 'Chart web components', + }, { package: '@fluentui/theming-designer', link: './theming-designer/index.html', diff --git a/change/@fluentui-chart-web-components-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json b/change/@fluentui-chart-web-components-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json new file mode 100644 index 00000000000000..c610fda40decf5 --- /dev/null +++ b/change/@fluentui-chart-web-components-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "Create chart web components. Includes donut chart and horizontal bar chart", + "packageName": "@fluentui/chart-web-components", + "email": "98592573+AtishayMsft@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/chart-web-components/.eslintignore b/packages/charts/chart-web-components/.eslintignore new file mode 100644 index 00000000000000..ba38ef5432888d --- /dev/null +++ b/packages/charts/chart-web-components/.eslintignore @@ -0,0 +1,8 @@ +# don't ever lint node_modules +node_modules +# don't lint build output (make sure it's set to your correct build folder name) +dist +# don't lint coverage output +coverage +# don't lint storybook +.storybook diff --git a/packages/charts/chart-web-components/.eslintrc.json b/packages/charts/chart-web-components/.eslintrc.json new file mode 100644 index 00000000000000..3d5876196e9baa --- /dev/null +++ b/packages/charts/chart-web-components/.eslintrc.json @@ -0,0 +1,74 @@ +{ + "root": true, + "parser": "@typescript-eslint/parser", + "plugins": ["@typescript-eslint", "import"], + "extends": [ + "eslint:recommended", + "plugin:@typescript-eslint/eslint-recommended", + "plugin:@typescript-eslint/recommended", + "prettier", + "plugin:playwright/recommended" + ], + "settings": { + "react": { + "version": "latest" + } + }, + "rules": { + "no-empty": [ + "error", + { + "allowEmptyCatch": true + } + ], + "no-extra-boolean-cast": "off", + "no-prototype-builtins": "off", + "no-fallthrough": "off", + "no-unexpected-multiline": "off", + "no-useless-escape": "off", + "import/order": "error", + "sort-imports": [ + "error", + { + "ignoreCase": true, + "ignoreDeclarationSort": true + } + ], + "comma-dangle": "off", + "@typescript-eslint/no-non-null-assertion": "off", + "@typescript-eslint/no-use-before-define": "off", + "@typescript-eslint/no-empty-interface": "error", + "@typescript-eslint/no-empty-object-type": "off", + "@typescript-eslint/no-unsafe-declaration-merging": "off", + "@typescript-eslint/explicit-module-boundary-types": "off", + "@typescript-eslint/explicit-function-return-type": "off", + "@typescript-eslint/camelcase": "off", + "@typescript-eslint/no-inferrable-types": "off", + "@typescript-eslint/no-unused-vars": [ + "warn", + { + "args": "none" + } + ], + "@typescript-eslint/no-unused-expressions": "warn", + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/naming-convention": [ + "error", + { + "selector": "default", + "format": ["UPPER_CASE", "camelCase", "PascalCase"], + "leadingUnderscore": "allow" + }, + { + "selector": "property", + "format": null // disable for property names because of our foo__expanded convention for JSS + // TODO: I think we can come up with a regex that ignores variables with __ in them + }, + { + "selector": "variable", + "format": null // disable for variable names because of our foo__expanded convention for JSS + // TODO: I think we can come up with a regex that ignores variables with __ in them + } + ] + } +} diff --git a/packages/charts/chart-web-components/.gitignore b/packages/charts/chart-web-components/.gitignore new file mode 100644 index 00000000000000..51511d1f8f36f4 --- /dev/null +++ b/packages/charts/chart-web-components/.gitignore @@ -0,0 +1 @@ +test-results/ diff --git a/packages/charts/chart-web-components/.storybook/docs-root.css b/packages/charts/chart-web-components/.storybook/docs-root.css new file mode 100644 index 00000000000000..b24a61b6161347 --- /dev/null +++ b/packages/charts/chart-web-components/.storybook/docs-root.css @@ -0,0 +1,473 @@ +/* + * Heads Up! + * This file should be kept in sync with the `docs-root.css` file for the React v9 Storybook. + */ + +/* remove the docs wrapper bg to let page bg show through */ +#storybook-docs .sbdocs-wrapper { + background: transparent !important; +} + +/* sb-show-main is missing during page transitions causing a page shift */ +/* todo: cleanup once we no longer inherit docs-root */ +.sb-show-main.sb-main-fullscreen, +.sb-main-fullscreen { + margin: 0; + padding: 0; + display: block; +} + +#storybook-docs .sbdocs-content { + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + max-width: 1200px; +} + +#storybook-docs h1.sbdocs-title { + font-size: 44px; + line-height: 60px; + /* identical to box height, or 143% */ + font-weight: 900; + letter-spacing: -0.04em; + color: #000000; +} + +#storybook-docs details { + position: relative; + z-index: 99; +} + +#storybook-docs .sbdocs:not(.sbdocs-preview) p { + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + font-size: 18px; + line-height: 27px; + letter-spacing: -0.01em; + color: #000000; + margin-top: 24px; +} + +#storybook-docs .sbdocs-img.featured-image { + max-width: 100%; + margin: 48px 0; + display: block; +} + +#storybook-docs .sbdocs-img { + border-radius: 24px; +} + +#storybook-docs .sbdocs:not(.sbdocs-preview) hr { + margin: 48px 0; + height: 0; + border-top: 1px solid #ebebeb; +} + +#storybook-docs .sbdocs h2 { + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + font-size: 24px; + line-height: 28px; + letter-spacing: -0.04em; + color: black; + border-top: 1px solid #ebebeb; + border-bottom: none; + margin: 48px 0 15px 0; + padding: 48px 0 0 0; +} + +#storybook-docs .sbdocs h2 code { + border-radius: 4px; + font-size: 20px; +} + +#storybook-docs .sbdocs-h3 { + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + font-size: 18px; + line-height: 24px; + margin: 25px 0 0 0 !important; + letter-spacing: -0.01em; + color: #000000; +} + +#storybook-docs .sbdocs-h3 code { + border-radius: 3px; + font-size: 16px; +} + +/* Only apply to H3s inside of stories which have a parent with an ID */ +#storybook-docs [id] > .sbdocs-h3:before { + content: ''; + display: block; + height: 40px; + margin: -40px 0 0; +} + +#storybook-docs .sbdocs:not(.sbdocs-preview) li { + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 150%; + letter-spacing: -0.01em; + + /* Neutrals / Web / Gray 200 #1B1A19 */ + color: #1b1a19; + margin-top: 8px; +} + +#storybook-docs .sbdocs:not(.sbdocs-preview) ul { + margin: 12px 0; +} + +#storybook-docs .sbdocs-ul .sbdocs:not(.sbdocs-preview) li { + list-style: none; + position: relative; +} + +#storybook-docs .sbdocs-ul .sbdocs-li::before { + position: absolute; + content: '•'; + color: #8d8d8d; + top: 0; + left: -15px; +} + +#storybook-docs .sbdocs-ol .sbdocs-li::marker { + color: #8d8d8d; +} + +#storybook-docs .sbdocs-preview { + border-radius: 16px; + background: #fff; /* --colorBrandBackgroundInverted */ + padding: 0; + box-shadow: none; + border: 1px solid #d1d1d1; /* --colorNeutralStroke1 */ +} + +/* Apply the currently selected Fluent UI theme to the relevant areas of the docs */ +#storybook-docs .innerZoomElementWrapper > div { + box-sizing: border-box; +} + +/* fix mouse interactions for toolbar on first story */ +#storybook-docs .sbdocs-preview > .os-host { + /* The toolbar sits within the story content area and is position: absolute by default. */ + /* The story content overlays the toolbar making it non-interactive */ + /* We don't use z-index because the toolbar can still sometimes overlay story content (flyout menu) */ + /* The best solution is to use a static toolbar that is always outside the story content and interactive */ + position: static; +} + +#storybook-docs span + .sbdocs .docblock-argstable tbody tr td button { + color: #0078d4; + color: red; +} + +#storybook-docs .docs-story + div { + background: #11100f; +} + +#storybook-docs .sbdocs-content > div:last-child { + margin-bottom: 96px; +} + +#storybook-docs .docs-story > div { + padding: 0; + background: none; +} + +#storybook-docs .docs-story > div:last-child { + right: 31px; + border-radius: 24px; +} + +.docs-story + div > div:last-child { + background: #000000; + box-shadow: 0px 0px 4px rgba(0, 0, 0, 0.25); + border-radius: 5px 5px 0px 0px; + right: 31px; +} + +.docs-story + div > div:last-child > button { + color: white; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + font-size: 14px; + line-height: 150%; + text-align: center; + letter-spacing: -0.01em; +} + +#storybook-docs a.sbdocs-a { + color: #0078d4; + text-decoration: underline; +} + +/* */ +/* Args Table */ +/* */ + +#storybook-docs .docblock-argstable tbody { + box-shadow: none; + border-left: none; + border-right: none; +} + +#storybook-docs .docblock-argstable-head th { + letter-spacing: -0.01em; + color: black; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 150%; + font-weight: 600; +} + +#storybook-docs thead.docblock-argstable-head { + border-bottom: 1px solid #edebe9; +} + +#storybook-docs .docblock-argstable tbody tr { + border: none; +} + +#storybook-docs table.docblock-argstable tbody.docblock-argstable-body td, +#storybook-docs .docblock-argstable th { + padding-top: 12px; + padding-bottom: 12px; + padding-left: 16px; +} + +#storybook-docs .docblock-argstable tbody tr td:nth-child(1) span { + font-weight: normal; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 130%; + letter-spacing: -0.01em; + color: #616161; +} + +#storybook-docs .docblock-argstable tbody tr td { + vertical-align: top; +} + +#storybook-docs .docblock-argstable-body > tr > td > div > div > button { + color: #0078d4; + line-height: 21px; +} + +#storybook-docs code, +#storybook-docs .docblock-argstable tbody tr td:nth-child(3) > div > span, +#storybook-docs .docblock-argstable-body > tr > td:nth-child(2) > div:nth-child(2) span, +#storybook-docs .docblock-argstable-body > tr > td:nth-child(2) > div:nth-child(1) > div > span, +#storybook-docs .css-16d4d7t { + font-family: 'Cascadia Code', Menlo, 'Courier New', Courier, monospace; + font-style: normal; + font-weight: normal; + font-size: 14px; + line-height: 130%; + letter-spacing: -0.2px; + box-decoration-break: clone; + -webkit-box-decoration-break: clone; +} + +#storybook-docs code.sbdocs-code, +#storybook-docs .sbdocs-p code, +#storybook-docs .sbdocs-li code, +#storybook-docs .docblock-argstable code, +#storybook-docs .docblock-argstable tbody tr td:nth-child(3) > div > span, +#storybook-docs .docblock-argstable-body > tr > td:nth-child(2) > div:nth-child(2) span, +#storybook-docs .docblock-argstable-body > tr > td:nth-child(2) > div:nth-child(1) > div > span, +#storybook-docs .css-16d4d7t { + font-size: 14px; + background: #f0f0f0; + border-radius: 4px; + padding: 1px 4px; + margin: 0 3px 0 3px; + color: black; + border: none; + line-height: 1.5; +} + +#storybook-docs .docblock-argstable code { + white-space: normal; +} + +#storybook-docs code { + padding: 0.1em 0.2em; + display: inline-block; + background-color: rgba(17, 16, 15, 0.1); + border-radius: 2px; + width: fit-content; /* prevent wrapping kebab-case words when they'll fit on one line */ +} + +.os-content-glue { + width: auto !important; +} + +#storybook-docs .sbdocs-preview .prismjs { + overflow: hidden; +} + +#storybook-docs .os-content .prismjs * { + font-family: 'Cascadia Code', Menlo, 'Courier New', Courier, monospace; + font-size: 14px; + line-height: 1.4em; +} + +#storybook-docs .sbdocs-preview .prismjs code { + color: white; + background: #11100f; + margin: 0; + overflow-x: auto; +} + +#storybook-docs .docblock-argstable-body td > div > p, +#storybook-docs .docblock-argstable-body > tr > td:nth-child(2) p, +#storybook-docs .docblock-argstable-body > tr > td:nth-child(2) > div:nth-child(1) > span { + font-family: 'Segoe UI', 'Segoe UI Web (West European)', -apple-system, BlinkMacSystemFont, Roboto, 'Helvetica Neue', + sans-serif; + font-size: 16px; + line-height: 130%; + color: black; + letter-spacing: -0.01em; +} + +#storybook-docs .docblock-argstable tr > :nth-child(1) { + width: 10%; +} + +#storybook-docs .docblock-argstable tr > :nth-child(2) { + width: 60%; +} + +#storybook-docs .os-padding { + z-index: 0; +} + +@font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI Light'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.ttf) format('truetype'); + font-weight: 100; +} + +@font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI Semilight'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.ttf) format('truetype'); + font-weight: 200; +} + +@font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.ttf) format('truetype'); + font-weight: 400; +} + +@font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI Semibold'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.ttf) format('truetype'); + font-weight: 600; +} + +@font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI Bold'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.ttf) format('truetype'); + font-weight: 700; +} + +body, +body p, +body ul, +body ul li { + font-family: 'Segoe UI' !important; +} + +h1.fluent { + font-weight: 700; + font-size: 40px; + font-family: 'Segoe UI'; + line-height: 60px; + letter-spacing: -0.16px; +} + +h1 .fluent-version { + display: block; + font-size: 24px; /* --font-size-base-600 */ + line-height: 32px; + color: #707070; /* --color-neutral-foreground-3 */ +} + +h2.fluent { + font-weight: 600; + font-size: 24px; + font-family: 'Segoe UI'; + line-height: 36px; + letter-spacing: -0.16px; +} + +/* Mimic React v9 Provider styles: + * - apply font, background, and foreground colors + * - apply padding for story content + */ +#storybook-docs .innerZoomElementWrapper > div > div { + padding: 48px 24px; + font-family: var(--fontFamilyBase); + background: var(--colorNeutralBackground2); + color: var(--colorNeutralForeground2); +} + +/* + * Theme Switcher + */ +#switches-container { + position: sticky; + display: flex; + gap: 20px; + align-items: center; + padding: 12px; + width: 100%; + top: 0; + box-sizing: border-box; /* keep from overflowing body making x scroll bar*/ + background: #fff; + box-shadow: 0 0 3px rgb(0 0 0 / 22%); + z-index: 10; +} + +#switches-container select { + padding: 5px var(--spacingHorizontalM); + border: var(--strokeWidthThin) solid #d1d1d1 /* --colorNeutralStroke1, without theme switching */; + border-radius: var(--borderRadiusMedium); + font-size: var(--fontSizeBase300); + font-weight: var(--fontWeightSemibold); + line-height: var(--lineHeightBase300); + width: 140px; +} + +.custom-fullscreen #switches-container { + display: none; +} + +.custom-fullscreen .sbdocs-wrapper { + padding: 20px; +} + +.custom-fullscreen .sbdocs-content { + max-width: unset; +} diff --git a/packages/charts/chart-web-components/.storybook/main.cjs b/packages/charts/chart-web-components/.storybook/main.cjs new file mode 100644 index 00000000000000..a608e4b28b9aba --- /dev/null +++ b/packages/charts/chart-web-components/.storybook/main.cjs @@ -0,0 +1,88 @@ +const path = require('path'); +const CircularDependencyPlugin = require('circular-dependency-plugin'); +const { TsconfigPathsPlugin } = require('tsconfig-paths-webpack-plugin'); + +const tsBin = require.resolve('typescript'); +const tsConfigPath = path.resolve(__dirname, '../../../../tsconfig.base.wc.json'); + +const tsPaths = new TsconfigPathsPlugin({ + configFile: tsConfigPath, +}); + +module.exports = + /** @type {import('@storybook/html-webpack5').StorybookConfig} */ + ({ + features: { + // On-demand code splitting is disabled for now, as it causes issues e2e tests. + storyStoreV7: false, + }, + // helpers.stories.ts is a file that contains helper functions for stories, + // and should not be treated as a story itself. + stories: ['../src/**/!(helpers)*.stories.@(ts|mdx)'], + staticDirs: ['../public'], + core: { + disableTelemetry: true, + }, + framework: '@storybook/html-webpack5', + addons: [ + { + name: '@storybook/addon-essentials', + options: { + backgrounds: false, + viewport: false, + toolbars: false, + actions: true, + }, + }, + ], + webpackFinal: async config => { + config.resolve = config.resolve ?? {}; + config.resolve.extensions = config.resolve.extensions ?? []; + config.resolve.plugins = config.resolve.plugins ?? []; + config.module = config.module ?? {}; + config.plugins = config.plugins ?? []; + + config.resolve.extensionAlias = { + '.js': ['.js', '.ts'], + '.mjs': ['.mjs', '.mts'], + }; + config.resolve.extensions.push(...['.ts', '.js']); + config.resolve.plugins.push(tsPaths); + config.module.rules = config.module.rules ?? []; + config.module.rules.push( + { + test: /\.([cm]?ts|tsx)$/, + loader: 'ts-loader', + sideEffects: true, + options: { + transpileOnly: true, + compiler: tsBin, + }, + }, + // Following config is needed to be able to resolve @storybook packages imported in specified files that don't ship valid ESM + // It also enables importing other packages without proper ESM extensions, but that should be avoided ! + // @see https://webpack.js.org/configuration/module/#resolvefullyspecified + { + test: /\.m?js/, + resolve: { fullySpecified: false }, + }, + ); + + config.plugins.push( + new CircularDependencyPlugin({ + exclude: /node_modules/, + failOnError: process.env.NODE_ENV === 'production', + }), + ); + + // Disable ProgressPlugin which logs verbose webpack build progress. Warnings and Errors are still logged. + if (process.env.TF_BUILD) { + config.plugins = config.plugins.filter(value => value && value.constructor.name !== 'ProgressPlugin'); + } + + return config; + }, + docs: { + autodocs: true, + }, + }); diff --git a/packages/charts/chart-web-components/.storybook/manager-head.html b/packages/charts/chart-web-components/.storybook/manager-head.html new file mode 100644 index 00000000000000..5ff3ef7092e609 --- /dev/null +++ b/packages/charts/chart-web-components/.storybook/manager-head.html @@ -0,0 +1,118 @@ +<meta name="title" content="Fluent UI Chart Web Components" /> +<link rel="shortcut icon" href="/favicon.png" /> +<link rel="icon" type="image/png" href="/favicon-192.png" sizes="192x192" /> +<link href="shell.css" rel="stylesheet" /> +<!-- + Override the default styles used in the Storybook svg icons for the left tree panel. + @see https://storybook.js.org/docs/react/configure/theming#css-escape-hatches + > 💡 NOTE: + > This is a brittle way for providing custom non thenable styles for manager UI. + > Those selectors might change on any storybook version bump. + --> +<style> + /* These styles should be kept in sync with those in the `manager-head.html` file for the React v9 Storybook. */ + @font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI Light'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/light/latest.ttf) format('truetype'); + font-weight: 100; + } + + @font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI Semilight'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semilight/latest.ttf) format('truetype'); + font-weight: 200; + } + + @font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/normal/latest.ttf) format('truetype'); + font-weight: 400; + } + + @font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI Semibold'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/semibold/latest.ttf) format('truetype'); + font-weight: 600; + } + + @font-face { + font-family: 'Segoe UI'; + src: local('Segoe UI Bold'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff2) format('woff2'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.woff) format('woff'), + url(https://c.s-microsoft.com/static/fonts/segoe-ui/west-european/bold/latest.ttf) format('truetype'); + font-weight: 700; + } + + #storybook-preview-iframe { + background: transparent !important; + } + + #storybook-explorer-searchfield { + font-weight: 400 !important; + font-size: 14px !important; + letter-spacing: -0.01em !important; + line-height: 14px !important; + } + + .sidebar-item svg, + .sidebar-svg-icon { + color: #11100f !important; + } + + .sidebar-item[data-selected='true'] svg, + .sidebar-item[data-selected='true'] .sidebar-svg-icon { + color: #ffffff !important; + } + + .sidebar-subheading { + font-weight: 600 !important; + font-size: 16px !important; + letter-spacing: 0px !important; + line-height: 24px !important; + text-transform: none !important; + color: #11100f !important; + } + + .sidebar-item { + font-weight: 400 !important; + font-size: 14px !important; + letter-spacing: -0.01em !important; + line-height: 14px !important; + color: #11100f !important; + } + + .sidebar-item[data-selected='true'] { + font-weight: 600 !important; + font-size: 14px !important; + letter-spacing: -0.01em !important; + line-height: 14px !important; + color: #ffffff !important; + } + + /* Hides "Addons" button from mobile view nav. */ + nav > button:last-child { + display: none; + } + + /* + Storybook has proposed a feature for this in https://github.com/storybookjs/storybook/issues/9209 + which will configure stories to exist in deeplink URL format, but do not appear in the nav tree or the docs page + Using suggested temporary workaround until storybook gets proper support. + */ + [id*='accessibility-stories'] { + display: none !important; + } +</style> diff --git a/packages/charts/chart-web-components/.storybook/manager.mjs b/packages/charts/chart-web-components/.storybook/manager.mjs new file mode 100644 index 00000000000000..73873977355b42 --- /dev/null +++ b/packages/charts/chart-web-components/.storybook/manager.mjs @@ -0,0 +1,14 @@ +import { addons } from '@storybook/manager-api'; +import webcomponentsTheme from './theme.mjs'; + +addons.setConfig({ + previewTabs: { + canvas: { hidden: true }, + }, + enableShortcuts: false, + sidebar: { + showRoots: true, + }, + showPanel: false, + theme: webcomponentsTheme, // override the default Storybook theme with a custom fluent theme +}); diff --git a/packages/charts/chart-web-components/.storybook/preview-body.html b/packages/charts/chart-web-components/.storybook/preview-body.html new file mode 100644 index 00000000000000..93e32a40560db2 --- /dev/null +++ b/packages/charts/chart-web-components/.storybook/preview-body.html @@ -0,0 +1,9 @@ +<div id="switches-container"> + <label for="theme-switch">Theme</label> + <select id="theme-switch" name="theme"> + <option value="web-light" selected>Web Light</option> + <option value="web-dark">Web Dark</option> + <option value="teams-light">Teams Light</option> + <option value="teams-dark">Teams Dark</option> + </select> +</div> diff --git a/packages/charts/chart-web-components/.storybook/preview.mjs b/packages/charts/chart-web-components/.storybook/preview.mjs new file mode 100644 index 00000000000000..e7e4cce4c6afb0 --- /dev/null +++ b/packages/charts/chart-web-components/.storybook/preview.mjs @@ -0,0 +1,69 @@ +import { teamsDarkTheme, teamsLightTheme, webDarkTheme, webLightTheme } from '@fluentui/tokens'; +import * as prettier from 'prettier'; +import prettierPluginHTML from 'prettier/parser-html.js'; +import { setTheme } from '@fluentui/web-components'; +import webcomponentsTheme from './theme.mjs'; + +import '../src/index-rollup.js'; +import './docs-root.css'; + +const FAST_EXPRESSION_COMMENTS = /<!--((fast-\w+)\{.*\}\2)?-->/g; // Matches comments that contain FAST expressions + +const themes = { + 'web-light': webLightTheme, + 'web-dark': webDarkTheme, + 'teams-light': teamsLightTheme, + 'teams-dark': teamsDarkTheme, +}; + +function changeTheme(/** @type {Event} */ e) { + setTheme(themes[/** @type {keyof themes} */ (/** @type {HTMLInputElement}*/ (e.target).value)]); +} + +// This is needed in Playwright. +Object.defineProperty(window, 'setTheme', { value: setTheme }); + +document.getElementById('theme-switch')?.addEventListener('change', changeTheme, false); +setTheme(themes['web-light']); + +export const parameters = { + layout: 'fullscreen', + controls: { expanded: true }, + viewMode: 'docs', + previewTabs: { + canvas: { hidden: true }, + }, + options: { + storySort: { + method: 'alphabetical', + }, + }, + docs: { + source: { + // To get around the inability to change Prettier options in the source addon, this transform function + // imports the standalone Prettier and uses it to format the source with the desired options. + transform(/** @type {string} */ src, /** @type {import('@storybook/html').StoryContext} */ storyContext) { + if (!src) { + const fragment = storyContext.originalStoryFn(storyContext.allArgs, storyContext); + if (!(fragment instanceof DocumentFragment) && !(fragment instanceof HTMLElement)) { + return; + } + + const div = document.createElement('div'); + div.append(fragment); + src = div.innerHTML; + } + + src = src.replace(FAST_EXPRESSION_COMMENTS, ''); // remove comments + src = src.replace(/=""/g, ''); // remove values for boolean attributes + src = prettier.format(src, { + htmlWhitespaceSensitivity: 'ignore', + parser: 'html', + plugins: [prettierPluginHTML], + }); + return src; + }, + }, + theme: webcomponentsTheme, // override the default Storybook theme with a custom fluent theme + }, +}; diff --git a/packages/charts/chart-web-components/.storybook/theme.mjs b/packages/charts/chart-web-components/.storybook/theme.mjs new file mode 100644 index 00000000000000..515891480e7a6f --- /dev/null +++ b/packages/charts/chart-web-components/.storybook/theme.mjs @@ -0,0 +1,34 @@ +import { create } from '@storybook/theming'; + +export default create({ + base: 'light', + brandTitle: 'Fluent UI\nChart Web Components', + brandUrl: 'https://github.com/microsoft/fluentui', + + // Toolbar default and active colors + barSelectedColor: '#0078d4', // use msft primary blue default + barTextColor: '#222', + + colorPrimary: '#dedede', + colorSecondary: 'deepskyblue', + + // UI + appBg: '#ffffff', + appContentBg: '#ffffff', + appBorderColor: '#e0e0e0', // use msft gray + appBorderRadius: 4, + + // Typography + fontBase: + '"Segoe UI", "Segoe UI Web (West European)", -apple-system, BlinkMacSystemFont, Roboto, "Helvetica Neue", sans-serif;', + fontCode: 'monospace', + + // Text colors + textColor: '#11100f', + textInverseColor: '#0078d4', // use msft primary blue default + + // Form colors + inputBg: 'white', + inputTextColor: 'black', + inputBorderRadius: 4, +}); diff --git a/packages/charts/chart-web-components/.storybook/tsconfig.json b/packages/charts/chart-web-components/.storybook/tsconfig.json new file mode 100644 index 00000000000000..78905f4f659714 --- /dev/null +++ b/packages/charts/chart-web-components/.storybook/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "noEmit": true, + "types": ["node"] + }, + "include": ["*", "../public", "../src/**/*.stories.*"] +} diff --git a/packages/charts/chart-web-components/README.md b/packages/charts/chart-web-components/README.md new file mode 100644 index 00000000000000..d0d22e595afee8 --- /dev/null +++ b/packages/charts/chart-web-components/README.md @@ -0,0 +1,26 @@ +# Fluent UI Chart Web Components + +Fluent charts is a set of modern, accessible, interactive and highly customizable visualization library representing the Microsoft design system. The library is built using D3 (Data Driven Documents). + +## Using the library + +Examples and code snippets for the chart components to be added. + +## Contact + +The charting project is actively funded by a small feature team. The team responds within 1-2 business days for any queries or doubts. +You can reach out to the charting team by tagging `@microsoft/charting-team` in [discussion](https://github.com/microsoft/fluentui/discussions) items. + +You could also create issues under the [charting](https://github.com/microsoft/fluentui/labels/Package:%20charting) tag. + +## Contributing + +[]() + +A comprehensive contributor and developer guide is available in the charts [wiki](https://aka.ms/fluentChartingWiki). + +## Accessibility + +Our charts have elaborate accessibility support. The charts are WCAG 2.1 MAS C compliant for accessibility. + +More details are covered in the [wiki](https://aka.ms/fluentChartingWiki). diff --git a/packages/charts/chart-web-components/api-extractor.json b/packages/charts/chart-web-components/api-extractor.json new file mode 100644 index 00000000000000..146de64b6d95ea --- /dev/null +++ b/packages/charts/chart-web-components/api-extractor.json @@ -0,0 +1,35 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + + "mainEntryPointFilePath": "<projectFolder>/dist/dts/index.d.ts", + + "apiReport": { + "enabled": true, + "reportFolder": "<projectFolder>/docs", + "reportFileName": "api-report.md" + }, + + "docModel": { + "enabled": true, + "apiJsonFilePath": "<projectFolder>/dist/chart-web-components.api.json" + }, + "dtsRollup": { + "enabled": true + }, + "compiler": { + "skipLibCheck": false, + "tsconfigFilePath": "./tsconfig.api-extractor.json" + }, + "messages": { + "extractorMessageReporting": { + "ae-missing-release-tag": { + "logLevel": "none", + "addToApiReportFile": true + }, + "ae-different-release-tags": { + "logLevel": "none", + "addToApiReportFile": true + } + } + } +} diff --git a/packages/charts/chart-web-components/docs/api-report.md b/packages/charts/chart-web-components/docs/api-report.md new file mode 100644 index 00000000000000..0d202f8acf7e0d --- /dev/null +++ b/packages/charts/chart-web-components/docs/api-report.md @@ -0,0 +1,150 @@ +## API Report File for "@fluentui/chart-web-components" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { ElementStyles } from '@microsoft/fast-element'; +import { ElementViewTemplate } from '@microsoft/fast-element'; +import { FASTElement } from '@microsoft/fast-element'; +import { FASTElementDefinition } from '@microsoft/fast-element'; + +// Warning: (ae-missing-release-tag) "DonutChart" is part of the package's API, but it is missing a release tag (@alpha, @beta, @public, or @internal) +// +// @public (undocumented) +export class DonutChart extends FASTElement { + constructor(); + // (undocumented) + activeLegend: string; + // (undocumented) + protected activeLegendChanged(oldValue: string, newValue: string): void; + // (undocumented) + chartWrapper: HTMLDivElement; + // (undocumented) + connectedCallback(): void; + // Warning: (ae-forgotten-export) The symbol "ChartProps_2" needs to be exported by the entry point index.d.ts + // + // (undocumented) + data: ChartProps_2; + // (undocumented) + elementInternals: ElementInternals; + // (undocumented) + group: SVGGElement; + // (undocumented) + handleLegendClick(legendTitle: string): void; + // (undocumented) + handleLegendMouseoutAndBlur(): void; + // (undocumented) + handleLegendMouseoverAndFocus(legendTitle: string): void; + // (undocumented) + height: number; + // (undocumented) + hideLegends: boolean; + // (undocumented) + hideTooltip: boolean; + // (undocumented) + innerRadius: number; + // (undocumented) + isLegendSelected: boolean; + // (undocumented) + legendListLabel?: string; + // Warning: (ae-forgotten-export) The symbol "Legend" needs to be exported by the entry point index.d.ts + // + // (undocumented) + legends: Legend[]; + // (undocumented) + tooltipProps: { + isVisible: boolean; + legend: string; + yValue: string; + color: string; + xPos: number; + yPos: number; + }; + // (undocumented) + protected tooltipPropsChanged(oldValue: any, newValue: any): void; + // (undocumented) + valueInsideDonut?: string; + // (undocumented) + width: number; +} + +// @public (undocumented) +export const DonutChartDefinition: FASTElementDefinition<typeof DonutChart>; + +// @public +export const DonutChartStyles: ElementStyles; + +// Warning: (ae-internal-missing-underscore) The name "DonutChartTemplate" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal (undocumented) +export const DonutChartTemplate: ElementViewTemplate<DonutChart>; + +// @public +export class HorizontalBarChart extends FASTElement { + constructor(); + // (undocumented) + activeLegend: string; + // (undocumented) + protected activeLegendChanged: (oldValue: string, newValue: string) => void; + // (undocumented) + chartContainer: HTMLDivElement; + // (undocumented) + chartTitle?: string; + // (undocumented) + connectedCallback(): void; + // Warning: (ae-forgotten-export) The symbol "ChartProps" needs to be exported by the entry point index.d.ts + // + // (undocumented) + data: ChartProps[]; + // (undocumented) + elementInternals: ElementInternals; + // (undocumented) + handleLegendClick: (legendTitle: string) => void; + // (undocumented) + handleLegendMouseoutAndBlur: () => void; + // (undocumented) + handleLegendMouseoverAndFocus: (legendTitle: string) => void; + // (undocumented) + hideLegends: boolean; + // (undocumented) + hideRatio: boolean; + // (undocumented) + hideTooltip: boolean; + // (undocumented) + isLegendSelected: boolean; + // (undocumented) + legendListLabel?: string; + // (undocumented) + tooltipProps: { + isVisible: boolean; + legend: string; + yValue: string; + color: string; + xPos: number; + yPos: number; + }; + // Warning: (ae-forgotten-export) The symbol "ChartDataPoint" needs to be exported by the entry point index.d.ts + // + // (undocumented) + uniqueLegends: ChartDataPoint[]; + // Warning: (ae-forgotten-export) The symbol "Variant" needs to be exported by the entry point index.d.ts + // + // (undocumented) + variant?: Variant; +} + +// @public +export const HorizontalBarChartDefinition: FASTElementDefinition<typeof HorizontalBarChart>; + +// @public +export const HorizontalBarChartStyles: ElementStyles; + +// Warning: (ae-internal-missing-underscore) The name "HorizontalBarChartTemplate" should be prefixed with an underscore because the declaration is marked as @internal +// +// @internal (undocumented) +export const HorizontalBarChartTemplate: ElementViewTemplate<HorizontalBarChart>; + +// (No @packageDocumentation comment for this package) + +``` diff --git a/packages/charts/chart-web-components/package.json b/packages/charts/chart-web-components/package.json new file mode 100644 index 00000000000000..fe15d6d133e168 --- /dev/null +++ b/packages/charts/chart-web-components/package.json @@ -0,0 +1,119 @@ +{ + "name": "@fluentui/chart-web-components", + "description": "A library of Fluent Chart Web Components", + "version": "0.0.0-alpha.1", + "author": { + "name": "Microsoft" + }, + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/microsoft/fluentui/tree/master/packages/charts/chart-web-components" + }, + "bugs": { + "url": "https://github.com/Microsoft/fluentui/issues/new/choose" + }, + "type": "module", + "main": "dist/esm/index.js", + "types": "dist/chart-web-components.d.ts", + "unpkg": "dist/chart-web-components.min.js", + "files": [ + "*.md", + "dist/dts/", + "dist/esm/", + "dist/*.js", + "dist/*.d.ts" + ], + "exports": { + ".": { + "types": "./dist/dts/index.d.ts", + "default": "./dist/esm/index.js" + }, + "./utilities.js": { + "types": "./dist/dts/utils/index.d.ts", + "default": "./dist/esm/utils/index.js" + }, + "./*/define.js": { + "types": "./dist/dts/*/*.define.d.ts", + "default": "./dist/esm/*/*.define.js" + }, + "./*/definition.js": { + "types": "./dist/dts/*/*.definition.d.ts", + "default": "./dist/esm/*/*.definition.js" + }, + "./*/options.js": { + "types": "./dist/dts/*/*.options.d.ts", + "default": "./dist/esm/*/*.options.js" + }, + "./*/styles.js": { + "types": "./dist/dts/*/*.styles.d.ts", + "default": "./dist/esm/*/*.styles.js" + }, + "./*/template.js": { + "types": "./dist/dts/*/*.template.d.ts", + "default": "./dist/esm/*/*.template.js" + }, + "./*/index.js": { + "types": "./dist/dts/*/index.d.ts", + "default": "./dist/esm/*/index.js" + }, + "./*.js": { + "types": "./dist/dts/*/define.d.ts", + "default": "./dist/esm/*/define.js" + }, + "./package.json": "./package.json" + }, + "sideEffects": [ + "./dist/esm/**/define.js", + "./dist/chart-web-components.js", + "./dist/chart-web-components.min.js" + ], + "scripts": { + "verify-packaging": "node ./scripts/verify-packaging", + "type-check": "node ./scripts/type-check", + "benchmark": "yarn clean && yarn compile:benchmark && yarn compile && node ./scripts/run-benchmarks", + "compile": "node ./scripts/compile", + "compile:benchmark": "rollup -c rollup.bench.js", + "clean": "node ./scripts/clean dist", + "generate-api": "api-extractor run --local", + "build": "yarn compile && yarn rollup -c && yarn generate-api", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "format": "prettier -w src/**/*.{ts,html} --ignore-path ../../.prettierignore", + "format:check": "yarn format -c", + "code-style": "yarn format:check && yarn lint", + "start": "yarn start-storybook -p 6006 --docs", + "start-storybook": "storybook dev", + "build-storybook": "storybook build -o ./dist/storybook --docs", + "e2e": "playwright test", + "test:dev": "playwright test" + }, + "devDependencies": { + "@microsoft/fast-element": "2.0.0", + "@tensile-perf/web-components": "~0.2.0", + "@storybook/html": "7.6.20", + "@storybook/html-webpack5": "7.6.20", + "chromedriver": "^125.0.0" + }, + "dependencies": { + "@microsoft/fast-web-utilities": "^6.0.0", + "@fluentui/tokens": "^1.0.0-alpha", + "@fluentui/web-components": "^3.0.0-beta", + "@types/d3-selection": "^3.0.0", + "@types/d3-shape": "^3.0.0", + "d3-selection": "^3.0.0", + "d3-shape": "^3.0.0", + "tabbable": "^6.2.0", + "tslib": "^2.1.0" + }, + "peerDependencies": { + "@microsoft/fast-element": "^2.0.0-beta.26 || ^2.0.0" + }, + "beachball": { + "disallowedChangeTypes": [ + "major", + "minor" + ], + "tag": "alpha" + } +} diff --git a/packages/charts/chart-web-components/playwright.config.ts b/packages/charts/chart-web-components/playwright.config.ts new file mode 100644 index 00000000000000..20100ddbc643c1 --- /dev/null +++ b/packages/charts/chart-web-components/playwright.config.ts @@ -0,0 +1,31 @@ +import type { PlaywrightTestConfig } from '@playwright/test'; +import { devices } from '@playwright/test'; + +const config: PlaywrightTestConfig = { + reporter: 'list', + retries: 3, + fullyParallel: process.env.CI ? false : true, + timeout: process.env.CI ? 10000 : 30000, + use: { + baseURL: 'http://localhost:6006/iframe.html', + viewport: { + height: 720, + width: 1280, + }, + }, + projects: [ + { + name: 'chromium', + use: { ...devices['Desktop Chrome'] }, + testMatch: /.*\.spec\.ts$/, + }, + ], + webServer: { + // double-quotes are required for Windows + command: `node -e "import('express').then(({ default: e }) => e().use(e.static('./dist/storybook')).listen(6006))"`, + port: 6006, + reuseExistingServer: process.env.CI ? false : true, + }, +}; + +export default config; diff --git a/packages/charts/chart-web-components/project.json b/packages/charts/chart-web-components/project.json new file mode 100644 index 00000000000000..023ee8ab08c977 --- /dev/null +++ b/packages/charts/chart-web-components/project.json @@ -0,0 +1,10 @@ +{ + "name": "chart-web-components", + "$schema": "../../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "implicitDependencies": [], + "tags": ["platform:web", "web-components"], + "targets": { + "e2e": { "dependsOn": ["build-storybook"] } + } +} diff --git a/packages/charts/chart-web-components/public/SegoeUI-VF.ttf b/packages/charts/chart-web-components/public/SegoeUI-VF.ttf new file mode 100644 index 0000000000000000000000000000000000000000..859db801de8fd50522da927bfeb36654b7932ce5 GIT binary patch literal 1844524 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≶j$jWUn__ulsg2F2a|eg41y=dU3?rrdk( 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ⅇ|sL;qo;oMv!6Znvp3(w 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%0DGIlGi7NKJNx>mYA$ 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�aco7{o5h%sx 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%0DxNM)RSm2?5k% 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 literal 0 HcmV?d00001 diff --git a/packages/charts/chart-web-components/public/favicon.ico b/packages/charts/chart-web-components/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..bfe873eb228f98720fe0ed18c638daa13906958f GIT binary patch literal 17174 zcmeHOJ#Q015PgP|sUltJ%A8D-(o!TUkc{NQ1+uPjPZg!4M<`cP($XUeDk>yUiu?k8 z10_|E2qK~~GdH`@9=;55lyHgjMj7wN?OyiY%<Q|hcYz-IsHz+)d)vUSq_dfozik0u zq;5P8*ZaW7hd@z;>vw?RV_+}{<sQ(V0C{fZZ7Cl;0pu2_MCG5!U#2;$v|QtJxm@D= zTdDfA1U~O$RQ_mO_X;Cd3gGUJD{l7@`x8IceRk+S9s-OX#t-AiL%@rk5&4Jw&G#2C ze8|7<1Va8L|GMGB__^ir14^d|EL<spZ0d^JeZl_3&vl<E{l`Oq@x%CG{CEg>(X$}` zkiRp}d#2<cH-N}L<R8Y5hkzSC<e!b_pRjnp_qDl-XPJ1U2+$u=G=OW1hwKHqQVB3z z+vn%_Y6NJX;0W{w-yd|J;Y{?kXxwL5$sWcwk%{H<_89^zKdi0%l*Bd-jEGNy0DXhL z5fDhc!m?NB8*TGqmvt-acVK0?&o&7H#HZmO2{M)?KEx*=@IQS+=g>#VM9RE@(KQaI zUna<K&Xd<scRgl~K@l*Cw$OFnSoE1_T<6I#wpO{MbzYHfy-wcISZ`q5Y8+Y}qf zsLT?EX1#$y91I7U-70gVo0S^3Mvm1dxLM<m<5iw1L?@z=XDT`K+$Ig4Ie3BlPk+~E zmrveFYdOb!Ea`Cm3lHW$ajfT?4_->Ws7T<G!^kn4R(@mhJU(Cj(9XwulQKIp*){pF z^~z+^%5`{Xh+IJ9d+bH}#y;xj15tgaI`wlotKTLKKVS2FetN&!$BX()uW?uTbUZcZ zl=Zwj=_;?-A{XG#sq3~^JLjT>XteX8<lE$LI}hh4ZOz;|v8!5G?YmYQZz^_Bi>N); ON)^VQz<8Ga>-ryC<7BY_ literal 0 HcmV?d00001 diff --git a/packages/charts/chart-web-components/public/favicon.png b/packages/charts/chart-web-components/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..bfe873eb228f98720fe0ed18c638daa13906958f GIT binary patch literal 17174 zcmeHOJ#Q015PgP|sUltJ%A8D-(o!TUkc{NQ1+uPjPZg!4M<`cP($XUeDk>yUiu?k8 z10_|E2qK~~GdH`@9=;55lyHgjMj7wN?OyiY%<Q|hcYz-IsHz+)d)vUSq_dfozik0u zq;5P8*ZaW7hd@z;>vw?RV_+}{<sQ(V0C{fZZ7Cl;0pu2_MCG5!U#2;$v|QtJxm@D= zTdDfA1U~O$RQ_mO_X;Cd3gGUJD{l7@`x8IceRk+S9s-OX#t-AiL%@rk5&4Jw&G#2C ze8|7<1Va8L|GMGB__^ir14^d|EL<spZ0d^JeZl_3&vl<E{l`Oq@x%CG{CEg>(X$}` zkiRp}d#2<cH-N}L<R8Y5hkzSC<e!b_pRjnp_qDl-XPJ1U2+$u=G=OW1hwKHqQVB3z z+vn%_Y6NJX;0W{w-yd|J;Y{?kXxwL5$sWcwk%{H<_89^zKdi0%l*Bd-jEGNy0DXhL z5fDhc!m?NB8*TGqmvt-acVK0?&o&7H#HZmO2{M)?KEx*=@IQS+=g>#VM9RE@(KQaI zUna<K&Xd<scRgl~K@l*Cw$OFnSoE1_T<6I#wpO{MbzYHfy-wcISZ`q5Y8+Y}qf zsLT?EX1#$y91I7U-70gVo0S^3Mvm1dxLM<m<5iw1L?@z=XDT`K+$Ig4Ie3BlPk+~E zmrveFYdOb!Ea`Cm3lHW$ajfT?4_->Ws7T<G!^kn4R(@mhJU(Cj(9XwulQKIp*){pF z^~z+^%5`{Xh+IJ9d+bH}#y;xj15tgaI`wlotKTLKKVS2FetN&!$BX()uW?uTbUZcZ zl=Zwj=_;?-A{XG#sq3~^JLjT>XteX8<lE$LI}hh4ZOz;|v8!5G?YmYQZz^_Bi>N); ON)^VQz<8Ga>-ryC<7BY_ literal 0 HcmV?d00001 diff --git a/packages/charts/chart-web-components/public/shell.css b/packages/charts/chart-web-components/public/shell.css new file mode 100644 index 00000000000000..21dc2f875e5906 --- /dev/null +++ b/packages/charts/chart-web-components/public/shell.css @@ -0,0 +1,82 @@ +/* This file should stay synchronized with the React v9 storybook styles. */ + +/* sidebar logo (Web Components uses text) */ +.sidebar-header > div:first-of-type { + font-size: 20px; + white-space: break-spaces; + margin-right: 0; +} + +/* remove sidebar shortcuts menu */ +.sidebar-header > div:last-child { + display: none; +} + +/* Add left side background color splash */ +/* colors become distracting in mobile layout so scoped to where sidebar is visible */ +@media (min-width: 600px) { + #storybook-root > div:before { + content: ''; + position: absolute; + top: -200px; + left: -200px; + width: 400px; + height: 400px; + background: #c989e8; + opacity: 0.5; + filter: blur(150px); + } + + /* Add right side background color splash */ + #storybook-root > div:after { + content: ''; + position: absolute; + top: -200px; + right: -200px; + width: 400px; + height: 400px; + background: #b3d4ff; + opacity: 0.5; + filter: blur(150px); + } +} + +/* Give sidebar a transparent white background to match design */ +.sidebar-container { + background: rgba(255, 255, 255, 0.6); +} + +/* remove background preventing color splash from showing */ +#storybook-preview-wrapper { + background: transparent; +} + +/* + * Set position fixed to create a layer and prevent iframe from jumping when content is + * larger than the viewport and the iframe itself + */ +[role='main'] { + position: fixed; + top: 0 !important; +} + +/* remove box shadow style from storybooks wrapper div */ +[role='main'] > div { + box-shadow: none; +} + +/* permanently hide toolbar so animation never appears on page load */ +[role='main'] .os-host { + display: none; +} + +/* stop offset from changing page dimensions when 't' is pressed and toolbar opened */ +[role='main'] > div > div > div { + top: 0 !important; + height: 100% !important; +} + +/* Remove 'Published on Chromatic' banner */ +#back-to-chromatic { + display: none !important; +} diff --git a/packages/charts/chart-web-components/rollup.bench.js b/packages/charts/chart-web-components/rollup.bench.js new file mode 100644 index 00000000000000..3b8e9d8bb711ff --- /dev/null +++ b/packages/charts/chart-web-components/rollup.bench.js @@ -0,0 +1,21 @@ +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import esbuild from 'rollup-plugin-esbuild'; +import commonJS from 'rollup-plugin-commonjs'; + +const plugins = [nodeResolve({ browser: true }), commonJS(), esbuild({ tsconfig: './tsconfig.json' })]; + +export default [ + { + input: { + tokens: './src/utils/benchmark-dependencies/tokens.ts', + }, + output: [ + { + dir: './.tensile/benchmark-dependencies', + format: 'esm', + sourcemap: true, + }, + ], + plugins, + }, +]; diff --git a/packages/charts/chart-web-components/rollup.config.js b/packages/charts/chart-web-components/rollup.config.js new file mode 100644 index 00000000000000..83e86ddda735ee --- /dev/null +++ b/packages/charts/chart-web-components/rollup.config.js @@ -0,0 +1,48 @@ +/** + * This config should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ + +import { nodeResolve } from '@rollup/plugin-node-resolve'; +import commonJS from 'rollup-plugin-commonjs'; +import esbuild, { minify } from 'rollup-plugin-esbuild'; +import transformTaggedTemplate from 'rollup-plugin-transform-tagged-template'; +import { transformCSSFragment, transformHTMLFragment } from './scripts/transform-fragments'; + +const parserOptions = { + sourceType: 'module', +}; + +export default [ + { + input: 'src/index-rollup.ts', + output: [ + { + file: 'dist/chart-web-components.js', + format: 'esm', + }, + { + file: 'dist/chart-web-components.min.js', + format: 'esm', + plugins: [minify()], + }, + ], + plugins: [ + nodeResolve({ browser: true }), + commonJS(), + esbuild({ + tsconfig: './tsconfig.lib.json', + }), + transformTaggedTemplate({ + tagsToProcess: ['css'], + transformer: transformCSSFragment, + parserOptions, + }), + transformTaggedTemplate({ + tagsToProcess: ['html'], + transformer: transformHTMLFragment, + parserOptions, + }), + ], + }, +]; diff --git a/packages/charts/chart-web-components/scripts/clean.js b/packages/charts/chart-web-components/scripts/clean.js new file mode 100644 index 00000000000000..421e7e53437525 --- /dev/null +++ b/packages/charts/chart-web-components/scripts/clean.js @@ -0,0 +1,53 @@ +/* eslint-disable no-undef */ +/** + * Utility for cleaning directories. + * Usage: node build/clean.js %path% + * + * This script should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ +import * as path from 'path'; +import * as fsPromises from 'node:fs/promises'; +import yargs from 'yargs'; + +main(); + +/** + * Function to remove a given path + */ +function cleanPath(cleanPath) { + const removePath = path.resolve(process.cwd(), cleanPath); + + const result = fsPromises.rm(removePath, { recursive: true }).then(() => { + console.log(removePath, 'cleaned'); + }); + + return result; +} + +function main() { + const argv = yargs.argv; + + /** + * All paths passed to the clean script + */ + const paths = argv._; + + /** + * Clean all paths + */ + if (!Array.isArray(paths)) { + throw new Error('"paths" must be an array'); + } + + const result = paths.map(cleanPath); + + Promise.all(result) + .then(() => { + console.log('All paths cleaned'); + }) + .catch(error => { + console.error(error); + process.exit(1); + }); +} diff --git a/packages/charts/chart-web-components/scripts/compile.js b/packages/charts/chart-web-components/scripts/compile.js new file mode 100644 index 00000000000000..7eb7a2aa7fc563 --- /dev/null +++ b/packages/charts/chart-web-components/scripts/compile.js @@ -0,0 +1,28 @@ +/* eslint-disable no-undef */ +/** + * This script should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ + +import { execSync } from 'child_process'; +import chalk from 'chalk'; + +main(); + +function compile() { + try { + console.log(chalk.bold(`🎬 compile:start`)); + + console.log(chalk.blueBright(`compile: running tsc`)); + execSync(`tsc -p tsconfig.lib.json --rootDir ./src --baseUrl .`, { stdio: 'inherit' }); + + console.log(chalk.bold(`🏁 compile:end`)); + } catch (err) { + console.error(err); + process.exit(1); + } +} + +function main() { + compile(); +} diff --git a/packages/charts/chart-web-components/scripts/run-benchmarks.js b/packages/charts/chart-web-components/scripts/run-benchmarks.js new file mode 100644 index 00000000000000..30735810d1d942 --- /dev/null +++ b/packages/charts/chart-web-components/scripts/run-benchmarks.js @@ -0,0 +1,47 @@ +/** + * This script should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ + +import fs from 'fs/promises'; +import path from 'path'; +import { execSync } from 'child_process'; + +const rootDir = path.join(import.meta.dirname, '..'); +const tensileConfig = 'tensile.config.js'; + +try { + const esmOutput = path.join(rootDir, 'dist', 'esm'); + const items = await fs.readdir(esmOutput); + + // Collect all component folders + const folders = []; + for (const item of items) { + const itemPath = path.join(esmOutput, item); + const stats = await fs.lstat(itemPath); + if (stats.isDirectory()) { + folders.push(item); + } + } + + // Collect all .bench.js files + const benchFiles = []; + for (const folder of folders) { + const folderPath = path.join(esmOutput, folder); + const files = await fs.readdir(folderPath); + const filteredFiles = files.filter(file => file.endsWith('.bench.js')); + benchFiles.push(...filteredFiles.map(file => path.relative(rootDir, path.join(folderPath, file)))); + } + + // Execute tensile for each .bench.js file + for (const file of benchFiles) { + try { + // eslint-disable-next-line no-undef + execSync(`tensile --file ./${file} --config ${tensileConfig} ${process.argv[2]}`, { stdio: 'inherit' }); + } catch (error) { + console.error(`Error executing command for file ${file}: ${error.message}`); + } + } +} catch (error) { + console.error(`Error reading directory: ${error.message}`); +} diff --git a/packages/charts/chart-web-components/scripts/setup-browser.cjs b/packages/charts/chart-web-components/scripts/setup-browser.cjs new file mode 100644 index 00000000000000..5f47d1b5211379 --- /dev/null +++ b/packages/charts/chart-web-components/scripts/setup-browser.cjs @@ -0,0 +1,14 @@ +/* eslint-disable no-undef */ +/** + * + * @param r {__WebpackModuleApi.RequireContext} + * + * This script should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ +function importAll(r) { + r.keys().forEach(r); +} + +// Explicitly add to browser test +importAll(require.context('../dist/esm', true, /\.spec\.js$/)); diff --git a/packages/charts/chart-web-components/scripts/transform-fragments.js b/packages/charts/chart-web-components/scripts/transform-fragments.js new file mode 100644 index 00000000000000..5387a94fa653d3 --- /dev/null +++ b/packages/charts/chart-web-components/scripts/transform-fragments.js @@ -0,0 +1,34 @@ +/* eslint-disable @typescript-eslint/explicit-function-return-type, @typescript-eslint/typedef */ + +/** + * This script should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ + +/** + * Reduces extra spaces in HTML tagged templates. + * + * @param {string} data - the fragment value + * @returns string + */ +export function transformHTMLFragment(data) { + data = data.replace(/\s*([<>])\s*/g, '$1'); // remove spaces before and after angle brackets + return data.replace(/\s{2,}/g, ' '); // Collapse all sequences to 1 space +} + +/** + * Reduces extra spaces in CSS tagged templates. + * + * Breakdown of this regex: + * (?:\s*\/\*(?:.|\s)+?\*\/\s*) Remove comments (non-capturing) + * (?:;)\s+(?=\}) Remove semicolons and spaces followed by property list end (non-capturing) + * \s+(?=\{) Remove spaces before property list start (non-capturing) + * (?<=:)\s+ Remove spaces after property declarations (non-capturing) + * \s*([{};,])\s* Remove extra spaces before and after braces, semicolons, and commas (captures) + * + * @param {string} data - the fragment value + * @returns string + */ +export function transformCSSFragment(data) { + return data.replace(/(?:\s*\/\*(?:.|\s)+?\*\/\s*)|(?:;)\s+(?=\})|\s+(?=\{)|(?<=:)\s+|\s*([{};,])\s*/g, '$1'); +} diff --git a/packages/charts/chart-web-components/scripts/type-check.js b/packages/charts/chart-web-components/scripts/type-check.js new file mode 100644 index 00000000000000..9d8a4b6c2f4198 --- /dev/null +++ b/packages/charts/chart-web-components/scripts/type-check.js @@ -0,0 +1,63 @@ +// @ts-check + +/** + * This script should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ + +import fs from 'node:fs'; +import path from 'node:path'; +import { promisify } from 'node:util'; +import { exec } from 'node:child_process'; +import { exit } from 'node:process'; + +const asyncExec = promisify(exec); + +main().catch(err => { + console.error(err); + exit(1); +}); + +/** + * Copied from ${@link 'file://./../../../../scripts/tasks/src/type-check.ts'} + */ +async function main() { + const rootConfig = JSON.parse(fs.readFileSync(path.join(import.meta.dirname, '../tsconfig.json'), 'utf-8')); + + const tsConfigsRefs = getTsConfigs(rootConfig, { spec: false, e2e: false }); + + const asyncQueue = []; + + for (const ref of tsConfigsRefs) { + const program = `tsc -p ${ref} --pretty --noEmit --baseUrl .`; + asyncQueue.push(asyncExec(program)); + } + + return Promise.all(asyncQueue).catch(err => { + console.error(err.stdout); + exit(1); + }); +} + +/** + * @param {{references?: Array<{ path: string }>;}} solutionConfig + * @param {{ spec: boolean, e2e: boolean }} exclude + */ +function getTsConfigs(solutionConfig, exclude) { + const refs = solutionConfig.references ?? []; + /** @type {string[]} */ + const refsPaths = []; + + for (const ref of refs) { + if (exclude.spec && ref.path.includes('spec')) { + continue; + } + if (exclude.e2e && ref.path.includes('cy')) { + continue; + } + + refsPaths.push(ref.path); + } + + return refsPaths; +} diff --git a/packages/charts/chart-web-components/scripts/verify-packaging.js b/packages/charts/chart-web-components/scripts/verify-packaging.js new file mode 100644 index 00000000000000..6cbfc5d9a437b1 --- /dev/null +++ b/packages/charts/chart-web-components/scripts/verify-packaging.js @@ -0,0 +1,79 @@ +// @ts-check +/** + * Copied from ${@link 'file://./../../../../scripts/tasks/src/verify-packaging.ts'} + */ + +/** + * This script should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ + +import assert from 'node:assert/strict'; +import { spawnSync } from 'node:child_process'; +import { readFileSync } from 'node:fs'; +import path from 'node:path'; + +import micromatch from 'micromatch'; + +main(); + +function main() { + /** + * @see https://docs.npmjs.com/cli/v10/commands/npm-publish#files-included-in-package + */ + const alwaysPublishedFiles = ['LICENSE', 'package.json', 'README.md']; + const rootConfigFiles = [ + 'just.config.[jt]s', + 'jest.config.[jt]s', + '.eslintrc.(js|json)', + 'project.json', + '.babelrc.json', + '.swcrc', + 'tsconfig(.*)?.json', + ]; + const nonProdAssets = ['assets/', 'docs/*', 'temp/*', 'bundle-size/*', '.storybook/*', 'stories/*']; + + verifyPackaging({ alwaysPublishedFiles, nonProdAssets, rootConfigFiles }); +} + +/** + * + * @param {{alwaysPublishedFiles:string[];rootConfigFiles:string[];nonProdAssets:string[]}} options + * @returns + */ + +function verifyPackaging(options) { + const { alwaysPublishedFiles, nonProdAssets, rootConfigFiles } = options; + const root = path.join(import.meta.dirname, '../'); + + /** @type {{ private?: boolean }} */ + const packageJSON = JSON.parse(readFileSync(path.join(root, 'package.json'), 'utf-8')); + + // no need to check if package is not being published yet + if (packageJSON.private) { + return; + } + + const npmPackResult = spawnSync('npm', ['pack', '--dry-run']); + + const processedResult = npmPackResult.output + .toString() + .replace(/\bnpm notice\b\s+[\d.]+[kB]+\s+/gi, '') + .replace(/[ ]+/g, ''); + const processedResultArr = processedResult.split('\n'); + + assert.ok(micromatch(processedResultArr, alwaysPublishedFiles).length, `npm always shipped files`); + assert.equal( + micromatch(processedResultArr, nonProdAssets).length, + 0, + `wont ship non production code related folders/files`, + ); + assert.equal(micromatch(processedResultArr, 'dist/storybook/**').length, 0, `wont ship storybook assets`); + assert.equal(micromatch(processedResultArr, rootConfigFiles).length, 0, `wont ship configuration files`); + assert.ok(micromatch(processedResultArr, 'dist/*.d.ts').length, 'ships rolluped dts'); + assert.ok(micromatch(processedResultArr, 'dist/*.(min.js|js)').length, 'ships rolluped js'); + assert.equal(micromatch(processedResultArr, 'src/*').length, 0, `wont ship source code from "/src"`); + + assert.ok(micromatch(processedResultArr, 'dist/esm/**/*.(js|map)').length, 'ships esm'); + assert.ok(micromatch(processedResultArr, 'dist/dts/**/*.d.ts').length, 'ships types'); +} diff --git a/packages/charts/chart-web-components/src/donut-chart/define.ts b/packages/charts/chart-web-components/src/donut-chart/define.ts new file mode 100644 index 00000000000000..1b8e20ac99e32d --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/define.ts @@ -0,0 +1,4 @@ +import { FluentDesignSystem } from '@fluentui/web-components'; +import { definition } from './donut-chart.definition.js'; + +definition.define(FluentDesignSystem.registry); diff --git a/packages/charts/chart-web-components/src/donut-chart/donut-chart.bench.ts b/packages/charts/chart-web-components/src/donut-chart/donut-chart.bench.ts new file mode 100644 index 00000000000000..5936ecc050474c --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/donut-chart.bench.ts @@ -0,0 +1,12 @@ +import { FluentDesignSystem } from '@fluentui/web-components'; +import { definition } from './donut-chart.definition.js'; + +definition.define(FluentDesignSystem.registry); + +const itemRenderer = () => { + const donutChart = document.createElement('fluent-donut-chart'); + return donutChart; +}; + +export default itemRenderer; +export { tests } from '../utils/benchmark-wrapper.js'; diff --git a/packages/charts/chart-web-components/src/donut-chart/donut-chart.definition.ts b/packages/charts/chart-web-components/src/donut-chart/donut-chart.definition.ts new file mode 100644 index 00000000000000..3cf608dc046483 --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/donut-chart.definition.ts @@ -0,0 +1,18 @@ +import { FluentDesignSystem } from '@fluentui/web-components'; +import { DonutChart } from './donut-chart.js'; +import { styles } from './donut-chart.styles.js'; +import { template } from './donut-chart.template.js'; + +/** + * @public + * @remarks + * HTML Element: `<fluent-donut-chart>` + */ +export const definition = DonutChart.compose({ + name: `${FluentDesignSystem.prefix}-donut-chart`, + template, + styles, + shadowOptions: { + delegatesFocus: true, + }, +}); diff --git a/packages/charts/chart-web-components/src/donut-chart/donut-chart.options.ts b/packages/charts/chart-web-components/src/donut-chart/donut-chart.options.ts new file mode 100644 index 00000000000000..75f288ca6bd9ea --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/donut-chart.options.ts @@ -0,0 +1,45 @@ +export interface ChartDataPoint { + /** + * Legend text for the datapoint in the chart + */ + legend: string; + + /** + * data the datapoint in the chart + */ + data: number; + + /** + * Color for the legend in the chart. If not provided, it will fallback on the default color palette. + */ + color?: string; + + /** + * Callout data for x axis + * This is an optional prop, If haven;t given legend will take + */ + xAxisCalloutData?: string; + + /** + * Callout data for y axis + * This is an optional prop, If haven't given data will take + */ + yAxisCalloutData?: string; +} + +export interface ChartProps { + /** + * chart title for the chart + */ + chartTitle?: string; + + /** + * data for the points in the chart + */ + chartData: ChartDataPoint[]; +} + +export type Legend = { + title: string; + color: string; +}; diff --git a/packages/charts/chart-web-components/src/donut-chart/donut-chart.spec.ts b/packages/charts/chart-web-components/src/donut-chart/donut-chart.spec.ts new file mode 100644 index 00000000000000..1c48d4677d4cca --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/donut-chart.spec.ts @@ -0,0 +1,139 @@ +import { test } from '@playwright/test'; +import { expect, fixtureURL } from '../helpers.tests.js'; +import type { ChartDataPoint, ChartProps } from './donut-chart.options.js'; + +const points: ChartDataPoint[] = [ + { + legend: 'first', + data: 20000, + }, + { + legend: 'second', + data: 39000, + }, +]; + +const data: ChartProps = { + chartTitle: 'Donut chart basic example', + chartData: points, +}; + +test.describe('Donut-chart - Basic', () => { + test.beforeEach(async ({ page }) => { + await page.goto(fixtureURL('components-donutchart--basic')); + await page.setContent(/* html */ ` + <div> + <fluent-donut-chart value-inside-donut="39,000" inner-radius="55" data='${JSON.stringify(data)}'> + </fluent-donut-chart> + </div> + `); + await page.waitForFunction(() => customElements.whenDefined('fluent-donut-chart')); + }); + + test('Should render chart properly', async ({ page }) => { + const element = page.locator('fluent-donut-chart'); + const legends = element.locator('.legend-text'); + await expect(legends.nth(0).getByText('first')).toBeVisible(); + await expect(legends.nth(1).getByText('second')).toBeVisible(); + await expect(element.getByText('39,000')).toBeVisible(); + }); + + test('Should render path with proper attributes and css', async ({ page }) => { + const element = page.locator('fluent-donut-chart'); + const arcList = element.locator('.arc'); + await expect(arcList).toHaveCount(2); + await expect(arcList.nth(0)).toHaveAttribute('fill', '#637cef'); + await expect(arcList.nth(0)).toHaveAttribute('aria-label', 'first, 20000.'); + await expect(arcList.nth(0)).toHaveAttribute( + 'd', + 'M-76.547,47.334A90,90,0,0,1,-1.055,-89.994L-1.055,-54.99A55,55,0,0,0,-46.993,28.577Z', + ); + await expect(arcList.nth(0)).toHaveCSS('fill', 'rgb(99, 124, 239)'); + await expect(arcList.nth(0)).toHaveCSS('--borderRadiusMedium', '4px'); + + await expect(arcList.nth(1)).toHaveAttribute('fill', '#e3008c'); + await expect(arcList.nth(1)).toHaveAttribute('aria-label', 'second, 39000.'); + await expect(arcList.nth(1)).toHaveAttribute( + 'd', + 'M1.055,-89.994A90,90,0,1,1,-75.417,49.115L-45.863,30.358A55,55,0,1,0,1.055,-54.99Z', + ); + await expect(arcList.nth(1)).toHaveCSS('fill', 'rgb(227, 0, 140)'); + await expect(arcList.nth(1)).toHaveCSS('--borderRadiusMedium', '4px'); + }); + + test('Should render legends data properly', async ({ page }) => { + const element = page.locator('fluent-donut-chart'); + const legends = element.getByRole('option'); + await expect(legends).toHaveCount(2); + const firstLegend = element.getByRole('option', { name: 'First' }); + const secondLegend = element.getByRole('option', { name: 'Second' }); + await expect(firstLegend).toBeVisible(); + await expect(firstLegend).toHaveText('first'); + await expect(firstLegend).toHaveCSS('--borderRadiusMedium', '4px'); + await expect(secondLegend).toBeVisible(); + await expect(secondLegend).toHaveText('second'); + await expect(secondLegend).toHaveCSS('--borderRadiusMedium', '4px'); + }); + + test('Should update path css values with mouse click event on legend', async ({ page }) => { + const element = page.locator('fluent-donut-chart'); + const firstPath = element.getByLabel('first,'); + const secondPath = element.getByLabel('second,'); + const firstLegend = element.getByRole('option', { name: 'First' }); + //mouse events + await firstLegend.click(); + await expect(firstPath).toHaveCSS('opacity', '1'); + await expect(secondPath).toHaveCSS('opacity', '0.1'); + await firstLegend.click(); + await expect(firstPath).toHaveCSS('opacity', '1'); + await expect(secondPath).toHaveCSS('opacity', '1'); + }); + + test('Should update path css values with mouse hover event on legend', async ({ page }) => { + const element = page.locator('fluent-donut-chart'); + const firstPath = element.getByLabel('first,'); + const secondPath = element.getByLabel('second,'); + const firstLegend = element.getByRole('option', { name: 'First' }); + //mouse events + await firstLegend.dispatchEvent('mouseover'); + await expect(firstPath).toHaveCSS('opacity', '1'); + await expect(secondPath).toHaveCSS('opacity', '0.1'); + await firstLegend.dispatchEvent('mouseout'); + await expect(firstPath).toHaveCSS('opacity', '1'); + await expect(secondPath).toHaveCSS('opacity', '1'); + }); + + test('Should show callout with mouse hover event on path', async ({ page }) => { + const element = page.locator('fluent-donut-chart'); + const firstPath = element.getByLabel('first,'); + const calloutRoot = element.locator('.tooltip'); + await expect(calloutRoot).toHaveCount(0); + await firstPath.dispatchEvent('mouseover'); + await expect(calloutRoot).toHaveCount(1); + await expect(calloutRoot).toHaveCSS('opacity', '1'); + const calloutLegendText = element.locator('.tooltip-legend-text'); + await expect(calloutLegendText).toHaveText('first'); + const calloutContentY = element.locator('.tooltip-content-y'); + await expect(calloutContentY).toHaveText('20000'); + await firstPath.dispatchEvent('mouseout'); + await expect(calloutRoot).not.toHaveCSS('opacity', '0'); + }); + + test('Should update callout data when mouse moved from one path to another path', async ({ page }) => { + const element = page.locator('fluent-donut-chart'); + const firstPath = element.getByLabel('first,'); + const calloutRoot = element.locator('.tooltip'); + await expect(calloutRoot).toHaveCount(0); + await firstPath.dispatchEvent('mouseover'); + await expect(calloutRoot).toHaveCSS('opacity', '1'); + const calloutLegendText = element.locator('.tooltip-legend-text'); + await expect(calloutLegendText).toHaveText('first'); + const calloutContentY = element.locator('.tooltip-content-y'); + await expect(calloutContentY).toHaveText('20000'); + const secondPath = element.getByLabel('second,'); + await secondPath.dispatchEvent('mouseover'); + await expect(calloutRoot).toHaveCSS('opacity', '1'); + await expect(calloutLegendText).toHaveText('second'); + await expect(calloutContentY).toHaveText('39000'); + }); +}); diff --git a/packages/charts/chart-web-components/src/donut-chart/donut-chart.stories.ts b/packages/charts/chart-web-components/src/donut-chart/donut-chart.stories.ts new file mode 100644 index 00000000000000..14177a11c60220 --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/donut-chart.stories.ts @@ -0,0 +1,39 @@ +import { html } from '@microsoft/fast-element'; +import type { Meta, Story, StoryArgs } from '../helpers.stories.js'; +import { renderComponent } from '../helpers.stories.js'; +import { DonutChart as FluentDonutChart } from './donut-chart.js'; +import type { ChartDataPoint, ChartProps } from './donut-chart.options.js'; + +const points: ChartDataPoint[] = [ + { + legend: 'first', + data: 20000, + }, + { + legend: 'second', + data: 39000, + }, +]; + +const data: ChartProps = { + chartTitle: 'Donut chart basic example', + chartData: points, +}; + +const storyTemplate = html<StoryArgs<FluentDonutChart>>` + <fluent-donut-chart data="${JSON.stringify(data)}" value-inside-donut="39,000" inner-radius="55"> + </fluent-donut-chart> +`; + +export default { + title: 'Components/DonutChart', +} as Meta<FluentDonutChart>; + +export const RTL: Story<FluentDonutChart> = renderComponent(html<StoryArgs<FluentDonutChart>>` + <div dir="rtl"> + <fluent-donut-chart data="${JSON.stringify(data)}" value-inside-donut="39,000" inner-radius="55"> + </fluent-donut-chart> + </div> +`); + +export const Basic: Story<FluentDonutChart> = renderComponent(storyTemplate).bind({}); diff --git a/packages/charts/chart-web-components/src/donut-chart/donut-chart.styles.ts b/packages/charts/chart-web-components/src/donut-chart/donut-chart.styles.ts new file mode 100644 index 00000000000000..5833ddfa60df27 --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/donut-chart.styles.ts @@ -0,0 +1,159 @@ +import { css } from '@microsoft/fast-element'; +import { + borderRadiusMedium, + colorNeutralBackground1, + colorNeutralForeground1, + colorNeutralShadowAmbient, + colorNeutralShadowKey, + colorStrokeFocus1, + colorStrokeFocus2, + colorTransparentStroke, + display, + forcedColorsStylesheetBehavior, + spacingHorizontalL, + spacingHorizontalNone, + spacingHorizontalS, + spacingVerticalL, + spacingVerticalMNudge, + spacingVerticalNone, + spacingVerticalS, + strokeWidthThickest, + strokeWidthThin, + typographyBody1Styles, + typographyCaption1Styles, + typographyTitle2Styles, + typographyTitle3Styles, +} from '@fluentui/web-components'; + +/** + * Styles for the DonutChart component. + * + * @public + */ +export const styles = css` + ${display('inline-block')} + + :host { + ${typographyBody1Styles} + align-items: center; + flex-direction: column; + width: 100%; + height: 100%; + position: relative; + } + + .chart { + box-sizing: content-box; + overflow: visible; + display: block; + } + + .arc.inactive { + opacity: 0.1; + } + + .arc:focus { + outline: none; + stroke-width: ${strokeWidthThin}; + stroke: ${colorStrokeFocus1}; + } + + .arc-outline { + fill: none; + } + + .arc-outline:has(+ .arc:focus) { + stroke-width: ${strokeWidthThickest}; + stroke: ${colorStrokeFocus2}; + } + + .text-inside-donut { + ${typographyTitle3Styles} + fill: ${colorNeutralForeground1}; + } + + .legend-container { + padding-top: ${spacingVerticalL}; + white-space: nowrap; + width: 100%; + align-items: center; + margin: -${spacingVerticalS} ${spacingHorizontalNone} ${spacingVerticalNone} -${spacingHorizontalS}; + flex-wrap: wrap; + display: flex; + } + + .legend { + display: flex; + align-items: center; + cursor: pointer; + border: none; + padding: ${spacingHorizontalS}; + background: none; + text-transform: capitalize; + } + + .legend-rect { + width: 12px; + height: 12px; + margin-inline-end: ${spacingHorizontalS}; + border: ${strokeWidthThin} solid; + } + + .legend-text { + ${typographyCaption1Styles} + color: ${colorNeutralForeground1}; + } + + .legend.inactive .legend-rect { + background-color: transparent !important; + } + + .legend.inactive .legend-text { + opacity: 0.67; + } + + .tooltip { + display: grid; + overflow: hidden; + padding: ${spacingVerticalMNudge} ${spacingHorizontalL}; + background-color: ${colorNeutralBackground1}; + background-blend-mode: normal, luminosity; + border-radius: ${borderRadiusMedium}; + border: 1px solid ${colorTransparentStroke}; + filter: drop-shadow(0 0 2px ${colorNeutralShadowAmbient}) drop-shadow(0 8px 16px ${colorNeutralShadowKey}); + position: absolute; + z-index: 1; + pointer-events: none; + } + + .tooltip-body { + padding-inline-start: ${spacingHorizontalS}; + color: ${colorNeutralForeground1}; + border-inline-start: 4px solid; + } + + .tooltip-legend-text { + ${typographyCaption1Styles} + } + + .tooltip-content-y { + ${typographyTitle2Styles} + } +`.withBehaviors( + forcedColorsStylesheetBehavior(css` + .text-inside-donut { + fill: CanvasText; + } + + .legend-rect, + .tooltip-body { + forced-color-adjust: none; + } + + .tooltip-legend-text, + .tooltip-content-y { + forced-color-adjust: auto; + color: CanvasText; + } + `), +); diff --git a/packages/charts/chart-web-components/src/donut-chart/donut-chart.template.ts b/packages/charts/chart-web-components/src/donut-chart/donut-chart.template.ts new file mode 100644 index 00000000000000..f435e709755c9e --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/donut-chart.template.ts @@ -0,0 +1,70 @@ +import { ElementViewTemplate, html, ref, repeat, when } from '@microsoft/fast-element'; +import type { DonutChart } from './donut-chart.js'; +import type { Legend } from './donut-chart.options.js'; + +/** + * Generates a template for the DonutChart component. + * + * @public + */ +export function donutChartTemplate<T extends DonutChart>(): ElementViewTemplate<T> { + return html<T>` + <template> + <div ${ref('chartWrapper')}> + <svg class="chart" width="${x => x.width}" height="${x => x.height}"> + <g ${ref('group')} transform="translate(${x => x.width / 2}, ${x => x.height / 2})"></g> + </svg> + </div> + ${when( + x => !x.hideLegends, + html<T>` + <div class="legend-container" role="listbox" aria-label="${x => x.legendListLabel}"> + ${repeat( + x => x.legends, + html<Legend, T>` <button + class="legend${(x, c) => + c.parent.activeLegend === '' || c.parent.activeLegend === x.title ? '' : ' inactive'}" + role="option" + aria-setsize="${(x, c) => c.length}" + aria-posinset="${(x, c) => c.index + 1}" + aria-selected="${(x, c) => x.title === c.parent.activeLegend}" + @mouseover="${(x, c) => c.parent.handleLegendMouseoverAndFocus(x.title)}" + @mouseout="${(x, c) => c.parent.handleLegendMouseoutAndBlur()}" + @focus="${(x, c) => c.parent.handleLegendMouseoverAndFocus(x.title)}" + @blur="${(x, c) => c.parent.handleLegendMouseoutAndBlur()}" + @click="${(x, c) => c.parent.handleLegendClick(x.title)}" + > + <div + class="legend-rect" + style="background-color: ${x => x.color}; border-color: ${x => x.color};" + ></div> + <div class="legend-text">${x => x.title}</div> + </button>`, + )} + </div> + `, + )} + ${when( + x => !x.hideTooltip && x.tooltipProps.isVisible, + html<T>` + <div + class="tooltip" + style="inset-inline-start: ${x => x.tooltipProps.xPos}px; top: ${x => x.tooltipProps.yPos}px" + > + <div class="tooltip-body" style="border-color: ${x => x.tooltipProps.color};"> + <div class="tooltip-legend-text">${x => x.tooltipProps.legend}</div> + <div class="tooltip-content-y" style="color: ${x => x.tooltipProps.color};"> + ${x => x.tooltipProps.yValue} + </div> + </div> + </div> + `, + )} + </template> + `; +} + +/** + * @internal + */ +export const template: ElementViewTemplate<DonutChart> = donutChartTemplate(); diff --git a/packages/charts/chart-web-components/src/donut-chart/donut-chart.ts b/packages/charts/chart-web-components/src/donut-chart/donut-chart.ts new file mode 100644 index 00000000000000..20d17d6572927b --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/donut-chart.ts @@ -0,0 +1,257 @@ +import { attr, FASTElement, nullableNumberConverter, observable } from '@microsoft/fast-element'; +import { arc as d3Arc, pie as d3Pie, PieArcDatum } from 'd3-shape'; +import { + getColorFromToken, + getNextColor, + getRTL, + jsonConverter, + SVG_NAMESPACE_URI, + validateChartProps, + wrapText, +} from '../utils/chart-helpers.js'; +import type { ChartDataPoint, ChartProps, Legend } from './donut-chart.options.js'; + +export class DonutChart extends FASTElement { + @attr({ converter: nullableNumberConverter }) + public height: number = 200; + + @attr({ converter: nullableNumberConverter }) + public width: number = 200; + + @attr({ attribute: 'hide-legends', mode: 'boolean' }) + public hideLegends: boolean = false; + + @attr({ attribute: 'hide-tooltip', mode: 'boolean' }) + public hideTooltip: boolean = false; + + @attr({ converter: jsonConverter }) + public data!: ChartProps; + + @attr({ attribute: 'inner-radius', converter: nullableNumberConverter }) + public innerRadius: number = 1; + + @attr({ attribute: 'value-inside-donut' }) + public valueInsideDonut?: string; + + @attr({ attribute: 'legend-list-label' }) + public legendListLabel?: string; + + @observable + public legends: Legend[] = []; + + @observable + public activeLegend: string = ''; + protected activeLegendChanged(oldValue: string, newValue: string) { + if (newValue === '') { + this._arcs?.forEach(arc => arc.classList.remove('inactive')); + } else { + this._arcs?.forEach(arc => { + if (arc.getAttribute('data-id') === newValue) { + arc.classList.remove('inactive'); + } else { + arc.classList.add('inactive'); + } + }); + } + + this._updateTextInsideDonut(); + } + + @observable + public isLegendSelected: boolean = false; + + @observable + public tooltipProps = { + isVisible: false, + legend: '', + yValue: '', + color: '', + xPos: 0, + yPos: 0, + }; + protected tooltipPropsChanged(oldValue: any, newValue: any) { + this._updateTextInsideDonut(); + } + + public chartWrapper!: HTMLDivElement; + public group!: SVGGElement; + public elementInternals: ElementInternals = this.attachInternals(); + + private _arcs: SVGPathElement[] = []; + private _isRTL: boolean = false; + private _textInsideDonut?: SVGTextElement; + + constructor() { + super(); + + this.elementInternals.role = 'region'; + } + + public handleLegendMouseoverAndFocus(legendTitle: string) { + if (this.isLegendSelected) { + return; + } + + this.activeLegend = legendTitle; + } + + public handleLegendMouseoutAndBlur() { + if (this.isLegendSelected) { + return; + } + + this.activeLegend = ''; + } + + public handleLegendClick(legendTitle: string) { + if (this.isLegendSelected && this.activeLegend === legendTitle) { + this.activeLegend = ''; + this.isLegendSelected = false; + } else { + this.activeLegend = legendTitle; + this.isLegendSelected = true; + } + } + + connectedCallback() { + super.connectedCallback(); + + validateChartProps(this.data, 'data'); + + this.data.chartData.forEach((dataPoint, index) => { + if (dataPoint.color) { + dataPoint.color = getColorFromToken(dataPoint.color); + } else { + dataPoint.color = getNextColor(index); + } + }); + + this.legends = this._getLegends(); + this._isRTL = getRTL(this); + this.elementInternals.ariaLabel = + this.data.chartTitle || `Donut chart with ${this.data.chartData.length} segments.`; + + this._render(); + } + + private _render() { + const pie = d3Pie<ChartDataPoint>() + .value(d => d.data) + .padAngle(0.02); + const arc = d3Arc<PieArcDatum<ChartDataPoint>>() + .innerRadius(this.innerRadius) + .outerRadius((Math.min(this.height, this.width) - 20) / 2); + + pie(this.data.chartData).forEach(arcDatum => { + const arcGroup = document.createElementNS(SVG_NAMESPACE_URI, 'g'); + this.group.appendChild(arcGroup); + + const pathOutline = document.createElementNS(SVG_NAMESPACE_URI, 'path'); + arcGroup.appendChild(pathOutline); + pathOutline.classList.add('arc-outline'); + pathOutline.setAttribute('d', arc(arcDatum)!); + + const path = document.createElementNS(SVG_NAMESPACE_URI, 'path'); + arcGroup.appendChild(path); + this._arcs.push(path); + path.classList.add('arc'); + path.setAttribute('d', arc(arcDatum)!); + path.setAttribute('fill', arcDatum.data.color!); + path.setAttribute('data-id', arcDatum.data.legend); + path.setAttribute('tabindex', '0'); + path.setAttribute('aria-label', `${arcDatum.data.legend}, ${arcDatum.data.data}.`); + path.setAttribute('role', 'img'); + + path.addEventListener('mouseover', event => { + if (this.activeLegend !== '' && this.activeLegend !== arcDatum.data.legend) { + return; + } + + const bounds = this.getBoundingClientRect(); + + this.tooltipProps = { + isVisible: true, + legend: arcDatum.data.legend, + yValue: `${arcDatum.data.data}`, + color: arcDatum.data.color!, + xPos: this._isRTL ? bounds.right - event.clientX : event.clientX - bounds.left, + yPos: event.clientY - bounds.top - 85, + }; + }); + path.addEventListener('focus', event => { + if (this.activeLegend !== '' && this.activeLegend !== arcDatum.data.legend) { + return; + } + + const rootBounds = this.getBoundingClientRect(); + const arcBounds = path.getBoundingClientRect(); + + this.tooltipProps = { + isVisible: true, + legend: arcDatum.data.legend, + yValue: `${arcDatum.data.data}`, + color: arcDatum.data.color!, + xPos: this._isRTL + ? rootBounds.right - arcBounds.left - arcBounds.width / 2 + : arcBounds.left + arcBounds.width / 2 - rootBounds.left, + yPos: arcBounds.top - rootBounds.top - 85, + }; + }); + path.addEventListener('blur', event => { + this.tooltipProps = { isVisible: false, legend: '', yValue: '', color: '', xPos: 0, yPos: 0 }; + }); + }); + + this.addEventListener('mouseleave', () => { + this.tooltipProps = { isVisible: false, legend: '', yValue: '', color: '', xPos: 0, yPos: 0 }; + }); + + if (this.valueInsideDonut) { + this._textInsideDonut = document.createElementNS(SVG_NAMESPACE_URI, 'text'); + this.group.appendChild(this._textInsideDonut); + this._textInsideDonut.classList.add('text-inside-donut'); + this._textInsideDonut.setAttribute('x', '0'); + this._textInsideDonut.setAttribute('y', '0'); + this._textInsideDonut.setAttribute('text-anchor', 'middle'); + this._textInsideDonut.setAttribute('dominant-baseline', 'middle'); + this._updateTextInsideDonut(); + } + } + + private _getLegends(): Legend[] { + return this.data.chartData.map((d, index) => ({ + title: d.legend, + color: d.color!, + })); + } + + private _getTextInsideDonut(valueInsideDonut: string) { + let textInsideDonut = valueInsideDonut; + + if (valueInsideDonut && (this.activeLegend !== '' || this.tooltipProps.isVisible)) { + const highlightedDataPoint = this.data.chartData.find( + dataPoint => + dataPoint.legend === this.activeLegend || + (this.tooltipProps.isVisible && dataPoint.legend === this.tooltipProps.legend), + ); + textInsideDonut = highlightedDataPoint!.yAxisCalloutData ?? highlightedDataPoint!.data.toLocaleString(); + } + + return textInsideDonut; + } + + private _updateTextInsideDonut() { + if (!this._textInsideDonut || !this.valueInsideDonut) { + return; + } + + this._textInsideDonut.textContent = this._getTextInsideDonut(this.valueInsideDonut); + const lineHeight = this._textInsideDonut.getBoundingClientRect().height; + wrapText(this._textInsideDonut, 2 * this.innerRadius); + const lines = this._textInsideDonut.getElementsByTagName('tspan'); + const start = -1 * Math.trunc((lines.length - 1) / 2); + for (let i = 0; i < lines.length; i++) { + lines[i].setAttribute('dy', `${(start + i) * lineHeight}`); + } + } +} diff --git a/packages/charts/chart-web-components/src/donut-chart/index.ts b/packages/charts/chart-web-components/src/donut-chart/index.ts new file mode 100644 index 00000000000000..60e54e1a59b9ba --- /dev/null +++ b/packages/charts/chart-web-components/src/donut-chart/index.ts @@ -0,0 +1,4 @@ +export { definition as DonutChartDefinition } from './donut-chart.definition.js'; +export { DonutChart } from './donut-chart.js'; +export { styles as DonutChartStyles } from './donut-chart.styles.js'; +export { template as DonutChartTemplate } from './donut-chart.template.js'; diff --git a/packages/charts/chart-web-components/src/helpers.stories.ts b/packages/charts/chart-web-components/src/helpers.stories.ts new file mode 100644 index 00000000000000..c885723594b95d --- /dev/null +++ b/packages/charts/chart-web-components/src/helpers.stories.ts @@ -0,0 +1,101 @@ +import type { ElementViewTemplate, FASTElement, ViewTemplate } from '@microsoft/fast-element'; +import type { AnnotatedStoryFn, Args, ComponentAnnotations, Renderer, StoryAnnotations } from '@storybook/csf'; + +/** + * A helper that returns a function to bind a Storybook story to a ViewTemplate. + * + * @param template - The ViewTemplate to render + * @returns - a function to bind a Storybook story + */ +export function renderComponent<TArgs = Args>(template: ViewTemplate): (args: TArgs) => Element | DocumentFragment { + return function (args) { + const storyFragment = new DocumentFragment(); + template.render(args, storyFragment); + if (storyFragment.childElementCount === 1) { + return storyFragment.firstElementChild!; + } + return storyFragment; + }; +} + +export declare interface FASTComponentsRenderer extends Renderer { + canvasElement: FASTElement; + component: typeof FASTElement | string; + storyResult: string | Node | DocumentFragment | ElementViewTemplate; +} + +/** + * A helper that returns a function to bind a Storybook story to a ViewTemplate. + */ +export type FASTFramework = Renderer & { + component: typeof FASTElement; + storyResult: FASTElement | Element | DocumentFragment; +}; + +/** + * Metadata to configure the stories for a component. + */ +export declare type Meta<TArgs = Args> = ComponentAnnotations<FASTComponentsRenderer, StoryArgs<TArgs>>; + +/** + * Story object that represents a CSFv3 component example. + * + * @see [Named Story exports](https://storybook.js.org/docs/formats/component-story-format/#named-story-exports) + */ +export declare type StoryObj<TArgs = Args> = StoryAnnotations<FASTComponentsRenderer, StoryArgs<TArgs>>; + +/** + * Story function that represents a CSFv2 component example. + */ +export declare type StoryFn<TArgs = Args> = AnnotatedStoryFn<FASTFramework, TArgs>; + +/** + * Story function that represents a CSFv2 component example. + * + * NOTE that in Storybook 7.0, this type will be renamed to `StoryFn` and replaced by the current `StoryObj` type. + */ +export declare type Story<TArgs = Args> = StoryFn<StoryArgs<TArgs>>; + +/** + * Combined Storybook story args. + */ +export type StoryArgs<TArgs = Args> = Partial<Omit<TArgs, keyof FASTElement>> & Args; + +export function generateImage({ + width, + height = width, + backgroundColor = 'rgb(204, 204, 204)', + color = 'rgb(150, 150, 150)', + text = `${width} x ${height}`, +}: { + width: number; + height?: number; + backgroundColor?: string; + color?: string; + text?: string; +}): string { + const canvas = document.createElement('canvas'); + const context = canvas.getContext('2d') as CanvasRenderingContext2D; + + canvas.width = width; + canvas.height = height; + + // Clear the canvas. + context.clearRect(0, 0, canvas.width, canvas.height); + + // get the font size to fit the text + context.font = '1px sans-serif'; + const maxFontSize = Math.max(width / context.measureText(text).width / 2, 7); + + // Draw the background + context.fillStyle = backgroundColor; + context.fillRect(0, 0, canvas.width, canvas.height); + + context.font = `${maxFontSize}px Helvetica, Arial, sans-serif`; + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = color; + context.fillText(text, canvas.width / 2, canvas.height / 2); + + return canvas.toDataURL('image/png'); +} diff --git a/packages/charts/chart-web-components/src/helpers.tests.ts b/packages/charts/chart-web-components/src/helpers.tests.ts new file mode 100644 index 00000000000000..46d72c8403a92f --- /dev/null +++ b/packages/charts/chart-web-components/src/helpers.tests.ts @@ -0,0 +1,86 @@ +import qs from 'qs'; +import { expect as baseExpect, type ExpectMatcherState, type Locator } from '@playwright/test'; + +/** + * Returns a formatted URL for a given Storybook fixture. + * + * @param id - the Storybook fixture ID + * @param args - Story args + * @returns - the local URL for the Storybook fixture iframe + */ +export function fixtureURL(id: string = 'debug--blank', args?: Record<string, any>): string { + const params: Record<string, any> = { id }; + if (args) { + params.args = qs + .stringify(args, { + allowDots: true, + delimiter: ';', + format: 'RFC1738', + encode: false, + }) + .replace(/=/g, ':') + .replace(/\//g, '--'); + } + + const url = qs.stringify(params, { + addQueryPrefix: true, + format: 'RFC1738', + encode: false, + }); + + return url; +} + +/** + * Evaluate whether an element has the given state or not on its `elementInternals` property. + * + * @param locator - The Playwright locator for the element. + * @param state - The name of the state. + * @param expected - Whether the given state is expected to exist. + * @param has - Whether the element is expected to have or not have the given state, defaults to `true`. + */ +async function toHaveCustomState( + this: ExpectMatcherState, + locator: Locator, + state: string, + options?: { timeout?: number }, +) { + const assertionName = 'toHaveCustomState'; + let pass: boolean; + let matcherResult: any; + const expected: boolean = !this.isNot; + + try { + baseExpect(await locator.evaluate((el, state) => el.matches(`:state(${state})`), state, options)).toEqual(true); + pass = true; + } catch (err: any) { + matcherResult = err.matcherResult; + pass = false; + } + + const message = pass + ? () => + this.utils.matcherHint(assertionName, undefined, undefined, { isNot: this.isNot }) + + '\n\n' + + `Locator: ${locator}\n` + + `Expected: ${this.isNot ? 'not' : ''}${this.utils.printExpected(expected)}\n` + + (matcherResult ? `Received: ${this.utils.printReceived(matcherResult.actual)}` : '') + : () => + this.utils.matcherHint(assertionName, undefined, undefined, { isNot: this.isNot }) + + '\n\n' + + `Locator: ${locator}\n` + + `Expected: ${this.utils.printExpected(expected)}\n` + + (matcherResult ? `Received: ${this.utils.printReceived(matcherResult.actual)}` : ''); + + return { + name: assertionName, + message, + pass, + expected, + actual: matcherResult?.actual, + }; +} + +export const expect = baseExpect.extend({ + toHaveCustomState, +}); diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/define.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/define.ts new file mode 100644 index 00000000000000..2af6e03097468c --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/define.ts @@ -0,0 +1,4 @@ +import { FluentDesignSystem } from '@fluentui/web-components'; +import { definition } from './horizontal-bar-chart.definition.js'; + +definition.define(FluentDesignSystem.registry); diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.bench.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.bench.ts new file mode 100644 index 00000000000000..14336cd320d46f --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.bench.ts @@ -0,0 +1,12 @@ +import { FluentDesignSystem } from '@fluentui/web-components'; +import { definition } from './horizontal-bar-chart.definition.js'; + +definition.define(FluentDesignSystem.registry); + +const itemRenderer = () => { + const horizontalbarchart = document.createElement('fluent-horizontal-bar-chart'); + return horizontalbarchart; +}; + +export default itemRenderer; +export { tests } from '../utils/benchmark-wrapper.js'; diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.definition.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.definition.ts new file mode 100644 index 00000000000000..211c4d0b63c563 --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.definition.ts @@ -0,0 +1,20 @@ +import { FluentDesignSystem } from '@fluentui/web-components'; +import { HorizontalBarChart } from './horizontal-bar-chart.js'; +import { styles } from './horizontal-bar-chart.styles.js'; +import { template } from './horizontal-bar-chart.template.js'; + +/** + * The Fluent Textarea Element definition. + * + * @public + * @remarks + * HTML Element: `<fluent-textarea>` + */ +export const definition = HorizontalBarChart.compose({ + name: `${FluentDesignSystem.prefix}-horizontal-bar-chart`, + template, + styles, + shadowOptions: { + delegatesFocus: true, + }, +}); diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.options.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.options.ts new file mode 100644 index 00000000000000..13b6150cc68b63 --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.options.ts @@ -0,0 +1,50 @@ +export enum Variant { + PartToWhole = 'part-to-whole', + AbsoluteScale = 'absolute-scale', + SingleBar = 'single-bar', +} + +export interface ChartDataPoint { + /** + * Legend text for the datapoint in the chart + */ + legend: string; + + /** + * data the datapoint in the chart + */ + data: number; + + /** + * total length of bar + */ + total?: number; + + /** + * onClick action for each datapoint in the chart + */ + onClick?: VoidFunction; + + /** + * Color for the legend in the chart. If not provided, it will fallback on the default color palette. + */ + color?: string; + + gradient?: [string, string]; +} + +export interface ChartProps { + /** + * title for the data series + */ + chartSeriesTitle?: string; + + /** + * data for the points in the chart + */ + chartData: ChartDataPoint[]; + + benchmarkData?: number; + + chartDataText?: string; +} diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.spec.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.spec.ts new file mode 100644 index 00000000000000..082758977133f2 --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.spec.ts @@ -0,0 +1,730 @@ +import { Locator, test } from '@playwright/test'; +import { expect, fixtureURL } from '../helpers.tests.js'; +import type { ChartDataPoint, ChartProps } from './horizontal-bar-chart.options.js'; + +const chartPoints1: ChartDataPoint[] = [ + { + legend: 'Debit card numbers (EU and USA)', + data: 40, + color: '#0099BC', + }, + { + legend: 'Passport numbers (USA)', + data: 23, + color: '#77004D', + }, + { + legend: 'Social security numbers', + data: 35, + color: '#4F68ED', + }, + { + legend: 'Credit card Numbers', + data: 87, + color: '#AE8C00', + }, + { + legend: 'Tax identification numbers (USA)', + data: 87, + color: '#004E8C', + }, +]; + +const chartPoints2: ChartDataPoint[] = [ + { + legend: 'Debit card numbers (EU and USA)', + data: 40, + color: '#0099BC', + }, + { + legend: 'Passport numbers (USA)', + data: 56, + color: '#77004D', + }, + { + legend: 'Social security numbers', + data: 35, + color: '#4F68ED', + }, + { + legend: 'Credit card Numbers', + data: 92, + color: '#AE8C00', + }, + { + legend: 'Tax identification numbers (USA)', + data: 87, + color: '#004E8C', + }, +]; + +const chartPoints3: ChartDataPoint[] = [ + { + legend: 'Phone Numbers', + data: 40, + color: '#881798', + }, + { + legend: 'Credit card Numbers', + data: 23, + color: '#AE8C00', + }, +]; + +const basicChartTestData: ChartProps[] = [ + { + chartSeriesTitle: 'Monitored First', + chartData: chartPoints1, + }, + { + chartSeriesTitle: 'Monitored Second', + chartData: chartPoints2, + }, + { + chartSeriesTitle: 'Unmonitored', + chartData: chartPoints3, + }, +]; + +const singleBarHBCData = [ + { + chartSeriesTitle: 'one', + chartData: [ + { + legend: 'one', + data: 1543, + total: 15000, + color: '#637cef', + }, + ], + }, + { + chartSeriesTitle: 'two', + chartData: [ + { + legend: 'two', + data: 800, + total: 15000, + color: '#e3008c', + }, + ], + }, + { + chartSeriesTitle: 'three', + chartData: [ + { + legend: 'three', + data: 8888, + total: 15000, + color: '#2aa0a4', + }, + ], + }, + { + chartSeriesTitle: 'four', + chartData: [ + { + legend: 'four', + data: 15888, + total: 15000, + color: '#9373c0', + }, + ], + }, + { + chartSeriesTitle: 'five', + chartData: [ + { + legend: 'five', + data: 11444, + total: 15000, + color: '#13a10e', + }, + ], + }, + { + chartSeriesTitle: 'six', + chartData: [ + { + legend: 'six', + data: 14000, + total: 15000, + color: '#3a96dd', + }, + ], + }, + { + chartSeriesTitle: 'seven', + chartData: [ + { + legend: 'seven', + data: 9855, + total: 15000, + color: '#ca5010', + }, + ], + }, + { + chartSeriesTitle: 'eight', + chartData: [ + { + legend: 'eight', + data: 4250, + total: 15000, + color: '#57811b', + }, + ], + }, +]; + +const singleBarNMVariantData = [ + { + chartSeriesTitle: 'one', + chartData: [ + { + legend: 'one', + data: 1543, + total: 15000, + color: '#637cef', + }, + ], + }, + { + chartSeriesTitle: 'two', + chartData: [ + { + legend: 'two', + data: 800, + total: 15000, + color: '#e3008c', + }, + ], + }, + { + chartSeriesTitle: 'three', + chartData: [ + { + legend: 'three', + data: 8888, + total: 15000, + color: '#2aa0a4', + }, + ], + }, + { + chartSeriesTitle: 'four', + chartData: [ + { + legend: 'four', + data: 15888, + total: 15000, + color: '#9373c0', + }, + ], + }, + { + chartSeriesTitle: 'five', + chartData: [ + { + legend: 'five', + data: 11444, + total: 15000, + color: '#13a10e', + }, + ], + }, + { + chartSeriesTitle: 'six', + chartData: [ + { + legend: 'six', + data: 14000, + total: 15000, + color: '#3a96dd', + }, + ], + }, + { + chartSeriesTitle: 'seven', + chartData: [ + { + legend: 'seven', + data: 9855, + total: 15000, + color: '#ca5010', + }, + ], + }, + { + chartSeriesTitle: 'eight', + chartData: [ + { + legend: 'eight', + data: 4250, + total: 15000, + color: '#57811b', + }, + ], + }, +]; + +const singlePointData = [ + { + chartSeriesTitle: 'one', + chartData: [ + { + legend: 'one', + data: 1543, + total: 15000, + gradient: ['#637cef', '#e3008c'], + }, + ], + }, +]; + +async function expectOptionsToBeVisible(element: Locator, options: string | any[]) { + for (let i = 0; i < options.length; i++) { + await expect(element.getByRole('option', { name: options[i] })).toBeVisible(); + } +} + +test.describe('horizontalbarchart - Basic', () => { + test.beforeEach(async ({ page }) => { + await page.goto(fixtureURL('components-horizontalbarchart--basic')); + await page.setContent(/* html */ ` + <div> + <fluent-horizontal-bar-chart data='${JSON.stringify(basicChartTestData)}'> + </fluent-horizontal-bar-chart> + </div> + `); + await page.waitForFunction(() => customElements.whenDefined('fluent-horizontal-bar-chart')); + }); + + test('Should render horizontalbarchart properly', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + await expectOptionsToBeVisible(element, [ + 'Debit card numbers (EU and USA)', + 'Passport numbers (USA)', + 'Social security numbers', + 'Credit card Numbers', + 'Phone Numbers', + ]); + await expect(page.getByText('Monitored First')).toBeVisible(); + await expect(page.getByText('Monitored Second')).toBeVisible(); + await expect(page.getByText('Unmonitored')).toBeVisible(); + }); + + test('Should render legends data properly', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(6); + const firstLegend = legends.first(); + await expect(firstLegend.locator('div').first()).toHaveCSS('background-color', 'rgb(0, 153, 188)'); + await expect(firstLegend).toHaveText('Debit card numbers (EU and USA)'); + }); + + test('Should update bar css/opaity when mouse hover on legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(6); + const firstLegend = legends.first(); + //mouse events + await legends.nth(0).dispatchEvent('mouseover'); + const bars = element.locator('.bar'); + await expect(bars).toHaveCount(12); + for (let i = 0; i < (await bars.count()); i++) { + if (i == 0 || i == 5) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + }); + + test('Should update bar css/opaity when mouse moved from one legend to another legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(6); + await legends.nth(0).dispatchEvent('mouseover'); + const bars = element.locator('.bar'); + for (let i = 0; i < (await bars.count()); i++) { + if (i == 0 || i == 5) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + await legends.nth(0).dispatchEvent('mouseout'); + await legends.nth(1).dispatchEvent('mouseover'); + for (let i = 0; i < (await bars.count()); i++) { + if (i == 1 || i == 6) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + }); + + test('Should show callout when mouse hover on bar', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + const tooltip = element.locator('.tooltip'); + await expect(tooltip).toHaveCount(0); + await bars.nth(0).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(1); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('Debit card numbers (EU and USA) 40'); + }); + + test('Should update callout data when mouse moved from one bar to another bar', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + const tooltip = element.locator('.tooltip'); + await expect(tooltip).toHaveCount(0); + await bars.nth(0).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(1); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('Debit card numbers (EU and USA) 40'); + await bars.nth(0).dispatchEvent('mouseout'); + await bars.nth(1).dispatchEvent('mouseover'); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('Passport numbers (USA) 23'); + }); +}); + +test.describe('horizontalbarchart - Single Bar HBC', () => { + test.beforeEach(async ({ page }) => { + await page.goto(fixtureURL('components-horizontalbarchart--single-bar-hbc')); + await page.setContent(/* html */ ` + <div> + <fluent-horizontal-bar-chart data='${JSON.stringify(singleBarHBCData)}'> + </fluent-horizontal-bar-chart> + </div> + `); + await page.waitForFunction(() => customElements.whenDefined('fluent-horizontal-bar-chart')); + }); + + test('Should render Single Bar HBC properly', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + await expectOptionsToBeVisible(element, ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight']); + const barsTitles = element.locator('.chart-title'); + await expect(barsTitles).toHaveCount(8); + await expect(barsTitles.nth(0)).toHaveText('one'); + await expect(barsTitles.nth(1)).toHaveText('two'); + await expect(barsTitles.nth(2)).toHaveText('three'); + await expect(barsTitles.nth(3)).toHaveText('four'); + await expect(barsTitles.nth(4)).toHaveText('five'); + await expect(barsTitles.nth(5)).toHaveText('six'); + await expect(barsTitles.nth(6)).toHaveText('seven'); + await expect(barsTitles.nth(7)).toHaveText('eight'); + for (let i = 0; i < (await barsTitles.count()); i++) { + await expect(barsTitles.nth(i)).toBeVisible(); + } + }); + + test('Should update bar css/opaity when mouse hover on legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(8); + //mouse events + await legends.nth(0).dispatchEvent('mouseover'); + const bars = element.locator('.bar'); + await expect(bars).toHaveCount(8); + for (let i = 1; i < (await bars.count()); i++) { + if (i == 0) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + }); + + test('Should update bar css/opaity when mouse moved from one legend to another legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(8); + await legends.nth(0).dispatchEvent('mouseover'); + const bars = element.locator('.bar'); + await expect(bars.nth(0)).toHaveCSS('opacity', '1'); + for (let i = 1; i < (await bars.count()); i++) { + if (i == 0) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + await legends.nth(0).dispatchEvent('mouseout'); + await legends.nth(1).dispatchEvent('mouseover'); + for (let i = 1; i < (await bars.count()); i++) { + if (i == 1) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + }); + + test('Should update bar css/opaity when mouse click on legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(8); + await legends.nth(0).click(); + const bars = element.locator('.bar'); + await expect(bars.nth(0)).toHaveCSS('opacity', '1'); + for (let i = 1; i < (await bars.count()); i++) { + if (i == 0) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + await legends.nth(0).click(); + for (let i = 1; i < (await bars.count()); i++) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } + }); + + test('Should show callout when mouse hover on bar', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + const tooltip = element.locator('.tooltip'); + await expect(tooltip).toHaveCount(0); + await bars.nth(0).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(1); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('one 1543'); + }); + + test('Should update callout data when mouse moved from one bar to another bar', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + const tooltip = element.locator('.tooltip'); + await expect(tooltip).toHaveCount(0); + await bars.nth(0).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(1); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('one 1543'); + await bars.nth(0).dispatchEvent('mouseout'); + await bars.nth(1).dispatchEvent('mouseover'); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('two 800'); + }); +}); + +test.describe('horizontalbarchart - Single Bar NM Variant', () => { + test.beforeEach(async ({ page }) => { + await page.goto(fixtureURL('components-horizontalbarchart--single-bar-nm-variant')); + await page.setContent(/* html */ ` + <div> + <fluent-horizontal-bar-chart data='${JSON.stringify(singleBarNMVariantData)}' variant="single-bar"> + </fluent-horizontal-bar-chart> + </div> + `); + await page.waitForFunction(() => customElements.whenDefined('fluent-horizontal-bar-chart')); + }); + + test('Should render Single Bar HBC properly', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + await expectOptionsToBeVisible(element, ['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight']); + }); + + test('Should render bars and bar labels properly', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + await expect(bars).toHaveCount(16); + await expect(bars.nth(0)).toHaveCSS('fill', 'rgb(99, 124, 239)'); + await expect(bars.nth(0)).toHaveCSS('opacity', '1'); + await expect(bars.nth(0)).toHaveAttribute(`height`, '12'); + + const firstBarWidth = await bars.nth(0).getAttribute('width'); + const firstBarWidthEmptySpace = await bars.nth(1).getAttribute('width'); + expect(parseFloat(firstBarWidth!)).toBeLessThan(parseFloat(firstBarWidthEmptySpace!)); + expect(parseFloat(firstBarWidth!) + parseFloat(firstBarWidthEmptySpace!)).toBeGreaterThanOrEqual(99); + + const secondBarWidth = await bars.nth(2).getAttribute('width'); + const secondBarWidthEmptySpace = await bars.nth(3).getAttribute('width'); + expect(parseFloat(secondBarWidth!)).toBeLessThan(parseFloat(secondBarWidthEmptySpace!)); + expect(parseFloat(secondBarWidth!) + parseFloat(secondBarWidthEmptySpace!)).toBeGreaterThanOrEqual(99); + + const thirdBarWidth = await bars.nth(4).getAttribute('width'); + const thirdBarWidthEmptySpace = await bars.nth(5).getAttribute('width'); + expect(parseFloat(thirdBarWidth!)).toBeGreaterThan(parseFloat(thirdBarWidthEmptySpace!)); + expect(parseFloat(thirdBarWidth!) + parseFloat(thirdBarWidthEmptySpace!)).toBeGreaterThanOrEqual(99); + + const fourthBarWidth = await bars.nth(6).getAttribute('width'); + const fourthBarWidthEmptySpace = await bars.nth(7).getAttribute('width'); + expect(parseFloat(fourthBarWidth!)).toBeGreaterThan(parseFloat(fourthBarWidthEmptySpace!)); + expect(parseFloat(fourthBarWidth!) + parseFloat(fourthBarWidthEmptySpace!)).toBeGreaterThanOrEqual(99); + + const fifthBarWidth = await bars.nth(8).getAttribute('width'); + const fifthBarWidthEmptySpace = await bars.nth(9).getAttribute('width'); + expect(parseFloat(fifthBarWidth!)).toBeGreaterThan(parseFloat(fifthBarWidthEmptySpace!)); + expect(parseFloat(fifthBarWidth!) + parseFloat(fifthBarWidthEmptySpace!)).toBeGreaterThanOrEqual(99); + + const sixthBarWidth = await bars.nth(10).getAttribute('width'); + const sixthBarWidthEmptySpace = await bars.nth(11).getAttribute('width'); + expect(parseFloat(sixthBarWidth!)).toBeGreaterThan(parseFloat(sixthBarWidthEmptySpace!)); + expect(parseFloat(sixthBarWidth!) + parseFloat(sixthBarWidthEmptySpace!)).toBeGreaterThanOrEqual(98); + + const seventhBarWidth = await bars.nth(12).getAttribute('width'); + const seventhBarWidthEmptySpace = await bars.nth(13).getAttribute('width'); + expect(parseFloat(seventhBarWidth!)).toBeGreaterThan(parseFloat(seventhBarWidthEmptySpace!)); + expect(parseFloat(seventhBarWidth!) + parseFloat(seventhBarWidthEmptySpace!)).toBeGreaterThanOrEqual(99); + + const eigthBarWidth = await bars.nth(14).getAttribute('width'); + const eigthBarWidthEmptySpace = await bars.nth(15).getAttribute('width'); + expect(parseFloat(eigthBarWidth!)).toBeLessThan(parseFloat(eigthBarWidthEmptySpace!)); + expect(parseFloat(eigthBarWidth!) + parseFloat(eigthBarWidthEmptySpace!)).toBeGreaterThanOrEqual(99); + }); + + test('Should update bar css/opaity when mouse hover on legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(8); + //mouse events + await legends.nth(0).dispatchEvent('mouseover'); + const bars = element.locator('.bar'); + await expect(bars).toHaveCount(16); + for (let i = 1; i < (await bars.count()); i++) { + if (i == 0) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + }); + + test('Should update bar css/opaity when mouse moved from one legend to another legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(8); + await legends.nth(0).dispatchEvent('mouseover'); + const bars = element.locator('.bar'); + for (let i = 1; i < (await bars.count()); i++) { + if (i == 0) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + await legends.nth(0).dispatchEvent('mouseout'); + await legends.nth(1).dispatchEvent('mouseover'); + for (let i = 1; i < (await bars.count()); i++) { + if (i == 2) { + await expect(bars.nth(i)).toHaveCSS('opacity', '1'); + } else { + await expect(bars.nth(i)).toHaveCSS('opacity', '0.1'); + } + } + }); + + test('Should show callout when mouse hover on bar', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + const tooltip = element.locator('.tooltip'); + await expect(tooltip).toHaveCount(0); + await bars.nth(0).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(1); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('one 1543'); + }); + + test('Should update callout data when mouse moved from one bar to another bar', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + const tooltip = element.locator('.tooltip'); + await expect(tooltip).toHaveCount(0); + await bars.nth(0).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(1); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('one 1543'); + await bars.nth(0).dispatchEvent('mouseout'); + await bars.nth(2).dispatchEvent('mouseover'); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('two 800'); + }); +}); + +test.describe('horizontalbarchart - Single Data Point', () => { + test.beforeEach(async ({ page }) => { + await page.goto(fixtureURL('components-horizontalbarchart--single-data-point')); + await page.setContent(/* html */ ` + <div> + <fluent-horizontal-bar-chart data='${JSON.stringify(singlePointData)}' variant="single-bar"> + </fluent-horizontal-bar-chart> + </div> + `); + await page.waitForFunction(() => customElements.whenDefined('fluent-horizontal-bar-chart')); + }); + + test('Should render Single Bar HBC properly', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + await expect(element.getByRole('option', { name: 'one' })).toBeVisible(); + const barsTitles = element.locator('.chart-title'); + await expect(barsTitles).toHaveCount(1); + await expect(barsTitles.nth(0)).toHaveText('one'); + await expect(barsTitles.nth(0)).toBeVisible(); + }); + + test('Should render bars and bar labels properly', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + await expect(bars).toHaveCount(2); + await expect(bars.nth(0)).toHaveCSS('fill', 'url("#gradient-0-0")'); + await expect(bars.nth(0)).toHaveCSS('opacity', '1'); + await expect(bars.nth(0)).toHaveAttribute(`height`, '12'); + const firstBarWidth = await bars.nth(0).getAttribute('width'); + const firstBarWidthEmptySpace = await bars.nth(1).getAttribute('width'); + expect(parseFloat(firstBarWidth!)).toBeLessThan(parseFloat(firstBarWidthEmptySpace!)); + expect(parseFloat(firstBarWidth!) + parseFloat(firstBarWidthEmptySpace!)).toBeGreaterThan(99); + }); + + test('Should update bar css/opaity when mouse hover on legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await expect(legends).toHaveCount(1); + //mouse events + await legends.nth(0).dispatchEvent('mouseover'); + const bars = element.locator('.bar'); + await expect(bars).toHaveCount(2); + await expect(bars.nth(0)).toHaveCSS('opacity', '1'); + await expect(bars.nth(1)).toHaveCSS('opacity', '0.1'); + }); + + test('Should update bar css/opaity when mouse click on legend', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const legends = element.locator('.legend'); + await legends.nth(0).click(); + const bars = element.locator('.bar'); + await expect(bars.nth(0)).toHaveCSS('opacity', '1'); + await expect(bars.nth(1)).toHaveCSS('opacity', '0.1'); + await legends.nth(0).click(); + await expect(bars.nth(0)).toHaveCSS('opacity', '1'); + await expect(bars.nth(1)).toHaveCSS('opacity', '1'); + }); + + test('Should show callout when mouse hover on bar', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + const tooltip = element.locator('.tooltip'); + await expect(tooltip).toHaveCount(0); + await bars.nth(0).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(1); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('one 1543'); + }); + + test('Should hide callout when mouve moved to bar offset', async ({ page }) => { + const element = page.locator('fluent-horizontal-bar-chart'); + const bars = element.locator('.bar'); + const tooltip = element.locator('.tooltip'); + await expect(tooltip).toHaveCount(0); + await bars.nth(0).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(1); + await expect(tooltip.nth(0)).toHaveCSS('opacity', '1'); + await expect(tooltip.nth(0).locator('div').first()).toHaveText('one 1543'); + await bars.nth(0).dispatchEvent('mouseout'); + await bars.nth(1).dispatchEvent('mouseover'); + await expect(tooltip).toHaveCount(0); + }); +}); diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.stories.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.stories.ts new file mode 100644 index 00000000000000..72f523b84f0f14 --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.stories.ts @@ -0,0 +1,389 @@ +import { html } from '@microsoft/fast-element'; +import type { Meta, Story, StoryArgs } from '../helpers.stories.js'; +import { renderComponent } from '../helpers.stories.js'; +import { HorizontalBarChart as FluentHorizontalBarChart } from './horizontal-bar-chart.js'; +import type { ChartDataPoint, ChartProps } from './horizontal-bar-chart.options.js'; +import { Variant } from './horizontal-bar-chart.options.js'; + +const singleBarHBCData = [ + { + chartSeriesTitle: 'one', + chartData: [ + { + legend: 'one', + data: 1543, + total: 15000, + color: '#637cef', + }, + ], + }, + { + chartSeriesTitle: 'two', + chartData: [ + { + legend: 'two', + data: 800, + total: 15000, + color: '#e3008c', + }, + ], + }, + { + chartSeriesTitle: 'three', + chartData: [ + { + legend: 'three', + data: 8888, + total: 15000, + color: '#2aa0a4', + }, + ], + }, + { + chartSeriesTitle: 'four', + chartData: [ + { + legend: 'four', + data: 15888, + total: 15000, + color: '#9373c0', + }, + ], + }, + { + chartSeriesTitle: 'five', + chartData: [ + { + legend: 'five', + data: 11444, + total: 15000, + color: '#13a10e', + }, + ], + }, + { + chartSeriesTitle: 'six', + chartData: [ + { + legend: 'six', + data: 14000, + total: 15000, + color: '#3a96dd', + }, + ], + }, + { + chartSeriesTitle: 'seven', + chartData: [ + { + legend: 'seven', + data: 9855, + total: 15000, + color: '#ca5010', + }, + ], + }, + { + chartSeriesTitle: 'eight', + chartData: [ + { + legend: 'eight', + data: 4250, + total: 15000, + color: '#57811b', + }, + ], + }, +]; + +const singleBarNMVariantData: ChartProps[] = [ + { + chartSeriesTitle: 'one', + chartData: [ + { + legend: 'one', + data: 1543, + total: 15000, + color: '#637cef', + }, + ], + chartDataText: '1.5k/15k hours', + }, + { + chartSeriesTitle: 'two', + chartData: [ + { + legend: 'two', + data: 800, + total: 15000, + color: '#e3008c', + }, + ], + chartDataText: '800/15k hours', + }, + { + chartSeriesTitle: 'three', + chartData: [ + { + legend: 'three', + data: 8888, + total: 15000, + color: '#2aa0a4', + }, + ], + chartDataText: '8.9k/15k hours', + }, + { + chartSeriesTitle: 'four', + chartData: [ + { + legend: 'four', + data: 15888, + total: 15000, + color: '#9373c0', + }, + ], + chartDataText: '16k/15k hours', + }, + { + chartSeriesTitle: 'five', + chartData: [ + { + legend: 'five', + data: 11444, + total: 15000, + color: '#13a10e', + }, + ], + chartDataText: '11k/15k hours', + }, + { + chartSeriesTitle: 'six', + chartData: [ + { + legend: 'six', + data: 14000, + total: 15000, + color: '#3a96dd', + }, + ], + chartDataText: '14k/15k hours', + }, + { + chartSeriesTitle: 'seven', + chartData: [ + { + legend: 'seven', + data: 9855, + total: 15000, + color: '#ca5010', + }, + ], + chartDataText: '9.9k/15k hours', + }, + { + chartSeriesTitle: 'eight', + chartData: [ + { + legend: 'eight', + data: 4250, + total: 15000, + color: '#57811b', + }, + ], + chartDataText: '4.3k/15k hours', + }, +]; + +const chartPoints1: ChartDataPoint[] = [ + { + legend: 'Debit card numbers (EU and USA)', + data: 40, + color: '#0099BC', + }, + { + legend: 'Passport numbers (USA)', + data: 23, + color: '#77004D', + }, + { + legend: 'Social security numbers', + data: 35, + color: '#4F68ED', + }, + { + legend: 'Credit card Numbers', + data: 87, + color: '#AE8C00', + }, + { + legend: 'Tax identification numbers (USA)', + data: 87, + color: '#004E8C', + }, +]; + +const chartPoints2: ChartDataPoint[] = [ + { + legend: 'Debit card numbers (EU and USA)', + data: 40, + color: '#0099BC', + }, + { + legend: 'Passport numbers (USA)', + data: 56, + color: '#77004D', + }, + { + legend: 'Social security numbers', + data: 35, + color: '#4F68ED', + }, + { + legend: 'Credit card Numbers', + data: 92, + color: '#AE8C00', + }, + { + legend: 'Tax identification numbers (USA)', + data: 87, + color: '#004E8C', + }, +]; + +const chartPoints3: ChartDataPoint[] = [ + { + legend: 'Phone Numbers', + data: 40, + color: '#881798', + }, + { + legend: 'Credit card Numbers', + data: 23, + color: '#AE8C00', + }, +]; + +const data: ChartProps[] = [ + { + chartSeriesTitle: 'Monitored First', + chartData: chartPoints1, + }, + { + chartSeriesTitle: 'Monitored Second', + chartData: chartPoints2, + }, + { + chartSeriesTitle: 'Unmonitored', + chartData: chartPoints3, + }, +]; + +const singlePointData = [ + { + chartSeriesTitle: 'one', + chartData: [ + { + legend: 'one', + data: 1543, + total: 15000, + gradient: ['#637cef', '#e3008c'], + }, + ], + }, +]; + +const benchmarkData: ChartProps[] = [ + { + chartSeriesTitle: 'one', + chartData: [ + { + legend: 'one', + data: 10, + total: 100, + color: '#637cef', + }, + ], + benchmarkData: 50, + }, + { + chartSeriesTitle: 'two', + chartData: [ + { + legend: 'two', + data: 30, + total: 200, + color: '#e3008c', + }, + ], + benchmarkData: 30, + }, + { + chartSeriesTitle: 'three', + chartData: [ + { + legend: 'three', + data: 15, + total: 50, + color: '#2aa0a4', + }, + ], + benchmarkData: 5, + }, +]; + +const storyTemplate = html<StoryArgs<FluentHorizontalBarChart>>` + <fluent-horizontal-bar-chart style="width: 100%" data="${JSON.stringify(data)}"> </fluent-horizontal-bar-chart> +`; + +export default { + title: 'Components/HorizontalBarChart', +} as Meta<FluentHorizontalBarChart>; + +export const RTL: Story<FluentHorizontalBarChart> = renderComponent(html<StoryArgs<FluentHorizontalBarChart>>` + <div dir="rtl"> + <div> + <fluent-horizontal-bar-chart style="width: 100%" data="${JSON.stringify(data)}"> </fluent-horizontal-bar-chart> + </div> + </div> +`); + +export const singleDataPoint: Story<FluentHorizontalBarChart> = renderComponent(html< + StoryArgs<FluentHorizontalBarChart> +>` + <div> + <fluent-horizontal-bar-chart style="width: 100%" variant="single-bar" data="${JSON.stringify(singlePointData)}"> + </fluent-horizontal-bar-chart> + </div> +`); + +export const Benchmark: Story<FluentHorizontalBarChart> = renderComponent(html<StoryArgs<FluentHorizontalBarChart>>` + <fluent-horizontal-bar-chart style="width: 100%" variant="single-bar" data="${JSON.stringify(benchmarkData)}"> + </fluent-horizontal-bar-chart> +`); + +export const singleBarNMVariant: Story<FluentHorizontalBarChart> = renderComponent(html< + StoryArgs<FluentHorizontalBarChart> +>` + <div> + <fluent-horizontal-bar-chart + style="width: 100%" + variant="single-bar" + data="${JSON.stringify(singleBarNMVariantData)}" + > + </fluent-horizontal-bar-chart> + </div> +`); + +export const singleBarHBC: Story<FluentHorizontalBarChart> = renderComponent(html<StoryArgs<FluentHorizontalBarChart>>` + <div> + <fluent-horizontal-bar-chart + style="width: 100%" + data="${JSON.stringify(singleBarHBCData)}" + variant="${Variant.AbsoluteScale}" + > + </fluent-horizontal-bar-chart> + </div> +`); + +export const Basic: Story<FluentHorizontalBarChart> = renderComponent(storyTemplate).bind({}); diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.styles.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.styles.ts new file mode 100644 index 00000000000000..9932537a89f26d --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.styles.ts @@ -0,0 +1,190 @@ +import type { ElementStyles } from '@microsoft/fast-element'; +import { css } from '@microsoft/fast-element'; +import { + colorNeutralBackground1, + colorNeutralForeground1, + colorNeutralStrokeAccessible, + display, + forcedColorsStylesheetBehavior, + shadow4, + spacingHorizontalL, + spacingHorizontalNone, + spacingHorizontalS, + spacingHorizontalSNudge, + spacingVerticalL, + spacingVerticalM, + spacingVerticalMNudge, + spacingVerticalNone, + spacingVerticalS, + spacingVerticalXS, + strokeWidthThick, + strokeWidthThickest, + strokeWidthThin, + typographyBody1StrongStyles, + typographyBody1Styles, + typographyCaption1Styles, + typographyTitle2Styles, +} from '@fluentui/web-components'; + +/** + * Styles for the HorizontalBarChart component. + * + * @public + */ +export const styles: ElementStyles = css` + ${display('inline-block')} + + :host { + position: relative; + } + .root { + background-color: ${colorNeutralBackground1}; + width: 100vw; + display: flex; + flex-direction: column; + align-items: center; + position: relative; + } + .tooltip { + ${typographyCaption1Styles} + position: absolute; + z-index: 999; + display: grid; + overflow: hidden; + padding: ${spacingVerticalMNudge} ${spacingHorizontalL}; + backgroundcolor: ${colorNeutralBackground1}; + background-blend-mode: normal, luminosity; + text-align: center; + background: ${colorNeutralBackground1}; + box-shadow: ${shadow4}; + border: ${strokeWidthThick}; + pointer-events: none; + } + .tooltip-line { + padding-inline-start: ${spacingHorizontalS}; + height: 50px; + border-inline-start: ${strokeWidthThickest} solid; + } + .tooltip-legend-text { + ${typographyCaption1Styles} + color: ${colorNeutralForeground1}; + text-align: start; + } + .tooltip-data-y { + ${typographyTitle2Styles} + text-align: start; + } + .bar { + opacity: 1; + } + .bar.inactive { + opacity: 0.1; + } + .bar:focus { + outline: none; + stroke-width: ${strokeWidthThick}; + stroke: black; + } + .svg-chart { + display: block; + overflow: visible; + } + .chart-title { + ${typographyBody1Styles} + display: flex; + justify-content: space-between; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; + display: block; + color: ${colorNeutralForeground1}; + margin-bottom: ${spacingHorizontalSNudge}; + } + .legendcontainer { + display: flex; + flex-direction: row; + flex-wrap: wrap; + padding-top: ${spacingVerticalL}; + width: 100%; + align-items: center; + margin: -${spacingVerticalS} ${spacingHorizontalNone} ${spacingVerticalNone} -${spacingHorizontalS}; + } + .legend { + display: flex; + align-items: center; + cursor: pointer; + border: none; + padding: ${spacingHorizontalS}; + background: none; + text-transform: capitalize; + } + .legend-rect { + width: 12px; + height: 12px; + margin-inline-end: ${spacingHorizontalS}; + border: ${strokeWidthThin} solid; + } + .legend-text { + ${typographyCaption1Styles} + color: ${colorNeutralForeground1}; + } + .legend.inactive .legend-rect { + background-color: transparent !important; + } + .legend.inactive .legend-text { + opacity: 0.67; + } + .bar-label { + ${typographyBody1StrongStyles} + fill: ${colorNeutralForeground1}; + } + .chart-title-div { + width: 100%; + display: flex; + justify-content: space-between; + } + .ratio-numerator { + ${typographyBody1StrongStyles} + color: ${colorNeutralForeground1}; + } + .ratio-denominator { + ${typographyBody1StrongStyles} + color: ${colorNeutralForeground1}; + font-weight: bold; + } + .benchmark-container { + position: relative; + height: 7px; + margin-top: -3px; + } + .triangle { + width: 0; + height: 0; + border-left: ${strokeWidthThickest} solid transparent; + border-right: ${strokeWidthThickest} solid transparent; + border-bottom: 7px solid; + border-bottom-color: ${colorNeutralStrokeAccessible}; + margin-bottom: ${spacingVerticalXS}; + position: absolute; + } + .chart-data-text { + ${typographyBody1StrongStyles} + color: ${colorNeutralForeground1}; + } +`.withBehaviors( + forcedColorsStylesheetBehavior(css` + .legend-rect, + .tooltip-line, + .triangle { + forced-color-adjust: none; + } + .tooltip-legend-text, + .tooltip-content-y { + forced-color-adjust: auto; + color: CanvasText; + } + .bar-label { + fill: CanvasText !important; + } + `), +); diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.template.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.template.ts new file mode 100644 index 00000000000000..07d6656bc9be0c --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.template.ts @@ -0,0 +1,66 @@ +import { ElementViewTemplate, html, ref, repeat, when } from '@microsoft/fast-element'; +import type { HorizontalBarChart } from './horizontal-bar-chart.js'; +import type { ChartDataPoint } from './horizontal-bar-chart.options.js'; + +/** + * Generates a template for the HorizontalBarChart component. + * + * @public + */ +export function horizontalbarchartTemplate<T extends HorizontalBarChart>(): ElementViewTemplate<T> { + return html<T>` + <template> + <div ${ref('chartContainer')}></div> + ${when( + x => !x.hideLegends, + html<T>` + <div class="legendcontainer" role="listbox" aria-label="${x => x.legendListLabel}"> + ${repeat( + x => x.uniqueLegends, + html<ChartDataPoint, T>` <button + class="legend${(x, c) => + c.parent.activeLegend === '' || c.parent.activeLegend === x.legend ? '' : ' inactive'}" + role="option" + aria-setsize="${(x, c) => c.length}" + aria-posinset="${(x, c) => c.index + 1}" + aria-selected="${(x, c) => x.legend === c.parent.activeLegend}" + @mouseover="${(x, c) => c.parent.handleLegendMouseoverAndFocus(x.legend)}" + @mouseout="${(x, c) => c.parent.handleLegendMouseoutAndBlur()}" + @focus="${(x, c) => c.parent.handleLegendMouseoverAndFocus(x.legend)}" + @blur="${(x, c) => c.parent.handleLegendMouseoutAndBlur()}" + @click="${(x, c) => c.parent.handleLegendClick(x.legend)}" + > + <div + class="legend-rect" + style="background-color: ${x => x.color}; border-color: ${x => x.color};" + ></div> + <div class="legend-text">${x => x.legend}</div> + </button>`, + )} + </div> + `, + )} + ${when( + x => !x.hideTooltip && x.tooltipProps.isVisible, + html<T>` + <div + class="tooltip" + style="inset-inline-start: ${x => x.tooltipProps.xPos}px; top: ${x => x.tooltipProps.yPos}px" + > + <div class="tooltip-line" style="border-color: ${x => x.tooltipProps.color};"> + <div class="tooltip-legend-text">${x => x.tooltipProps.legend}</div> + <div class="tooltip-data-y" style="color: ${x => x.tooltipProps.color};"> + ${x => x.tooltipProps.yValue} + </div> + </div> + </div> + `, + )} + </template> + `; +} + +/** + * @internal + */ +export const template: ElementViewTemplate<HorizontalBarChart> = horizontalbarchartTemplate(); diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.ts new file mode 100644 index 00000000000000..718c9ca5b4dcb4 --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/horizontal-bar-chart.ts @@ -0,0 +1,462 @@ +import { attr, FASTElement, observable } from '@microsoft/fast-element'; +import { create as d3Create, select as d3Select } from 'd3-selection'; +import { getRTL, jsonConverter, SVG_NAMESPACE_URI, validateChartPropsArray } from '../utils/chart-helpers.js'; +import type { ChartDataPoint, ChartProps } from './horizontal-bar-chart.options.js'; +import { Variant } from './horizontal-bar-chart.options.js'; + +/** + * A Horizontal Bar Chart HTML Element. + * + * @public + */ +export class HorizontalBarChart extends FASTElement { + @attr + public variant?: Variant; + + @attr({ converter: jsonConverter }) + public data!: ChartProps[]; + + @attr({ attribute: 'hide-ratio', mode: 'boolean' }) + public hideRatio: boolean = false; + + @attr({ attribute: 'hide-legends', mode: 'boolean' }) + public hideLegends: boolean = false; + + @attr({ attribute: 'hide-tooltip', mode: 'boolean' }) + public hideTooltip: boolean = false; + + @attr({ attribute: 'legend-list-label' }) + public legendListLabel?: string; + + @attr({ attribute: 'chart-title' }) + public chartTitle?: string; + + @observable + public uniqueLegends: ChartDataPoint[] = []; + + @observable + public activeLegend: string = ''; + protected activeLegendChanged = (oldValue: string, newValue: string) => { + if (newValue === '') { + this._bars?.forEach(bar => bar.classList.remove('inactive')); + } else { + this._bars?.forEach(bar => { + if (bar.getAttribute('barinfo') === newValue) { + bar.classList.remove('inactive'); + } else { + bar.classList.add('inactive'); + } + }); + } + }; + + @observable + public isLegendSelected: boolean = false; + + @observable + public tooltipProps = { + isVisible: false, + legend: '', + yValue: '', + color: '', + xPos: 0, + yPos: 0, + }; + + public chartContainer!: HTMLDivElement; + public elementInternals: ElementInternals = this.attachInternals(); + + private _isRTL: boolean = false; + private _barHeight: number = 12; + private _bars: SVGRectElement[] = []; + + constructor() { + super(); + + this.elementInternals.role = 'region'; + } + + public handleLegendMouseoverAndFocus = (legendTitle: string) => { + if (this.isLegendSelected) { + return; + } + + this.activeLegend = legendTitle; + }; + + public handleLegendMouseoutAndBlur = () => { + if (this.isLegendSelected) { + return; + } + + this.activeLegend = ''; + }; + + public handleLegendClick = (legendTitle: string) => { + if (this.isLegendSelected && this.activeLegend === legendTitle) { + this.activeLegend = ''; + this.isLegendSelected = false; + } else { + this.activeLegend = legendTitle; + this.isLegendSelected = true; + } + }; + + connectedCallback() { + super.connectedCallback(); + + validateChartPropsArray(this.data, 'data'); + + this._isRTL = getRTL(this); + this.elementInternals.ariaLabel = this.chartTitle || `Horizontal bar chart with ${this.data.length} categories.`; + + this._initializeData(); + this._renderChart(); + } + + private _initializeData() { + if (this.variant === Variant.SingleBar) { + this._hydrateData(); + } + this._hydrateLegends(); + } + + private _renderChart() { + const chartContainerDiv = d3Select(this.chartContainer); + chartContainerDiv + .selectAll('div') + .data(this.data!) + .enter() + .append('div') + .each((d, i, nodes) => { + this._createSingleChartBars(d, i, nodes); + }); + } + + private _createSingleChartBars(singleChartData: ChartProps, index: number, nodes: any) { + const singleChartBars = this._createBarsAndLegends(singleChartData!, index); + + // create a div element. Loop through chart bars and add to the div as its children + d3Select(nodes[index]) + .attr('key', index) + .attr('id', `_MSBC_bar-${index}`) + .node()! + .appendChild(singleChartBars.node()); + } + + private _hydrateLegends() { + // Create a map to store unique legends + const uniqueLegendsMap = new Map(); + + // Iterate through all chart points and populate the map + for (const dataSeries of this.data) { + for (const point of dataSeries.chartData!) { + if ((point as any).placeholder === true) { + continue; + } + // Check if the legend is already in the map + if (!uniqueLegendsMap.has(point.legend)) { + uniqueLegendsMap.set(point.legend, { + legend: point.legend, + data: point.data, + color: point.gradient ? point.gradient[0] : point.color, + }); + } + } + } + + // Convert the map values back to an array + this.uniqueLegends = Array.from(uniqueLegendsMap.values()); + } + + private _hydrateData() { + this.data!.forEach(({ chartData }) => { + if (chartData!.length === 1) { + const pointData = chartData![0]; + const newEntry = { + legend: '', + data: Math.max(pointData.total! - pointData.data!, 0), + y: pointData.total!, + color: '#edebe9', + placeholder: true, + }; + chartData!.push(newEntry); + } + }); + } + + private _calculateBarSpacing(): number { + const svgWidth = this.getBoundingClientRect().width; + let barSpacing = 0; + const MARGIN_WIDTH_IN_PX = 3; + if (svgWidth) { + const currentBarSpacing = (MARGIN_WIDTH_IN_PX / svgWidth) * 100; + barSpacing = currentBarSpacing; + } + return barSpacing; + } + + private _createBarsAndLegends(data: ChartProps, barNo?: number) { + const _isRTL = this._isRTL; + const _computeLongestBarTotalValue = () => { + let longestBarTotalValue = 0; + this.data!.forEach(({ chartData }) => { + const barTotalValue = chartData!.reduce((acc: number, point: ChartDataPoint) => acc + (point.data ?? 0), 0); + longestBarTotalValue = Math.max(longestBarTotalValue, barTotalValue); + }); + return longestBarTotalValue; + }; + const longestBarTotalValue = _computeLongestBarTotalValue(); + const noOfBars = + data.chartData?.reduce((count: number, point: ChartDataPoint) => (count += (point.data || 0) > 0 ? 1 : 0), 0) || + 1; + const barSpacingInPercent = this._calculateBarSpacing(); + const totalMarginPercent = barSpacingInPercent * (noOfBars - 1); + // calculating starting point of each bar and it's range + const startingPoint: number[] = []; + const barTotalValue = data.chartData!.reduce((acc: number, point: ChartDataPoint) => acc + (point.data ?? 0), 0); + const total = this.variant === Variant.AbsoluteScale ? longestBarTotalValue : barTotalValue; + + let sumOfPercent = 0; + data.chartData!.map((point: ChartDataPoint, index: number) => { + const pointData = point.data ?? 0; + const currValue = (pointData / total) * 100; + let value = currValue ?? 0; + + if (value < 1 && value !== 0) { + value = 1; + } else if (value > 99 && value !== 100) { + value = 99; + } + sumOfPercent += value; + + return sumOfPercent; + }); + + // Include an imaginary placeholder bar with value equal to + // the difference between longestBarTotalValue and barTotalValue + // while calculating sumOfPercent to get correct scalingRatio for absolute-scale variant + if (this.variant === Variant.AbsoluteScale) { + let value = total === 0 ? 0 : ((total - barTotalValue) / total) * 100; + if (value < 1 && value !== 0) { + value = 1; + } else if (value > 99 && value !== 100) { + value = 99; + } + sumOfPercent += value; + } + + /** + * The %age of the space occupied by the margin needs to subtracted + * while computing the scaling ratio, since the margins are not being + * scaled down, only the data is being scaled down from a higher percentage to lower percentage + * Eg: 95% of the space is taken by the bars, 5% by the margins + * Now if the sumOfPercent is 120% -> This needs to be scaled down to 95%, not 100% + * since that's only space available to the bars + */ + + const scalingRatio = sumOfPercent !== 0 ? sumOfPercent / (100 - totalMarginPercent) : 1; + + let prevPosition = 0; + let value = 0; + + const createBars = (g: SVGGElement, point: ChartDataPoint, index: number) => { + const barHeight = 12; + const pointData = point.data ?? 0; + if (index > 0) { + prevPosition += value; + } + value = (pointData / total) * 100 ? (pointData / total) * 100 : 0; + if (value < 1 && value !== 0) { + value = 1 / scalingRatio; + } else if (value > 99 && value !== 100) { + value = 99 / scalingRatio; + } else { + value = value / scalingRatio; + } + + startingPoint.push(prevPosition); + + const gEle = d3Select(g) // 'this' refers to the current 'g' element + .attr('key', index) + .attr('role', 'img') + .attr('aria-label', pointData); + + let gradientId = ''; + if (point.gradient) { + const defs = document.createElementNS(SVG_NAMESPACE_URI, 'defs'); + gEle.node()!.appendChild(defs); + + const linearGradient = document.createElementNS(SVG_NAMESPACE_URI, 'linearGradient'); + defs.appendChild(linearGradient); + gradientId = `gradient-${barNo}-${index}`; + linearGradient.setAttribute('id', gradientId); + + const stop1 = document.createElementNS(SVG_NAMESPACE_URI, 'stop'); + linearGradient.appendChild(stop1); + stop1.setAttribute('offset', '0%'); + stop1.setAttribute('stop-color', point.gradient[0]); + + const stop2 = document.createElementNS(SVG_NAMESPACE_URI, 'stop'); + linearGradient.appendChild(stop2); + stop2.setAttribute('offset', '100%'); + stop2.setAttribute('stop-color', point.gradient[1]); + } + + const rect = gEle + .append('rect') + .attr('key', index) + .attr('id', `${barNo}-${index}`) + .attr('barinfo', `${point.legend}`) + .attr('class', 'bar') + .attr('style', point.gradient ? `fill:url(#${gradientId})` : `fill:${point.color!}`) + .attr( + 'x', + `${ + _isRTL + ? 100 - startingPoint[index] - value - barSpacingInPercent * index + : startingPoint[index] + barSpacingInPercent * index + }%`, + ) + .attr('y', 0) + .attr('width', value + '%') + .attr('height', barHeight) + .attr('tabindex', 0); + this._bars.push(rect.node()!); + }; + + const containerDiv = d3Create('div').attr('style', 'position: relative'); + + const chartTitleDiv = containerDiv.append('div').attr('class', 'chart-title-div'); + chartTitleDiv + .append('div') + .append('span') + .attr('class', 'chart-title') + .text(data?.chartSeriesTitle ? data?.chartSeriesTitle : ''); + + const showChartDataText = this.variant !== Variant.AbsoluteScale; + // chartData length is always 2 in single-bar variant + const showRatio = !this.hideRatio && data!.chartData!.length === 2; + const getChartData = () => data!.chartData![0].data ?? 0; + + if (showChartDataText) { + if (data.chartDataText) { + const chartTitleRight = document.createElement('div'); + chartTitleDiv.node()!.appendChild(chartTitleRight); + chartTitleRight.classList.add('chart-data-text'); + chartTitleRight.textContent = data.chartDataText; + } else if (showRatio) { + const ratioDiv = chartTitleDiv.append('div').attr('role', 'text'); + const numData = data!.chartData![0].data; + const denomData = data!.chartData![1].data; + const total = numData! + denomData!; + ratioDiv.append('span').attr('class', 'ratio-numerator').text(numData!); + ratioDiv.append('span').attr('class', 'ratio-denominator').text(`/${total!}`); + } + } + + const svgDiv = containerDiv.append('div').attr('style', 'display: flex;'); + const svgEle = svgDiv + .append('svg') + .attr('height', 12) + .attr('width', 100 + '%') + .attr('class', 'svg-chart') + .attr( + 'aria-label', + data?.chartSeriesTitle ?? + `Series with ${data.chartData.length}${data.chartData.length > 1 ? ' stacked' : ''} bars.`, + ) + .selectAll('g') + .data(data.chartData!) + .enter() + .append('g') + .each(function (this, d, i) { + createBars(this, d, i); + }) + .on('mouseover', (event, d) => { + if (d && d.hasOwnProperty('placeholder') && (d as any).placeholder === true) { + return; + } + + const bounds = this.getBoundingClientRect(); + const centerX = window.innerWidth / 2; + const xPos = Math.max(0, Math.min(centerX, window.innerWidth)); + + this.tooltipProps = { + isVisible: true, + legend: d.legend, + yValue: `${d.data}`, + color: d.gradient ? d.gradient[0] : d.color!, + xPos: this._isRTL ? bounds.right - event.clientX : Math.min(event.clientX - bounds.left, xPos), + yPos: event.clientY - bounds.top - 40, + }; + }) + .on('mouseout', () => { + this.tooltipProps = { isVisible: false, legend: '', yValue: '', color: '', xPos: 0, yPos: 0 }; + }); + + if (this.variant === Variant.AbsoluteScale) { + const showLabel = true; + const barLabel = barTotalValue; + if (showLabel) { + if (Math.round((startingPoint[startingPoint.length - 1] || 0) + value + totalMarginPercent) === 100) { + svgDiv + .append('text') + .attr('key', 'text') + .attr('style', 'margin-top: -4.5px; margin-left: 2px;') + .attr('class', 'bar-label') + .attr( + 'x', + `${ + this._isRTL + ? 100 - (startingPoint[startingPoint.length - 1] || 0) - value - totalMarginPercent + : (startingPoint[startingPoint.length - 1] || 0) + value + totalMarginPercent + }%`, + ) + .attr('textAnchor', 'start') + .attr('y', this._barHeight / 2 + 6) + .attr('dominantBaseline', 'central') + .attr('transform', `translate(${this._isRTL ? -4 : 4})`) + .attr('aria-label', `Total: ${barLabel}`) + .attr('role', 'img') + .text(barLabel); + } else { + svgEle + .append('text') + .attr('key', 'text') + .attr('class', 'bar-label') + .attr( + 'x', + `${ + this._isRTL + ? 100 - (startingPoint[startingPoint.length - 1] || 0) - value - totalMarginPercent + : (startingPoint[startingPoint.length - 1] || 0) + value + totalMarginPercent + }%`, + ) + .attr('textAnchor', 'start') + .attr('y', this._barHeight / 2 + 6) + .attr('dominantBaseline', 'central') + .attr('transform', `translate(${this._isRTL ? -4 : 4})`) + .attr('aria-label', `Total: ${barLabel}`) + .attr('role', 'img') + .text(barLabel); + } + } + } + + if (data.benchmarkData) { + const benchmarkContainer = document.createElement('div'); + containerDiv.node()!.appendChild(benchmarkContainer); + benchmarkContainer.classList.add('benchmark-container'); + + const triangle = document.createElement('div'); + benchmarkContainer.appendChild(triangle); + triangle.classList.add('triangle'); + + const benchmarkRatio = (data.benchmarkData / total) * 100; + triangle.style['insetInlineStart'] = `calc(${benchmarkRatio}% - 4px)`; + } + + return containerDiv; + } +} diff --git a/packages/charts/chart-web-components/src/horizontal-bar-chart/index.ts b/packages/charts/chart-web-components/src/horizontal-bar-chart/index.ts new file mode 100644 index 00000000000000..0695516e7dce49 --- /dev/null +++ b/packages/charts/chart-web-components/src/horizontal-bar-chart/index.ts @@ -0,0 +1,4 @@ +export { definition as HorizontalBarChartDefinition } from './horizontal-bar-chart.definition.js'; +export { HorizontalBarChart } from './horizontal-bar-chart.js'; +export { styles as HorizontalBarChartStyles } from './horizontal-bar-chart.styles.js'; +export { template as HorizontalBarChartTemplate } from './horizontal-bar-chart.template.js'; diff --git a/packages/charts/chart-web-components/src/index-rollup.ts b/packages/charts/chart-web-components/src/index-rollup.ts new file mode 100644 index 00000000000000..8726e6a32d0f9e --- /dev/null +++ b/packages/charts/chart-web-components/src/index-rollup.ts @@ -0,0 +1,2 @@ +import './horizontal-bar-chart/define.js'; +import './donut-chart/define.js'; diff --git a/packages/charts/chart-web-components/src/index.ts b/packages/charts/chart-web-components/src/index.ts new file mode 100644 index 00000000000000..9dcd14f29327dc --- /dev/null +++ b/packages/charts/chart-web-components/src/index.ts @@ -0,0 +1,7 @@ +export { + HorizontalBarChart, + HorizontalBarChartDefinition, + HorizontalBarChartStyles, + HorizontalBarChartTemplate, +} from './horizontal-bar-chart/index.js'; +export { DonutChart, DonutChartDefinition, DonutChartStyles, DonutChartTemplate } from './donut-chart/index.js'; diff --git a/packages/charts/chart-web-components/src/utils/benchmark-wrapper.ts b/packages/charts/chart-web-components/src/utils/benchmark-wrapper.ts new file mode 100644 index 00000000000000..3b1807cbff920f --- /dev/null +++ b/packages/charts/chart-web-components/src/utils/benchmark-wrapper.ts @@ -0,0 +1,22 @@ +// eslint-disable-next-line +// @ts-nocheck +import { tests } from '@tensile-perf/web-components'; +import { webLightTheme } from '@fluentui/tokens'; +import { setTheme } from '@fluentui/web-components'; + +const testWrapper = (test: any, args: any) => { + setTheme(webLightTheme); + return test(args); +}; + +const wrappedTests = {}; + +for (const testName of Object.keys(tests)) { + const test = tests[testName]; + + wrappedTests[testName] = (args: any) => { + return testWrapper(test, args); + }; +} + +export { wrappedTests as tests }; diff --git a/packages/charts/chart-web-components/src/utils/chart-helpers.ts b/packages/charts/chart-web-components/src/utils/chart-helpers.ts new file mode 100644 index 00000000000000..45f9ecdb56dd5f --- /dev/null +++ b/packages/charts/chart-web-components/src/utils/chart-helpers.ts @@ -0,0 +1,193 @@ +import type { ValueConverter } from '@microsoft/fast-element'; +import { Direction } from '@microsoft/fast-web-utilities'; +import { getDirection } from '@fluentui/web-components'; + +export const jsonConverter: ValueConverter = { + toView(value: any): string { + return JSON.stringify(value); + }, + fromView(value: string): any { + return JSON.parse(value); + }, +}; + +type Dict = { [key: string]: any }; + +export const validateChartPropsArray = (obj: any, objName: string) => { + if (!Array.isArray(obj)) { + throw TypeError(`Invalid ${objName}: Expected an array.`); + } + + obj.forEach((item, idx) => { + validateChartProps(item, `${objName}[${idx}]`); + }); +}; + +export const validateChartProps = (obj: any, objName: string) => { + if (obj === null || typeof obj !== 'object' || Array.isArray(obj)) { + throw TypeError(`Invalid ${objName}: Expected an object.`); + } + + if (!Array.isArray(obj.chartData)) { + throw TypeError(`Invalid ${objName}.chartData: Expected an array.`); + } + + (obj.chartData as any[]).forEach((item, idx) => { + if (item === null || typeof item !== 'object' || Array.isArray(item)) { + throw TypeError(`Invalid ${objName}.chartData[${idx}]: Expected an object.`); + } + + if (typeof item.legend !== 'string') { + throw TypeError(`Invalid ${objName}.chartData[${idx}].legend: Expected a string.`); + } + + if (typeof item.data !== 'number') { + throw TypeError(`Invalid ${objName}.chartData[${idx}].data: Expected a number.`); + } + }); +}; + +export const DataVizPalette = { + color1: 'qualitative.1', + color2: 'qualitative.2', + color3: 'qualitative.3', + color4: 'qualitative.4', + color5: 'qualitative.5', + color6: 'qualitative.6', + color7: 'qualitative.7', + color8: 'qualitative.8', + color9: 'qualitative.9', + color10: 'qualitative.10', + color11: 'qualitative.21', + color12: 'qualitative.22', + color13: 'qualitative.23', + color14: 'qualitative.24', + color15: 'qualitative.25', + color16: 'qualitative.26', + color17: 'qualitative.27', + color18: 'qualitative.28', + color19: 'qualitative.29', + info: 'semantic.info', + disabled: 'semantic.disabled', + highError: 'semantic.highError', + error: 'semantic.error', + warning: 'semantic.warning', + success: 'semantic.success', + highSuccess: 'semantic.highSuccess', +}; + +/** + * Key: Color code. + * Value: + * Index 0 - Default color / Color for light theme, + * Index 1 - Color for dark theme + */ +type Palette = { [key: string]: string[] }; + +const QualitativePalette: Palette = { + '1': ['#637cef'], // [cornflower.tint10], + '2': ['#e3008c'], // [hotPink.primary], + '3': ['#2aa0a4'], // [teal.tint20], + '4': ['#9373c0'], // [orchid.tint10], + '5': ['#13a10e'], // [lightGreen.primary], + '6': ['#3a96dd'], // [lightBlue.primary], + '7': ['#ca5010'], // [pumpkin.primary], + '8': ['#57811b'], // [lime.shade20], + '9': ['#b146c2'], // [lilac.primary], + '10': ['#ae8c00'], // [gold.shade10], + '21': ['#4f6bed'], // [cornflower.primary], + '22': ['#ea38a6'], // [hotPink.tint20], + '23': ['#038387'], // [teal.primary], + '24': ['#8764b8'], // [orchid.primary], + '25': ['#11910d'], // [lightGreen.shade10], + '26': ['#3487c7'], // [lightBlue.shade10], + '27': ['#d06228'], // [pumpkin.tint10], + '28': ['#689920'], // [lime.shade10], + '29': ['#ba58c9'], // [lilac.tint10], +}; + +const SemanticPalette: Palette = { + info: ['#015cda'], + disabled: ['#dbdbdb', '#4d4d4d'], // [grey[86], grey[30]] + highError: ['#6e0811', '#cc2635'], // [cranberry.shade30, cranberry.tint10], + error: ['#c50f1f', '#dc626d'], // [cranberry.primary, cranberry.tint30], + warning: ['#f7630c', '#f87528'], // [orange.primary, orange.tint10], + success: ['#107c10', '#54b054'], // [green.primary, green.tint30], + highSuccess: ['#094509', '#218c21'], // [green.shade30, green.tint10], +}; + +const Colors: { [key: string]: Palette } = { + qualitative: QualitativePalette, + semantic: SemanticPalette, +}; + +const QUALITATIVE_COLORS = Object.values(QualitativePalette); +const TOKENS = Object.values(DataVizPalette); + +const getThemeSpecificColor = (colors: string[], isDarkTheme: boolean): string => { + if (colors.length === 0) { + return ''; + } + const colorIdx = Number(isDarkTheme); + if (colorIdx < colors.length) { + return colors[colorIdx]; + } + return colors[0]; +}; + +export const getNextColor = (index: number, offset: number = 0, isDarkTheme: boolean = false): string => { + const colors = QUALITATIVE_COLORS[(index + offset) % QUALITATIVE_COLORS.length]; + return getThemeSpecificColor(colors, isDarkTheme); +}; + +export const getColorFromToken = (token: string, isDarkTheme: boolean = false): string => { + if (TOKENS.indexOf(token) >= 0) { + const [paletteName, colorCode] = token.split('.'); + const colors = Colors[paletteName][colorCode]; + return getThemeSpecificColor(colors, isDarkTheme); + } + return token; +}; + +export const getRTL = (rootNode: HTMLElement): boolean => { + return getDirection(rootNode) === Direction.rtl; +}; + +export const SVG_NAMESPACE_URI = 'http://www.w3.org/2000/svg'; + +export const wrapText = (text: SVGTextElement, width: number) => { + if (!text.textContent) { + return; + } + + const words = text.textContent.split(/\s+/).reverse(); + let word: string | undefined; + let line: string[] = []; + let lineNumber = 0; + const lineHeight = text.getBoundingClientRect().height; + const y = text.getAttribute('y') || '0'; + + text.textContent = null; + + let tspan = document.createElementNS(SVG_NAMESPACE_URI, 'tspan'); + text.appendChild(tspan); + tspan.setAttribute('x', '0'); + tspan.setAttribute('y', y); + tspan.setAttribute('dy', `${lineNumber++ * lineHeight}`); + + while ((word = words.pop())) { + line.push(word); + tspan.textContent = line.join(' ') + ' '; + if (tspan.getComputedTextLength() > width && line.length > 1) { + line.pop(); + tspan.textContent = line.join(' ') + ' '; + line = [word]; + tspan = document.createElementNS(SVG_NAMESPACE_URI, 'tspan'); + text.appendChild(tspan); + tspan.setAttribute('x', '0'); + tspan.setAttribute('y', y); + tspan.setAttribute('dy', `${lineNumber++ * lineHeight}`); + tspan.textContent = word; + } + } +}; diff --git a/packages/charts/chart-web-components/tensile.config.js b/packages/charts/chart-web-components/tensile.config.js new file mode 100644 index 00000000000000..f73bbfb19cdd4d --- /dev/null +++ b/packages/charts/chart-web-components/tensile.config.js @@ -0,0 +1,25 @@ +/** + * This config should be shared for all web-component packages. + * Tracking issue - https://github.com/microsoft/fluentui/issues/33576 + */ + +const config = { + // Browsers to test against + browsers: ['chrome'], + + // Importmaps for your test. + // See: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script/type/importmap + imports: { + '@tensile-perf/web-components': '/node_modules/@tensile-perf/web-components/lib/index.js', + '@microsoft/fast-element': '/node_modules/@microsoft/fast-element/dist/fast-element.min.js', + '@microsoft/fast-element/utilities.js': '/node_modules/@microsoft/fast-element/dist/esm/utilities.js', + '@microsoft/fast-web-utilities': '/node_modules/@microsoft/fast-web-utilities/dist/index.js', + '@fluentui/tokens': '/tensile-assets/benchmark-dependencies/tokens.js', + '@fluentui/web-components': '/node_modules/@fluentui/web-components/dist/esm/index.js', + 'exenv-es6': '/node_modules/exenv-es6/dist/index.js', + tabbable: '/node_modules/tabbable/dist/index.esm.js', + tslib: '/node_modules/tslib/tslib.es6.js', + }, +}; + +export default config; diff --git a/packages/charts/chart-web-components/tsconfig.api-extractor.json b/packages/charts/chart-web-components/tsconfig.api-extractor.json new file mode 100644 index 00000000000000..e245193e1fb3db --- /dev/null +++ b/packages/charts/chart-web-components/tsconfig.api-extractor.json @@ -0,0 +1,7 @@ +{ + "extends": "./tsconfig.lib.json", + "compilerOptions": { + "paths": null, + "baseUrl": "." + } +} diff --git a/packages/charts/chart-web-components/tsconfig.json b/packages/charts/chart-web-components/tsconfig.json new file mode 100644 index 00000000000000..7c023fa3b63590 --- /dev/null +++ b/packages/charts/chart-web-components/tsconfig.json @@ -0,0 +1,22 @@ +{ + "extends": "../../../tsconfig.base.wc.json", + "compilerOptions": { + "target": "ES2019", + "module": "NodeNext", + "moduleResolution": "NodeNext", + "experimentalDecorators": true, + "allowJs": true + }, + "files": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + }, + { + "path": "./.storybook/tsconfig.json" + } + ] +} diff --git a/packages/charts/chart-web-components/tsconfig.lib.json b/packages/charts/chart-web-components/tsconfig.lib.json new file mode 100644 index 00000000000000..a9ffdf43596828 --- /dev/null +++ b/packages/charts/chart-web-components/tsconfig.lib.json @@ -0,0 +1,14 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "target": "ES2019", + "module": "NodeNext", + "lib": ["ESNext", "DOM"], + "declaration": true, + "declarationDir": "dist/dts", + "outDir": "dist/esm", + "importHelpers": true + }, + "include": ["src"], + "exclude": ["**/*.stories.*", "**/*.test.*", "**/*.spec.*"] +} diff --git a/packages/charts/chart-web-components/tsconfig.spec.json b/packages/charts/chart-web-components/tsconfig.spec.json new file mode 100644 index 00000000000000..d9bed36588029a --- /dev/null +++ b/packages/charts/chart-web-components/tsconfig.spec.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "module": "NodeNext", + "outDir": "dist/esm", + "types": ["node"] + }, + "include": ["src/**/*.test.*", "src/**/*.spec.*"] +} diff --git a/packages/charts/chart-web-components/tsdoc.json b/packages/charts/chart-web-components/tsdoc.json new file mode 100644 index 00000000000000..0c30fee865df6f --- /dev/null +++ b/packages/charts/chart-web-components/tsdoc.json @@ -0,0 +1,44 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/tsdoc/v0/tsdoc.schema.json", + "extends": ["@microsoft/api-extractor/extends/tsdoc-base.json"], + "tagDefinitions": [ + { + "tagName": "@slot", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@csspart", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@cssprop", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@cssproperty", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@event", + "syntaxKind": "block", + "allowMultiple": true + }, + { + "tagName": "@fires", + "syntaxKind": "block", + "allowMultiple": true + } + ], + "supportForTags": { + "@slot": true, + "@csspart": true, + "@cssprop": true, + "@cssproperty": true, + "@event": true, + "@fires": true + } +} diff --git a/tsconfig.base.wc.json b/tsconfig.base.wc.json index 5c7d220e1c3a6d..c4492bf1b4ddcb 100644 --- a/tsconfig.base.wc.json +++ b/tsconfig.base.wc.json @@ -11,6 +11,7 @@ "rootDir": ".", "baseUrl": ".", "paths": { + "@fluentui/chart-web-components": ["packages/charts/chart-web-components/src/index.ts"], "@fluentui/web-components": ["packages/web-components/src/index.ts"], "@fluentui/tokens": ["packages/tokens/src/index.ts"] } From f1a15496cf7c7121f4d163e2394d5647fbe9eb96 Mon Sep 17 00:00:00 2001 From: Valentyna <vkozlova@microsoft.com> Date: Tue, 14 Jan 2025 04:54:42 -0800 Subject: [PATCH 25/78] feat(react-color-picker): Added `transparent` option to the AlphaSlider (#33572) --- ...-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json | 7 +++ .../etc/react-color-picker-preview.api.md | 4 +- .../AlphaSlider/AlphaSlider.types.ts | 12 ++++- .../AlphaSlider/alphaSliderUtils.test.ts | 54 +++++++++++++++++++ .../AlphaSlider/alphaSliderUtils.ts | 36 +++++++++++++ .../AlphaSlider/useAlphaSliderState.ts | 16 +++--- .../ColorSlider/ColorSlider.types.ts | 2 +- .../AlphaSliderDefault.stories.tsx | 24 +++++++++ 8 files changed, 146 insertions(+), 9 deletions(-) create mode 100644 change/@fluentui-react-color-picker-preview-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json create mode 100644 packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/alphaSliderUtils.test.ts create mode 100644 packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/alphaSliderUtils.ts diff --git a/change/@fluentui-react-color-picker-preview-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json b/change/@fluentui-react-color-picker-preview-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json new file mode 100644 index 00000000000000..f30eab37953f98 --- /dev/null +++ b/change/@fluentui-react-color-picker-preview-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "feat: Added `transparent` option to the AlphaSlider", + "packageName": "@fluentui/react-color-picker-preview", + "email": "v.kozlova13@gmail.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-color-picker-preview/library/etc/react-color-picker-preview.api.md b/packages/react-components/react-color-picker-preview/library/etc/react-color-picker-preview.api.md index 0ff850de65940e..8190eeb7f921ca 100644 --- a/packages/react-components/react-color-picker-preview/library/etc/react-color-picker-preview.api.md +++ b/packages/react-components/react-color-picker-preview/library/etc/react-color-picker-preview.api.md @@ -20,7 +20,9 @@ export const AlphaSlider: ForwardRefComponent<AlphaSliderProps>; export const alphaSliderClassNames: SlotClassNames<AlphaSliderSlots>; // @public -export type AlphaSliderProps = ColorSliderProps; +export type AlphaSliderProps = ColorSliderProps & { + transparency?: boolean; +}; // @public (undocumented) export type AlphaSliderSlots = ColorSliderSlots; diff --git a/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/AlphaSlider.types.ts b/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/AlphaSlider.types.ts index 7a471fa974f46c..2f4c1195416b14 100644 --- a/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/AlphaSlider.types.ts +++ b/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/AlphaSlider.types.ts @@ -6,7 +6,17 @@ export type AlphaSliderSlots = ColorSliderSlots; /** * AlphaSlider Props */ -export type AlphaSliderProps = ColorSliderProps; +export type AlphaSliderProps = ColorSliderProps & { + /** + * The `transparency` property determines how the alpha channel is interpreted. + * - When `false`, the alpha channel represents the opacity of the color. + * - When `true`, the alpha channel represents the transparency of the color. + * For example, a 30% transparent color has 70% opacity. + * + * @defaultvalue false + */ + transparency?: boolean; +}; /** * State used in rendering AlphaSlider diff --git a/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/alphaSliderUtils.test.ts b/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/alphaSliderUtils.test.ts new file mode 100644 index 00000000000000..2756ee7164985a --- /dev/null +++ b/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/alphaSliderUtils.test.ts @@ -0,0 +1,54 @@ +import { adjustToTransparency, calculateTransparencyValue, getSliderDirection } from './alphaSliderUtils'; + +describe('AlphaSlider Utils', () => { + describe('adjustToTransparency', () => { + it('should return 100 - value when transparency is true', () => { + expect(adjustToTransparency(30, true)).toBe(70); + }); + + it('should return value when transparency is false', () => { + expect(adjustToTransparency(30, false)).toBe(30); + }); + }); + + describe('calculateTransparencyValue', () => { + it('should return adjusted value when value is provided and transparency is true', () => { + expect(calculateTransparencyValue(true, 0.3)).toBe(70); + }); + + it('should return adjusted value when value is provided and transparency is false', () => { + expect(calculateTransparencyValue(false, 0.3)).toBe(30); + }); + + it('should return undefined when value is not provided', () => { + expect(calculateTransparencyValue(true)).toBeUndefined(); + expect(calculateTransparencyValue(false)).toBeUndefined(); + }); + }); + + describe('getSliderDirection', () => { + it('should return "180deg" when vertical is true and transparency is true', () => { + expect(getSliderDirection('ltr', true, true)).toBe('180deg'); + }); + + it('should return "0deg" when vertical is true and transparency is false', () => { + expect(getSliderDirection('ltr', true, false)).toBe('0deg'); + }); + + it('should return "90deg" when dir is "ltr" and transparency is false', () => { + expect(getSliderDirection('ltr', false, false)).toBe('90deg'); + }); + + it('should return "-90deg" when dir is "ltr" and transparency is true', () => { + expect(getSliderDirection('ltr', false, true)).toBe('-90deg'); + }); + + it('should return "-90deg" when dir is "rtl" and transparency is false', () => { + expect(getSliderDirection('rtl', false, false)).toBe('-90deg'); + }); + + it('should return "-90deg" when dir is "rtl" and transparency is true', () => { + expect(getSliderDirection('rtl', false, true)).toBe('-90deg'); + }); + }); +}); diff --git a/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/alphaSliderUtils.ts b/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/alphaSliderUtils.ts new file mode 100644 index 00000000000000..739fe0c7fcde8f --- /dev/null +++ b/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/alphaSliderUtils.ts @@ -0,0 +1,36 @@ +/** + * Adjusts the given value based on the transparency flag. + * + * @param value - The numeric value to adjust. + * @param transparency - A boolean flag indicating whether to adjust for transparency. + * @returns The adjusted value. + */ +export function adjustToTransparency(value: number, transparency: boolean) { + return transparency ? 100 - value : value; +} + +/** + * Calculates the transparency value based on the given parameters. + * + * @param transparency - A boolean flag indicating whether to adjust for transparency. + * @param value - An optional numeric value to adjust. + * @returns The calculated transparency value or undefined if the value is not provided. + */ +export function calculateTransparencyValue(transparency: boolean, value?: number) { + return value !== undefined ? adjustToTransparency(value * 100, transparency) : undefined; +} + +/** + * Determines the direction of the slider based on the given parameters. + * + * @param dir - The text direction, either 'ltr' (left-to-right) or 'rtl' (right-to-left). + * @param vertical - A boolean indicating if the slider is vertical. + * @param transparency - A boolean indicating if the slider is for transparency. + * @returns The direction of the slider as a string representing degrees (e.g., '90deg'). + */ +export function getSliderDirection(dir: 'ltr' | 'rtl', vertical: boolean, transparency: boolean) { + if (vertical) { + return transparency ? '180deg' : '0deg'; + } + return dir === 'ltr' && !transparency ? '90deg' : '-90deg'; +} diff --git a/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/useAlphaSliderState.ts b/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/useAlphaSliderState.ts index 153975294f8e5a..c1654f5eef77c2 100644 --- a/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/useAlphaSliderState.ts +++ b/packages/react-components/react-color-picker-preview/library/src/components/AlphaSlider/useAlphaSliderState.ts @@ -8,6 +8,7 @@ import { useColorPickerContextValue_unstable } from '../../contexts/colorPicker' import { MIN, MAX } from '../../utils/constants'; import { getPercent } from '../../utils/getPercent'; import type { HsvColor } from '../../types/color'; +import { adjustToTransparency, calculateTransparencyValue, getSliderDirection } from './alphaSliderUtils'; export const useAlphaSliderState_unstable = (state: AlphaSliderState, props: AlphaSliderProps) => { 'use no memo'; @@ -15,30 +16,33 @@ export const useAlphaSliderState_unstable = (state: AlphaSliderState, props: Alp const { dir } = useFluent(); const onChangeFromContext = useColorPickerContextValue_unstable(ctx => ctx.requestChange); const colorFromContext = useColorPickerContextValue_unstable(ctx => ctx.color); - const { color, onChange = onChangeFromContext } = props; + const { color, onChange = onChangeFromContext, transparency = false, vertical = false } = props; const hsvColor = color || colorFromContext; const hslColor = tinycolor(hsvColor).toHsl(); const [currentValue, setCurrentValue] = useControllableState({ - defaultState: props.defaultColor?.a ? props.defaultColor.a * 100 : undefined, - state: hsvColor?.a ? hsvColor.a * 100 : undefined, - initialState: 100, + defaultState: calculateTransparencyValue(transparency, props.defaultColor?.a), + state: calculateTransparencyValue(transparency, hsvColor?.a), + initialState: adjustToTransparency(100, transparency), }); + const clampedValue = clamp(currentValue, MIN, MAX); const valuePercent = getPercent(clampedValue, MIN, MAX); const inputOnChange = state.input.onChange; const _onChange: React.ChangeEventHandler<HTMLInputElement> = useEventCallback(event => { - const newValue = Number(event.target.value); + const newValue = adjustToTransparency(Number(event.target.value), transparency); const newColor: HsvColor = { ...hsvColor, a: newValue / 100 }; setCurrentValue(newValue); inputOnChange?.(event); onChange?.(event, { type: 'change', event, color: newColor }); }); + const sliderDirection = getSliderDirection(dir, vertical, transparency); + const rootVariables = { - [alphaSliderCSSVars.sliderDirectionVar]: state.vertical ? '0deg' : dir === 'ltr' ? '90deg' : '-90deg', + [alphaSliderCSSVars.sliderDirectionVar]: sliderDirection, [alphaSliderCSSVars.sliderProgressVar]: `${valuePercent}%`, [alphaSliderCSSVars.thumbColorVar]: `transparent`, [alphaSliderCSSVars.railColorVar]: `hsl(${hslColor.h} ${hslColor.s * 100}%, ${hslColor.l * 100}%)`, diff --git a/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/ColorSlider.types.ts b/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/ColorSlider.types.ts index ca7417aa765d3b..162ff92bf3f6e8 100644 --- a/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/ColorSlider.types.ts +++ b/packages/react-components/react-color-picker-preview/library/src/components/ColorSlider/ColorSlider.types.ts @@ -36,7 +36,7 @@ export type ColorSliderProps = Omit< vertical?: boolean; /** - * Color of the COlorPicker + * Color of the ColorPicker */ color?: HsvColor; diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx index bce95432ff2ccf..82867dbc8a908c 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx @@ -27,13 +27,17 @@ export const AlphaSliderExample = (props: Partial<AlphaSliderProps>) => { const styles = useStyles(); const [color, setColor] = React.useState(COLOR); + const [transparancyColor, setTransparancyColor] = React.useState(COLOR); const [value, setValue] = React.useState(COLOR.a * 100); const onSliderChange: AlphaSliderProps['onChange'] = (_, data) => { const alpha = data.color.a ?? 1; setColor({ ...data.color, a: alpha }); setValue(alpha * 100); }; + const onTransparancySliderChange: AlphaSliderProps['onChange'] = (_, data) => + setTransparancyColor({ ...data.color, a: data.color.a ?? 1 }); const resetSlider = () => setColor(COLOR); + const resetTransparencySlider = () => setTransparancyColor(COLOR); return ( <div className={styles.example}> @@ -48,6 +52,26 @@ export const AlphaSliderExample = (props: Partial<AlphaSliderProps>) => { /> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toRgbString() }} /> <Button onClick={resetSlider}>Reset</Button> + <h3>Transparency</h3> + <AlphaSlider + color={transparancyColor} + onChange={onTransparancySliderChange} + aria-valuetext={`${value}%`} + aria-label="Alpha" + transparency + {...props} + /> + <AlphaSlider + color={transparancyColor} + onChange={onTransparancySliderChange} + aria-valuetext={`${value}%`} + aria-label="Vertical alpha" + transparency + vertical + {...props} + /> + <div className={styles.previewColor} style={{ backgroundColor: tinycolor(transparancyColor).toRgbString() }} /> + <Button onClick={resetTransparencySlider}>Reset</Button> </div> ); }; From f66e15caa085fc79bff081c801ae465c24052d5f Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Tue, 14 Jan 2025 14:06:21 +0100 Subject: [PATCH 26/78] ci(gha): enable manual trigger for VRT and disable automatic PR trigger for testing purposes (#33606) --- .github/workflows/pr-vrt.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/pr-vrt.yml b/.github/workflows/pr-vrt.yml index 344a1783f9f858..7cb8853eb8e604 100644 --- a/.github/workflows/pr-vrt.yml +++ b/.github/workflows/pr-vrt.yml @@ -1,6 +1,8 @@ name: VRT CI on: - pull_request: + # TODO: once testing is done enable pull_request trigger again + # pull_request: + workflow_dispatch: concurrency: # see https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-only-cancel-in-progress-jobs-or-runs-for-the-current-workflow From 8cf401d626def27ad679f9e53928533df9f9ef52 Mon Sep 17 00:00:00 2001 From: Dmytro Kirpa <dmytrokirpa@microsoft.com> Date: Tue, 14 Jan 2025 15:06:36 +0100 Subject: [PATCH 27/78] fix(react-utilities): add autoCorrect and minLength input properties support to getNativeProps utility (#33642) --- ...-0b333279-3531-4fce-a0ee-8e9c05d6f830.json | 7 +++++ .../src/components/Input/Input.test.tsx | 11 ++++++++ .../src/utils/properties.test.ts | 28 ++++++++++++++++++- .../react-utilities/src/utils/properties.ts | 2 ++ 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 change/@fluentui-react-utilities-0b333279-3531-4fce-a0ee-8e9c05d6f830.json diff --git a/change/@fluentui-react-utilities-0b333279-3531-4fce-a0ee-8e9c05d6f830.json b/change/@fluentui-react-utilities-0b333279-3531-4fce-a0ee-8e9c05d6f830.json new file mode 100644 index 00000000000000..050e7fdba7a165 --- /dev/null +++ b/change/@fluentui-react-utilities-0b333279-3531-4fce-a0ee-8e9c05d6f830.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: add autoCorrect and minLength input properties support to getNativeProps utility", + "packageName": "@fluentui/react-utilities", + "email": "dmytrokirpa@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-input/library/src/components/Input/Input.test.tsx b/packages/react-components/react-input/library/src/components/Input/Input.test.tsx index 2d12b3fbca0d4c..55f93f73560398 100644 --- a/packages/react-components/react-input/library/src/components/Input/Input.test.tsx +++ b/packages/react-components/react-input/library/src/components/Input/Input.test.tsx @@ -128,4 +128,15 @@ describe('Input', () => { expect(input.value).toBe('foo'); expect(spy).not.toHaveBeenCalled(); }); + + it('forwards native input props to the input element', () => { + renderedComponent = render(<Input autoCorrect="on" minLength={1} maxLength={2} />); + + expect(getInput()).toMatchObject({ + minLength: 1, + maxLength: 2, + }); + + expect(getInput().getAttribute('autocorrect')).toEqual('on'); + }); }); diff --git a/packages/react-components/react-utilities/src/utils/properties.test.ts b/packages/react-components/react-utilities/src/utils/properties.test.ts index 8b7a6a0735dd0c..a2a25519905150 100644 --- a/packages/react-components/react-utilities/src/utils/properties.test.ts +++ b/packages/react-components/react-utilities/src/utils/properties.test.ts @@ -1,5 +1,5 @@ import * as React from 'react'; -import { getNativeProps, divProperties } from './properties'; +import { getNativeProps, divProperties, inputProperties } from './properties'; describe('getNativeProps', () => { it('can pass through data tags', () => { @@ -43,6 +43,32 @@ describe('getNativeProps', () => { expect(typeof result.onClickCapture).toEqual('function'); }); + it('can pass through input props', () => { + const result = getNativeProps<React.InputHTMLAttributes<HTMLInputElement>>( + { + autoCapitalize: 'off', + autoCorrect: 'on', + maxLength: 10, + minLength: 1, + value: '123', + // Non-input property + foobar: 1, + }, + inputProperties, + ); + + expect(result).toMatchObject({ + autoCapitalize: 'off', + autoCorrect: 'on', + maxLength: 10, + minLength: 1, + value: '123', + }); + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + expect((result as any).foobar).toBeUndefined(); + }); + it('can remove unexpected properties', () => { const result = getNativeProps<React.HTMLAttributes<HTMLDivElement>>( { diff --git a/packages/react-components/react-utilities/src/utils/properties.ts b/packages/react-components/react-utilities/src/utils/properties.ts index 2f434f8afc95b3..60867cd652f8cb 100644 --- a/packages/react-components/react-utilities/src/utils/properties.ts +++ b/packages/react-components/react-utilities/src/utils/properties.ts @@ -248,6 +248,7 @@ export const buttonProperties = toObjectMap(htmlElementProperties, [ export const inputProperties = toObjectMap(buttonProperties, [ 'accept', // input 'alt', // area, img, input + 'autoCorrect', // input, textarea 'autoCapitalize', // input, textarea 'autoComplete', // form, input 'checked', // input @@ -259,6 +260,7 @@ export const inputProperties = toObjectMap(buttonProperties, [ 'max', // input, meter 'maxLength', // input, textarea 'min', // input, meter + 'minLength', // input, textarea 'multiple', // input, select 'pattern', // input 'placeholder', // input, textarea From 83a61f47466ccd33dea3d4b83f566de7a151bdc7 Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Tue, 14 Jan 2025 15:45:40 +0100 Subject: [PATCH 28/78] docs(react-carousel): normalize title creation within storybook menu (#33604) --- .../react-carousel/stories/src/Carousel/index.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-components/react-carousel/stories/src/Carousel/index.stories.tsx b/packages/react-components/react-carousel/stories/src/Carousel/index.stories.tsx index 29d2ccf2468add..9d3be3b898bc6f 100644 --- a/packages/react-components/react-carousel/stories/src/Carousel/index.stories.tsx +++ b/packages/react-components/react-carousel/stories/src/Carousel/index.stories.tsx @@ -24,7 +24,7 @@ export { FirstRunExperience } from './CarouselFirstRunExperience.stories'; export { Eventing } from './CarouselEventing.stories'; export default { - title: 'Components/Carousel', + title: 'Components/Carousel/Carousel', component: Carousel, subcomponents: { CarouselAutoplayButton, From 9ed5fce8dda03bb85d583a23478ed298e51d305d Mon Sep 17 00:00:00 2001 From: Valentyna <vkozlova@microsoft.com> Date: Tue, 14 Jan 2025 07:34:03 -0800 Subject: [PATCH 29/78] fix(react-color-picker): focus shifts to inputY when user clicks `tab` (#33620) --- ...icker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json | 7 +++++++ .../library/src/components/ColorArea/useColorArea.ts | 4 ++-- .../stories/src/ColorPicker/AlphaSliderDefault.stories.tsx | 3 +-- .../src/ColorPicker/ColorAndSwatchPicker.stories.tsx | 6 ++++-- .../stories/src/ColorPicker/ColorAreaDefault.stories.tsx | 2 +- .../stories/src/ColorPicker/ColorPickerDefault.stories.tsx | 2 +- .../stories/src/ColorPicker/ColorPickerPopup.stories.tsx | 2 +- .../stories/src/ColorPicker/ColorPickerShape.stories.tsx | 6 +++--- .../stories/src/ColorPicker/ColorSliderDefault.stories.tsx | 3 +-- 9 files changed, 21 insertions(+), 14 deletions(-) create mode 100644 change/@fluentui-react-color-picker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json diff --git a/change/@fluentui-react-color-picker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json b/change/@fluentui-react-color-picker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json new file mode 100644 index 00000000000000..659240a99245b9 --- /dev/null +++ b/change/@fluentui-react-color-picker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: focus jumps to inputY instead of next element", + "packageName": "@fluentui/react-color-picker-preview", + "email": "vkozlova@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-color-picker-preview/library/src/components/ColorArea/useColorArea.ts b/packages/react-components/react-color-picker-preview/library/src/components/ColorArea/useColorArea.ts index e11b88384ff351..d3b814a6aac836 100644 --- a/packages/react-components/react-color-picker-preview/library/src/components/ColorArea/useColorArea.ts +++ b/packages/react-components/react-color-picker-preview/library/src/components/ColorArea/useColorArea.ts @@ -175,7 +175,7 @@ export const useColorArea_unstable = (props: ColorAreaProps, ref: React.Ref<HTML defaultProps: { id: useId('sliderX-'), type: 'range', - ...(activeAxis === 'x' && { tabIndex: 0 }), + ...(activeAxis && { tabIndex: activeAxis === 'x' ? 0 : -1 }), }, elementType: 'input', }), @@ -183,7 +183,7 @@ export const useColorArea_unstable = (props: ColorAreaProps, ref: React.Ref<HTML defaultProps: { id: useId('sliderY-'), type: 'range', - ...(activeAxis === 'y' && { tabIndex: 0 }), + ...(activeAxis && { tabIndex: activeAxis === 'y' ? 0 : -1 }), }, elementType: 'input', }), diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx index 82867dbc8a908c..3a46c7d6fe53e0 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/AlphaSliderDefault.stories.tsx @@ -20,8 +20,7 @@ const useStyles = makeStyles({ }, }, }); - -const COLOR = tinycolor('#5be600').toHsv(); +const COLOR = { h: 96, s: 1, v: 0.9, a: 1 }; export const AlphaSliderExample = (props: Partial<AlphaSliderProps>) => { const styles = useStyles(); diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAndSwatchPicker.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAndSwatchPicker.stories.tsx index 4c702b95060c0f..6a8a4daf86014b 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAndSwatchPicker.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAndSwatchPicker.stories.tsx @@ -48,8 +48,9 @@ const useStyles = makeStyles({ const ITEMS_LIMIT = 8; const DEFAULT_SELECTED_VALUE = '2be700'; -const DEFAULT_SELECTED_COLOR = '#2be700'; -const DEFAULT_COLOR_HSV = tinycolor(DEFAULT_SELECTED_COLOR).toHsv(); + +const DEFAULT_COLOR_HSV = { h: 109, s: 1, v: 0.9, a: 1 }; +const DEFAULT_SELECTED_COLOR = tinycolor(DEFAULT_COLOR_HSV).toHex(); export const ColorAndSwatchPickerExample = () => { const styles = useStyles(); @@ -110,6 +111,7 @@ export const ColorAndSwatchPickerExample = () => { aria-label="SwatchPicker with empty swatches" selectedValue={selectedValue} onSelectionChange={handleSelect} + shape="rounded" > {items.map(item => ( <ColorSwatch key={item.value} ref={item.value === colorFocusTarget ? colorFocusTargetRef : null} {...item} /> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx index 53b06d3ee52946..c991d299a6d45e 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx @@ -21,7 +21,7 @@ const useStyles = makeStyles({ }, }); -const DEFAULT_COLOR_HSV = tinycolor('#804066').toHsv(); +const DEFAULT_COLOR_HSV = { h: 324, s: 0.5, v: 0.5, a: 1 }; export const ColorAreaExample = () => { const styles = useStyles(); diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx index 394822d70e8309..97a1dd81ccfb21 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx @@ -56,7 +56,7 @@ const useStyles = makeStyles({ const HEX_COLOR_REGEX = /^#?([0-9A-Fa-f]{0,6})$/; const NUMBER_REGEX = /^\d+$/; -const DEFAULT_COLOR_HSV = tinycolor('#2be700').toHsv(); +const DEFAULT_COLOR_HSV = { h: 109, s: 1, v: 0.9, a: 1 }; type RgbKey = 'r' | 'g' | 'b'; diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerPopup.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerPopup.stories.tsx index 3b1b43a2bd4108..bfc248fa6032f3 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerPopup.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerPopup.stories.tsx @@ -36,7 +36,7 @@ const useStyles = makeStyles({ }, }); -const DEFAULT_COLOR_HSV = tinycolor('#2be700').toHsv(); +const DEFAULT_COLOR_HSV = { h: 109, s: 1, v: 0.9, a: 1 }; export const ColorPickerPopup = () => { const styles = useStyles(); diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerShape.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerShape.stories.tsx index 89349528ca0f00..ce1b4ab0ca56c6 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerShape.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerShape.stories.tsx @@ -27,7 +27,7 @@ const useStyles = makeStyles({ }, }); -const DEFAULT_COLOR_HSV = tinycolor('#2be700').toHsv(); +const DEFAULT_COLOR_HSV = { h: 109, s: 1, v: 0.91, a: 1 }; export const ColorPickerShape = () => { const styles = useStyles(); @@ -39,15 +39,15 @@ export const ColorPickerShape = () => { <div className={styles.example}> <h3>Rounded (default)</h3> <ColorPicker color={color} onColorChange={handleChange}> + <ColorArea /> <ColorSlider /> <AlphaSlider /> - <ColorArea /> </ColorPicker> <h3>Square (default)</h3> <ColorPicker shape="square" color={color} onColorChange={handleChange}> + <ColorArea /> <ColorSlider /> <AlphaSlider /> - <ColorArea /> </ColorPicker> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toRgbString() }} /> </div> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorSliderDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorSliderDefault.stories.tsx index 1062a371d2bb9e..2c1cbdec1772dc 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorSliderDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorSliderDefault.stories.tsx @@ -20,8 +20,7 @@ const useStyles = makeStyles({ }, }, }); - -const DEFAULT_COLOR_HSV = tinycolor('#2be700').toHsv(); +const DEFAULT_COLOR_HSV = { h: 109, s: 1, v: 0.9, a: 1 }; export const ColorSliderExample = (props: Partial<ColorSliderProps>) => { const styles = useStyles(); From ab6a30284d152c9ecde274e0cfc0579d002a7bbb Mon Sep 17 00:00:00 2001 From: Oleksandr Fediashov <olfedias@microsoft.com> Date: Tue, 14 Jan 2025 17:38:07 +0100 Subject: [PATCH 30/78] feat(motion): add extended support for reduced motion (#33353) --- ...-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json | 7 + .../library/etc/react-motion.api.md | 6 +- .../src/hooks/useAnimateAtoms.test.tsx | 88 ++++++++++ .../library/src/hooks/useAnimateAtoms.ts | 32 +++- .../react-motion/library/src/types.ts | 13 +- .../CreateMotionComponentDefault.stories.tsx | 4 + .../CreateMotionComponentFactory.stories.tsx | 4 + ...eMotionComponentFunctionParams.stories.tsx | 4 + ...CreateMotionComponentFunctions.stories.tsx | 4 + ...omponentImperativeRefPlayState.stories.tsx | 4 + ...eateMotionComponentTokensUsage.stories.tsx | 4 + ...ePresenceComponentReducedMotion.stories.md | 24 +++ ...PresenceComponentReducedMotion.stories.tsx | 150 ++++++++++++++++++ .../CreatePresenceComponent/index.stories.ts | 1 + 14 files changed, 334 insertions(+), 11 deletions(-) create mode 100644 change/@fluentui-react-motion-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json create mode 100644 packages/react-components/react-motion/library/src/hooks/useAnimateAtoms.test.tsx create mode 100644 packages/react-components/react-motion/stories/src/CreatePresenceComponent/CreatePresenceComponentReducedMotion.stories.md create mode 100644 packages/react-components/react-motion/stories/src/CreatePresenceComponent/CreatePresenceComponentReducedMotion.stories.tsx diff --git a/change/@fluentui-react-motion-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json b/change/@fluentui-react-motion-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json new file mode 100644 index 00000000000000..cba37e60ef3fdd --- /dev/null +++ b/change/@fluentui-react-motion-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "feat: add extended support for reduced motion", + "packageName": "@fluentui/react-motion", + "email": "olfedias@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-motion/library/etc/react-motion.api.md b/packages/react-components/react-motion/library/etc/react-motion.api.md index e8fd8b1a9e8bed..7f97978066768b 100644 --- a/packages/react-components/react-motion/library/etc/react-motion.api.md +++ b/packages/react-components/react-motion/library/etc/react-motion.api.md @@ -9,9 +9,9 @@ import { SlotComponentType } from '@fluentui/react-utilities'; import { SlotRenderFunction } from '@fluentui/react-utilities'; // @public (undocumented) -export type AtomMotion = { - keyframes: Keyframe[]; -} & KeyframeEffectOptions; +export type AtomMotion = AtomCore & { + reducedMotion?: Partial<AtomCore>; +}; // @public (undocumented) export type AtomMotionFn<MotionParams extends Record<string, MotionParam> = {}> = (params: { diff --git a/packages/react-components/react-motion/library/src/hooks/useAnimateAtoms.test.tsx b/packages/react-components/react-motion/library/src/hooks/useAnimateAtoms.test.tsx new file mode 100644 index 00000000000000..3501931bcf306c --- /dev/null +++ b/packages/react-components/react-motion/library/src/hooks/useAnimateAtoms.test.tsx @@ -0,0 +1,88 @@ +import { renderHook } from '@testing-library/react-hooks'; + +import type { AtomMotion } from '../types'; +import { DEFAULT_ANIMATION_OPTIONS, useAnimateAtoms } from './useAnimateAtoms'; + +function createElementMock() { + const animate = jest.fn().mockReturnValue({ + persist: jest.fn(), + }); + + return [{ animate } as unknown as HTMLElement, animate] as const; +} + +const DEFAULT_KEYFRAMES = [{ transform: 'rotate(0)' }, { transform: 'rotate(180deg)' }]; +const REDUCED_MOTION_KEYFRAMES = [{ opacity: 0 }, { opacity: 1 }]; + +describe('useAnimateAtoms', () => { + beforeEach(() => { + // We set production environment to avoid testing the mock implementation + process.env.NODE_ENV = 'production'; + }); + + it('should return a function', () => { + const { result } = renderHook(() => useAnimateAtoms()); + + expect(result.current).toBeInstanceOf(Function); + }); + + describe('reduce motion', () => { + it('calls ".animate()" with regular motion', () => { + const { result } = renderHook(() => useAnimateAtoms()); + + const [element, animateMock] = createElementMock(); + const motion: AtomMotion = { keyframes: DEFAULT_KEYFRAMES }; + + result.current(element, motion, { isReducedMotion: false }); + + expect(animateMock).toHaveBeenCalledTimes(1); + expect(animateMock).toHaveBeenCalledWith(DEFAULT_KEYFRAMES, { ...DEFAULT_ANIMATION_OPTIONS }); + }); + + it('calls ".animate()" with shortened duration (1ms) when reduced motion is enabled', () => { + const { result } = renderHook(() => useAnimateAtoms()); + + const [element, animateMock] = createElementMock(); + const motion: AtomMotion = { keyframes: DEFAULT_KEYFRAMES }; + + result.current(element, motion, { isReducedMotion: true }); + + expect(animateMock).toHaveBeenCalledTimes(1); + expect(animateMock).toHaveBeenCalledWith(DEFAULT_KEYFRAMES, { ...DEFAULT_ANIMATION_OPTIONS, duration: 1 }); + }); + + it('calls ".animate()" with specified reduced motion keyframes when reduced motion is enabled', () => { + const { result } = renderHook(() => useAnimateAtoms()); + + const [element, animateMock] = createElementMock(); + const motion: AtomMotion = { + keyframes: DEFAULT_KEYFRAMES, + reducedMotion: { keyframes: REDUCED_MOTION_KEYFRAMES }, + }; + + result.current(element, motion, { isReducedMotion: true }); + + expect(animateMock).toHaveBeenCalledTimes(1); + expect(animateMock).toHaveBeenCalledWith(REDUCED_MOTION_KEYFRAMES, { ...DEFAULT_ANIMATION_OPTIONS }); + }); + + it('calls ".animate()" with specified reduced motion params when reduced motion is enabled', () => { + const { result } = renderHook(() => useAnimateAtoms()); + + const [element, animateMock] = createElementMock(); + const motion: AtomMotion = { + keyframes: DEFAULT_KEYFRAMES, + reducedMotion: { duration: 100, easing: 'linear' }, + }; + + result.current(element, motion, { isReducedMotion: true }); + + expect(animateMock).toHaveBeenCalledTimes(1); + expect(animateMock).toHaveBeenCalledWith(DEFAULT_KEYFRAMES, { + ...DEFAULT_ANIMATION_OPTIONS, + easing: 'linear', + duration: 100, + }); + }); + }); +}); diff --git a/packages/react-components/react-motion/library/src/hooks/useAnimateAtoms.ts b/packages/react-components/react-motion/library/src/hooks/useAnimateAtoms.ts index 9bc31e0d2e9cee..59bfe38e32203a 100644 --- a/packages/react-components/react-motion/library/src/hooks/useAnimateAtoms.ts +++ b/packages/react-components/react-motion/library/src/hooks/useAnimateAtoms.ts @@ -1,6 +1,16 @@ import * as React from 'react'; import type { AnimationHandle, AtomMotion } from '../types'; +export const DEFAULT_ANIMATION_OPTIONS: KeyframeEffectOptions = { + fill: 'forwards', +}; + +// A motion atom's default reduced motion is a simple 1 ms duration. +// But an atom can define a custom reduced motion, overriding keyframes and/or params like duration, easing, iterations, etc. +const DEFAULT_REDUCED_MOTION_ATOM: NonNullable<AtomMotion['reducedMotion']> = { + duration: 1, +}; + function useAnimateAtomsInSupportedEnvironment() { // eslint-disable-next-line @nx/workspace-no-restricted-globals const SUPPORTS_PERSIST = typeof window !== 'undefined' && typeof window.Animation?.prototype.persist === 'function'; @@ -17,18 +27,26 @@ function useAnimateAtomsInSupportedEnvironment() { const { isReducedMotion } = options; const animations = atoms.map(motion => { - const { keyframes, ...params } = motion; - const animation = element.animate(keyframes, { - fill: 'forwards', - + // Grab the custom reduced motion definition if it exists, or fall back to the default reduced motion. + const { keyframes: motionKeyframes, reducedMotion = DEFAULT_REDUCED_MOTION_ATOM, ...params } = motion; + // Grab the reduced motion keyframes if they exist, or fall back to the regular keyframes. + const { keyframes: reducedMotionKeyframes = motionKeyframes, ...reducedMotionParams } = reducedMotion; + + const animationKeyframes: Keyframe[] = isReducedMotion ? reducedMotionKeyframes : motionKeyframes; + const animationParams: KeyframeEffectOptions = { + ...DEFAULT_ANIMATION_OPTIONS, ...params, - ...(isReducedMotion && { duration: 1 }), - }); + + // Use reduced motion overrides (e.g. duration, easing) when reduced motion is enabled + ...(isReducedMotion && reducedMotionParams), + }; + + const animation = element.animate(animationKeyframes, animationParams); if (SUPPORTS_PERSIST) { animation.persist(); } else { - const resultKeyframe = keyframes[keyframes.length - 1]; + const resultKeyframe = animationKeyframes[animationKeyframes.length - 1]; Object.assign(element.style ?? {}, resultKeyframe); } diff --git a/packages/react-components/react-motion/library/src/types.ts b/packages/react-components/react-motion/library/src/types.ts index b989d7e890b18c..6fdfd8e7130246 100644 --- a/packages/react-components/react-motion/library/src/types.ts +++ b/packages/react-components/react-motion/library/src/types.ts @@ -1,4 +1,15 @@ -export type AtomMotion = { keyframes: Keyframe[] } & KeyframeEffectOptions; +type AtomCore = { keyframes: Keyframe[] } & KeyframeEffectOptions; + +export type AtomMotion = AtomCore & { + /** + * Allows to specify a reduced motion version of the animation. If provided, the settings will be used when the + * user has enabled the reduced motion setting in the operating system (i.e `prefers-reduced-motion` media query is + * active). If not provided, the duration of the animation will be overridden to be 1ms. + * + * Note, if `keyframes` are provided, they will be used instead of the regular `keyframes`. + */ + reducedMotion?: Partial<AtomCore>; +}; export type PresenceDirection = 'enter' | 'exit'; diff --git a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentDefault.stories.tsx b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentDefault.stories.tsx index 07a0143b051de2..d40b1fb87d986a 100644 --- a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentDefault.stories.tsx +++ b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentDefault.stories.tsx @@ -41,6 +41,10 @@ const FadeEnter = createMotionComponent({ keyframes: [{ opacity: 0 }, { opacity: 1 }], duration: motionTokens.durationSlow, iterations: Infinity, + + reducedMotion: { + iterations: 1, + }, }); export const CreateMotionComponentDefault = (props: MotionComponentProps) => { diff --git a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFactory.stories.tsx b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFactory.stories.tsx index 928ffc9bb2b67b..57b41d3f226aee 100644 --- a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFactory.stories.tsx +++ b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFactory.stories.tsx @@ -45,6 +45,10 @@ const DropIn = createMotionComponent({ ], duration: 4000, iterations: Infinity, + + reducedMotion: { + iterations: 1, + }, }); export const CreateMotionComponentFactory = () => { diff --git a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFunctionParams.stories.tsx b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFunctionParams.stories.tsx index bd0374ed4ce868..81ed56abc9ee3a 100644 --- a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFunctionParams.stories.tsx +++ b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFunctionParams.stories.tsx @@ -81,6 +81,10 @@ const Scale = createMotionComponent<{ startFrom?: number }>(({ startFrom = 0.5 } ], duration: motionTokens.durationUltraSlow, iterations: Infinity, + + reducedMotion: { + iterations: 1, + }, }; }); diff --git a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFunctions.stories.tsx b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFunctions.stories.tsx index a62027d0707b60..422b33618f6580 100644 --- a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFunctions.stories.tsx +++ b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentFunctions.stories.tsx @@ -68,6 +68,10 @@ const Grow = createMotionComponent(({ element }) => ({ { opacity: 0, maxHeight: `${element.scrollHeight / 2}px` }, ], iterations: Infinity, + + reducedMotion: { + iterations: 1, + }, })); export const CreateMotionComponentFunctions = () => { diff --git a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentImperativeRefPlayState.stories.tsx b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentImperativeRefPlayState.stories.tsx index b06668fd66ac7c..d0e19a07e790c0 100644 --- a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentImperativeRefPlayState.stories.tsx +++ b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentImperativeRefPlayState.stories.tsx @@ -66,6 +66,10 @@ const FadeEnter = createMotionComponent({ keyframes: [{ opacity: 0 }, { opacity: 1 }], duration: motionTokens.durationSlow, iterations: Infinity, + + reducedMotion: { + iterations: 1, + }, }); export const CreateMotionComponentImperativeRefPlayState = () => { diff --git a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentTokensUsage.stories.tsx b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentTokensUsage.stories.tsx index 5ac6bed6773d91..07c8af66fe1462 100644 --- a/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentTokensUsage.stories.tsx +++ b/packages/react-components/react-motion/stories/src/CreateMotionComponent/CreateMotionComponentTokensUsage.stories.tsx @@ -45,6 +45,10 @@ const BackgroundChange = createMotionComponent({ ], duration: 3000, iterations: Infinity, + + reducedMotion: { + iterations: 1, + }, }); export const CreateMotionComponentTokensUsage = () => { diff --git a/packages/react-components/react-motion/stories/src/CreatePresenceComponent/CreatePresenceComponentReducedMotion.stories.md b/packages/react-components/react-motion/stories/src/CreatePresenceComponent/CreatePresenceComponentReducedMotion.stories.md new file mode 100644 index 00000000000000..34997dc8b2df94 --- /dev/null +++ b/packages/react-components/react-motion/stories/src/CreatePresenceComponent/CreatePresenceComponentReducedMotion.stories.md @@ -0,0 +1,24 @@ +By default, when [reduced motion](https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion) is enabled the duration of the animation is set to `1ms`. `reducedMotion` allows to customize a reduced motion version of the animation: + +```ts +const Motion = createPresenceComponent({ + enter: { + keyframes: [ + { opacity: 0, transform: 'scale(0)' }, + { opacity: 1, transform: 'scale(1)' }, + ], + duration: 300, + + /* 💡reduced motion will not have scale animation */ + reducedMotion: { + keyframes: [{ opacity: 0 }, { opacity: 1 }], + duration: 1000, + }, + }, + exit: { + /* ... */ + }, +}); +``` + +> 💡Note, if `keyframes` are provided, they will be used instead of the regular keyframes. diff --git a/packages/react-components/react-motion/stories/src/CreatePresenceComponent/CreatePresenceComponentReducedMotion.stories.tsx b/packages/react-components/react-motion/stories/src/CreatePresenceComponent/CreatePresenceComponentReducedMotion.stories.tsx new file mode 100644 index 00000000000000..b480d9587821ba --- /dev/null +++ b/packages/react-components/react-motion/stories/src/CreatePresenceComponent/CreatePresenceComponentReducedMotion.stories.tsx @@ -0,0 +1,150 @@ +import { + createPresenceComponent, + Field, + makeStyles, + mergeClasses, + type MotionImperativeRef, + motionTokens, + Slider, + Switch, + tokens, +} from '@fluentui/react-components'; +import * as React from 'react'; + +import description from './CreatePresenceComponentReducedMotion.stories.md'; + +const useClasses = makeStyles({ + container: { + display: 'grid', + gridTemplate: `"card card" "controls ." / 1fr 1fr`, + gap: '20px 10px', + }, + card: { + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + justifyContent: 'end', + gridArea: 'card', + + border: `${tokens.strokeWidthThicker} solid ${tokens.colorNeutralForeground3}`, + borderRadius: tokens.borderRadiusMedium, + boxShadow: tokens.shadow16, + padding: '10px', + }, + controls: { + display: 'flex', + flexDirection: 'column', + gridArea: 'controls', + + border: `${tokens.strokeWidthThicker} solid ${tokens.colorNeutralForeground3}`, + borderRadius: tokens.borderRadiusMedium, + boxShadow: tokens.shadow16, + padding: '10px', + }, + field: { + flex: 1, + }, + sliderField: { + gridTemplateColumns: 'min-content 1fr', + }, + sliderLabel: { + textWrap: 'nowrap', + }, + + item: { + backgroundColor: tokens.colorBrandBackground, + border: `${tokens.strokeWidthThicker} solid ${tokens.colorTransparentStroke}`, + + width: '100px', + height: '100px', + }, +}); + +const FadeAndScale = createPresenceComponent({ + enter: { + keyframes: [ + { opacity: 0, transform: 'rotate(0)' }, + { transform: 'rotate(90deg) scale(1.5)' }, + { opacity: 1, transform: 'rotate(0)' }, + ], + duration: motionTokens.durationGentle, + + reducedMotion: { + keyframes: [{ opacity: 0 }, { opacity: 1 }], + duration: motionTokens.durationUltraSlow, + }, + }, + exit: { + keyframes: [ + { opacity: 1, transform: 'rotate(0)' }, + { transform: 'rotate(-90deg) scale(1.5)' }, + { opacity: 0, transform: 'rotate(0)' }, + ], + duration: motionTokens.durationGentle, + + reducedMotion: { + keyframes: [{ opacity: 1 }, { opacity: 0 }], + duration: motionTokens.durationUltraSlow, + }, + }, +}); + +export const CreatePresenceComponentReducedMotion = () => { + const classes = useClasses(); + const motionRef = React.useRef<MotionImperativeRef>(); + + const [playbackRate, setPlaybackRate] = React.useState<number>(30); + const [visible, setVisible] = React.useState<boolean>(true); + + // Heads up! + // This is optional and is intended solely to slow down the animations, making motions more visible in the examples. + React.useEffect(() => { + motionRef.current?.setPlaybackRate(playbackRate / 100); + }, [playbackRate, visible]); + + return ( + <div className={classes.container}> + <div className={classes.card}> + <FadeAndScale imperativeRef={motionRef} visible={visible}> + <div className={classes.item} /> + </FadeAndScale> + </div> + + <div className={classes.controls}> + <Field className={classes.field}> + <Switch label="Visible" checked={visible} onChange={() => setVisible(v => !v)} /> + </Field> + <Field + className={mergeClasses(classes.field, classes.sliderField)} + label={{ + children: ( + <> + <code>playbackRate</code>: {playbackRate}% + </> + ), + className: classes.sliderLabel, + }} + orientation="horizontal" + > + <Slider + aria-valuetext={`Value is ${playbackRate}%`} + className={mergeClasses(classes.field, classes.sliderField)} + value={playbackRate} + onChange={(ev, data) => setPlaybackRate(data.value)} + min={0} + max={100} + step={5} + /> + </Field> + </div> + </div> + ); +}; + +CreatePresenceComponentReducedMotion.parameters = { + docs: { + description: { + story: description, + }, + }, +}; diff --git a/packages/react-components/react-motion/stories/src/CreatePresenceComponent/index.stories.ts b/packages/react-components/react-motion/stories/src/CreatePresenceComponent/index.stories.ts index 190d3b12fc3aec..71a7375a799b01 100644 --- a/packages/react-components/react-motion/stories/src/CreatePresenceComponent/index.stories.ts +++ b/packages/react-components/react-motion/stories/src/CreatePresenceComponent/index.stories.ts @@ -8,6 +8,7 @@ export { CreatePresenceComponentDefault as Default } from './CreatePresenceCompo export { CreatePresenceComponentFactory as createPresenceComponent } from './CreatePresenceComponentFactory.stories'; export { CreatePresenceComponentAppear as appear } from './CreatePresenceComponentAppear.stories'; +export { CreatePresenceComponentReducedMotion as reducedMotion } from './CreatePresenceComponentReducedMotion.stories'; export { CreatePresenceComponentUnmountOnExit as unmountOnExit } from './CreatePresenceComponentUnmountOnExit.stories'; export { CreatePresenceComponentLifecycleCallbacks as LifecycleCallbacks } from './CreatePresenceComponentLifecycleCallbacks.stories'; From a8c0c467fdcdb1f721350b5cbd4ed6dd84e0715c Mon Sep 17 00:00:00 2001 From: Makoto Morimoto <Humberto.Morimoto@microsoft.com> Date: Tue, 14 Jan 2025 10:37:27 -0800 Subject: [PATCH 31/78] chore(react-provider): Updating `FluentProvider` types to avoid implicit import in API definition (#33590) Co-authored-by: Humberto Makoto Morimoto Burgos <makotom@microsoft.com> Co-authored-by: Martin Hochel <hochelmartin@gmail.com> --- ...-9f506bc2-b69a-4140-b85e-67b97c87e955.json | 7 + .../library/etc/react-provider.api.md | 161 +----------------- .../FluentProvider/FluentProvider.tsx | 5 +- 3 files changed, 15 insertions(+), 158 deletions(-) create mode 100644 change/@fluentui-react-provider-9f506bc2-b69a-4140-b85e-67b97c87e955.json diff --git a/change/@fluentui-react-provider-9f506bc2-b69a-4140-b85e-67b97c87e955.json b/change/@fluentui-react-provider-9f506bc2-b69a-4140-b85e-67b97c87e955.json new file mode 100644 index 00000000000000..c7f52f2deb033f --- /dev/null +++ b/change/@fluentui-react-provider-9f506bc2-b69a-4140-b85e-67b97c87e955.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "fix: Updating FluentProvider types to avoid implicit import in API definition.", + "packageName": "@fluentui/react-provider", + "email": "makotom@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-provider/library/etc/react-provider.api.md b/packages/react-components/react-provider/library/etc/react-provider.api.md index e7e94b84cad4f2..de54394ef0a815 100644 --- a/packages/react-components/react-provider/library/etc/react-provider.api.md +++ b/packages/react-components/react-provider/library/etc/react-provider.api.md @@ -4,17 +4,17 @@ ```ts -import { ComponentProps } from '@fluentui/react-utilities'; +import type { ComponentProps } from '@fluentui/react-utilities'; import type { ComponentState } from '@fluentui/react-utilities'; import type { CustomStyleHooksContextValue_unstable } from '@fluentui/react-shared-contexts'; +import type { ForwardRefComponent } from '@fluentui/react-utilities'; import type { IconDirectionContextValue } from '@fluentui/react-icons/lib/providers'; -import { OverridesContextValue_unstable } from '@fluentui/react-shared-contexts'; +import type { OverridesContextValue_unstable } from '@fluentui/react-shared-contexts'; import type { PartialTheme } from '@fluentui/react-theme'; import type { ProviderContextValue_unstable } from '@fluentui/react-shared-contexts'; import * as React_2 from 'react'; import type { Slot } from '@fluentui/react-utilities'; import { SlotClassNames } from '@fluentui/react-utilities'; -import { Theme } from '@fluentui/tokens'; import type { ThemeClassNameContextValue_unstable } from '@fluentui/react-shared-contexts'; import type { ThemeContextValue_unstable } from '@fluentui/react-shared-contexts'; import type { TooltipVisibilityContextValue_unstable } from '@fluentui/react-shared-contexts'; @@ -23,160 +23,7 @@ import type { TooltipVisibilityContextValue_unstable } from '@fluentui/react-sha export function createCSSRuleFromTheme(selector: string, theme: PartialTheme | undefined): string; // @public (undocumented) -export const FluentProvider: React_2.ForwardRefExoticComponent<Omit<ComponentProps<FluentProviderSlots>, "dir"> & { - applyStylesToPortals?: boolean | undefined; - customStyleHooks_unstable?: Partial<{ - useAccordionHeaderStyles_unstable: (state: unknown) => void; - useAccordionItemStyles_unstable: (state: unknown) => void; - useAccordionPanelStyles_unstable: (state: unknown) => void; - useAccordionStyles_unstable: (state: unknown) => void; - useAvatarStyles_unstable: (state: unknown) => void; - useAvatarGroupStyles_unstable: (state: unknown) => void; - useAvatarGroupItemStyles_unstable: (state: unknown) => void; - useAvatarGroupPopoverStyles_unstable: (state: unknown) => void; - useBadgeStyles_unstable: (state: unknown) => void; - useCounterBadgeStyles_unstable: (state: unknown) => void; - useCardHeaderStyles_unstable: (state: unknown) => void; - useCardStyles_unstable: (state: unknown) => void; - useCardFooterStyles_unstable: (state: unknown) => void; - useCardPreviewStyles_unstable: (state: unknown) => void; - usePresenceBadgeStyles_unstable: (state: unknown) => void; - useButtonStyles_unstable: (state: unknown) => void; - useCompoundButtonStyles_unstable: (state: unknown) => void; - useMenuButtonStyles_unstable: (state: unknown) => void; - useSplitButtonStyles_unstable: (state: unknown) => void; - useToggleButtonStyles_unstable: (state: unknown) => void; - useCheckboxStyles_unstable: (state: unknown) => void; - useComboboxStyles_unstable: (state: unknown) => void; - useDropdownStyles_unstable: (state: unknown) => void; - useListboxStyles_unstable: (state: unknown) => void; - useListStyles_unstable: (state: unknown) => void; - useListItemStyles_unstable: (state: unknown) => void; - useListItemButtonStyles_unstable: (state: unknown) => void; - useOptionStyles_unstable: (state: unknown) => void; - useOptionGroupStyles_unstable: (state: unknown) => void; - useDividerStyles_unstable: (state: unknown) => void; - useInputStyles_unstable: (state: unknown) => void; - useImageStyles_unstable: (state: unknown) => void; - useLabelStyles_unstable: (state: unknown) => void; - useLinkStyles_unstable: (state: unknown) => void; - useMenuDividerStyles_unstable: (state: unknown) => void; - useMenuGroupHeaderStyles_unstable: (state: unknown) => void; - useMenuGroupStyles_unstable: (state: unknown) => void; - useMenuItemCheckboxStyles_unstable: (state: unknown) => void; - useMenuItemSwitchStyles_unstable: (state: unknown) => void; - useMenuItemRadioStyles_unstable: (state: unknown) => void; - useMenuItemStyles_unstable: (state: unknown) => void; - useMenuItemLinkStyles_unstable: (state: unknown) => void; - useMenuListStyles_unstable: (state: unknown) => void; - useMenuPopoverStyles_unstable: (state: unknown) => void; - useMenuSplitGroupStyles_unstable: (state: unknown) => void; - usePersonaStyles_unstable: (state: unknown) => void; - usePopoverSurfaceStyles_unstable: (state: unknown) => void; - useRadioGroupStyles_unstable: (state: unknown) => void; - useRadioStyles_unstable: (state: unknown) => void; - useSelectStyles_unstable: (state: unknown) => void; - useSliderStyles_unstable: (state: unknown) => void; - useSpinButtonStyles_unstable: (state: unknown) => void; - useSpinnerStyles_unstable: (state: unknown) => void; - useSwitchStyles_unstable: (state: unknown) => void; - useTabStyles_unstable: (state: unknown) => void; - useTabListStyles_unstable: (state: unknown) => void; - useTextStyles_unstable: (state: unknown) => void; - useTextareaStyles_unstable: (state: unknown) => void; - useTooltipStyles_unstable: (state: unknown) => void; - useDialogTitleStyles_unstable: (state: unknown) => void; - useDialogBodyStyles_unstable: (state: unknown) => void; - useDialogActionsStyles_unstable: (state: unknown) => void; - useDialogSurfaceStyles_unstable: (state: unknown) => void; - useDialogContentStyles_unstable: (state: unknown) => void; - useProgressBarStyles_unstable: (state: unknown) => void; - useToolbarButtonStyles_unstable: (state: unknown) => void; - useToolbarRadioButtonStyles_unstable: (state: unknown) => void; - useToolbarGroupStyles_unstable: (state: unknown) => void; - useToolbarToggleButtonStyles_unstable: (state: unknown) => void; - useToolbarDividerStyles_unstable: (state: unknown) => void; - useToolbarStyles_unstable: (state: unknown) => void; - useTableCellStyles_unstable: (state: unknown) => void; - useTableRowStyles_unstable: (state: unknown) => void; - useTableBodyStyles_unstable: (state: unknown) => void; - useTableStyles_unstable: (state: unknown) => void; - useTableHeaderStyles_unstable: (state: unknown) => void; - useTableHeaderCellStyles_unstable: (state: unknown) => void; - useTableResizeHandleStyles_unstable: (state: unknown) => void; - useTableSelectionCellStyles_unstable: (state: unknown) => void; - useTableCellActionsStyles_unstable: (state: unknown) => void; - useTableCellLayoutStyles_unstable: (state: unknown) => void; - useDataGridCellStyles_unstable: (state: unknown) => void; - useDataGridRowStyles_unstable: (state: unknown) => void; - useDataGridBodyStyles_unstable: (state: unknown) => void; - useDataGridStyles_unstable: (state: unknown) => void; - useDataGridHeaderStyles_unstable: (state: unknown) => void; - useDataGridHeaderCellStyles_unstable: (state: unknown) => void; - useDataGridSelectionCellStyles_unstable: (state: unknown) => void; - useDrawerStyles_unstable: (state: unknown) => void; - useDrawerInlineStyles_unstable: (state: unknown) => void; - useDrawerOverlayStyles_unstable: (state: unknown) => void; - useInlineDrawerStyles_unstable: (state: unknown) => void; - useOverlayDrawerStyles_unstable: (state: unknown) => void; - useDrawerHeaderStyles_unstable: (state: unknown) => void; - useDrawerHeaderNavigationStyles_unstable: (state: unknown) => void; - useDrawerHeaderTitleStyles_unstable: (state: unknown) => void; - useDrawerBodyStyles_unstable: (state: unknown) => void; - useDrawerFooterStyles_unstable: (state: unknown) => void; - useInteractionTagStyles_unstable: (state: unknown) => void; - useInteractionTagPrimaryStyles_unstable: (state: unknown) => void; - useInteractionTagSecondaryStyles_unstable: (state: unknown) => void; - useTagStyles_unstable: (state: unknown) => void; - useTagGroupStyles_unstable: (state: unknown) => void; - useBreadcrumbStyles_unstable: (state: unknown) => void; - useBreadcrumbButtonStyles_unstable: (state: unknown) => void; - useBreadcrumbItemStyles_unstable: (state: unknown) => void; - useBreadcrumbDividerStyles_unstable: (state: unknown) => void; - useMessageBarStyles_unstable: (state: unknown) => void; - useMessageBarBodyStyles_unstable: (state: unknown) => void; - useMessageBarTitleStyles_unstable: (state: unknown) => void; - useMessageBarActionsStyles_unstable: (state: unknown) => void; - useMessageBarGroupStyles_unstable: (state: unknown) => void; - useToasterStyles_unstable: (state: unknown) => void; - useTeachingPopoverStyles_unstable: (state: unknown) => void; - useTeachingPopoverActionsStyles_unstable: (state: unknown) => void; - useTeachingPopoverBodyStyles_unstable: (state: unknown) => void; - useTeachingPopoverButtonStyles_unstable: (state: unknown) => void; - useTeachingPopoverCarouselStyles_unstable: (state: unknown) => void; - useTeachingPopoverHeaderStyles_unstable: (state: unknown) => void; - useTeachingPopoverPageCountStyles_unstable: (state: unknown) => void; - useTeachingPopoverSurfaceStyles_unstable: (state: unknown) => void; - useTeachingPopoverTitleStyles_unstable: (state: unknown) => void; - useTimePickerCompatStyles_unstable: (state: unknown) => void; - useTagPickerInputStyles_unstable: (state: unknown) => void; - useTagPickerButtonStyles_unstable: (state: unknown) => void; - useTagPickerControlStyles_unstable: (state: unknown) => void; - useTagPickerGroupStyles_unstable: (state: unknown) => void; - useTagPickerListStyles_unstable: (state: unknown) => void; - useTagPickerOptionStyles_unstable: (state: unknown) => void; - useTagPickerOptionGroupStyles_unstable: (state: unknown) => void; - useColorSwatchStyles_unstable: (state: unknown) => void; - useImageSwatchStyles_unstable: (state: unknown) => void; - useEmptySwatchStyles_unstable: (state: unknown) => void; - useSwatchPickerRowStyles_unstable: (state: unknown) => void; - useSwatchPickerStyles_unstable: (state: unknown) => void; - useCarouselViewportStyles_unstable: (state: unknown) => void; - useCarouselSliderStyles_unstable: (state: unknown) => void; - useCarouselStyles_unstable: (state: unknown) => void; - useCarouselAutoplayButtonStyles_unstable: (state: unknown) => void; - useCarouselButtonStyles_unstable: (state: unknown) => void; - useCarouselCardStyles_unstable: (state: unknown) => void; - useCarouselNavStyles_unstable: (state: unknown) => void; - useCarouselNavButtonStyles_unstable: (state: unknown) => void; - useCarouselNavContainerStyles_unstable: (state: unknown) => void; - useCarouselNavImageButtonStyles_unstable: (state: unknown) => void; - }> | undefined; - dir?: "ltr" | "rtl" | undefined; - targetDocument?: Document | undefined; - theme?: Partial<Theme> | undefined; - overrides_unstable?: OverridesContextValue_unstable | undefined; -} & React_2.RefAttributes<HTMLElement>>; +export const FluentProvider: ForwardRefComponent<FluentProviderProps>; // @public (undocumented) export const fluentProviderClassNames: SlotClassNames<FluentProviderSlots>; diff --git a/packages/react-components/react-provider/library/src/components/FluentProvider/FluentProvider.tsx b/packages/react-components/react-provider/library/src/components/FluentProvider/FluentProvider.tsx index 6fbcb494a3c1a6..e732fb42d1ec59 100644 --- a/packages/react-components/react-provider/library/src/components/FluentProvider/FluentProvider.tsx +++ b/packages/react-components/react-provider/library/src/components/FluentProvider/FluentProvider.tsx @@ -1,11 +1,14 @@ import * as React from 'react'; + +import type { ForwardRefComponent } from '@fluentui/react-utilities'; + import { renderFluentProvider_unstable } from './renderFluentProvider'; import { useFluentProvider_unstable } from './useFluentProvider'; import { useFluentProviderStyles_unstable } from './useFluentProviderStyles.styles'; import { useFluentProviderContextValues_unstable } from './useFluentProviderContextValues'; import type { FluentProviderProps } from './FluentProvider.types'; -export const FluentProvider = React.forwardRef<HTMLElement, FluentProviderProps>((props, ref) => { +export const FluentProvider: ForwardRefComponent<FluentProviderProps> = React.forwardRef((props, ref) => { const state = useFluentProvider_unstable(props, ref); useFluentProviderStyles_unstable(state); From 614e8b594da0eec4104f9fcaa034a4352fee5c74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Mat=C4=9Bjka?= <krystof.matejka@microsoft.com> Date: Tue, 14 Jan 2025 20:14:56 +0100 Subject: [PATCH 32/78] fix(TagItem v8): add missing data-id attribute (#31956) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kryštof Matějka <kmatejka@microsoft.com> Co-authored-by: Esteban Munoz Facusse <estebanmu@microsoft.com> --- ...-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json | 7 + packages/react/etc/react.api.md | 6 + .../pickers/TagPicker/TagItem.test.tsx | 10 + .../components/pickers/TagPicker/TagItem.tsx | 2 + .../pickers/TagPicker/TagPicker.types.ts | 13 + .../__snapshots__/TagItem.test.tsx.snap | 255 ++++++++++++++++++ packages/react/src/index.ts | 1 + 7 files changed, 294 insertions(+) create mode 100644 change/@fluentui-react-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json diff --git a/change/@fluentui-react-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json b/change/@fluentui-react-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json new file mode 100644 index 00000000000000..a14b5ba95b418d --- /dev/null +++ b/change/@fluentui-react-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "add missing data-id attribute to close button in TagItem", + "packageName": "@fluentui/react", + "email": "kmatejka@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react/etc/react.api.md b/packages/react/etc/react.api.md index 9fe14cb8bfbb28..6ad1107c0ee84c 100644 --- a/packages/react/etc/react.api.md +++ b/packages/react/etc/react.api.md @@ -9205,11 +9205,17 @@ export interface ITag { export interface ITagItemProps extends IPickerItemProps<ITag> { className?: string; enableTagFocusInDisabledPicker?: boolean; + removeButtonProps?: ITagItemRemoveButtonProps; styles?: IStyleFunctionOrObject<ITagItemStyleProps, ITagItemStyles>; theme?: ITheme; title?: string; } +// @public +export interface ITagItemRemoveButtonProps extends IButtonProps { + 'data-id'?: string; +} + // @public export type ITagItemStyleProps = Required<Pick<ITagItemProps, 'theme'>> & Pick<ITagItemProps, 'className' | 'selected' | 'disabled'> & {}; diff --git a/packages/react/src/components/pickers/TagPicker/TagItem.test.tsx b/packages/react/src/components/pickers/TagPicker/TagItem.test.tsx index b2a28e459fb5e9..8174ed6428b609 100644 --- a/packages/react/src/components/pickers/TagPicker/TagItem.test.tsx +++ b/packages/react/src/components/pickers/TagPicker/TagItem.test.tsx @@ -39,4 +39,14 @@ describe('TagItem', () => { const tree = component.toJSON(); expect(tree).toMatchSnapshot(); }); + + it('accepts remove-button-data-id', () => { + const component = renderer.create( + <TagItem item={{ name: 'Red', key: 'red' }} index={0} removeButtonProps={{ 'data-id': 'close-red-x' }}> + Red color + </TagItem>, + ); + const tree = component.toJSON(); + expect(tree).toMatchSnapshot(); + }); }); diff --git a/packages/react/src/components/pickers/TagPicker/TagItem.tsx b/packages/react/src/components/pickers/TagPicker/TagItem.tsx index 5bdb2ddb4a910d..cae157e3af2b8a 100644 --- a/packages/react/src/components/pickers/TagPicker/TagItem.tsx +++ b/packages/react/src/components/pickers/TagPicker/TagItem.tsx @@ -25,6 +25,7 @@ export const TagItemBase = (props: ITagItemProps) => { removeButtonAriaLabel, title = typeof props.children === 'string' ? props.children : props.item.name, removeButtonIconProps, + removeButtonProps, } = props; const buttonRef = React.createRef<IButton>(); @@ -65,6 +66,7 @@ export const TagItemBase = (props: ITagItemProps) => { styles={{ icon: { fontSize: '12px' } }} className={classNames.close} aria-labelledby={`${itemId}-removeLabel ${itemId}-text`} + {...removeButtonProps} /> <span id={`${itemId}-removeLabel`} hidden> {removeButtonAriaLabel} diff --git a/packages/react/src/components/pickers/TagPicker/TagPicker.types.ts b/packages/react/src/components/pickers/TagPicker/TagPicker.types.ts index 942cb785e06ebf..cd754ed7cad524 100644 --- a/packages/react/src/components/pickers/TagPicker/TagPicker.types.ts +++ b/packages/react/src/components/pickers/TagPicker/TagPicker.types.ts @@ -3,6 +3,7 @@ import type { IStyle, ITheme } from '../../../Styling'; import type { IStyleFunctionOrObject } from '../../../Utilities'; import type { IPickerItemProps } from '../PickerItem.types'; import type { IBasePickerProps } from '../BasePicker.types'; +import type { IButtonProps } from '../../Button/Button.types'; /** * TagPickerItem item interface. @@ -22,6 +23,15 @@ export interface ITag { */ export interface ITagPickerProps extends IBasePickerProps<ITag> {} +/** + * TagItem remove button component props + * {@docCategory TagPicker} + */ +export interface ITagItemRemoveButtonProps extends IButtonProps { + /** data-id to manually trigger interaction or to identify users' interactions */ + 'data-id'?: string; +} + /** * TagItem component props * {@docCategory TagPicker} @@ -47,6 +57,9 @@ export interface ITagItemProps extends IPickerItemProps<ITag> { /** Theme provided by High-Order Component. */ theme?: ITheme; + + /** Allows to pass any additional props directly to the remove IconButton. */ + removeButtonProps?: ITagItemRemoveButtonProps; } /** diff --git a/packages/react/src/components/pickers/TagPicker/__snapshots__/TagItem.test.tsx.snap b/packages/react/src/components/pickers/TagPicker/__snapshots__/TagItem.test.tsx.snap index 8b3c153b0ec247..2607e5f8261803 100644 --- a/packages/react/src/components/pickers/TagPicker/__snapshots__/TagItem.test.tsx.snap +++ b/packages/react/src/components/pickers/TagPicker/__snapshots__/TagItem.test.tsx.snap @@ -1,5 +1,260 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP +exports[`TagItem accepts remove-button-data-id 1`] = ` +<div + className= + ms-TagItem + { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + background: #f3f2f1; + border-radius: 2px; + box-sizing: content-box; + color: #323130; + cursor: default; + display: flex; + flex-shrink: 1; + flex-wrap: nowrap; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 14px; + font-weight: 400; + height: 26px; + line-height: 26px; + margin-bottom: 2px; + margin-left: 2px; + margin-right: 2px; + margin-top: 2px; + max-width: 300px; + min-width: 0px; + outline: transparent; + position: relative; + user-select: none; + } + &::-moz-focus-inner { + border: 0; + } + .ms-Fabric--isFocusVisible &:focus:after { + border: 1px solid #ffffff; + bottom: 1px; + content: ""; + left: 1px; + outline: 1px solid #605e5c; + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + } + :host(.ms-Fabric--isFocusVisible) &:focus:after { + border: 1px solid #ffffff; + bottom: 1px; + content: ""; + left: 1px; + outline: 1px solid #605e5c; + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + } + &:hover { + background: #edebe9; + color: #201f1e; + } + &:hover .ms-TagItem-close { + color: #323130; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){& { + border: 1px solid WindowText; + } + data-selection-index={0} + onClick={[Function]} + role="listitem" +> + <span + className= + ms-TagItem-text + { + margin-bottom: 0; + margin-left: 8px; + margin-right: 8px; + margin-top: 0; + min-width: 30px; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + id="id__0-text" + title="Red color" + > + Red color + </span> + <button + aria-labelledby="id__0-removeLabel id__0-text" + className= + ms-Button + ms-Button--icon + ms-TagItem-close + { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + align-items: center; + background-color: transparent; + border-radius: 0 2px 2px 0; + border: none; + box-sizing: border-box; + color: #605e5c; + cursor: pointer; + display: inline-flex; + flex: 0 0 auto; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 14px; + font-weight: 400; + height: 100%; + justify-content: center; + outline: transparent; + padding-bottom: 0; + padding-left: 4px; + padding-right: 4px; + padding-top: 0; + position: relative; + text-align: center; + text-decoration: none; + user-select: none; + width: 30px; + } + &::-moz-focus-inner { + border: 0; + } + .ms-Fabric--isFocusVisible &:focus:after { + border: 1px solid transparent; + bottom: 2px; + content: ""; + left: 2px; + outline: 1px solid #ffffff; + position: absolute; + right: 2px; + top: 2px; + z-index: 1; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){.ms-Fabric--isFocusVisible &:focus:after { + bottom: -2px; + left: -2px; + outline-color: ButtonText; + right: -2px; + top: -2px; + } + :host(.ms-Fabric--isFocusVisible) &:focus:after { + border: 1px solid transparent; + bottom: 2px; + content: ""; + left: 2px; + outline: 1px solid #ffffff; + position: absolute; + right: 2px; + top: 2px; + z-index: 1; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){:host(.ms-Fabric--isFocusVisible) &:focus:after { + bottom: -2px; + left: -2px; + outline-color: ButtonText; + right: -2px; + top: -2px; + } + &:active > span { + left: 0px; + position: relative; + top: 0px; + } + &:hover { + background-color: #f3f2f1; + background: #e1dfdd; + color: #323130; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){&:hover { + border-color: Highlight; + color: Highlight; + } + &:active { + background-color: #005a9e; + color: #ffffff; + } + .is-selected &:focus { + background: #0078d4; + color: #ffffff; + } + &:focus:hover { + background: #005a9e; + color: #ffffff; + } + data-id="close-red-x" + data-is-focusable={true} + id="id__0" + onClick={[Function]} + onKeyDown={[Function]} + onKeyPress={[Function]} + onKeyUp={[Function]} + onMouseDown={[Function]} + onMouseUp={[Function]} + type="button" + > + <span + className= + ms-Button-flexContainer + { + align-items: center; + display: flex; + flex-wrap: nowrap; + height: 100%; + justify-content: center; + } + data-automationid="splitbuttonprimary" + > + <i + aria-hidden={true} + className= + ms-Icon + ms-Button-icon + { + display: inline-block; + text-decoration: inherit; + } + { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + font-family: "FabricMDL2Icons"; + font-style: normal; + font-weight: normal; + speak: none; + } + { + flex-shrink: 0; + font-size: 12px; + height: 16px; + line-height: 16px; + margin-bottom: 0; + margin-left: 4px; + margin-right: 4px; + margin-top: 0; + text-align: center; + } + data-icon-name="Cancel" + style={ + Object { + "fontFamily": "\\"FabricMDL2Icons\\"", + } + } + > + + </i> + </span> + </button> + <span + hidden={true} + id="id__0-removeLabel" + /> +</div> +`; + exports[`TagItem accepts title override 1`] = ` <div className= diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index 0c2d7d4e92b0a9..e930a8da1676cb 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -844,6 +844,7 @@ export type { ITagItemSuggestionProps, ITagItemSuggestionStyleProps, ITagItemSuggestionStyles, + ITagItemRemoveButtonProps, ITagPickerProps, } from './Pickers'; export { From e7e2987a4b0c8c36984dc9732937e2e58fb8fb35 Mon Sep 17 00:00:00 2001 From: John Kreitlow <863023+radium-v@users.noreply.github.com> Date: Tue, 14 Jan 2025 11:17:55 -0800 Subject: [PATCH 33/78] chore(web-components): build tokens package before running e2e tests (#33638) --- ...-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json | 7 +++++++ packages/web-components/test/harness/vite.config.ts | 9 +++++++++ 2 files changed, 16 insertions(+) create mode 100644 change/@fluentui-web-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json diff --git a/change/@fluentui-web-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json b/change/@fluentui-web-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json new file mode 100644 index 00000000000000..812ad60eb4fcee --- /dev/null +++ b/change/@fluentui-web-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "build tokens package before running e2e tests", + "packageName": "@fluentui/web-components", + "email": "863023+radium-v@users.noreply.github.com", + "dependentChangeType": "none" +} diff --git a/packages/web-components/test/harness/vite.config.ts b/packages/web-components/test/harness/vite.config.ts index 6c7c44543a3bb0..85f14d8d1529a0 100644 --- a/packages/web-components/test/harness/vite.config.ts +++ b/packages/web-components/test/harness/vite.config.ts @@ -1,5 +1,9 @@ +import { createRequire } from 'node:module'; +import { dirname, join } from 'node:path'; import type { UserConfig } from 'vite'; +const { resolve } = createRequire(import.meta.url); + export default { clearScreen: false, publicDir: '../../public', @@ -20,4 +24,9 @@ export default { strictPort: true, open: false, }, + resolve: { + alias: { + '@fluentui/tokens': join(dirname(resolve('@fluentui/tokens/package.json')), 'src'), + }, + }, } as UserConfig; From 1e110d6492d33ca8959aaddc35e21cbd8992706b Mon Sep 17 00:00:00 2001 From: Dave Rupert <rupertdavid@microsoft.com> Date: Tue, 14 Jan 2025 14:22:08 -0600 Subject: [PATCH 34/78] [web-components] fix: disabled switch state in high-contrast mode (#33637) --- ...eb-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json | 7 +++++++ packages/web-components/src/switch/switch.styles.ts | 4 ++++ 2 files changed, 11 insertions(+) create mode 100644 change/@fluentui-web-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json diff --git a/change/@fluentui-web-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json b/change/@fluentui-web-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json new file mode 100644 index 00000000000000..df9f992ebe5ced --- /dev/null +++ b/change/@fluentui-web-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "fix: update disabled switch styles to GrayText for high-contrast mode", + "packageName": "@fluentui/web-components", + "email": "rupertdavid@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/web-components/src/switch/switch.styles.ts b/packages/web-components/src/switch/switch.styles.ts index e642d3fb9ec256..432d2b03f0c764 100644 --- a/packages/web-components/src/switch/switch.styles.ts +++ b/packages/web-components/src/switch/switch.styles.ts @@ -141,5 +141,9 @@ export const styles = css` :host(${checkedState}:active) .checked-indicator { background-color: ButtonFace; } + :host(:disabled) .checked-indicator, + :host(${checkedState}:disabled) .checked-indicator { + background-color: GrayText; + } `), ); From 00458f3bbe3f12c0cef556f8d8fd564ffa66983c Mon Sep 17 00:00:00 2001 From: Dave Rupert <rupertdavid@microsoft.com> Date: Tue, 14 Jan 2025 16:31:15 -0600 Subject: [PATCH 35/78] [web-components] fix: remove logical properties to fix spinner in rtl (#33654) --- ...b-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json | 7 +++++++ packages/web-components/src/spinner/spinner.styles.ts | 8 ++++---- 2 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 change/@fluentui-web-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json diff --git a/change/@fluentui-web-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json b/change/@fluentui-web-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json new file mode 100644 index 00000000000000..99a9e9c5639d0d --- /dev/null +++ b/change/@fluentui-web-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json @@ -0,0 +1,7 @@ +{ + "type": "prerelease", + "comment": "fix: revert logical properties in spinner to support rtl\"", + "packageName": "@fluentui/web-components", + "email": "rupertdavid@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/web-components/src/spinner/spinner.styles.ts b/packages/web-components/src/spinner/spinner.styles.ts index 8db70684013db7..e24c674a5d8ba3 100644 --- a/packages/web-components/src/spinner/spinner.styles.ts +++ b/packages/web-components/src/spinner/spinner.styles.ts @@ -93,12 +93,12 @@ export const styles = css` .start { overflow: hidden; - inset-inline-end: 50%; + right: 50%; } .end { overflow: hidden; - inset-inline-start: 50%; + left: 50%; } .indicator { @@ -107,7 +107,7 @@ export const styles = css` border-radius: 50%; border: var(--indicatorSize) solid transparent; border-block-start-color: currentcolor; - border-inline-end-color: currentcolor; + border-right-color: currentcolor; } :host(${invertedState}) .indicator { @@ -171,7 +171,7 @@ export const styles = css` .indicator { border-color: Canvas; border-block-start-color: Highlight; - border-inline-end-color: Highlight; + border-right-color: Highlight; } `), ); From 9422dd03c1a17d80a2677eee47fb9765e619b348 Mon Sep 17 00:00:00 2001 From: FrietStoofvlees <76880277+FrietStoofvlees@users.noreply.github.com> Date: Wed, 15 Jan 2025 09:42:00 +0100 Subject: [PATCH 36/78] Fix typo in ToolbarSmall story (#33575) --- .../react-toolbar/stories/src/Toolbar/ToolbarSmall.stories.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/react-components/react-toolbar/stories/src/Toolbar/ToolbarSmall.stories.tsx b/packages/react-components/react-toolbar/stories/src/Toolbar/ToolbarSmall.stories.tsx index ee487910535182..f3ba53c429c6fc 100644 --- a/packages/react-components/react-toolbar/stories/src/Toolbar/ToolbarSmall.stories.tsx +++ b/packages/react-components/react-toolbar/stories/src/Toolbar/ToolbarSmall.stories.tsx @@ -24,7 +24,7 @@ Small.parameters = { description: { story: [ 'The size determines the spacing around the toolbar controls.', - 'A small sized toolbar has no vertical padding and uses 20px for horizontal padding.', + 'A small sized toolbar has no vertical padding and uses 4px for horizontal padding.', ].join('\n'), }, }, From d75752a0df4723f188a44a348af14bbc6c36c85d Mon Sep 17 00:00:00 2001 From: Bernardo Sunderhus <bernardo.sunderhus@gmail.com> Date: Wed, 15 Jan 2025 10:36:30 +0100 Subject: [PATCH 37/78] docs: reorder buttons on footer to give priority to primary action (#33623) --- .../react-dialog/stories/src/Dialog/DialogAlert.stories.tsx | 2 +- .../stories/src/Dialog/DialogChangeFocus.stories.tsx | 2 +- .../src/Dialog/DialogControllingOpenAndClose.stories.tsx | 2 +- .../stories/src/Dialog/DialogCustomTrigger.stories.tsx | 2 +- .../stories/src/Dialog/DialogDefault.stories.tsx | 2 +- .../stories/src/Dialog/DialogFluidDialogActions.stories.tsx | 2 +- .../src/Dialog/DialogScrollingLongContent.stories.tsx | 2 +- .../src/Dialog/DialogTriggerOutsideDialog.stories.tsx | 2 +- .../stories/src/Dialog/DialogWithForm.stories.tsx | 6 +++--- 9 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogAlert.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogAlert.stories.tsx index acd15f5ad3e12e..d7dcfef470850c 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogAlert.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogAlert.stories.tsx @@ -25,10 +25,10 @@ export const Alert = () => { pressed to dismiss this Alert </DialogContent> <DialogActions> + <Button appearance="primary">Do Something</Button> <DialogTrigger disableButtonEnhancement> <Button appearance="secondary">Close</Button> </DialogTrigger> - <Button appearance="primary">Do Something</Button> </DialogActions> </DialogBody> </DialogSurface> diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogChangeFocus.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogChangeFocus.stories.tsx index d872b259e1df0c..f5d6e8b2fb4e0d 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogChangeFocus.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogChangeFocus.stories.tsx @@ -31,12 +31,12 @@ export const ChangeFocus = () => { <Button appearance="outline">Third Action</Button> </DialogActions> <DialogActions position="end"> + <Button appearance="primary">Do Something</Button> <DialogTrigger disableButtonEnhancement> <Button ref={buttonRef} appearance="secondary"> Close </Button> </DialogTrigger> - <Button appearance="primary">Do Something</Button> </DialogActions> </DialogBody> </DialogSurface> diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogControllingOpenAndClose.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogControllingOpenAndClose.stories.tsx index d2fcf0ede0a42f..f76d7da8f00903 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogControllingOpenAndClose.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogControllingOpenAndClose.stories.tsx @@ -27,10 +27,10 @@ export const ControllingOpenAndClose = () => { cumque eaque? </DialogContent> <DialogActions> + <Button appearance="primary">Do Something</Button> <DialogTrigger disableButtonEnhancement> <Button appearance="secondary">Close</Button> </DialogTrigger> - <Button appearance="primary">Do Something</Button> </DialogActions> </DialogBody> </DialogSurface> diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogCustomTrigger.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogCustomTrigger.stories.tsx index 526402fab05bfe..7dd51ba339194e 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogCustomTrigger.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogCustomTrigger.stories.tsx @@ -35,10 +35,10 @@ export const CustomTrigger = () => { cumque eaque? </DialogContent> <DialogActions> + <Button appearance="primary">Do Something</Button> <DialogTrigger disableButtonEnhancement> <Button appearance="secondary">Close</Button> </DialogTrigger> - <Button appearance="primary">Do Something</Button> </DialogActions> </DialogBody> </DialogSurface> diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogDefault.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogDefault.stories.tsx index e36839a8ddfdfb..00c1940b9e354a 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogDefault.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogDefault.stories.tsx @@ -25,10 +25,10 @@ export const Default = () => { cumque eaque? </DialogContent> <DialogActions> + <Button appearance="primary">Do Something</Button> <DialogTrigger disableButtonEnhancement> <Button appearance="secondary">Close</Button> </DialogTrigger> - <Button appearance="primary">Do Something</Button> </DialogActions> </DialogBody> </DialogSurface> diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogFluidDialogActions.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogFluidDialogActions.stories.tsx index de95f61c2a9210..4bd53c955f0eac 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogFluidDialogActions.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogFluidDialogActions.stories.tsx @@ -26,12 +26,12 @@ export const FluidActions = () => { cumque eaque? </DialogContent> <DialogActions fluid> + <Button appearance="primary">Do Something</Button> <Button appearance="secondary">Something Else</Button> <Button appearance="secondary">Something Else</Button> <DialogTrigger disableButtonEnhancement> <Button appearance="secondary">Close</Button> </DialogTrigger> - <Button appearance="primary">Do Something</Button> </DialogActions> </DialogBody> </DialogSurface> diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogScrollingLongContent.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogScrollingLongContent.stories.tsx index 4cd63e09f95db4..a35205026b8051 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogScrollingLongContent.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogScrollingLongContent.stories.tsx @@ -126,10 +126,10 @@ export const ScrollingLongContent = () => { </p> </DialogContent> <DialogActions> + <Button appearance="primary">Do Something</Button> <DialogTrigger disableButtonEnhancement> <Button appearance="secondary">Close</Button> </DialogTrigger> - <Button appearance="primary">Do Something</Button> </DialogActions> </DialogBody> </DialogSurface> diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogTriggerOutsideDialog.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogTriggerOutsideDialog.stories.tsx index f4589ee411be72..584610b8bc7205 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogTriggerOutsideDialog.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogTriggerOutsideDialog.stories.tsx @@ -47,11 +47,11 @@ export const TriggerOutsideDialog = () => { </DialogContent> <DialogActions> + <Button appearance="primary">Do Something</Button> {/* DialogTrigger inside of a Dialog still works properly */} <DialogTrigger disableButtonEnhancement> <Button appearance="secondary">Close</Button> </DialogTrigger> - <Button appearance="primary">Do Something</Button> </DialogActions> </DialogBody> </DialogSurface> diff --git a/packages/react-components/react-dialog/stories/src/Dialog/DialogWithForm.stories.tsx b/packages/react-components/react-dialog/stories/src/Dialog/DialogWithForm.stories.tsx index b1d739aec6860e..082d22dcad06ca 100644 --- a/packages/react-components/react-dialog/stories/src/Dialog/DialogWithForm.stories.tsx +++ b/packages/react-components/react-dialog/stories/src/Dialog/DialogWithForm.stories.tsx @@ -48,12 +48,12 @@ export const WithForm = () => { <Input required type="password" id={'password-input'} /> </DialogContent> <DialogActions> - <DialogTrigger disableButtonEnhancement> - <Button appearance="secondary">Close</Button> - </DialogTrigger> <Button type="submit" appearance="primary"> Submit </Button> + <DialogTrigger disableButtonEnhancement> + <Button appearance="secondary">Close</Button> + </DialogTrigger> </DialogActions> </DialogBody> </form> From 6093d92e5e8e4be06ba6a6f81adcd567115277fd Mon Sep 17 00:00:00 2001 From: "Atishay Jain (atisjai)" <98592573+AtishayMsft@users.noreply.github.com> Date: Wed, 15 Jan 2025 16:16:01 +0530 Subject: [PATCH 38/78] chore(web-components): Update build tag to enable building charts web component package (#33656) --- azure-pipelines.release.web-components.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/azure-pipelines.release.web-components.yml b/azure-pipelines.release.web-components.yml index 7ff0c44032afa9..e3817f7116627a 100644 --- a/azure-pipelines.release.web-components.yml +++ b/azure-pipelines.release.web-components.yml @@ -69,7 +69,7 @@ extends: displayName: yarn - script: | - yarn nx run-many -t format:check lint test build -p web-components --nxBail + yarn nx run-many -t format:check lint test build -p tag:web-components --exclude vr-tests-web-components --nxBail displayName: Build, Test, Lint - script: | From 408fe44060b746844a9c76c67391b18d76d1f26e Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Wed, 15 Jan 2025 12:11:06 +0100 Subject: [PATCH 39/78] release: applying package updates - web-components (#33647) --- ...-cfdeb418-e440-4904-9a73-4b8291c7c99d.json | 7 ++++ ...-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json | 7 ---- .../chart-web-components/CHANGELOG.json | 32 +++++++++++++++++++ .../charts/chart-web-components/CHANGELOG.md | 15 +++++++++ .../charts/chart-web-components/package.json | 6 ++-- 5 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 change/@fluentui-chart-web-components-cfdeb418-e440-4904-9a73-4b8291c7c99d.json delete mode 100644 change/@fluentui-chart-web-components-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json create mode 100644 packages/charts/chart-web-components/CHANGELOG.json create mode 100644 packages/charts/chart-web-components/CHANGELOG.md diff --git a/change/@fluentui-chart-web-components-cfdeb418-e440-4904-9a73-4b8291c7c99d.json b/change/@fluentui-chart-web-components-cfdeb418-e440-4904-9a73-4b8291c7c99d.json new file mode 100644 index 00000000000000..cad856081e15fb --- /dev/null +++ b/change/@fluentui-chart-web-components-cfdeb418-e440-4904-9a73-4b8291c7c99d.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: sync failed release pipeline with git", + "packageName": "@fluentui/chart-web-components", + "email": "martinhochel@microsoft.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-chart-web-components-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json b/change/@fluentui-chart-web-components-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json deleted file mode 100644 index c610fda40decf5..00000000000000 --- a/change/@fluentui-chart-web-components-dfff0cf0-8ca6-4c11-aacb-bdd0e7090bbb.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "Create chart web components. Includes donut chart and horizontal bar chart", - "packageName": "@fluentui/chart-web-components", - "email": "98592573+AtishayMsft@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/packages/charts/chart-web-components/CHANGELOG.json b/packages/charts/chart-web-components/CHANGELOG.json new file mode 100644 index 00000000000000..083c48da4b8382 --- /dev/null +++ b/packages/charts/chart-web-components/CHANGELOG.json @@ -0,0 +1,32 @@ +{ + "name": "@fluentui/chart-web-components", + "entries": [ + { + "date": "Tue, 14 Jan 2025 14:42:14 GMT", + "tag": "@fluentui/chart-web-components_v0.0.0-alpha.2", + "version": "0.0.0-alpha.2", + "comments": { + "prerelease": [ + { + "author": "98592573+AtishayMsft@users.noreply.github.com", + "package": "@fluentui/chart-web-components", + "commit": "5964b11d0ac272f2ae10e1081b8f0d1e17497eef", + "comment": "Create chart web components. Includes donut chart and horizontal bar chart" + }, + { + "author": "beachball", + "package": "@fluentui/chart-web-components", + "comment": "Bump @fluentui/tokens to v1.0.0-alpha.21", + "commit": "8cf401d626def27ad679f9e53928533df9f9ef52" + }, + { + "author": "beachball", + "package": "@fluentui/chart-web-components", + "comment": "Bump @fluentui/web-components to v3.0.0-beta.76", + "commit": "8cf401d626def27ad679f9e53928533df9f9ef52" + } + ] + } + } + ] +} diff --git a/packages/charts/chart-web-components/CHANGELOG.md b/packages/charts/chart-web-components/CHANGELOG.md new file mode 100644 index 00000000000000..19eff92c0072a1 --- /dev/null +++ b/packages/charts/chart-web-components/CHANGELOG.md @@ -0,0 +1,15 @@ +# Change Log - @fluentui/chart-web-components + +This log was last generated on Tue, 14 Jan 2025 14:42:14 GMT and should not be manually modified. + +<!-- Start content --> + +## [0.0.0-alpha.2](https://github.com/microsoft/fluentui/tree/@fluentui/chart-web-components_v0.0.0-alpha.2) + +Tue, 14 Jan 2025 14:42:14 GMT + +### Changes + +- Create chart web components. Includes donut chart and horizontal bar chart ([PR #33084](https://github.com/microsoft/fluentui/pull/33084) by 98592573+AtishayMsft@users.noreply.github.com) +- Bump @fluentui/tokens to v1.0.0-alpha.21 ([PR #33642](https://github.com/microsoft/fluentui/pull/33642) by beachball) +- Bump @fluentui/web-components to v3.0.0-beta.76 ([PR #33642](https://github.com/microsoft/fluentui/pull/33642) by beachball) diff --git a/packages/charts/chart-web-components/package.json b/packages/charts/chart-web-components/package.json index fe15d6d133e168..280ff647ca39fa 100644 --- a/packages/charts/chart-web-components/package.json +++ b/packages/charts/chart-web-components/package.json @@ -1,7 +1,7 @@ { "name": "@fluentui/chart-web-components", "description": "A library of Fluent Chart Web Components", - "version": "0.0.0-alpha.1", + "version": "0.0.0-alpha.2", "author": { "name": "Microsoft" }, @@ -97,8 +97,8 @@ }, "dependencies": { "@microsoft/fast-web-utilities": "^6.0.0", - "@fluentui/tokens": "^1.0.0-alpha", - "@fluentui/web-components": "^3.0.0-beta", + "@fluentui/tokens": "^1.0.0-alpha.21", + "@fluentui/web-components": "^3.0.0-beta.76", "@types/d3-selection": "^3.0.0", "@types/d3-shape": "^3.0.0", "d3-selection": "^3.0.0", From 92722197457a5c8ca81a76e15ef016ff07ec0361 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Nuno=20Mota?= <jnuno.carrilho@gmail.com> Date: Wed, 15 Jan 2025 12:51:07 +0000 Subject: [PATCH 40/78] Update README links that are incorrect or outdated (#33184) --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index ce78d0bfa950d5..c2bffa8e5ced88 100644 --- a/README.md +++ b/README.md @@ -17,8 +17,8 @@ The following table will help you navigate the 3 projects and understand their d | **Used By** | Microsoft 365 | Office | Edge | | **Read Me** | [README.md](/packages/react-components/react-components/README.md) | [README.md](/packages/react/README.md)| [README.md](/packages/web-components/README.md) | | **Changelog** | [CHANGELOG.md](/packages/react-components/react-components/CHANGELOG.md) | [CHANGELOG.md](/packages/react/CHANGELOG.md) | [CHANGELOG.md](/packages/web-components/CHANGELOG.md) | -| **Repo** | [packages/react-components](/packages/react-components/react-components/CHANGELOG.md) | [./packages/react](/packages/react) | [./packages/web-components](/packages/web-components) | -| **Quick Start** | [Quick Start](https://react.fluentui.dev/?path=/docs/concepts-developer-quick-start--page) | [Quick Start](https://developer.microsoft.com/en-us/fluentui#/get-started/web) | [See README.md](https://github.com/microsoft/fluentui/tree/master/packages/web-components/README.md) | +| **Repo** | [packages/react-components](/packages/react-components/react-components) | [./packages/react](/packages/react) | [./packages/web-components](/packages/web-components) | +| **Quick Start** | [Quick Start](https://react.fluentui.dev/?path=/docs/concepts-developer-quick-start--docs) | [Quick Start](https://developer.microsoft.com/en-us/fluentui#/get-started/web) | [See README.md](https://github.com/microsoft/fluentui/tree/master/packages/web-components/README.md) | | **Docs** | [https://react.fluentui.dev/](https://react.fluentui.dev/) | [aka.ms/fluentui-react](https://aka.ms/fluentui-react) | [aka.ms/fluentui-web-components](https://aka.ms/fluentui-web-components) | | **NPM** | `@fluentui/react-components` | `@fluentui/react`| `@fluentui/web-components` | | **Version** | [](https://www.npmjs.com/package/@fluentui/react-components) | [](https://www.npmjs.com/package/@fluentui/react) | [](https://www.npmjs.com/package/@fluentui/web-components/v/3.0.0-beta.15) | From d6997e2e9f448ad908f3cf1839b9a42b77ca22eb Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Wed, 15 Jan 2025 13:55:40 +0100 Subject: [PATCH 41/78] ci: update react-components-bug-report list (#33598) --- .../01-react-components-bug-report.yml | 37 ++++++++++++++----- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/01-react-components-bug-report.yml b/.github/ISSUE_TEMPLATE/01-react-components-bug-report.yml index fa2b5be3bc0082..3ac9d7de51cab4 100644 --- a/.github/ISSUE_TEMPLATE/01-react-components-bug-report.yml +++ b/.github/ISSUE_TEMPLATE/01-react-components-bug-report.yml @@ -26,8 +26,15 @@ body: - Breadcrumb - Button - Card + - CardFooter + - CardHeader + - CardPreview + - Carousel + - CarouselNav - Checkbox - Combobox + - CompoundButton + - Counter Badge - DataGrid - Dialog - Divider @@ -38,14 +45,19 @@ body: - Image - InfoLabel - Input + - InteractionTag - Label - Link + - List - Menu + - MenuButton + - MenuList - MessageBar - Overflow - Persona - Popover - Portal + - PresenceBadge - ProgressBar - RadioGroup - Rating @@ -56,32 +68,37 @@ body: - Slider - SpinButton - Spinner + - SplitButton - SwatchPicker - Switch - - Table - TabList + - Table - Tag + - TagGroup - TagPicker - TeachingPopover - Text - Textarea - Toast + - ToggleButton - Toolbar - Tooltip - Tree + - ColorPicker (Preview) + - Nav (Preview) + - Virtualizer (Preview) + - VirtualizerScrollView (Preview) + - VirtualizerScrollViewDynamic (Preview) - Calendar (Compat) - DatePicker (Compat) - TimePicker (Compat) - - Carousel (Preview) - - List (Preview) - - Nav (Preview) - - Virtualizer (Preview) - - Motion - Icons - - Theme/Tokens - - Utilities (utilities we provide besides Components, e.g. apis from react-utilities) - - Migration Shims v0 - - Migration Shims v8 + - Migration Shims V0 + - Migration Shims V8 + - Motion + - Theme + - Tokens + - Utilities - Other... validations: required: true From 1e9bac019e636b7118b73ded1e78da5146dfcde2 Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Wed, 15 Jan 2025 13:57:46 +0100 Subject: [PATCH 42/78] test(workspace-plugin): make build executor spec deterministic on local and CI (#33645) --- .../src/executors/build/executor.spec.ts | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/tools/workspace-plugin/src/executors/build/executor.spec.ts b/tools/workspace-plugin/src/executors/build/executor.spec.ts index a690d8b1bcb4b7..4b0a832baa1ccd 100644 --- a/tools/workspace-plugin/src/executors/build/executor.spec.ts +++ b/tools/workspace-plugin/src/executors/build/executor.spec.ts @@ -270,13 +270,19 @@ describe('Build Executor', () => { const publicApiFilePath = join(workspaceRoot, 'libs/proj/src/index.ts'); const originalApiContent = readFileSync(publicApiFilePath); + const existingEnvVariableCi = process.env.CI; + appendFileSync(publicApiFilePath, `export const hello='new public api';\n`); + // force api-extractor CI behaviors to fail on both Local/CI + process.env.CI = 'true'; - // force api-extractor to generate api.md and not fail on Local/CI - process.env.__FORCE_API_MD_UPDATE__ = ''; const outputFailed = await executor(options, context); expect(outputFailed.success).toBe(false); + // cleanup writeFileSync(publicApiFilePath, originalApiContent, 'utf-8'); + if (existingEnvVariableCi) { + process.env.CI = existingEnvVariableCi; + } }, 60000); }); From 84c2ce729ec1b6566a6561ac47f0ea1b0a0e249b Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Wed, 15 Jan 2025 13:58:07 +0100 Subject: [PATCH 43/78] chore: migrate to nx 19.8.14 (#33629) --- package.json | 20 +-- yarn.lock | 377 ++++++++++++++++++++++++++------------------------- 2 files changed, 199 insertions(+), 198 deletions(-) diff --git a/package.json b/package.json index c50f53823e2ddb..77c06c19c1c95f 100644 --- a/package.json +++ b/package.json @@ -75,14 +75,14 @@ "@microsoft/load-themed-styles": "1.10.26", "@microsoft/loader-load-themed-styles": "2.0.17", "@microsoft/tsdoc": "0.14.2", - "@nx/devkit": "19.8.4", - "@nx/eslint": "19.8.4", - "@nx/eslint-plugin": "19.8.4", - "@nx/jest": "19.8.4", - "@nx/js": "19.8.4", - "@nx/node": "19.8.4", - "@nx/plugin": "19.8.4", - "@nx/workspace": "19.8.4", + "@nx/devkit": "19.8.14", + "@nx/eslint": "19.8.14", + "@nx/eslint-plugin": "19.8.14", + "@nx/jest": "19.8.14", + "@nx/js": "19.8.14", + "@nx/node": "19.8.14", + "@nx/plugin": "19.8.14", + "@nx/workspace": "19.8.14", "@octokit/rest": "18.12.0", "@oddbird/css-anchor-positioning": "0.4.0", "@phenomnomnominal/tsquery": "6.1.3", @@ -282,7 +282,7 @@ "monosize-bundler-webpack": "0.1.5", "monosize-storage-azure": "0.0.15", "node-plop": "0.25.0", - "nx": "19.8.4", + "nx": "19.8.14", "p-queue": "6.6.2", "parse-diff": "0.7.1", "path-browserify": "1.0.1", @@ -335,7 +335,7 @@ "terser-webpack-plugin": "5.3.10", "through2": "4.0.2", "tmp": "0.2.1", - "ts-jest": "29.1.1", + "ts-jest": "29.2.5", "ts-loader": "9.4.2", "ts-node": "10.9.2", "tsconfig-paths": "4.2.0", diff --git a/yarn.lock b/yarn.lock index 5885094de87ceb..e52755aa7c44f5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2743,62 +2743,62 @@ dependencies: "@nx/devkit" "19.5.7" -"@nrwl/devkit@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-19.8.4.tgz#19fbf56854d11fa6b12431b8f9c51999099cf3e2" - integrity sha512-OoIqDjj2mWzLs3aSF6w5OiC2xywYi/jBxHc7t7Lyi56Vc4dQq8vJMELa9WtG6qH0k05fF7N+jAoKlfvLgbbEFA== +"@nrwl/devkit@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nrwl/devkit/-/devkit-19.8.14.tgz#0c1eaeb8b1b0283d071fcd0cb0ddb10dd9fc1bfb" + integrity sha512-Oud7BPhFNqE3/YStULn/gHyuGSw2QyxUaHXJApr+DybmYtUms7hQ+cWnY1IY+hRpdtU9ldlg8UYx+VslpS9YNQ== dependencies: - "@nx/devkit" "19.8.4" + "@nx/devkit" "19.8.14" -"@nrwl/eslint-plugin-nx@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-19.8.4.tgz#7710a02660380c67c7d2d8ee188574a159c13275" - integrity sha512-D2RsuKOwuF3SO9/tA2R93zL2ixampDlQC8+6E7wfcU+KdfMhhGFG2+r53F98Q8cZKMt5Wls2nGSGpj2CWxCk5A== +"@nrwl/eslint-plugin-nx@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nrwl/eslint-plugin-nx/-/eslint-plugin-nx-19.8.14.tgz#d734a6dd905439c8282a275c25fea75529cd905e" + integrity sha512-nnwWYW+XS3r8aCzVahpIVSu63J8UD5WAzO7yUZpk8etRlmRrVXl+JXxNLkOF0KNTuGuqFZUrN9ZO/NkigPPtUA== dependencies: - "@nx/eslint-plugin" "19.8.4" + "@nx/eslint-plugin" "19.8.14" -"@nrwl/jest@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-19.8.4.tgz#ed1be1e881e085a080a86fa11c88c8dd4a1445d3" - integrity sha512-N18UVEqTrOUotXdjpVZOe/qgT4m0cX9YIS6ATKXAYxX9Nl6Qo3hhbRDo9WHHulXE2Hql6S/RpnwwUP5TJthkZw== +"@nrwl/jest@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nrwl/jest/-/jest-19.8.14.tgz#15b66c01b59eee7d1642807436a26960884f348a" + integrity sha512-4xW9aRhDnTgsuVuhex+cM6u65XNpc1l3HzJRClaKfJY9cRp2uRpBR6UCgqRypXacflX2QXGczlBBUg2N6CQZ0A== dependencies: - "@nx/jest" "19.8.4" + "@nx/jest" "19.8.14" -"@nrwl/js@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-19.8.4.tgz#1368d872bb0d7e4d7eee3f3eecb9bc0a4363ec1f" - integrity sha512-XuPOJc77waJ3zgg42zntTy5eGCKTc6EjVvRVdUSf1iXWaMHAsknPjb4kz16iwdGhoRMQpZxHRr1KjY5WmcWq0A== +"@nrwl/js@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nrwl/js/-/js-19.8.14.tgz#7dcf0941f89bb45588b964b3e4a96cbfeebedace" + integrity sha512-DilRYVrqoecsNOkV2j4QDvcIjJXaO2krV7bbfGU/9TSmDzNcdB1R++dEgpa0seo2FrEfVgKffOl/6zzi8PhsgQ== dependencies: - "@nx/js" "19.8.4" + "@nx/js" "19.8.14" -"@nrwl/node@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-19.8.4.tgz#712941c282cbad8e016ba33f5b33b433131ef20a" - integrity sha512-uAtNNGqaHvNIFFNZkUzAh1fviX/O8VS9lOa8+k7uL4WjxNuQBcdORX3DkQ9mTGeNgsdzhIHQTCi7AMMFIPWB0g== +"@nrwl/node@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nrwl/node/-/node-19.8.14.tgz#56628aeb2f0c3be72555706cd57a4e515fd9837e" + integrity sha512-GE/lyXiAJgCmTXh5gauG78HMCVV3oFGdNkro0MToBNBRvv7SQL9OINRfzg9+9vK8ERcMviCYILt56TyKMl8xwQ== dependencies: - "@nx/node" "19.8.4" + "@nx/node" "19.8.14" -"@nrwl/nx-plugin@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nrwl/nx-plugin/-/nx-plugin-19.8.4.tgz#c6900327eb6ef0d2d604884bdbcf17305121d023" - integrity sha512-nPE+7iUTIEsO080MQNrZptFTQsPnKojGGdC9q9+T5Fj0TaAAKVKTrPQjRmgEoiG1JD+8r0BwR+e3YAXu/OhynQ== +"@nrwl/nx-plugin@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nrwl/nx-plugin/-/nx-plugin-19.8.14.tgz#dc575cf4fad6083093c5b53bc890200581ba4083" + integrity sha512-q0Md9yt1zRCQ1XZx3EZUkF5QFODGZ6BVaPjOlcXi9Ml6vP4dMvBjoA3F5TuILkvTTJVhLG20M24AGwWYkgrLHQ== dependencies: - "@nx/plugin" "19.8.4" + "@nx/plugin" "19.8.14" -"@nrwl/tao@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-19.8.4.tgz#7bba53a15e3530544405f90c90bc940b12524404" - integrity sha512-03/+QZ4/6HmKbEmvzCutLI1XIclBspNYtiVHmGPRWuwhnZViqYfnyl8J7RWVdFEoKKA5fhJqpg7e28aGuoMBvQ== +"@nrwl/tao@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nrwl/tao/-/tao-19.8.14.tgz#a9e3157ba19723946ca0f362bc9612b32b5d7cf7" + integrity sha512-zBeYzzwg43T/Z8ZtLblv0fcKuqJULttqYDekSLILThXp3UOMSerEvruhUgwddCY1jUssfLscz8vacMKISv5X4w== dependencies: - nx "19.8.4" + nx "19.8.14" tslib "^2.3.0" -"@nrwl/workspace@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-19.8.4.tgz#3bb0f36fd412c1dd2848fead1b96a1bd8731fb00" - integrity sha512-ZdzVMuVDkD5nYRXkvBIZe6yUTcbllYanoIh38a7l3MfPqw+2cFY2Cr9uPNfH3LXpzZYgKcr4vffYWwLXeIwbjw== +"@nrwl/workspace@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nrwl/workspace/-/workspace-19.8.14.tgz#bc1e42bf8de6a7a2ce400c81035123bd4476fa24" + integrity sha512-I4eZtnHMkqnmOXVy6yN59fQopQZ+Sg0OFWwGluhKD5XPZULrlzECB8d4vblY9pcmQlN/6fat+KBrWkmKl41ZKg== dependencies: - "@nx/workspace" "19.8.4" + "@nx/workspace" "19.8.14" "@nx/devkit@19.5.7", "@nx/devkit@~19.5.7": version "19.5.7" @@ -2815,12 +2815,12 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/devkit@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-19.8.4.tgz#b814d2c41e99fee305d14895520a785ac010ecce" - integrity sha512-FPFT8gVDFRSEmU0n7nRkT4Rnqy7OMznfPXLfDZtVuzEi5Cl6ftG3UBUvCgJcJFCYJVAZAUuv6vRSRarHd51XFQ== +"@nx/devkit@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/devkit/-/devkit-19.8.14.tgz#c73cc2721ff4860a9d6891a0f5af0e7d7a8571ae" + integrity sha512-A8dCGttbuqgg9P56VTb0ElD2vM5nc5g0aLnX5PSXo4SkFXwd8DV5GgwJKWB1GO9hYyEtbj4gKek0KxnCtdav4g== dependencies: - "@nrwl/devkit" "19.8.4" + "@nrwl/devkit" "19.8.14" ejs "^3.1.7" enquirer "~2.3.6" ignore "^5.0.4" @@ -2830,15 +2830,15 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/eslint-plugin@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-19.8.4.tgz#7078c15704fb3d2c0199a591f266c2a4876ed60b" - integrity sha512-0Q/2y/FZJyRxk5SbIXP+FlIY8//3chtaQz+FuorHGs0mDBN5FtBFqBL0atWClJO+B+QByO70ue/qHEHSiNrcJw== +"@nx/eslint-plugin@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/eslint-plugin/-/eslint-plugin-19.8.14.tgz#ff4c6ffbab693eb4c8de304e1754c4e6302e8037" + integrity sha512-0wYTqP3J3mJPGilf9xCiFD8Rw7f/knCDwXmoXv1tZb/N/3oExreqVPz0wnRcQh+clDAEVlY3onvqqkSBw5K/Fg== dependencies: "@eslint/compat" "^1.1.1" - "@nrwl/eslint-plugin-nx" "19.8.4" - "@nx/devkit" "19.8.4" - "@nx/js" "19.8.4" + "@nrwl/eslint-plugin-nx" "19.8.14" + "@nx/devkit" "19.8.14" + "@nx/js" "19.8.14" "@typescript-eslint/type-utils" "^8.0.0" "@typescript-eslint/utils" "^8.0.0" chalk "^4.1.0" @@ -2848,28 +2848,28 @@ semver "^7.5.3" tslib "^2.3.0" -"@nx/eslint@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-19.8.4.tgz#8dd64afbadd4bd37352c502c950cbec250123a49" - integrity sha512-gJGtYd9ThKSM1pbV/iG/PGwtVKg1PwjAly2AjgebYmAey+hgxzwgjQy84Lf+FdkKNUQZjB0sYaKCw26oKXXYaA== +"@nx/eslint@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/eslint/-/eslint-19.8.14.tgz#55ccf21ce1a6d8bec1183880486e6272a2be7dc1" + integrity sha512-fhrCd8OZue7WcIoU4NyKLLrfolEa2TvSgaLxjDabONqZOJRG38Y7ZX92P+Y1hSEdDZ9AazzirIdsy2d1AZWvfQ== dependencies: - "@nx/devkit" "19.8.4" - "@nx/js" "19.8.4" - "@nx/linter" "19.8.4" + "@nx/devkit" "19.8.14" + "@nx/js" "19.8.14" + "@nx/linter" "19.8.14" semver "^7.5.3" tslib "^2.3.0" typescript "~5.4.2" -"@nx/jest@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-19.8.4.tgz#5599b7c5a09805934c7c23a5175ff3f11f6cb845" - integrity sha512-oAC0zLkktCduq3ZNjIqPK/gCGPxPZMiWDFKqeEpZnIqgYuQfy6wUk3aSVWGPud0kuPJGJA0G1hkxCXtCmCXMNw== +"@nx/jest@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/jest/-/jest-19.8.14.tgz#a4b7094336088706413210bc0c04ba9fa306f516" + integrity sha512-y/ce61yDu5qUP4a70OKBlCC5MOFcpS1J8HEJB1DAsF0jFb1NX8ft1B+7LjuGvSbuEmuy+a/pZwiTToUFnp0bGg== dependencies: "@jest/reporters" "^29.4.1" "@jest/test-result" "^29.4.1" - "@nrwl/jest" "19.8.4" - "@nx/devkit" "19.8.4" - "@nx/js" "19.8.4" + "@nrwl/jest" "19.8.14" + "@nx/devkit" "19.8.14" + "@nx/js" "19.8.14" "@phenomnomnominal/tsquery" "~5.0.1" chalk "^4.1.0" identity-obj-proxy "3.0.0" @@ -2882,10 +2882,10 @@ tslib "^2.3.0" yargs-parser "21.1.1" -"@nx/js@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/js/-/js-19.8.4.tgz#fdff61c22f0f97b80e1054af4a17b48294513871" - integrity sha512-rBiBi0A9NsxA5cnMcDRXllNXFJYjk+YiNP4T5e+GmqHmicjRjF+mORrhQ4zBZXvZwS2O+ZO9iBOZX41IVqzFaw== +"@nx/js@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/js/-/js-19.8.14.tgz#f7f976df4783838bed29cd0387addbe06e46f934" + integrity sha512-Nk0eEB2F/ZbBkH2iT+cgLWIittY8n5eOrA/uBBG2XMdencJZ9E2HNA/UzSGPZmD4EYVk0R1vm83k5+IMS1VAZA== dependencies: "@babel/core" "^7.23.2" "@babel/plugin-proposal-decorators" "^7.22.7" @@ -2894,9 +2894,9 @@ "@babel/preset-env" "^7.23.2" "@babel/preset-typescript" "^7.22.5" "@babel/runtime" "^7.22.6" - "@nrwl/js" "19.8.4" - "@nx/devkit" "19.8.4" - "@nx/workspace" "19.8.4" + "@nrwl/js" "19.8.14" + "@nx/devkit" "19.8.14" + "@nx/workspace" "19.8.14" babel-plugin-const-enum "^1.0.1" babel-plugin-macros "^2.8.0" babel-plugin-transform-typescript-metadata "^0.3.1" @@ -2918,97 +2918,97 @@ tsconfig-paths "^4.1.2" tslib "^2.3.0" -"@nx/linter@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-19.8.4.tgz#3836fcb7fe50e1aa70918c8c623c07f952f67be9" - integrity sha512-aK6Bic/iup5nkZDFQgBgilgtqfjuy+dT0agnE6HEdXKOIR++LJXpka5nrJ9VNNglp22DrFtBDAH/hfRpIwm8uw== +"@nx/linter@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/linter/-/linter-19.8.14.tgz#e5b032d862a2102de53ac1c7ebd953f21ead3d81" + integrity sha512-QIeEXmdvXKX6rHIiA3W77l2oB9rABH3HYP6bgNaHyx65+tZ6RvmKfVXk+GWMgTf0lfQpnGyI/M7nsa91RGxu6w== dependencies: - "@nx/eslint" "19.8.4" + "@nx/eslint" "19.8.14" -"@nx/node@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/node/-/node-19.8.4.tgz#e32d0e2268cf288b0ad2ed6562e93976fa444e57" - integrity sha512-fvyR9GmYNBV/FNHDEHBjhP/Pxh8Ol2lMapMR6B59RDqB/4aDp+WGYr8qi6w5PV0yvszQrEzxVnfNPALlHwQDKQ== +"@nx/node@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/node/-/node-19.8.14.tgz#2d1353df281cb7721fd777662d294a1b475fb98b" + integrity sha512-lg6NRmroPmouEUH6wg+w1ajGuT2IzXfhgqy8UiIgIgAj5agXxeb9aEsszksFYV3hMJuzlfxLrkm1oQjccdtzPg== dependencies: - "@nrwl/node" "19.8.4" - "@nx/devkit" "19.8.4" - "@nx/eslint" "19.8.4" - "@nx/jest" "19.8.4" - "@nx/js" "19.8.4" + "@nrwl/node" "19.8.14" + "@nx/devkit" "19.8.14" + "@nx/eslint" "19.8.14" + "@nx/jest" "19.8.14" + "@nx/js" "19.8.14" tslib "^2.3.0" -"@nx/nx-darwin-arm64@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.4.tgz#7930e44161521892901dacfadbf139bd33c346a8" - integrity sha512-mbSGt63hYcVCSQ54kpHl0lFqr5CsbkGJ4L3liWE30Da7vXZJwUBr9f+b9DnQ64IZzlu6vAhNcaiYQXa9lAk0yQ== - -"@nx/nx-darwin-x64@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.4.tgz#1f61d12c41aa6a25cd462e17a5e6b70d6a4626fc" - integrity sha512-lTcXUCXNvqHdLmrNCOyDF+u6pDx209Ew7nSR47sQPvkycIHYi0gvgk0yndFn1Swah0lP4OxWg7rzAfmOlZd6ew== - -"@nx/nx-freebsd-x64@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.4.tgz#d2450133e38531a4c2552b99aef7a3c35e6c33a5" - integrity sha512-4BUplOxPZeUwlUNfzHHMmebNVgDFW/jNX6TWRS+jINwOHnpWLkLFAXu27G80/S3OaniVCzEQklXO9b+1UsdgXw== - -"@nx/nx-linux-arm-gnueabihf@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.4.tgz#d8295447a9bbb302c54659c5aa423854c2e46805" - integrity sha512-Wahul8oz9huEm/Jv3wud5IGWdZxkGG4tdJm9i5TV5wxfUMAWbKU9v2nzZZins452UYESWvwvDkiuBPZqSto3qw== - -"@nx/nx-linux-arm64-gnu@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.4.tgz#4af1f7c24920805d0b05259c235aa25894d64c17" - integrity sha512-L0RVCZkNAtZDplLT7uJV7M9cXxq2Fxw+8ex3eb9XSp7eyLeFO21T0R6vTouJ42E/PEvGApCAcyGqtnyPNMZFfw== - -"@nx/nx-linux-arm64-musl@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.4.tgz#46c7312d9aa45f108d10f0ff8435f171b020eb10" - integrity sha512-0q8r8I8WCsY3xowDI2j109SCUSkFns/BJ40aCfRh9hhrtaIIc5qXUw2YFTjxUZNcRJXx9j9+hTe9jBkUSIGvCw== - -"@nx/nx-linux-x64-gnu@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.4.tgz#a65da197a58627c7b8210cff1be64d0cbcdab124" - integrity sha512-XcRBNe0ws7KB0PMcUlpQqzzjjxMP8VdqirBz7CfB2XQ8xKmP3370p0cDvqs/4oKDHK4PCkmvVFX60tzakutylA== - -"@nx/nx-linux-x64-musl@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.4.tgz#c2225f65ed81fb7b2bb068f8471ed34319ba94a3" - integrity sha512-JB4tAuZBCF0yqSnKF3pHXa0b7LA3ebi3Bw08QmMr//ON4aU+eXURGBuj9XvULD2prY+gpBrvf+MsG1XJAHL6Zg== - -"@nx/nx-win32-arm64-msvc@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.4.tgz#ce5975930ee33019251579f33dc58cace8976501" - integrity sha512-WvQag/pN9ofRWRDvOZxj3jvJoTetlvV1uyirnDrhupRgi+Fj67OlGGt2zVUHaXFGEa1MfCEG6Vhk6152m4KyaQ== - -"@nx/nx-win32-x64-msvc@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.4.tgz#c58a0d0f68ee10b365606abd337712b50453ae11" - integrity sha512-//JntLrN3L7WL/WgP3D0FE34caYTPcG/GIMBguC9w7YDyTlEikLgLbobjdCPz+2f9OWGvIZbJgGmtHNjnETM/g== - -"@nx/plugin@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/plugin/-/plugin-19.8.4.tgz#d321f67cfd3bc1cd5b36be16c0f0bf711910d2ee" - integrity sha512-ONukvL6/zbUA3GK4s/zR8XIK3vC4hcPPnuAJ7s99A2w8iD4V1J8ziqVgCmvqAtiwPE7tzhX9c3wIyrb/QTESEA== - dependencies: - "@nrwl/nx-plugin" "19.8.4" - "@nx/devkit" "19.8.4" - "@nx/eslint" "19.8.4" - "@nx/jest" "19.8.4" - "@nx/js" "19.8.4" +"@nx/nx-darwin-arm64@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-arm64/-/nx-darwin-arm64-19.8.14.tgz#d32b1108bfa9908ca1bad893f3d35d211b30292e" + integrity sha512-bZUFf23gAzuwVw71dR8rngye5aCR8Z/ouIo+KayjqB0LWWoi3WzO73s4S69ljftYt4n6z9wvD+Trbb1BKm2fPg== + +"@nx/nx-darwin-x64@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-darwin-x64/-/nx-darwin-x64-19.8.14.tgz#d8f5855e271f1e7b46f700cad81395014e4418f1" + integrity sha512-UXXVea8icFG/3rFwpbLYsD6O4wlyJ1STQfOdhGK1Hyuga70AUUdrjVm7HzigAQP/Sb2Nzd7155YXHzfpRPDFYA== + +"@nx/nx-freebsd-x64@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-freebsd-x64/-/nx-freebsd-x64-19.8.14.tgz#bbb8958b8a50645f17e4670f5ef41b207d469546" + integrity sha512-TK2xuXn+BI6hxGaRK1HRUPWeF/nOtezKSqM+6rbippfCzjES/crmp9l5nbI764MMthtUmykCyWvhEfkDca6kbA== + +"@nx/nx-linux-arm-gnueabihf@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-19.8.14.tgz#e222b45d25fe58ae326d68bf3e94edf8877b0a66" + integrity sha512-33rptyRraqaeQ2Kq6pcZKQqgnYY/7zcGH8fHXgKK7XzKk+7QuPViq+jMEUZP5E3UzZPkIYhsfmZcZqhNRvepJQ== + +"@nx/nx-linux-arm64-gnu@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-19.8.14.tgz#935ff45aba0d3b9ed551bbc4b7f61aa9ff286f77" + integrity sha512-2E70qMKOhh7Fp4JGcRbRLvFKq0+ANVdAgSzH47plxOLygIeVAfIXRSuQbCI0EUFa5Sy6hImLaoRSB2GdgKihAw== + +"@nx/nx-linux-arm64-musl@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-19.8.14.tgz#260fbbd011a393695d1d4507a82d6c02b2a0f15c" + integrity sha512-ltty/PDWqkYgu/6Ye65d7v5nh3D6e0n3SacoKRs2Vtfz5oHYRUkSKizKIhEVfRNuHn3d9j8ve1fdcCN4SDPUBQ== + +"@nx/nx-linux-x64-gnu@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-19.8.14.tgz#0e8f74512fb589c22b36993c095e945f3ac53a36" + integrity sha512-JzE3BuO9RCBVdgai18CCze6KUzG0AozE0TtYFxRokfSC05NU3nUhd/o62UsOl7s6Bqt/9nwrW7JC8pNDiCi9OQ== + +"@nx/nx-linux-x64-musl@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-19.8.14.tgz#ffdd7cdef97ada49f0d696b26139599e12de21c4" + integrity sha512-2rPvDOQLb7Wd6YiU88FMBiLtYco0dVXF99IJBRGAWv+WTI7MNr47OyK2ze+JOsbYY1d8aOGUvckUvCCZvZKEfg== + +"@nx/nx-win32-arm64-msvc@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-19.8.14.tgz#7fb5263e9a6aad49828e1aa3762160e10cab433f" + integrity sha512-JxW+YPS+EjhUsLw9C6wtk9pQTG3psyFwxhab8y/dgk2s4AOTLyIm0XxgcCJVvB6i4uv+s1g0QXRwp6+q3IR6hg== + +"@nx/nx-win32-x64-msvc@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-19.8.14.tgz#1eac610cf007e72ffc1551ed34e31ba266414db5" + integrity sha512-RxiPlBWPcGSf9TzIIy62iKRdRhokXMDUsPub9DL2VdVyTMXPZQR25aY/PJeasJN1EQU74hg097LK2wSHi+vzOQ== + +"@nx/plugin@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/plugin/-/plugin-19.8.14.tgz#035a7a23c5222699ffc3dc0243480d8f4c69eb80" + integrity sha512-OqjxQNciuRYBIueX6ILLtk2NNvn06ucbSnRvfSwGoXUpiqomsHg/YuBZ61npkYVNc0ZZma8kqtrKBhAhuVTdnw== + dependencies: + "@nrwl/nx-plugin" "19.8.14" + "@nx/devkit" "19.8.14" + "@nx/eslint" "19.8.14" + "@nx/jest" "19.8.14" + "@nx/js" "19.8.14" tslib "^2.3.0" -"@nx/workspace@19.8.4": - version "19.8.4" - resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-19.8.4.tgz#81591e2f73f5052efdc0f4116233635b9438bcb7" - integrity sha512-ub4nD2klOj00onF1KrNXIlLB9hXN9ybHs7XSP9YW+52qz79KaJWJm46ebTqeLnDZApYbAcB0vSCp2+kaEV24Ew== +"@nx/workspace@19.8.14": + version "19.8.14" + resolved "https://registry.yarnpkg.com/@nx/workspace/-/workspace-19.8.14.tgz#378cccacfc3e7a5a3062427556ba2b2da4959bea" + integrity sha512-Yb3d5WVjCyLill8MycKU+P/kbTyatKKqoUCu5zWokkysABiMWRLlrCYNzqwjTjeIIGj9MMGRHAQEemkBdL4tdg== dependencies: - "@nrwl/workspace" "19.8.4" - "@nx/devkit" "19.8.4" + "@nrwl/workspace" "19.8.14" + "@nx/devkit" "19.8.14" chalk "^4.1.0" enquirer "~2.3.6" - nx "19.8.4" + nx "19.8.14" tslib "^2.3.0" yargs-parser "21.1.1" @@ -7817,7 +7817,7 @@ browserslist@^4.16.1, browserslist@^4.21.10, browserslist@^4.23.0, browserslist@ node-releases "^2.0.14" update-browserslist-db "^1.1.0" -bs-logger@0.x: +bs-logger@^0.2.6: version "0.2.6" resolved "https://registry.yarnpkg.com/bs-logger/-/bs-logger-0.2.6.tgz#eb7d365307a72cf974cc6cda76b68354ad336bd8" integrity sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog== @@ -10367,7 +10367,7 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -ejs@3.1.10, ejs@^3.1.7, ejs@^3.1.8: +ejs@3.1.10, ejs@^3.1.10, ejs@^3.1.7, ejs@^3.1.8: version "3.1.10" resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.10.tgz#69ab8358b14e896f80cc39e62087b88500c3ac3b" integrity sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA== @@ -16184,7 +16184,7 @@ lodash.mapvalues@^4.6.0: resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= -lodash.memoize@4.x, lodash.memoize@^4.1.2: +lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4= @@ -16440,10 +16440,10 @@ make-dir@^3.0.0, make-dir@^3.0.2: dependencies: semver "^6.0.0" -make-error@1.x, make-error@^1.1.1: - version "1.3.5" - resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.5.tgz#efe4e81f6db28cadd605c70f29c831b58ef776c8" - integrity sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g== +make-error@^1.1.1, make-error@^1.3.6: + version "1.3.6" + resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" + integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== make-iterator@^1.0.0: version "1.0.1" @@ -17916,13 +17916,13 @@ nwsapi@^2.2.2: resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.5.tgz#a52744c61b3889dd44b0a158687add39b8d935e2" integrity sha512-6xpotnECFy/og7tKSBVmUNft7J3jyXAka4XvG6AUhFWRz+Q/Ljus7znJAA3bxColfQLdS+XsjoodtJfCgeTEFQ== -nx@19.8.4: - version "19.8.4" - resolved "https://registry.yarnpkg.com/nx/-/nx-19.8.4.tgz#6bd7b9d8150f2f8cd263cb3792288f39e04111a0" - integrity sha512-fc833c3UKo6kuoG4z0kSKet17yWym3VzcQ+yPWYspxxxd8GFVVk42+9wieyVQDi9YqtKZQ6PdQfSEPm59/M7SA== +nx@19.8.14: + version "19.8.14" + resolved "https://registry.yarnpkg.com/nx/-/nx-19.8.14.tgz#248f093ca90426690833180bfeb1ce3436a8f4bb" + integrity sha512-yprBOWV16eQntz5h5SShYHMVeN50fUb6yHfzsqNiFneCJeyVjyJ585m+2TuVbE11vT1amU0xCjHcSGfJBBnm8g== dependencies: "@napi-rs/wasm-runtime" "0.2.4" - "@nrwl/tao" "19.8.4" + "@nrwl/tao" "19.8.14" "@yarnpkg/lockfile" "^1.1.0" "@yarnpkg/parsers" "3.0.0-rc.46" "@zkochan/js-yaml" "0.0.7" @@ -17956,16 +17956,16 @@ nx@19.8.4: yargs "^17.6.2" yargs-parser "21.1.1" optionalDependencies: - "@nx/nx-darwin-arm64" "19.8.4" - "@nx/nx-darwin-x64" "19.8.4" - "@nx/nx-freebsd-x64" "19.8.4" - "@nx/nx-linux-arm-gnueabihf" "19.8.4" - "@nx/nx-linux-arm64-gnu" "19.8.4" - "@nx/nx-linux-arm64-musl" "19.8.4" - "@nx/nx-linux-x64-gnu" "19.8.4" - "@nx/nx-linux-x64-musl" "19.8.4" - "@nx/nx-win32-arm64-msvc" "19.8.4" - "@nx/nx-win32-x64-msvc" "19.8.4" + "@nx/nx-darwin-arm64" "19.8.14" + "@nx/nx-darwin-x64" "19.8.14" + "@nx/nx-freebsd-x64" "19.8.14" + "@nx/nx-linux-arm-gnueabihf" "19.8.14" + "@nx/nx-linux-arm64-gnu" "19.8.14" + "@nx/nx-linux-arm64-musl" "19.8.14" + "@nx/nx-linux-x64-gnu" "19.8.14" + "@nx/nx-linux-x64-musl" "19.8.14" + "@nx/nx-win32-arm64-msvc" "19.8.14" + "@nx/nx-win32-x64-msvc" "19.8.14" nypm@^0.3.8: version "0.3.9" @@ -21044,7 +21044,7 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2: +semver@^7.0.0, semver@^7.1.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.2, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -22732,19 +22732,20 @@ ts-invariant@^0.10.3: dependencies: tslib "^2.1.0" -ts-jest@29.1.1: - version "29.1.1" - resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.1.1.tgz#f58fe62c63caf7bfcc5cc6472082f79180f0815b" - integrity sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA== +ts-jest@29.2.5: + version "29.2.5" + resolved "https://registry.yarnpkg.com/ts-jest/-/ts-jest-29.2.5.tgz#591a3c108e1f5ebd013d3152142cb5472b399d63" + integrity sha512-KD8zB2aAZrcKIdGk4OwpJggeLcH1FgrICqDSROWqlnJXGCXK4Mn6FcdK2B6670Xr73lHMG1kHw8R87A0ecZ+vA== dependencies: - bs-logger "0.x" - fast-json-stable-stringify "2.x" + bs-logger "^0.2.6" + ejs "^3.1.10" + fast-json-stable-stringify "^2.1.0" jest-util "^29.0.0" json5 "^2.2.3" - lodash.memoize "4.x" - make-error "1.x" - semver "^7.5.3" - yargs-parser "^21.0.1" + lodash.memoize "^4.1.2" + make-error "^1.3.6" + semver "^7.6.3" + yargs-parser "^21.1.1" ts-loader@9.4.2: version "9.4.2" @@ -24411,7 +24412,7 @@ yargs-parser@13.1.2, yargs-parser@^13.1.0, yargs-parser@^13.1.2: camelcase "^5.0.0" decamelize "^1.2.0" -yargs-parser@21.1.1, yargs-parser@^21.0.0, yargs-parser@^21.0.1, yargs-parser@^21.1.1: +yargs-parser@21.1.1, yargs-parser@^21.0.0, yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== From 688e9ca686e4c7f92919d0f722beb9bf20aebb42 Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Wed, 15 Jan 2025 13:58:39 +0100 Subject: [PATCH 44/78] ci(gha): limit privileged vrt workflow trigger branch base (#33627) --- .github/workflows/pr-vrt-comment.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/pr-vrt-comment.yml b/.github/workflows/pr-vrt-comment.yml index 39f8960881ce12..cea6491dd5114c 100644 --- a/.github/workflows/pr-vrt-comment.yml +++ b/.github/workflows/pr-vrt-comment.yml @@ -4,6 +4,10 @@ on: workflows: ['VRT CI'] types: - completed + branches: + - master + # remove following once CRT testing is done + - vrt-gha-testing concurrency: # see https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-only-cancel-in-progress-jobs-or-runs-for-the-current-workflow From 087380a45deea085c92d7d557ac841cad5c99b4b Mon Sep 17 00:00:00 2001 From: Valentyna <vkozlova@microsoft.com> Date: Wed, 15 Jan 2025 05:28:32 -0800 Subject: [PATCH 45/78] docs(react-color-picker): Added aria attributes to the stories (#33605) --- .../src/ColorPicker/ColorAndSwatchPicker.stories.tsx | 6 +++--- .../stories/src/ColorPicker/ColorAreaDefault.stories.tsx | 8 ++++++-- .../src/ColorPicker/ColorPickerDefault.stories.tsx | 6 ++++-- .../stories/src/ColorPicker/ColorPickerPopup.stories.tsx | 6 +++--- .../stories/src/ColorPicker/ColorPickerShape.stories.tsx | 6 +++--- 5 files changed, 19 insertions(+), 13 deletions(-) diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAndSwatchPicker.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAndSwatchPicker.stories.tsx index 6a8a4daf86014b..8d883d2f3661e7 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAndSwatchPicker.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAndSwatchPicker.stories.tsx @@ -98,11 +98,11 @@ export const ColorAndSwatchPickerExample = () => { return ( <div className={styles.example}> <ColorPicker color={color} onColorChange={handleChange}> - <ColorArea /> + <ColorArea inputX={{ 'aria-label': 'Saturation' }} inputY={{ 'aria-label': 'Brightness' }} /> <div className={styles.row}> <div className={styles.sliders}> - <ColorSlider /> - <AlphaSlider /> + <ColorSlider aria-label="Hue" /> + <AlphaSlider aria-label="Alpha" /> </div> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toRgbString() }} /> </div> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx index c991d299a6d45e..121943a471ee61 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorAreaDefault.stories.tsx @@ -38,14 +38,18 @@ export const ColorAreaExample = () => { }; const resetSlider = () => setColor(DEFAULT_COLOR_HSV); const ariaAttributes = { - 'aria-label': 'ColorPicker', 'aria-roledescription': '2D slider', 'aria-valuetext': `Saturation ${color.s * 100}, Brightness: ${color.v * 100}, ${namedColor}`, }; return ( <div className={styles.example}> - <ColorArea color={color} onChange={onChange} inputX={ariaAttributes} inputY={ariaAttributes} /> + <ColorArea + color={color} + onChange={onChange} + inputX={{ 'aria-label': 'Saturation', ...ariaAttributes }} + inputY={{ 'aria-label': 'Brightness', ...ariaAttributes }} + /> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(color).toHexString() }} /> <Button onClick={resetSlider}>Reset</Button> </div> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx index 97a1dd81ccfb21..f329dbf2bd9a68 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerDefault.stories.tsx @@ -120,7 +120,6 @@ export const Default = () => { ); const colorAriaAttributes = { - 'aria-label': 'ColorPicker', 'aria-roledescription': '2D slider', 'aria-valuetext': `Saturation ${color.s * 100}, Brightness: ${color.v * 100}, ${namedColor}`, }; @@ -128,7 +127,10 @@ export const Default = () => { return ( <div className={styles.example}> <ColorPicker color={color} onColorChange={handleChange}> - <ColorArea inputX={colorAriaAttributes} inputY={colorAriaAttributes} /> + <ColorArea + inputX={{ 'aria-label': 'Saturation', ...colorAriaAttributes }} + inputY={{ 'aria-label': 'Brightness', ...colorAriaAttributes }} + /> <ColorSlider aria-label="Hue" aria-valuetext={`${color.h}°, ${namedColor}`} /> <AlphaSlider aria-label="Alpha" aria-valuetext={`${color.a * 100}%`} /> </ColorPicker> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerPopup.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerPopup.stories.tsx index bfc248fa6032f3..54c783638ba87e 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerPopup.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerPopup.stories.tsx @@ -58,11 +58,11 @@ export const ColorPickerPopup = () => { <PopoverSurface> <ColorPicker color={previewColor} onColorChange={handleChange}> - <ColorArea /> + <ColorArea inputX={{ 'aria-label': 'Saturation' }} inputY={{ 'aria-label': 'Brightness' }} /> <div className={styles.row}> <div className={styles.sliders}> - <ColorSlider /> - <AlphaSlider /> + <ColorSlider aria-label="Hue" /> + <AlphaSlider aria-label="Alpha" /> </div> <div className={styles.previewColor} style={{ backgroundColor: tinycolor(previewColor).toRgbString() }} /> </div> diff --git a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerShape.stories.tsx b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerShape.stories.tsx index ce1b4ab0ca56c6..048d8862fa5297 100644 --- a/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerShape.stories.tsx +++ b/packages/react-components/react-color-picker-preview/stories/src/ColorPicker/ColorPickerShape.stories.tsx @@ -39,9 +39,9 @@ export const ColorPickerShape = () => { <div className={styles.example}> <h3>Rounded (default)</h3> <ColorPicker color={color} onColorChange={handleChange}> - <ColorArea /> - <ColorSlider /> - <AlphaSlider /> + <ColorSlider aria-label="Hue" /> + <AlphaSlider aria-label="Alpha" /> + <ColorArea inputX={{ 'aria-label': 'Saturation' }} inputY={{ 'aria-label': 'Brightness' }} /> </ColorPicker> <h3>Square (default)</h3> <ColorPicker shape="square" color={color} onColorChange={handleChange}> From 928fdced4834242a829327af1db00f51f9dbd382 Mon Sep 17 00:00:00 2001 From: Victor Genaev <vgenaev@gmail.com> Date: Wed, 15 Jan 2025 17:54:23 +0100 Subject: [PATCH 46/78] fix(react-link): support Enter and Space keys interaction, if rendered as span (#33587) --- ...-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json | 7 +++ .../library/src/components/Link/Link.test.tsx | 59 +++++++++++++++++++ .../src/components/Link/useLinkState.ts | 9 ++- .../stories/src/Link/LinkAsSpan.stories.tsx | 2 +- 4 files changed, 75 insertions(+), 2 deletions(-) create mode 100644 change/@fluentui-react-link-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json diff --git a/change/@fluentui-react-link-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json b/change/@fluentui-react-link-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json new file mode 100644 index 00000000000000..c77906f88a7d1f --- /dev/null +++ b/change/@fluentui-react-link-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: support Enter and Space interaction, if rendered as span", + "packageName": "@fluentui/react-link", + "email": "vgenaev@gmail.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-link/library/src/components/Link/Link.test.tsx b/packages/react-components/react-link/library/src/components/Link/Link.test.tsx index 57ab9a049db1df..44bd49f27fea89 100644 --- a/packages/react-components/react-link/library/src/components/Link/Link.test.tsx +++ b/packages/react-components/react-link/library/src/components/Link/Link.test.tsx @@ -1,9 +1,11 @@ import * as React from 'react'; import { render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { linkBehaviorDefinition, validateBehavior, ComponentTestFacade } from '@fluentui/a11y-testing'; import { isConformant } from '../../testing/isConformant'; import { Link } from './Link'; import { LinkProps } from './Link.types'; +import { Enter } from '@fluentui/keyboard-keys'; describe('Link', () => { isConformant<LinkProps>({ @@ -140,5 +142,62 @@ describe('Link', () => { expect(result.queryAllByRole('link')).toHaveLength(0); expect(result.queryAllByRole('presentation')).toHaveLength(1); }); + + describe('when rendered as span', () => { + it('should call onClick by pressing Enter', () => { + const onClick = jest.fn(); + + render( + <Link as="span" onClick={onClick}> + This is a buttonlink + </Link>, + ); + + userEvent.tab(); + userEvent.keyboard('{Enter}'); + + expect(onClick).toHaveBeenCalledTimes(1); + }); + + it('should trigger onClick once via onKeyDown', () => { + const onClick = jest.fn(); + + render( + <Link + as="span" + onClick={onClick} + onKeyDown={ev => { + if (ev.key === Enter) { + ev.currentTarget.click(); + } + }} + > + This is a buttonlink + </Link>, + ); + + userEvent.tab(); + userEvent.keyboard('{Enter}'); + + expect(onClick).toHaveBeenCalledTimes(1); + }); + + it('should not trigger onClick', () => { + const onClick = jest.fn(); + const onKeyDown = jest.fn(); + + render( + <Link as="span" onClick={onClick} onKeyDown={onKeyDown}> + This is a buttonlink + </Link>, + ); + + userEvent.tab(); + userEvent.keyboard('{Enter}'); + + expect(onClick).toHaveBeenCalledTimes(0); + expect(onKeyDown).toHaveBeenCalledTimes(1); + }); + }); }); }); diff --git a/packages/react-components/react-link/library/src/components/Link/useLinkState.ts b/packages/react-components/react-link/library/src/components/Link/useLinkState.ts index c8655ea6b95b85..b7ef6679ab9c32 100644 --- a/packages/react-components/react-link/library/src/components/Link/useLinkState.ts +++ b/packages/react-components/react-link/library/src/components/Link/useLinkState.ts @@ -36,11 +36,18 @@ export const useLinkState_unstable = (state: LinkState): LinkState => { // Disallow keydown event when component is disabled and eat events when disabledFocusable is set to true. state.root.onKeyDown = (ev: React.KeyboardEvent<HTMLAnchorElement & HTMLButtonElement>) => { - if ((disabled || disabledFocusable) && (ev.key === Enter || ev.key === Space)) { + const keyPressed = ev.key === Enter || ev.key === Space; + + if ((disabled || disabledFocusable) && keyPressed) { ev.preventDefault(); ev.stopPropagation(); } else { onKeyDown?.(ev); + // if there is already onKeyDown provided - respect it + if (state.root.as === 'span' && !!state.root.onClick && !onKeyDown && keyPressed) { + ev.preventDefault(); + ev.currentTarget.click(); + } } }; diff --git a/packages/react-components/react-link/stories/src/Link/LinkAsSpan.stories.tsx b/packages/react-components/react-link/stories/src/Link/LinkAsSpan.stories.tsx index a2a421e9f796e8..2c178fe605f436 100644 --- a/packages/react-components/react-link/stories/src/Link/LinkAsSpan.stories.tsx +++ b/packages/react-components/react-link/stories/src/Link/LinkAsSpan.stories.tsx @@ -8,7 +8,7 @@ const useDivWithWidthClassName = makeResetStyles({ export const AsSpan = () => ( <div className={useDivWithWidthClassName()}> The following link renders as a span.{' '} - <Link as="span" inline> + <Link as="span" inline onClick={() => alert('Link rendered as span')}> Links that render as a span wrap correctly between lines when their content is very long </Link> . This is because they behave as regular inline elements. From 78a2b344195233e31ae75ed609eaaafc44438ca5 Mon Sep 17 00:00:00 2001 From: v-baambati <132879294+v-baambati@users.noreply.github.com> Date: Thu, 16 Jan 2025 13:14:26 +0530 Subject: [PATCH 47/78] Added unit test cases to PlotlySchemaAdapter file (#33552) --- .../DeclarativeChartRTL.test.tsx | 22 +- .../PlotlySchemaAdapterUT.test.tsx | 347 ++ .../DeclarativeChartRTL.test.tsx.snap | 436 +- .../PlotlySchemaAdapterUT.test.tsx.snap | 4934 +++++++++++++++++ .../fluent_groupedverticalbarchart_test.json | 95 + .../tests/schema/fluent_nesteddata_test.json | 23 + .../fluent_verticalstackedbarchart_test.json | 75 + 7 files changed, 5796 insertions(+), 136 deletions(-) create mode 100644 packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapterUT.test.tsx create mode 100644 packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap create mode 100644 packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_groupedverticalbarchart_test.json create mode 100644 packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_nesteddata_test.json create mode 100644 packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_verticalstackedbarchart_test.json diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChartRTL.test.tsx b/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChartRTL.test.tsx index f796516f504e44..d9f0b23cb8efd7 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChartRTL.test.tsx +++ b/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChartRTL.test.tsx @@ -30,7 +30,7 @@ describe('DeclarativeChart', () => { expect(container).toMatchSnapshot(); }); - test.skip('Should render gaugechart in DeclarativeChart', () => { + test('Should render gaugechart in DeclarativeChart', () => { // Arrange const plotlySchema = require('./tests/schema/fluent_gauge_test.json'); const { container } = render(<DeclarativeChart key={'gaugechart'} chartSchema={{ plotlySchema }} />); @@ -51,24 +51,38 @@ describe('DeclarativeChart', () => { expect(container).toMatchSnapshot(); }); - test.skip('Should render piechart in DeclarativeChart', () => { + test('Should render piechart in DeclarativeChart', () => { // Arrange const plotlySchema = require('./tests/schema/fluent_pie_test.json'); const { container } = render(<DeclarativeChart key={'piechart'} chartSchema={{ plotlySchema }} />); expect(container).toMatchSnapshot(); }); - test.skip('Should render sankeychart in DeclarativeChart', () => { + test('Should render sankeychart in DeclarativeChart', () => { // Arrange const plotlySchema = require('./tests/schema/fluent_sankey_test.json'); const { container } = render(<DeclarativeChart key={'sankeychart'} chartSchema={{ plotlySchema }} />); expect(container).toMatchSnapshot(); }); - test('Should render verticalbarchart in DeclarativeChart', () => { + test.skip('Should render verticalbarchart in DeclarativeChart', () => { // Arrange const plotlySchema = require('./tests/schema/fluent_verticalbar_test.json'); const { container } = render(<DeclarativeChart key={'verticalbarchart'} chartSchema={{ plotlySchema }} />); expect(container).toMatchSnapshot(); }); + + test.skip('Should render histogram chart in DeclarativeChart', () => { + // Arrange + const plotlySchema = require('./tests/schema/fluent_verticalbar_histogram_test.json'); + const { container } = render(<DeclarativeChart key={'histogram'} chartSchema={{ plotlySchema }} />); + expect(container).toMatchSnapshot(); + }); + + test.skip('Should render horizontalbar chart in DeclarativeChart', () => { + // Arrange + const plotlySchema = require('./tests/schema/fluent_horizontalbar_test.json'); + const { container } = render(<DeclarativeChart key={'histogram'} chartSchema={{ plotlySchema }} />); + expect(container).toMatchSnapshot(); + }); }); diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapterUT.test.tsx b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapterUT.test.tsx new file mode 100644 index 00000000000000..174ca2d90161bd --- /dev/null +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapterUT.test.tsx @@ -0,0 +1,347 @@ +import { + isDateArray, + isNumberArray, + isMonthArray, + updateXValues, + getColor, + transformPlotlyJsonToDonutProps, + transformPlotlyJsonToVSBCProps, + transformPlotlyJsonToGVBCProps, + transformPlotlyJsonToVBCProps, + transformPlotlyJsonToScatterChartProps, + transformPlotlyJsonToHorizontalBarWithAxisProps, + transformPlotlyJsonToHeatmapProps, + transformPlotlyJsonToSankeyProps, + transformPlotlyJsonToGaugeProps, + sanitizeJson, +} from './PlotlySchemaAdapter'; + +const date = new Date(); +const colorMap = new Map<string, string>(); + +describe('isDate', () => { + test('Should return true when input array contains Date objects', () => { + const nextDay = new Date(date); + nextDay.setDate(date.getDate() + 1); + expect(isDateArray([date, nextDay])).toBe(true); + }); + + test('Should return false when input array contains numeric data', () => { + expect(isDateArray([20, 30, 40])).toBe(false); + }); + + test('Should return false when input array contains string data', () => { + expect(isDateArray(['twenty', 'thirty', 'forty'])).toBe(false); + }); + + test('Should return false when input array contains different data type objects', () => { + expect(isDateArray(['twenty', 20, date])).toBe(false); + }); + + test('Should return true when input array contains string date objects which contains month in short format', () => { + expect(isDateArray(['20 Jan 2025', '10 Feb 2025'])).toBe(true); + }); + + test('Should return true when input array contains string date objects', () => { + expect(isDateArray(['20 January 2025', '10 February 2025'])).toBe(true); + }); + + test('Should return true when input array contains date in different data types and formats', () => { + expect(isDateArray([date, '10 February 2025', '10 Feb 2025'])).toBe(true); + }); + + test('Should return true when input array contains date in DD/MM/YYYY format(string)', () => { + expect(isDateArray(['10/11/2025', '10/10/2025'])).toBe(true); + }); + + test('Should return false when input array contains date in DD/MM/YYYY format with invalid date objects', () => { + expect(isDateArray(['14/14/2025', '10/14/2025'])).toBe(false); + }); + + test('Should return true when input array contains date in MM/DD/YYYY format', () => { + expect(isDateArray(['12/1/2025', '12/11/2025'])).toBe(true); + }); + + test.skip('Should return true when input array contains date in simple date Object format', () => { + expect(isDateArray([11 / 2 / 2025, 10 / 2 / 2025])).toBe(true); + }); + + test.skip('Should return false when input array is empty', () => { + expect(isDateArray([])).toBe(false); + }); + + test('Should return false when input array contains only month(MMM)', () => { + expect(isDateArray(['January', 'February'])).toBe(false); + }); + + test('Should return false when input array contains only month(MM)', () => { + expect(isDateArray(['Jan', 'Feb'])).toBe(false); + }); +}); + +describe('isNumberArray', () => { + test('Should return false when input array contains Date objects', () => { + expect(isNumberArray([date, date.getDate() + 1, date.getDate() + 2])).toBe(false); + }); + + test('Should return true when input array contains numeric data', () => { + expect(isNumberArray([20, 30, 40])).toBe(true); + }); + + test('Should return true when input array contains numaric data in string formatt', () => { + expect(isNumberArray(['20', '30', '40'])).toBe(true); + }); + + test('Should return false when input array contains string data', () => { + expect(isNumberArray(['twenty', 'thirty', 'forty'])).toBe(false); + }); +}); + +describe('isMonthArray', () => { + test('Should return false when input array contains Date objects', () => { + expect(isMonthArray([date, date.getDate() + 1, date.getDate() + 2])).toBe(false); + }); + + test('Should return true when input array contains months data', () => { + expect(isMonthArray([10, 11, 1])).toBe(true); + }); + + test('Should return false when input array contains numeric data(apart from months 1 to 12)', () => { + expect(isMonthArray([20, 30, 40])).toBe(false); + }); + + test('Should return false when input array contains numaric data in string formatt', () => { + expect(isMonthArray(['20', '30', '40'])).toBe(false); + }); + + test('Should return false when input array contains numbers in string data', () => { + expect(isMonthArray(['One', 'Two', 'Three'])).toBe(false); + }); + + test('Should return true when input array contains only months in string formatt(MMM)', () => { + expect(isMonthArray(['January', 'February'])).toBe(true); + }); + + test('Should return true when input array contains only months in string formatt(MM)', () => { + expect(isMonthArray(['Jan', 'Feb'])).toBe(true); + }); + + test('Should return false when input array is empty', () => { + expect(isMonthArray([])).toBe(false); + }); + + test.skip('Should return true when input array contains only months in string formatt(MMM) in spanish', () => { + expect(isMonthArray(['Enero', 'Febrero'])).toBe(true); + }); + + test.skip('Should return true when input array contains only months in string formatt(MM) in spanish', () => { + expect(isMonthArray(['Ene', 'Feb'])).toBe(true); + }); + + test.skip('Should return true when input array contains only months in string format(MMM) in italian', () => { + expect(isMonthArray(['Gennaio', 'Febbraio'])).toBe(true); + }); +}); + +describe('updateXValues', () => { + test('Should return dates array when input array contains months data', () => { + expect(updateXValues([10, 11, 1])).toStrictEqual(['10 01, 2024', '11 01, 2024', '1 01, 2025']); + }); + + test('Should return error when input array contains invalid months', () => { + try { + expect(updateXValues([10, 11, 16])).toStrictEqual([]); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of null (reading 'getMonth')")); + } + }); + + test('Should return dates array when input array contains months data in MMM format', () => { + expect(updateXValues(['January', 'February'])).toStrictEqual(['January 01, 2025', 'February 01, 2025']); + }); + + test('Should return dates array when input array contains months data in MM format', () => { + expect(updateXValues(['Jan', 'Feb'])).toStrictEqual(['Jan 01, 2025', 'Feb 01, 2025']); + }); + + test('Should return dates array when input array is empty', () => { + expect(updateXValues([])).toStrictEqual([]); + }); +}); + +describe('getColor', () => { + test('Should return color code when we had legend title', () => { + expect(getColor('test', { current: colorMap }, true)).toBe('#e3008c'); + }); + + test('Should return color code when we had legend title', () => { + expect(getColor('test', { current: colorMap }, false)).toBe('#e3008c'); + }); + + test('Should return color code when we had legend title is empty', () => { + expect(getColor('', { current: colorMap }, false)).toBe('#2aa0a4'); + }); +}); + +describe('transform Plotly Json To chart Props', () => { + test('transformPlotlyJsonToDonutProps - Should return donut chart props', () => { + const plotlySchema = require('./tests/schema/fluent_donut_test.json'); + expect(transformPlotlyJsonToDonutProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToDonutProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect(transformPlotlyJsonToDonutProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading '0')")); + } + }); + + test('transformPlotlyJsonToDonutProps - Should return pie chart props', () => { + const plotlySchema = require('./tests/schema/fluent_pie_test.json'); + expect(transformPlotlyJsonToDonutProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToVSBCProps - Should return VSBC props', () => { + const plotlySchema = require('./tests/schema/fluent_verticalstackedbarchart_test.json'); + expect(transformPlotlyJsonToVSBCProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToVSBCProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect(transformPlotlyJsonToVSBCProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading 'forEach')")); + } + }); + + test('transformPlotlyJsonToGVBCProps - Should return GVBC props', () => { + const plotlySchema = require('./tests/schema/fluent_groupedverticalbarchart_test.json'); + expect(transformPlotlyJsonToGVBCProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToGVBCProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect(transformPlotlyJsonToGVBCProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading 'forEach')")); + } + }); + + test('transformPlotlyJsonToVBCProps - Should return VBC props', () => { + const plotlySchema = require('./tests/schema/fluent_verticalbar_histogram_test.json'); + expect(transformPlotlyJsonToVBCProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToVBCProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect(transformPlotlyJsonToVBCProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading 'forEach')")); + } + }); + + test('transformPlotlyJsonToScatterChartProps - Should return line chart props', () => { + const plotlySchema = require('./tests/schema/fluent_line_test.json'); + expect(transformPlotlyJsonToScatterChartProps(plotlySchema, true, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToScatterChartProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect(transformPlotlyJsonToScatterChartProps(plotlySchema, true, { current: colorMap }, true)).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading 'map')")); + } + }); + + test('transformPlotlyJsonToScatterChartProps - Should return area chart props', () => { + const plotlySchema = require('./tests/schema/fluent_area_test.json'); + expect(transformPlotlyJsonToScatterChartProps(plotlySchema, true, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToHorizontalBarWithAxisProps - Should return HBC with axis chart props', () => { + const plotlySchema = require('./tests/schema/fluent_horizontalbar_test.json'); + expect( + transformPlotlyJsonToHorizontalBarWithAxisProps(plotlySchema, { current: colorMap }, true), + ).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToHorizontalBarWithAxisProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect( + transformPlotlyJsonToHorizontalBarWithAxisProps(plotlySchema, { current: colorMap }, true), + ).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading 'map')")); + } + }); + + test('transformPlotlyJsonToHeatmapProps - Should return heatmap chart props', () => { + const plotlySchema = require('./tests/schema/fluent_heatmap_test.json'); + expect(transformPlotlyJsonToHeatmapProps(plotlySchema)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToHeatmapProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect(transformPlotlyJsonToHeatmapProps(plotlySchema)).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading '0')")); + } + }); + + test('transformPlotlyJsonToSankeyProps - Should return sankey chart props', () => { + const plotlySchema = require('./tests/schema/fluent_sankey_test.json'); + expect(transformPlotlyJsonToSankeyProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToSankeyProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect(transformPlotlyJsonToSankeyProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading '0')")); + } + }); + + test('transformPlotlyJsonToGaugeProps - Should return gauge chart props', () => { + const plotlySchema = require('./tests/schema/fluent_gauge_test.json'); + expect(transformPlotlyJsonToGaugeProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + }); + + test('transformPlotlyJsonToGaugeProps - Should throw an error when we pass invalid data', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + expect(transformPlotlyJsonToGaugeProps(plotlySchema, { current: colorMap }, true)).toMatchSnapshot(); + } catch (e) { + expect(e).toStrictEqual(TypeError("Cannot read properties of undefined (reading '0')")); + } + }); +}); + +describe('sanitizeJson', () => { + test('Should return json object when depth inside the range', () => { + const plotlySchema = require('./tests/schema/fluent_gauge_test.json'); + expect(sanitizeJson(plotlySchema)).toMatchSnapshot(); + }); + + test('Should return empty json object when input schema is empty', () => { + const plotlySchema = {}; + expect(sanitizeJson(plotlySchema)).toStrictEqual({}); + }); + + test('Should return error when input schema has depth more than max limit', () => { + const plotlySchema = require('./tests/schema/fluent_nesteddata_test.json'); + try { + sanitizeJson(plotlySchema); + } catch (e) { + expect(e).toStrictEqual(Error('Maximum json depth exceeded')); + } + }); +}); diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap index 2518fa0e844b78..a4e8dfbfe3165e 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap @@ -4043,7 +4043,7 @@ exports[`DeclarativeChart Should render gaugechart in DeclarativeChart 1`] = ` data-tabster="{\\"uncontrolled\\": {}}" > <svg - aria-label="Speed. Gauge chart with 3 segments. " + aria-label="Gauge chart with 3 segments. " class= { @@ -4057,20 +4057,7 @@ exports[`DeclarativeChart Should render gaugechart in DeclarativeChart 1`] = ` <g transform="translate(250, 340)" > - <text - aria-hidden="true" - class= - - { - fill: #323130; - font-size: 12px; - } - text-anchor="middle" - x="0" - y="-205" - > - Speed - </text> + <text aria-label="Min value: 0" class= @@ -24382,6 +24369,7 @@ exports[`DeclarativeChart Should render piechart in DeclarativeChart 1`] = ` > <div> <svg + aria-label="" class= { @@ -24550,6 +24538,7 @@ exports[`DeclarativeChart Should render piechart in DeclarativeChart 1`] = ` 500 </text> </g> + </g> </svg> </div> @@ -25048,7 +25037,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` { overflow: auto; } - data-focuszone-id="FocusZone33" + data-focuszone-id="FocusZone36" data-tabster="{\\"uncontrolled\\": {}}" > <svg @@ -25068,14 +25057,14 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` } > <g - id="nodeGElement35" + id="nodeGElement38" > <rect - aria-label="node Leave+No – 16 with weight 16" + aria-label="node Remain+No – 28 with weight 28" data-is-focusable="true" - fill="#2aa0a4" - height="79.99999999999994" - id="nodeBar34" + fill="#e3008c" + height="99.37254901960782" + id="nodeBar37" opacity="1" role="img" stroke="#757575" @@ -25108,12 +25097,12 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` fill="#FFFFFF" font-size="10" font-weight="regular" - id="nodeBar34-name" + id="nodeBar37-name" text-anchor="start" x="48" y="36" > - Leave+No – 16 + Remain+No – 28 </text> </g> <text @@ -25126,6 +25115,81 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` text-anchor="start" x="48" y="36" + > + 28 + </text> + </g> + </g> + </g> + <g + class= + + { + fill: #F5F5F5; + } + @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& { + fill: #000000; + } + > + <g + id="nodeGElement40" + > + <rect + aria-label="node Leave+No – 16 with weight 16" + data-is-focusable="true" + fill="#2aa0a4" + height="56.78431372549022" + id="nodeBar39" + opacity="1" + role="img" + stroke="#757575" + stroke-width="2" + tabindex="-1" + width="124" + x="48" + y="143.37254901960782" + /> + <g + class= + + { + margin-bottom: 4px; + margin-left: 8px; + margin-right: 8px; + margin-top: 4px; + } + @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& text { + fill: rgb(179, 179, 179); + } + > + <g + class="nodeName" + > + <text + aria-hidden="true" + dx="0.4em" + dy="1.2em" + fill="#FFFFFF" + font-size="10" + font-weight="regular" + id="nodeBar39-name" + text-anchor="start" + x="48" + y="143.37254901960782" + > + Leave+No – 16 + </text> + </g> + <text + aria-hidden="true" + dx="0.4em" + dy="2em" + fill="#FFFFFF" + font-size="14" + font-weight="bold" + text-anchor="start" + x="48" + y="143.37254901960782" > 16 </text> @@ -25143,14 +25207,14 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` } > <g - id="nodeGElement37" + id="nodeGElement42" > <rect aria-label="node Remain+Yes – 21 with weight 22" data-is-focusable="true" fill="#9373c0" - height="110" - id="nodeBar36" + height="78.07843137254915" + id="nodeBar41" opacity="1" role="img" stroke="#757575" @@ -25158,7 +25222,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` tabindex="-1" width="124" x="48" - y="123.99999999999994" + y="208.15686274509804" /> <g class= @@ -25183,10 +25247,10 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` fill="#FFFFFF" font-size="10" font-weight="regular" - id="nodeBar36-name" + id="nodeBar41-name" text-anchor="start" x="48" - y="123.99999999999994" + y="208.15686274509804" > Remain+Yes – 21 </text> @@ -25200,7 +25264,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` font-weight="bold" text-anchor="start" x="48" - y="123.99999999999994" + y="208.15686274509804" > 22 </text> @@ -25218,14 +25282,14 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` } > <g - id="nodeGElement39" + id="nodeGElement44" > <rect aria-label="node Leave+Yes – 14 with weight 14" data-is-focusable="true" fill="#13a10e" - height="70.00000000000011" - id="nodeBar38" + height="49.686274509803866" + id="nodeBar43" opacity="1" role="img" stroke="#757575" @@ -25233,7 +25297,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` tabindex="-1" width="124" x="48" - y="241.99999999999994" + y="294.2352941176472" /> <g class= @@ -25258,10 +25322,10 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` fill="#FFFFFF" font-size="10" font-weight="regular" - id="nodeBar38-name" + id="nodeBar43-name" text-anchor="start" x="48" - y="241.99999999999994" + y="294.2352941176472" > Leave+Yes – 14 </text> @@ -25275,7 +25339,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` font-weight="bold" text-anchor="start" x="48" - y="241.99999999999994" + y="294.2352941176472" > 14 </text> @@ -25293,14 +25357,14 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` } > <g - id="nodeGElement41" + id="nodeGElement46" > <rect aria-label="node Didn’t vote in at least one referendum – 21 with weight 22" data-is-focusable="true" fill="#3a96dd" - height="110" - id="nodeBar40" + height="78.07843137254906" + id="nodeBar45" opacity="1" role="img" stroke="#757575" @@ -25308,7 +25372,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` tabindex="-1" width="124" x="48" - y="320.00000000000006" + y="351.92156862745105" /> <g class= @@ -25333,10 +25397,10 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` fill="#FFFFFF" font-size="10" font-weight="regular" - id="nodeBar40-name" + id="nodeBar45-name" text-anchor="start" x="48" - y="320.00000000000006" + y="351.92156862745105" > Didn’t vote in at least one referendum – 21 </text> @@ -25350,7 +25414,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` font-weight="bold" text-anchor="start" x="48" - y="320.00000000000006" + y="351.92156862745105" > 22 </text> @@ -25381,7 +25445,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#2aa0a4" + stop-color="#e3008c" /> <stop offset="100%" @@ -25390,11 +25454,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Leave+No – 16 to 46 – No with weight 14" - d="M172,36C455.5,36,455.5,44,739,44L739,114C455.5,114,455.5,106,172,106Z" + aria-label="link from Remain+No – 28 to 46 – No with weight 20" + d="M172,36C455.5,36,455.5,47.482,739,47.482L739,118.462C455.5,118.462,455.5,106.98,172,106.98Z" data-is-focusable="true" fill-opacity="1" - id="link50" + id="link53" role="img" stroke="#757575" stroke-opacity="1" @@ -25427,7 +25491,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#2aa0a4" + stop-color="#e3008c" /> <stop offset="100%" @@ -25436,11 +25500,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Leave+No – 16 to 39 – Yes with weight 1" - d="M172,106C455.5,106,455.5,177,739,177L739,182C455.5,182,455.5,111,172,111Z" + aria-label="link from Remain+No – 28 to 39 – Yes with weight 3" + d="M172,106.98C455.5,106.98,455.5,215.188,739,215.188L739,225.835C455.5,225.835,455.5,117.627,172,117.627Z" data-is-focusable="true" fill-opacity="1" - id="link51" + id="link54" role="img" stroke="#757575" stroke-opacity="1" @@ -25473,7 +25537,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#2aa0a4" + stop-color="#e3008c" /> <stop offset="100%" @@ -25482,11 +25546,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Leave+No – 16 to 14 – Don’t know / would not vote with weight 1" - d="M172,111C455.5,111,455.5,365,739,365L739,370C455.5,370,455.5,116,172,116Z" + aria-label="link from Remain+No – 28 to 14 – Don’t know / would not vote with weight 5" + d="M172,117.627C455.5,117.627,455.5,361.6,739,361.6L739,379.345C455.5,379.345,455.5,135.373,172,135.373Z" data-is-focusable="true" fill-opacity="1" - id="link52" + id="link55" role="img" stroke="#757575" stroke-opacity="1" @@ -25519,7 +25583,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#9373c0" + stop-color="#2aa0a4" /> <stop offset="100%" @@ -25528,11 +25592,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Remain+Yes – 21 to 46 – No with weight 3" - d="M172,124C455.5,124,455.5,114,739,114L739,129C455.5,129,455.5,139,172,139Z" + aria-label="link from Leave+No – 16 to 46 – No with weight 14" + d="M172,143.373C455.5,143.373,455.5,118.462,739,118.462L739,168.149C455.5,168.149,455.5,193.059,172,193.059Z" data-is-focusable="true" fill-opacity="1" - id="link53" + id="link56" role="img" stroke="#757575" stroke-opacity="1" @@ -25565,7 +25629,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#9373c0" + stop-color="#2aa0a4" /> <stop offset="100%" @@ -25574,11 +25638,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Remain+Yes – 21 to 39 – Yes with weight 17" - d="M172,139C455.5,139,455.5,182,739,182L739,267C455.5,267,455.5,224,172,224Z" + aria-label="link from Leave+No – 16 to 39 – Yes with weight 1" + d="M172,193.059C455.5,193.059,455.5,225.835,739,225.835L739,229.384C455.5,229.384,455.5,196.608,172,196.608Z" data-is-focusable="true" fill-opacity="1" - id="link54" + id="link57" role="img" stroke="#757575" stroke-opacity="1" @@ -25611,7 +25675,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#9373c0" + stop-color="#2aa0a4" /> <stop offset="100%" @@ -25620,11 +25684,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Remain+Yes – 21 to 14 – Don’t know / would not vote with weight 2" - d="M172,224C455.5,224,455.5,370,739,370L739,380C455.5,380,455.5,234,172,234Z" + aria-label="link from Leave+No – 16 to 14 – Don’t know / would not vote with weight 1" + d="M172,196.608C455.5,196.608,455.5,379.345,739,379.345L739,382.894C455.5,382.894,455.5,200.157,172,200.157Z" data-is-focusable="true" fill-opacity="1" - id="link55" + id="link58" role="img" stroke="#757575" stroke-opacity="1" @@ -25657,7 +25721,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#13a10e" + stop-color="#9373c0" /> <stop offset="100%" @@ -25666,11 +25730,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Leave+Yes – 14 to 46 – No with weight 3" - d="M172,242C455.5,242,455.5,129,739,129L739,144C455.5,144,455.5,257,172,257Z" + aria-label="link from Remain+Yes – 21 to 46 – No with weight 3" + d="M172,208.157C455.5,208.157,455.5,168.149,739,168.149L739,178.796C455.5,178.796,455.5,218.804,172,218.804Z" data-is-focusable="true" fill-opacity="1" - id="link56" + id="link59" role="img" stroke="#757575" stroke-opacity="1" @@ -25703,7 +25767,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#13a10e" + stop-color="#9373c0" /> <stop offset="100%" @@ -25712,11 +25776,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Leave+Yes – 14 to 39 – Yes with weight 9" - d="M172,257C455.5,257,455.5,267,739,267L739,312C455.5,312,455.5,302,172,302Z" + aria-label="link from Remain+Yes – 21 to 39 – Yes with weight 17" + d="M172,218.804C455.5,218.804,455.5,229.384,739,229.384L739,289.717C455.5,289.717,455.5,279.137,172,279.137Z" data-is-focusable="true" fill-opacity="1" - id="link57" + id="link60" role="img" stroke="#757575" stroke-opacity="1" @@ -25749,7 +25813,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#13a10e" + stop-color="#9373c0" /> <stop offset="100%" @@ -25758,11 +25822,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Leave+Yes – 14 to 14 – Don’t know / would not vote with weight 2" - d="M172,302C455.5,302,455.5,380,739,380L739,390C455.5,390,455.5,312,172,312Z" + aria-label="link from Remain+Yes – 21 to 14 – Don’t know / would not vote with weight 2" + d="M172,279.137C455.5,279.137,455.5,382.894,739,382.894L739,389.992C455.5,389.992,455.5,286.235,172,286.235Z" data-is-focusable="true" fill-opacity="1" - id="link58" + id="link61" role="img" stroke="#757575" stroke-opacity="1" @@ -25795,7 +25859,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#3a96dd" + stop-color="#13a10e" /> <stop offset="100%" @@ -25804,11 +25868,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Didn’t vote in at least one referendum – 21 to 46 – No with weight 5" - d="M172,320C455.5,320,455.5,144,739,144L739,169C455.5,169,455.5,345,172,345Z" + aria-label="link from Leave+Yes – 14 to 46 – No with weight 3" + d="M172,294.235C455.5,294.235,455.5,178.796,739,178.796L739,189.443C455.5,189.443,455.5,304.882,172,304.882Z" data-is-focusable="true" fill-opacity="1" - id="link59" + id="link62" role="img" stroke="#757575" stroke-opacity="1" @@ -25841,7 +25905,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#3a96dd" + stop-color="#13a10e" /> <stop offset="100%" @@ -25850,11 +25914,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Didn’t vote in at least one referendum – 21 to 39 – Yes with weight 9" - d="M172,345C455.5,345,455.5,312,739,312L739,357C455.5,357,455.5,390,172,390Z" + aria-label="link from Leave+Yes – 14 to 39 – Yes with weight 9" + d="M172,304.882C455.5,304.882,455.5,289.717,739,289.717L739,321.658C455.5,321.658,455.5,336.824,172,336.824Z" data-is-focusable="true" fill-opacity="1" - id="link60" + id="link63" role="img" stroke="#757575" stroke-opacity="1" @@ -25887,7 +25951,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` > <stop offset="0" - stop-color="#3a96dd" + stop-color="#13a10e" /> <stop offset="100%" @@ -25896,11 +25960,11 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` </lineargradient> </defs> <path - aria-label="link from Didn’t vote in at least one referendum – 21 to 14 – Don’t know / would not vote with weight 8" - d="M172,390C455.5,390,455.5,390,739,390L739,430C455.5,430,455.5,430,172,430Z" + aria-label="link from Leave+Yes – 14 to 14 – Don’t know / would not vote with weight 2" + d="M172,336.824C455.5,336.824,455.5,389.992,739,389.992L739,397.09C455.5,397.09,455.5,343.922,172,343.922Z" data-is-focusable="true" fill-opacity="1" - id="link61" + id="link64" role="img" stroke="#757575" stroke-opacity="1" @@ -25913,29 +25977,137 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` class= { - fill: #F5F5F5; + fill: #ffffff; + stroke-width: 3px; + stroke: #000000; } @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& { fill: #000000; } + stroke-opacity="1" > - <g - id="nodeGElement43" - > - <rect - aria-label="node Remain+No – 28 with weight 0" + <g> + <defs> + <lineargradient + id="gradient-link1-12" + x1="0%" + x2="100%" + y1="0%" + y2="0%" + > + <stop + offset="0" + stop-color="#3a96dd" + /> + <stop + offset="100%" + stop-color="#ca5010" + /> + </lineargradient> + </defs> + <path + aria-label="link from Didn’t vote in at least one referendum – 21 to 46 – No with weight 5" + d="M172,351.922C455.5,351.922,455.5,189.443,739,189.443L739,207.188C455.5,207.188,455.5,369.667,172,369.667Z" data-is-focusable="true" - fill="#e3008c" - height="0" - id="nodeBar42" - opacity="1" + fill-opacity="1" + id="link65" role="img" stroke="#757575" + stroke-opacity="1" + stroke-width="2" + tabindex="-1" + /> + </g> + </g> + <g + class= + + { + fill: #ffffff; + stroke-width: 3px; + stroke: #000000; + } + @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& { + fill: #000000; + } + stroke-opacity="1" + > + <g> + <defs> + <lineargradient + id="gradient-link1-13" + x1="0%" + x2="100%" + y1="0%" + y2="0%" + > + <stop + offset="0" + stop-color="#3a96dd" + /> + <stop + offset="100%" + stop-color="#57811b" + /> + </lineargradient> + </defs> + <path + aria-label="link from Didn’t vote in at least one referendum – 21 to 39 – Yes with weight 9" + d="M172,369.667C455.5,369.667,455.5,321.658,739,321.658L739,353.6C455.5,353.6,455.5,401.608,172,401.608Z" + data-is-focusable="true" + fill-opacity="1" + id="link66" + role="img" + stroke="#757575" + stroke-opacity="1" + stroke-width="2" + tabindex="-1" + /> + </g> + </g> + <g + class= + + { + fill: #ffffff; + stroke-width: 3px; + stroke: #000000; + } + @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& { + fill: #000000; + } + stroke-opacity="1" + > + <g> + <defs> + <lineargradient + id="gradient-link1-14" + x1="0%" + x2="100%" + y1="0%" + y2="0%" + > + <stop + offset="0" + stop-color="#3a96dd" + /> + <stop + offset="100%" + stop-color="#b146c2" + /> + </lineargradient> + </defs> + <path + aria-label="link from Didn’t vote in at least one referendum – 21 to 14 – Don’t know / would not vote with weight 8" + d="M172,401.608C455.5,401.608,455.5,397.09,739,397.09L739,425.482C455.5,425.482,455.5,430,172,430Z" + data-is-focusable="true" + fill-opacity="1" + id="link67" + role="img" + stroke="#757575" + stroke-opacity="1" stroke-width="2" tabindex="-1" - width="124" - x="739" - y="36" /> </g> </g> @@ -25950,14 +26122,14 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` } > <g - id="nodeGElement45" + id="nodeGElement48" > <rect - aria-label="node 46 – No with weight 25" + aria-label="node 46 – No with weight 45" data-is-focusable="true" fill="#ca5010" - height="125.00000000000006" - id="nodeBar44" + height="159.70588235294113" + id="nodeBar47" opacity="1" role="img" stroke="#757575" @@ -25965,7 +26137,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` tabindex="-1" width="124" x="739" - y="44" + y="47.48191060502646" /> <g class= @@ -25990,10 +26162,10 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` fill="#FFFFFF" font-size="10" font-weight="regular" - id="nodeBar44-name" + id="nodeBar47-name" text-anchor="start" x="739" - y="44" + y="47.48191060502646" > 46 – No </text> @@ -26007,9 +26179,9 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` font-weight="bold" text-anchor="start" x="739" - y="44" + y="47.48191060502646" > - 25 + 45 </text> </g> </g> @@ -26025,14 +26197,14 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` } > <g - id="nodeGElement47" + id="nodeGElement50" > <rect - aria-label="node 39 – Yes with weight 36" + aria-label="node 39 – Yes with weight 39" data-is-focusable="true" fill="#57811b" - height="180.00000000000017" - id="nodeBar46" + height="138.41176470588226" + id="nodeBar49" opacity="1" role="img" stroke="#757575" @@ -26040,7 +26212,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` tabindex="-1" width="124" x="739" - y="177.00000000000006" + y="215.1877929579676" /> <g class= @@ -26065,10 +26237,10 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` fill="#FFFFFF" font-size="10" font-weight="regular" - id="nodeBar46-name" + id="nodeBar49-name" text-anchor="start" x="739" - y="177.00000000000006" + y="215.1877929579676" > 39 – Yes </text> @@ -26082,9 +26254,9 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` font-weight="bold" text-anchor="start" x="739" - y="177.00000000000006" + y="215.1877929579676" > - 36 + 39 </text> </g> </g> @@ -26100,14 +26272,14 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` } > <g - id="nodeGElement49" + id="nodeGElement52" > <rect - aria-label="node 14 – Don’t know / would not vote with weight 13" + aria-label="node 14 – Don’t know / would not vote with weight 18" data-is-focusable="true" fill="#b146c2" - height="65" - id="nodeBar48" + height="63.882352941176464" + id="nodeBar51" opacity="1" role="img" stroke="#757575" @@ -26115,7 +26287,7 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` tabindex="-1" width="124" x="739" - y="365.0000000000002" + y="361.59955766384985" /> <g class= @@ -26140,10 +26312,10 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` fill="#FFFFFF" font-size="10" font-weight="regular" - id="nodeBar48-name" + id="nodeBar51-name" text-anchor="start" x="739" - y="365.0000000000002" + y="361.59955766384985" > 14 – Don’t know / would not vote </text> @@ -26157,9 +26329,9 @@ exports[`DeclarativeChart Should render sankeychart in DeclarativeChart 1`] = ` font-weight="bold" text-anchor="start" x="739" - y="365.0000000000002" + y="361.59955766384985" > - 13 + 18 </text> </g> </g> diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap new file mode 100644 index 00000000000000..2e2347d3576bc3 --- /dev/null +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap @@ -0,0 +1,4934 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`sanitizeJson Should return json object when depth inside the range 1`] = ` +Object { + "data": Array [ + Object { + "delta": Object { + "increasing": Object { + "color": "RebeccaPurple", + }, + "reference": 400, + }, + "gauge": Object { + "axis": Object { + "range": Array [ + null, + 500, + ], + "tickcolor": "darkblue", + "tickwidth": 1, + }, + "bar": Object { + "color": "darkblue", + }, + "bgcolor": "white", + "bordercolor": "gray", + "borderwidth": 2, + "steps": Array [ + Object { + "color": "cyan", + "range": Array [ + 0, + 250, + ], + }, + Object { + "color": "royalblue", + "range": Array [ + 250, + 400, + ], + }, + ], + "threshold": Object { + "line": Object { + "color": "red", + "width": 4, + }, + "thickness": 0.75, + "value": 490, + }, + }, + "mode": "gauge+number+delta", + "title": Object { + "font": Object { + "size": 24, + }, + "text": "Speed", + }, + "type": "indicator", + "value": 420, + }, + ], + "frames": Array [], + "layout": Object { + "font": Object { + "color": "darkblue", + "family": "Arial", + }, + "height": 400, + "margin": Object { + "b": 25, + "l": 25, + "r": 25, + "t": 25, + }, + "paper_bgcolor": "lavender", + "width": 500, + }, + "visualizer": "plotly", +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToDonutProps - Should return donut chart props 1`] = ` +Object { + "data": Object { + "chartData": Array [ + Object { + "color": "#9373c0", + "data": 1, + "legend": "AMC", + }, + Object { + "color": "#13a10e", + "data": 1, + "legend": "Cadillac", + }, + Object { + "color": "#3a96dd", + "data": 1, + "legend": "Camaro", + }, + Object { + "color": "#ca5010", + "data": 1, + "legend": "Chrysler", + }, + Object { + "color": "#57811b", + "data": 1, + "legend": "Datsun", + }, + Object { + "color": "#b146c2", + "data": 1, + "legend": "Dodge", + }, + Object { + "color": "#ae8c00", + "data": 1, + "legend": "Duster", + }, + Object { + "color": "#93a4f4", + "data": 1, + "legend": "Ferrari", + }, + Object { + "color": "#ee5fb7", + "data": 2, + "legend": "Fiat", + }, + Object { + "color": "#4cb4b7", + "data": 1, + "legend": "Ford", + }, + Object { + "color": "#a083c9", + "data": 1, + "legend": "Honda", + }, + Object { + "color": "#27ac22", + "data": 2, + "legend": "Hornet", + }, + Object { + "color": "#4fa1e1", + "data": 1, + "legend": "Lincoln", + }, + Object { + "color": "#d77440", + "data": 1, + "legend": "Lotus", + }, + Object { + "color": "#73aa24", + "data": 1, + "legend": "Maserati", + }, + Object { + "color": "#c36bd1", + "data": 2, + "legend": "Mazda", + }, + Object { + "color": "#d0b232", + "data": 7, + "legend": "Merc", + }, + Object { + "color": "#4f6bed", + "data": 1, + "legend": "Pontiac", + }, + Object { + "color": "#ea38a6", + "data": 1, + "legend": "Porsche", + }, + Object { + "color": "#038387", + "data": 2, + "legend": "Toyota", + }, + Object { + "color": "#8764b8", + "data": 1, + "legend": "Valiant", + }, + Object { + "color": "#11910d", + "data": 1, + "legend": "Volvo", + }, + ], + "chartTitle": "Donut charts using Plotly", + }, + "height": 220, + "hideLabels": false, + "hideLegend": false, + "innerRadius": 42, + "showLabelsInPercent": true, + "styles": Object { + "root": Object { + "[class^=\\"arcLabel\\"]": Object {}, + }, + }, + "width": 440, +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToDonutProps - Should return pie chart props 1`] = ` +Object { + "data": Object { + "chartData": Array [ + Object { + "color": "#3487c7", + "data": 4500, + "legend": "Oxygen", + }, + Object { + "color": "#d06228", + "data": 2500, + "legend": "Hydrogen", + }, + Object { + "color": "#689920", + "data": 1053, + "legend": "Carbon_Dioxide", + }, + Object { + "color": "#ba58c9", + "data": 500, + "legend": "Nitrogen", + }, + ], + "chartTitle": "", + }, + "height": 220, + "hideLabels": false, + "hideLegend": false, + "innerRadius": 0, + "showLabelsInPercent": false, + "styles": Object { + "root": Object { + "[class^=\\"arcLabel\\"]": Object { + "fontSize": 20, + }, + }, + }, + "width": 440, +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToGVBCProps - Should return GVBC props 1`] = ` +Object { + "barwidth": "auto", + "chartTitle": "PHP Framework Popularity at Work - SitePoint, 2015", + "data": Array [ + Object { + "name": "Jan", + "series": Array [ + Object { + "color": "#c19c00", + "data": 2000, + "key": "Category A", + "legend": "Category A", + "xAxisCalloutData": "Jan", + }, + Object { + "color": "#c8d1fa", + "data": 3000, + "key": "Category B", + "legend": "Category B", + "xAxisCalloutData": "Jan", + }, + ], + }, + Object { + "name": "Feb", + "series": Array [ + Object { + "color": "#c19c00", + "data": 2100, + "key": "Category A", + "legend": "Category A", + "xAxisCalloutData": "Feb", + }, + Object { + "color": "#c8d1fa", + "data": 3100, + "key": "Category B", + "legend": "Category B", + "xAxisCalloutData": "Feb", + }, + ], + }, + Object { + "name": "Mar", + "series": Array [ + Object { + "color": "#c19c00", + "data": 2200, + "key": "Category A", + "legend": "Category A", + "xAxisCalloutData": "Mar", + }, + Object { + "color": "#c8d1fa", + "data": 3200, + "key": "Category B", + "legend": "Category B", + "xAxisCalloutData": "Mar", + }, + ], + }, + Object { + "name": "Apr", + "series": Array [ + Object { + "color": "#c19c00", + "data": 2300, + "key": "Category A", + "legend": "Category A", + "xAxisCalloutData": "Apr", + }, + Object { + "color": "#c8d1fa", + "data": 3300, + "key": "Category B", + "legend": "Category B", + "xAxisCalloutData": "Apr", + }, + ], + }, + Object { + "name": "May", + "series": Array [ + Object { + "color": "#c19c00", + "data": 2400, + "key": "Category A", + "legend": "Category A", + "xAxisCalloutData": "May", + }, + Object { + "color": "#c8d1fa", + "data": 3400, + "key": "Category B", + "legend": "Category B", + "xAxisCalloutData": "May", + }, + ], + }, + ], + "mode": "plotly", + "xAxisTitle": "Votes", + "yAxisTitle": "Framework", +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToGaugeProps - Should return gauge chart props 1`] = ` +Object { + "chartTitle": "", + "chartValue": 420, + "chartValueFormat": [Function], + "height": 400, + "maxValue": 500, + "minValue": undefined, + "segments": Array [ + Object { + "color": "#c19c00", + "legend": "Segment 1", + "size": 250, + }, + Object { + "color": "#c8d1fa", + "legend": "Segment 2", + "size": 150, + }, + ], + "styles": Object { + "sublabel": Object { + "fill": "#f7adda", + }, + }, + "sublabel": "▲ 20", + "variant": "multiple-segments", + "width": 500, +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToHeatmapProps - Should return heatmap chart props 1`] = ` +Object { + "chartTitle": "", + "data": Array [ + Object { + "data": Array [ + Object { + "rectText": 12, + "value": 12, + "x": "x_0", + "y": "y_0", + }, + Object { + "rectText": 18.072596781382654, + "value": 18.072596781382654, + "x": "x_0", + "y": "y_1", + }, + Object { + "rectText": 16.104827483834423, + "value": 16.104827483834423, + "x": "x_0", + "y": "y_2", + }, + Object { + "rectText": 12.732656491556462, + "value": 12.732656491556462, + "x": "x_0", + "y": "y_3", + }, + Object { + "rectText": 10.424697200562369, + "value": 10.424697200562369, + "x": "x_0", + "y": "y_4", + }, + Object { + "rectText": 1.3848305486418013, + "value": 1.3848305486418013, + "x": "x_0", + "y": "y_5", + }, + Object { + "rectText": -6.877933971525136, + "value": -6.877933971525136, + "x": "x_0", + "y": "y_6", + }, + Object { + "rectText": -7.513284950652834, + "value": -7.513284950652834, + "x": "x_0", + "y": "y_7", + }, + Object { + "rectText": 0.02929945240777787, + "value": 0.02929945240777787, + "x": "x_0", + "y": "y_8", + }, + Object { + "rectText": 1.3315750803470996, + "value": 1.3315750803470996, + "x": "x_0", + "y": "y_9", + }, + Object { + "rectText": -0.34155835630595655, + "value": -0.34155835630595655, + "x": "x_0", + "y": "y_10", + }, + Object { + "rectText": -1.2496939708148902, + "value": -1.2496939708148902, + "x": "x_0", + "y": "y_11", + }, + Object { + "rectText": 3.673504371828866, + "value": 3.673504371828866, + "x": "x_0", + "y": "y_12", + }, + Object { + "rectText": 9.197351864496074, + "value": 9.197351864496074, + "x": "x_0", + "y": "y_13", + }, + Object { + "rectText": 17.878378279408615, + "value": 17.878378279408615, + "x": "x_0", + "y": "y_14", + }, + Object { + "rectText": 18.3594620989525, + "value": 18.3594620989525, + "x": "x_0", + "y": "y_15", + }, + Object { + "rectText": 9.52854140993721, + "value": 9.52854140993721, + "x": "x_0", + "y": "y_16", + }, + Object { + "rectText": 8.834804620855842, + "value": 8.834804620855842, + "x": "x_0", + "y": "y_17", + }, + Object { + "rectText": 2.008683713506029, + "value": 2.008683713506029, + "x": "x_0", + "y": "y_18", + }, + Object { + "rectText": 1.4746401926975559, + "value": 1.4746401926975559, + "x": "x_0", + "y": "y_19", + }, + Object { + "rectText": 11.697147742124411, + "value": 11.697147742124411, + "x": "x_1", + "y": "y_0", + }, + Object { + "rectText": 6.872368565119988, + "value": 6.872368565119988, + "x": "x_1", + "y": "y_1", + }, + Object { + "rectText": 16.816096580158092, + "value": 16.816096580158092, + "x": "x_1", + "y": "y_2", + }, + Object { + "rectText": 24.158612074358526, + "value": 24.158612074358526, + "x": "x_1", + "y": "y_3", + }, + Object { + "rectText": 28.78022939969912, + "value": 28.78022939969912, + "x": "x_1", + "y": "y_4", + }, + Object { + "rectText": 28.88858899620542, + "value": 28.88858899620542, + "x": "x_1", + "y": "y_5", + }, + Object { + "rectText": 44.04384439381119, + "value": 44.04384439381119, + "x": "x_1", + "y": "y_6", + }, + Object { + "rectText": 44.21182779048812, + "value": 44.21182779048812, + "x": "x_1", + "y": "y_7", + }, + Object { + "rectText": 47.8943258538308, + "value": 47.8943258538308, + "x": "x_1", + "y": "y_8", + }, + Object { + "rectText": 45.90255894008207, + "value": 45.90255894008207, + "x": "x_1", + "y": "y_9", + }, + Object { + "rectText": 52.257883472637104, + "value": 52.257883472637104, + "x": "x_1", + "y": "y_10", + }, + Object { + "rectText": 52.0753263525035, + "value": 52.0753263525035, + "x": "x_1", + "y": "y_11", + }, + Object { + "rectText": 55.66537870906952, + "value": 55.66537870906952, + "x": "x_1", + "y": "y_12", + }, + Object { + "rectText": 55.98556586180058, + "value": 55.98556586180058, + "x": "x_1", + "y": "y_13", + }, + Object { + "rectText": 65.61603877495548, + "value": 65.61603877495548, + "x": "x_1", + "y": "y_14", + }, + Object { + "rectText": 66.76755465163893, + "value": 66.76755465163893, + "x": "x_1", + "y": "y_15", + }, + Object { + "rectText": 66.15934256222516, + "value": 66.15934256222516, + "x": "x_1", + "y": "y_16", + }, + Object { + "rectText": 58.63396530456222, + "value": 58.63396530456222, + "x": "x_1", + "y": "y_17", + }, + Object { + "rectText": 68.77074374390875, + "value": 68.77074374390875, + "x": "x_1", + "y": "y_18", + }, + Object { + "rectText": 76.5710413276318, + "value": 76.5710413276318, + "x": "x_1", + "y": "y_19", + }, + Object { + "rectText": 7.1748009833505355, + "value": 7.1748009833505355, + "x": "x_2", + "y": "y_0", + }, + Object { + "rectText": 2.6331323456979367, + "value": 2.6331323456979367, + "x": "x_2", + "y": "y_1", + }, + Object { + "rectText": -1.0796033248100874, + "value": -1.0796033248100874, + "x": "x_2", + "y": "y_2", + }, + Object { + "rectText": 1.8639666906231516, + "value": 1.8639666906231516, + "x": "x_2", + "y": "y_3", + }, + Object { + "rectText": 3.274446200066722, + "value": 3.274446200066722, + "x": "x_2", + "y": "y_4", + }, + Object { + "rectText": 12.971410893817621, + "value": 12.971410893817621, + "x": "x_2", + "y": "y_5", + }, + Object { + "rectText": 13.548126342387011, + "value": 13.548126342387011, + "x": "x_2", + "y": "y_6", + }, + Object { + "rectText": 14.479713711226983, + "value": 14.479713711226983, + "x": "x_2", + "y": "y_7", + }, + Object { + "rectText": 13.4384038570412, + "value": 13.4384038570412, + "x": "x_2", + "y": "y_8", + }, + Object { + "rectText": 9.162060301209916, + "value": 9.162060301209916, + "x": "x_2", + "y": "y_9", + }, + Object { + "rectText": 14.63013635132661, + "value": 14.63013635132661, + "x": "x_2", + "y": "y_10", + }, + Object { + "rectText": 16.573843720560127, + "value": 16.573843720560127, + "x": "x_2", + "y": "y_11", + }, + Object { + "rectText": 22.222025244923273, + "value": 22.222025244923273, + "x": "x_2", + "y": "y_12", + }, + Object { + "rectText": 19.688495387348357, + "value": 19.688495387348357, + "x": "x_2", + "y": "y_13", + }, + Object { + "rectText": 21.1073514253479, + "value": 21.1073514253479, + "x": "x_2", + "y": "y_14", + }, + Object { + "rectText": 23.378561600159312, + "value": 23.378561600159312, + "x": "x_2", + "y": "y_15", + }, + Object { + "rectText": 25.727095609917317, + "value": 25.727095609917317, + "x": "x_2", + "y": "y_16", + }, + Object { + "rectText": 32.725737544844485, + "value": 32.725737544844485, + "x": "x_2", + "y": "y_17", + }, + Object { + "rectText": 27.561261630596558, + "value": 27.561261630596558, + "x": "x_2", + "y": "y_18", + }, + Object { + "rectText": 22.444170064560886, + "value": 22.444170064560886, + "x": "x_2", + "y": "y_19", + }, + Object { + "rectText": 11.443688379214382, + "value": 11.443688379214382, + "x": "x_3", + "y": "y_0", + }, + Object { + "rectText": 8.910260123844887, + "value": 8.910260123844887, + "x": "x_3", + "y": "y_1", + }, + Object { + "rectText": 13.037577162924944, + "value": 13.037577162924944, + "x": "x_3", + "y": "y_2", + }, + Object { + "rectText": 9.195075731494875, + "value": 9.195075731494875, + "x": "x_3", + "y": "y_3", + }, + Object { + "rectText": 8.669870516018236, + "value": 8.669870516018236, + "x": "x_3", + "y": "y_4", + }, + Object { + "rectText": 21.143305039916708, + "value": 21.143305039916708, + "x": "x_3", + "y": "y_5", + }, + Object { + "rectText": 17.74014481550033, + "value": 17.74014481550033, + "x": "x_3", + "y": "y_6", + }, + Object { + "rectText": 17.660499931671584, + "value": 17.660499931671584, + "x": "x_3", + "y": "y_7", + }, + Object { + "rectText": 17.917433759396193, + "value": 17.917433759396193, + "x": "x_3", + "y": "y_8", + }, + Object { + "rectText": -1.2943200134022526, + "value": -1.2943200134022526, + "x": "x_3", + "y": "y_9", + }, + Object { + "rectText": -1.1475310646451669, + "value": -1.1475310646451669, + "x": "x_3", + "y": "y_10", + }, + Object { + "rectText": 0.6254954059905691, + "value": 0.6254954059905691, + "x": "x_3", + "y": "y_11", + }, + Object { + "rectText": -2.1871046243479864, + "value": -2.1871046243479864, + "x": "x_3", + "y": "y_12", + }, + Object { + "rectText": -1.1757697666321, + "value": -1.1757697666321, + "x": "x_3", + "y": "y_13", + }, + Object { + "rectText": -9.253213203481765, + "value": -9.253213203481765, + "x": "x_3", + "y": "y_14", + }, + Object { + "rectText": -9.221557127656212, + "value": -9.221557127656212, + "x": "x_3", + "y": "y_15", + }, + Object { + "rectText": -16.01042996598902, + "value": -16.01042996598902, + "x": "x_3", + "y": "y_16", + }, + Object { + "rectText": -13.465901648481573, + "value": -13.465901648481573, + "x": "x_3", + "y": "y_17", + }, + Object { + "rectText": -11.972754232678293, + "value": -11.972754232678293, + "x": "x_3", + "y": "y_18", + }, + Object { + "rectText": -11.754560357801614, + "value": -11.754560357801614, + "x": "x_3", + "y": "y_19", + }, + Object { + "rectText": 23.648522429525176, + "value": 23.648522429525176, + "x": "x_4", + "y": "y_0", + }, + Object { + "rectText": 23.29825386450679, + "value": 23.29825386450679, + "x": "x_4", + "y": "y_1", + }, + Object { + "rectText": 25.071276081749808, + "value": 25.071276081749808, + "x": "x_4", + "y": "y_2", + }, + Object { + "rectText": 19.788944565361437, + "value": 19.788944565361437, + "x": "x_4", + "y": "y_3", + }, + Object { + "rectText": 17.75655781585482, + "value": 17.75655781585482, + "x": "x_4", + "y": "y_4", + }, + Object { + "rectText": 7.466382276034302, + "value": 7.466382276034302, + "x": "x_4", + "y": "y_5", + }, + Object { + "rectText": 15.7912983146064, + "value": 15.7912983146064, + "x": "x_4", + "y": "y_6", + }, + Object { + "rectText": 14.436062506263415, + "value": 14.436062506263415, + "x": "x_4", + "y": "y_7", + }, + Object { + "rectText": 17.039432522289083, + "value": 17.039432522289083, + "x": "x_4", + "y": "y_8", + }, + Object { + "rectText": 21.982396858443334, + "value": 21.982396858443334, + "x": "x_4", + "y": "y_9", + }, + Object { + "rectText": 19.815434611539906, + "value": 19.815434611539906, + "x": "x_4", + "y": "y_10", + }, + Object { + "rectText": 25.67070005332393, + "value": 25.67070005332393, + "x": "x_4", + "y": "y_11", + }, + Object { + "rectText": 28.014054309766728, + "value": 28.014054309766728, + "x": "x_4", + "y": "y_12", + }, + Object { + "rectText": 26.78831096366896, + "value": 26.78831096366896, + "x": "x_4", + "y": "y_13", + }, + Object { + "rectText": 27.879670681460908, + "value": 27.879670681460908, + "x": "x_4", + "y": "y_14", + }, + Object { + "rectText": 28.23165649899542, + "value": 28.23165649899542, + "x": "x_4", + "y": "y_15", + }, + Object { + "rectText": 24.77811171644336, + "value": 24.77811171644336, + "x": "x_4", + "y": "y_16", + }, + Object { + "rectText": 31.313375862796256, + "value": 31.313375862796256, + "x": "x_4", + "y": "y_17", + }, + Object { + "rectText": 27.652138241890253, + "value": 27.652138241890253, + "x": "x_4", + "y": "y_18", + }, + Object { + "rectText": 31.65020848831535, + "value": 31.65020848831535, + "x": "x_4", + "y": "y_19", + }, + Object { + "rectText": 10.040502684649338, + "value": 10.040502684649338, + "x": "x_5", + "y": "y_0", + }, + Object { + "rectText": 9.18418261775059, + "value": 9.18418261775059, + "x": "x_5", + "y": "y_1", + }, + Object { + "rectText": -6.016235615271988, + "value": -6.016235615271988, + "x": "x_5", + "y": "y_2", + }, + Object { + "rectText": -6.833645216204284, + "value": -6.833645216204284, + "x": "x_5", + "y": "y_3", + }, + Object { + "rectText": -6.896721183137775, + "value": -6.896721183137775, + "x": "x_5", + "y": "y_4", + }, + Object { + "rectText": -2.108394838355938, + "value": -2.108394838355938, + "x": "x_5", + "y": "y_5", + }, + Object { + "rectText": -6.563883600581922, + "value": -6.563883600581922, + "x": "x_5", + "y": "y_6", + }, + Object { + "rectText": -8.630753569571617, + "value": -8.630753569571617, + "x": "x_5", + "y": "y_7", + }, + Object { + "rectText": -4.774743239794282, + "value": -4.774743239794282, + "x": "x_5", + "y": "y_8", + }, + Object { + "rectText": -2.0046315173801657, + "value": -2.0046315173801657, + "x": "x_5", + "y": "y_9", + }, + Object { + "rectText": -0.3597615447940745, + "value": -0.3597615447940745, + "x": "x_5", + "y": "y_10", + }, + Object { + "rectText": 2.8833642841959586, + "value": 2.8833642841959586, + "x": "x_5", + "y": "y_11", + }, + Object { + "rectText": -1.9343227464152601, + "value": -1.9343227464152601, + "x": "x_5", + "y": "y_12", + }, + Object { + "rectText": -5.206570891432279, + "value": -5.206570891432279, + "x": "x_5", + "y": "y_13", + }, + Object { + "rectText": -2.8320537701090256, + "value": -2.8320537701090256, + "x": "x_5", + "y": "y_14", + }, + Object { + "rectText": -0.3620931039471351, + "value": -0.3620931039471351, + "x": "x_5", + "y": "y_15", + }, + Object { + "rectText": -1.2825355952790376, + "value": -1.2825355952790376, + "x": "x_5", + "y": "y_16", + }, + Object { + "rectText": -1.937020141351771, + "value": -1.937020141351771, + "x": "x_5", + "y": "y_17", + }, + Object { + "rectText": -8.994598412149836, + "value": -8.994598412149836, + "x": "x_5", + "y": "y_18", + }, + Object { + "rectText": -6.747073251084499, + "value": -6.747073251084499, + "x": "x_5", + "y": "y_19", + }, + Object { + "rectText": 10.819974608119614, + "value": 10.819974608119614, + "x": "x_6", + "y": "y_0", + }, + Object { + "rectText": 18.052236884018036, + "value": 18.052236884018036, + "x": "x_6", + "y": "y_1", + }, + Object { + "rectText": 12.248777535804365, + "value": 12.248777535804365, + "x": "x_6", + "y": "y_2", + }, + Object { + "rectText": 9.969142303073252, + "value": 9.969142303073252, + "x": "x_6", + "y": "y_3", + }, + Object { + "rectText": 17.337127681913973, + "value": 17.337127681913973, + "x": "x_6", + "y": "y_4", + }, + Object { + "rectText": 16.027000754389025, + "value": 16.027000754389025, + "x": "x_6", + "y": "y_5", + }, + Object { + "rectText": 21.49865383744765, + "value": 21.49865383744765, + "x": "x_6", + "y": "y_6", + }, + Object { + "rectText": 18.920515851612024, + "value": 18.920515851612024, + "x": "x_6", + "y": "y_7", + }, + Object { + "rectText": 12.169188113505435, + "value": 12.169188113505435, + "x": "x_6", + "y": "y_8", + }, + Object { + "rectText": 23.75776947991829, + "value": 23.75776947991829, + "x": "x_6", + "y": "y_9", + }, + Object { + "rectText": 22.773438522174473, + "value": 22.773438522174473, + "x": "x_6", + "y": "y_10", + }, + Object { + "rectText": 21.05489065711163, + "value": 21.05489065711163, + "x": "x_6", + "y": "y_11", + }, + Object { + "rectText": 29.16438526268995, + "value": 29.16438526268995, + "x": "x_6", + "y": "y_12", + }, + Object { + "rectText": 29.755041090905404, + "value": 29.755041090905404, + "x": "x_6", + "y": "y_13", + }, + Object { + "rectText": 26.13796211607032, + "value": 26.13796211607032, + "x": "x_6", + "y": "y_14", + }, + Object { + "rectText": 28.91643855216486, + "value": 28.91643855216486, + "x": "x_6", + "y": "y_15", + }, + Object { + "rectText": 19.064261874916085, + "value": 19.064261874916085, + "x": "x_6", + "y": "y_16", + }, + Object { + "rectText": 14.893297536987049, + "value": 14.893297536987049, + "x": "x_6", + "y": "y_17", + }, + Object { + "rectText": 16.01202612993778, + "value": 16.01202612993778, + "x": "x_6", + "y": "y_18", + }, + Object { + "rectText": 10.677375854561543, + "value": 10.677375854561543, + "x": "x_6", + "y": "y_19", + }, + Object { + "rectText": 20.83991840239746, + "value": 20.83991840239746, + "x": "x_7", + "y": "y_0", + }, + Object { + "rectText": 32.088269277118485, + "value": 32.088269277118485, + "x": "x_7", + "y": "y_1", + }, + Object { + "rectText": 35.617617939013286, + "value": 35.617617939013286, + "x": "x_7", + "y": "y_2", + }, + Object { + "rectText": 46.34145242145437, + "value": 46.34145242145437, + "x": "x_7", + "y": "y_3", + }, + Object { + "rectText": 42.70107878756259, + "value": 42.70107878756259, + "x": "x_7", + "y": "y_4", + }, + Object { + "rectText": 40.70844626018491, + "value": 40.70844626018491, + "x": "x_7", + "y": "y_5", + }, + Object { + "rectText": 38.24729505908534, + "value": 38.24729505908534, + "x": "x_7", + "y": "y_6", + }, + Object { + "rectText": 41.961872256649784, + "value": 41.961872256649784, + "x": "x_7", + "y": "y_7", + }, + Object { + "rectText": 40.42317097918186, + "value": 40.42317097918186, + "x": "x_7", + "y": "y_8", + }, + Object { + "rectText": 42.681396519281044, + "value": 42.681396519281044, + "x": "x_7", + "y": "y_9", + }, + Object { + "rectText": 45.16830973647258, + "value": 45.16830973647258, + "x": "x_7", + "y": "y_10", + }, + Object { + "rectText": 45.54977153406254, + "value": 45.54977153406254, + "x": "x_7", + "y": "y_11", + }, + Object { + "rectText": 44.051494895676456, + "value": 44.051494895676456, + "x": "x_7", + "y": "y_12", + }, + Object { + "rectText": 35.45913888587404, + "value": 35.45913888587404, + "x": "x_7", + "y": "y_13", + }, + Object { + "rectText": 24.926244822709098, + "value": 24.926244822709098, + "x": "x_7", + "y": "y_14", + }, + Object { + "rectText": 11.188848304771073, + "value": 11.188848304771073, + "x": "x_7", + "y": "y_15", + }, + Object { + "rectText": 14.509555473536986, + "value": 14.509555473536986, + "x": "x_7", + "y": "y_16", + }, + Object { + "rectText": 23.629750932895455, + "value": 23.629750932895455, + "x": "x_7", + "y": "y_17", + }, + Object { + "rectText": 27.496822437992087, + "value": 27.496822437992087, + "x": "x_7", + "y": "y_18", + }, + Object { + "rectText": 18.290237353501528, + "value": 18.290237353501528, + "x": "x_7", + "y": "y_19", + }, + Object { + "rectText": 14.378243279399832, + "value": 14.378243279399832, + "x": "x_8", + "y": "y_0", + }, + Object { + "rectText": 15.862814449470617, + "value": 15.862814449470617, + "x": "x_8", + "y": "y_1", + }, + Object { + "rectText": 20.621055215762404, + "value": 20.621055215762404, + "x": "x_8", + "y": "y_2", + }, + Object { + "rectText": 27.310374393715577, + "value": 27.310374393715577, + "x": "x_8", + "y": "y_3", + }, + Object { + "rectText": 27.376076996458107, + "value": 27.376076996458107, + "x": "x_8", + "y": "y_4", + }, + Object { + "rectText": 25.966261645863177, + "value": 25.966261645863177, + "x": "x_8", + "y": "y_5", + }, + Object { + "rectText": 25.710457133039732, + "value": 25.710457133039732, + "x": "x_8", + "y": "y_6", + }, + Object { + "rectText": 30.992785862263872, + "value": 30.992785862263872, + "x": "x_8", + "y": "y_7", + }, + Object { + "rectText": 37.22474246115934, + "value": 37.22474246115934, + "x": "x_8", + "y": "y_8", + }, + Object { + "rectText": 44.65189694360409, + "value": 44.65189694360409, + "x": "x_8", + "y": "y_9", + }, + Object { + "rectText": 50.90620858214391, + "value": 50.90620858214391, + "x": "x_8", + "y": "y_10", + }, + Object { + "rectText": 54.790476948309696, + "value": 54.790476948309696, + "x": "x_8", + "y": "y_11", + }, + Object { + "rectText": 47.138525452751004, + "value": 47.138525452751004, + "x": "x_8", + "y": "y_12", + }, + Object { + "rectText": 48.543398737558654, + "value": 48.543398737558654, + "x": "x_8", + "y": "y_13", + }, + Object { + "rectText": 41.22820882460708, + "value": 41.22820882460708, + "x": "x_8", + "y": "y_14", + }, + Object { + "rectText": 43.30138646653476, + "value": 43.30138646653476, + "x": "x_8", + "y": "y_15", + }, + Object { + "rectText": 43.57067434580797, + "value": 43.57067434580797, + "x": "x_8", + "y": "y_16", + }, + Object { + "rectText": 41.77269087492713, + "value": 41.77269087492713, + "x": "x_8", + "y": "y_17", + }, + Object { + "rectText": 42.223038572972655, + "value": 42.223038572972655, + "x": "x_8", + "y": "y_18", + }, + Object { + "rectText": 44.04246479548906, + "value": 44.04246479548906, + "x": "x_8", + "y": "y_19", + }, + Object { + "rectText": 9.546437633051273, + "value": 9.546437633051273, + "x": "x_9", + "y": "y_0", + }, + Object { + "rectText": 20.517302217015732, + "value": 20.517302217015732, + "x": "x_9", + "y": "y_1", + }, + Object { + "rectText": 18.321563171124787, + "value": 18.321563171124787, + "x": "x_9", + "y": "y_2", + }, + Object { + "rectText": 15.451738777747869, + "value": 15.451738777747869, + "x": "x_9", + "y": "y_3", + }, + Object { + "rectText": 10.416788406228507, + "value": 10.416788406228507, + "x": "x_9", + "y": "y_4", + }, + Object { + "rectText": 0.9043901831061678, + "value": 0.9043901831061678, + "x": "x_9", + "y": "y_5", + }, + Object { + "rectText": 2.2251747151953722, + "value": 2.2251747151953722, + "x": "x_9", + "y": "y_6", + }, + Object { + "rectText": 0.3821317782171232, + "value": 0.3821317782171232, + "x": "x_9", + "y": "y_7", + }, + Object { + "rectText": 0.22091049853526112, + "value": 0.22091049853526112, + "x": "x_9", + "y": "y_8", + }, + Object { + "rectText": -3.233129329636757, + "value": -3.233129329636757, + "x": "x_9", + "y": "y_9", + }, + Object { + "rectText": -4.123416917882673, + "value": -4.123416917882673, + "x": "x_9", + "y": "y_10", + }, + Object { + "rectText": -1.1319446806674005, + "value": -1.1319446806674005, + "x": "x_9", + "y": "y_11", + }, + Object { + "rectText": -2.533067604753474, + "value": -2.533067604753474, + "x": "x_9", + "y": "y_12", + }, + Object { + "rectText": 3.274578409778302, + "value": 3.274578409778302, + "x": "x_9", + "y": "y_13", + }, + Object { + "rectText": 4.291828909220028, + "value": 4.291828909220028, + "x": "x_9", + "y": "y_14", + }, + Object { + "rectText": 5.000880279196099, + "value": 5.000880279196099, + "x": "x_9", + "y": "y_15", + }, + Object { + "rectText": 7.890650307112603, + "value": 7.890650307112603, + "x": "x_9", + "y": "y_16", + }, + Object { + "rectText": 9.082388429023517, + "value": 9.082388429023517, + "x": "x_9", + "y": "y_17", + }, + Object { + "rectText": 9.14302748045202, + "value": 9.14302748045202, + "x": "x_9", + "y": "y_18", + }, + Object { + "rectText": -0.9669084139974888, + "value": -0.9669084139974888, + "x": "x_9", + "y": "y_19", + }, + Object { + "rectText": 2.117430162487592, + "value": 2.117430162487592, + "x": "x_10", + "y": "y_0", + }, + Object { + "rectText": 1.5668378537843557, + "value": 1.5668378537843557, + "x": "x_10", + "y": "y_1", + }, + Object { + "rectText": 5.106104151848498, + "value": 5.106104151848498, + "x": "x_10", + "y": "y_2", + }, + Object { + "rectText": 6.691398648622392, + "value": 6.691398648622392, + "x": "x_10", + "y": "y_3", + }, + Object { + "rectText": 5.9545352540812, + "value": 5.9545352540812, + "x": "x_10", + "y": "y_4", + }, + Object { + "rectText": -0.6718858579700804, + "value": -0.6718858579700804, + "x": "x_10", + "y": "y_5", + }, + Object { + "rectText": -10.093623877175773, + "value": -10.093623877175773, + "x": "x_10", + "y": "y_6", + }, + Object { + "rectText": -9.481337721021028, + "value": -9.481337721021028, + "x": "x_10", + "y": "y_7", + }, + Object { + "rectText": -9.687370268531138, + "value": -9.687370268531138, + "x": "x_10", + "y": "y_8", + }, + Object { + "rectText": -11.7007015295863, + "value": -11.7007015295863, + "x": "x_10", + "y": "y_9", + }, + Object { + "rectText": -10.08874106711032, + "value": -10.08874106711032, + "x": "x_10", + "y": "y_10", + }, + Object { + "rectText": -6.836880142255078, + "value": -6.836880142255078, + "x": "x_10", + "y": "y_11", + }, + Object { + "rectText": 2.4604369987892873, + "value": 2.4604369987892873, + "x": "x_10", + "y": "y_12", + }, + Object { + "rectText": 7.640442280843416, + "value": 7.640442280843416, + "x": "x_10", + "y": "y_13", + }, + Object { + "rectText": 4.713688574820864, + "value": 4.713688574820864, + "x": "x_10", + "y": "y_14", + }, + Object { + "rectText": 1.955677009677276, + "value": 1.955677009677276, + "x": "x_10", + "y": "y_15", + }, + Object { + "rectText": 1.6731169765193206, + "value": 1.6731169765193206, + "x": "x_10", + "y": "y_16", + }, + Object { + "rectText": -6.034577415215565, + "value": -6.034577415215565, + "x": "x_10", + "y": "y_17", + }, + Object { + "rectText": -9.49672264010566, + "value": -9.49672264010566, + "x": "x_10", + "y": "y_18", + }, + Object { + "rectText": -10.02999798650989, + "value": -10.02999798650989, + "x": "x_10", + "y": "y_19", + }, + Object { + "rectText": 24.053122758748437, + "value": 24.053122758748437, + "x": "x_11", + "y": "y_0", + }, + Object { + "rectText": 19.031137709612036, + "value": 19.031137709612036, + "x": "x_11", + "y": "y_1", + }, + Object { + "rectText": 20.47764211274059, + "value": 20.47764211274059, + "x": "x_11", + "y": "y_2", + }, + Object { + "rectText": 14.55281641333698, + "value": 14.55281641333698, + "x": "x_11", + "y": "y_3", + }, + Object { + "rectText": 15.043018310072712, + "value": 15.043018310072712, + "x": "x_11", + "y": "y_4", + }, + Object { + "rectText": 2.6597070827875093, + "value": 2.6597070827875093, + "x": "x_11", + "y": "y_5", + }, + Object { + "rectText": 1.9137585062069147, + "value": 1.9137585062069147, + "x": "x_11", + "y": "y_6", + }, + Object { + "rectText": 1.6266164906990555, + "value": 1.6266164906990555, + "x": "x_11", + "y": "y_7", + }, + Object { + "rectText": 10.608534707379862, + "value": 10.608534707379862, + "x": "x_11", + "y": "y_8", + }, + Object { + "rectText": 8.768962763531919, + "value": 8.768962763531919, + "x": "x_11", + "y": "y_9", + }, + Object { + "rectText": 17.77058648507848, + "value": 17.77058648507848, + "x": "x_11", + "y": "y_10", + }, + Object { + "rectText": 15.502730715077965, + "value": 15.502730715077965, + "x": "x_11", + "y": "y_11", + }, + Object { + "rectText": 19.673236477344094, + "value": 19.673236477344094, + "x": "x_11", + "y": "y_12", + }, + Object { + "rectText": 6.615425581412669, + "value": 6.615425581412669, + "x": "x_11", + "y": "y_13", + }, + Object { + "rectText": 16.71505221410986, + "value": 16.71505221410986, + "x": "x_11", + "y": "y_14", + }, + Object { + "rectText": 17.279662785715818, + "value": 17.279662785715818, + "x": "x_11", + "y": "y_15", + }, + Object { + "rectText": 11.216733394728445, + "value": 11.216733394728445, + "x": "x_11", + "y": "y_16", + }, + Object { + "rectText": 26.401238496860607, + "value": 26.401238496860607, + "x": "x_11", + "y": "y_17", + }, + Object { + "rectText": 25.872388552562622, + "value": 25.872388552562622, + "x": "x_11", + "y": "y_18", + }, + Object { + "rectText": 26.331023176529538, + "value": 26.331023176529538, + "x": "x_11", + "y": "y_19", + }, + Object { + "rectText": 14.741753869753929, + "value": 14.741753869753929, + "x": "x_12", + "y": "y_0", + }, + Object { + "rectText": 12.133745300119848, + "value": 12.133745300119848, + "x": "x_12", + "y": "y_1", + }, + Object { + "rectText": 13.078423154116999, + "value": 13.078423154116999, + "x": "x_12", + "y": "y_2", + }, + Object { + "rectText": 31.321025344254267, + "value": 31.321025344254267, + "x": "x_12", + "y": "y_3", + }, + Object { + "rectText": 32.12573718137715, + "value": 32.12573718137715, + "x": "x_12", + "y": "y_4", + }, + Object { + "rectText": 36.093975687401766, + "value": 36.093975687401766, + "x": "x_12", + "y": "y_5", + }, + Object { + "rectText": 28.853944000537858, + "value": 28.853944000537858, + "x": "x_12", + "y": "y_6", + }, + Object { + "rectText": 20.52198483872326, + "value": 20.52198483872326, + "x": "x_12", + "y": "y_7", + }, + Object { + "rectText": 22.489367975650175, + "value": 22.489367975650175, + "x": "x_12", + "y": "y_8", + }, + Object { + "rectText": 21.48008268870696, + "value": 21.48008268870696, + "x": "x_12", + "y": "y_9", + }, + Object { + "rectText": 17.40525407651549, + "value": 17.40525407651549, + "x": "x_12", + "y": "y_10", + }, + Object { + "rectText": 16.434991284495794, + "value": 16.434991284495794, + "x": "x_12", + "y": "y_11", + }, + Object { + "rectText": 23.43582349379937, + "value": 23.43582349379937, + "x": "x_12", + "y": "y_12", + }, + Object { + "rectText": 27.520672134556655, + "value": 27.520672134556655, + "x": "x_12", + "y": "y_13", + }, + Object { + "rectText": 27.48982397761371, + "value": 27.48982397761371, + "x": "x_12", + "y": "y_14", + }, + Object { + "rectText": 26.178614647552152, + "value": 26.178614647552152, + "x": "x_12", + "y": "y_15", + }, + Object { + "rectText": 25.858459074516183, + "value": 25.858459074516183, + "x": "x_12", + "y": "y_16", + }, + Object { + "rectText": 30.051671106505943, + "value": 30.051671106505943, + "x": "x_12", + "y": "y_17", + }, + Object { + "rectText": 29.591488992612543, + "value": 29.591488992612543, + "x": "x_12", + "y": "y_18", + }, + Object { + "rectText": 23.744787277420585, + "value": 23.744787277420585, + "x": "x_12", + "y": "y_19", + }, + Object { + "rectText": 11.223068582526338, + "value": 11.223068582526338, + "x": "x_13", + "y": "y_0", + }, + Object { + "rectText": 8.724453334098921, + "value": 8.724453334098921, + "x": "x_13", + "y": "y_1", + }, + Object { + "rectText": 4.270904076038434, + "value": 4.270904076038434, + "x": "x_13", + "y": "y_2", + }, + Object { + "rectText": 9.311054030160307, + "value": 9.311054030160307, + "x": "x_13", + "y": "y_3", + }, + Object { + "rectText": 11.294834569956391, + "value": 11.294834569956391, + "x": "x_13", + "y": "y_4", + }, + Object { + "rectText": 12.79240265673884, + "value": 12.79240265673884, + "x": "x_13", + "y": "y_5", + }, + Object { + "rectText": 9.119846857537635, + "value": 9.119846857537635, + "x": "x_13", + "y": "y_6", + }, + Object { + "rectText": 9.822475957217343, + "value": 9.822475957217343, + "x": "x_13", + "y": "y_7", + }, + Object { + "rectText": 10.669348146795615, + "value": 10.669348146795615, + "x": "x_13", + "y": "y_8", + }, + Object { + "rectText": 11.750650693071353, + "value": 11.750650693071353, + "x": "x_13", + "y": "y_9", + }, + Object { + "rectText": 19.428287067763215, + "value": 19.428287067763215, + "x": "x_13", + "y": "y_10", + }, + Object { + "rectText": 20.05330736176254, + "value": 20.05330736176254, + "x": "x_13", + "y": "y_11", + }, + Object { + "rectText": 18.46461800040717, + "value": 18.46461800040717, + "x": "x_13", + "y": "y_12", + }, + Object { + "rectText": 17.13948338893387, + "value": 17.13948338893387, + "x": "x_13", + "y": "y_13", + }, + Object { + "rectText": 14.998235183145638, + "value": 14.998235183145638, + "x": "x_13", + "y": "y_14", + }, + Object { + "rectText": 21.57198989722974, + "value": 21.57198989722974, + "x": "x_13", + "y": "y_15", + }, + Object { + "rectText": 18.23274943606415, + "value": 18.23274943606415, + "x": "x_13", + "y": "y_16", + }, + Object { + "rectText": 23.834062269627154, + "value": 23.834062269627154, + "x": "x_13", + "y": "y_17", + }, + Object { + "rectText": 17.887210405056912, + "value": 17.887210405056912, + "x": "x_13", + "y": "y_18", + }, + Object { + "rectText": 21.58401811955205, + "value": 21.58401811955205, + "x": "x_13", + "y": "y_19", + }, + Object { + "rectText": 2.9058799108357736, + "value": 2.9058799108357736, + "x": "x_14", + "y": "y_0", + }, + Object { + "rectText": 8.972456038301432, + "value": 8.972456038301432, + "x": "x_14", + "y": "y_1", + }, + Object { + "rectText": 10.32885307002288, + "value": 10.32885307002288, + "x": "x_14", + "y": "y_2", + }, + Object { + "rectText": 12.004790333591908, + "value": 12.004790333591908, + "x": "x_14", + "y": "y_3", + }, + Object { + "rectText": 16.313424113247194, + "value": 16.313424113247194, + "x": "x_14", + "y": "y_4", + }, + Object { + "rectText": 16.292076219475025, + "value": 16.292076219475025, + "x": "x_14", + "y": "y_5", + }, + Object { + "rectText": 16.770107402461807, + "value": 16.770107402461807, + "x": "x_14", + "y": "y_6", + }, + Object { + "rectText": 15.658011352744083, + "value": 15.658011352744083, + "x": "x_14", + "y": "y_7", + }, + Object { + "rectText": 13.95650541886101, + "value": 13.95650541886101, + "x": "x_14", + "y": "y_8", + }, + Object { + "rectText": 10.314016323078881, + "value": 10.314016323078881, + "x": "x_14", + "y": "y_9", + }, + Object { + "rectText": 10.154808609159593, + "value": 10.154808609159593, + "x": "x_14", + "y": "y_10", + }, + Object { + "rectText": 2.3102989662620654, + "value": 2.3102989662620654, + "x": "x_14", + "y": "y_11", + }, + Object { + "rectText": 3.2513035287755745, + "value": 3.2513035287755745, + "x": "x_14", + "y": "y_12", + }, + Object { + "rectText": -0.7130168306222968, + "value": -0.7130168306222968, + "x": "x_14", + "y": "y_13", + }, + Object { + "rectText": -1.0419904618770504, + "value": -1.0419904618770504, + "x": "x_14", + "y": "y_14", + }, + Object { + "rectText": -1.3161643920050667, + "value": -1.3161643920050667, + "x": "x_14", + "y": "y_15", + }, + Object { + "rectText": -1.5424885952686824, + "value": -1.5424885952686824, + "x": "x_14", + "y": "y_16", + }, + Object { + "rectText": -3.561155588342318, + "value": -3.561155588342318, + "x": "x_14", + "y": "y_17", + }, + Object { + "rectText": -5.273287251587566, + "value": -5.273287251587566, + "x": "x_14", + "y": "y_18", + }, + Object { + "rectText": -5.054619683005746, + "value": -5.054619683005746, + "x": "x_14", + "y": "y_19", + }, + Object { + "rectText": 12.523922839169199, + "value": 12.523922839169199, + "x": "x_15", + "y": "y_0", + }, + Object { + "rectText": 9.771921362871048, + "value": 9.771921362871048, + "x": "x_15", + "y": "y_1", + }, + Object { + "rectText": 11.953280688550777, + "value": 11.953280688550777, + "x": "x_15", + "y": "y_2", + }, + Object { + "rectText": 13.059625413572078, + "value": 13.059625413572078, + "x": "x_15", + "y": "y_3", + }, + Object { + "rectText": 15.444451104553893, + "value": 15.444451104553893, + "x": "x_15", + "y": "y_4", + }, + Object { + "rectText": 13.792475502830154, + "value": 13.792475502830154, + "x": "x_15", + "y": "y_5", + }, + Object { + "rectText": 7.3577813910229235, + "value": 7.3577813910229235, + "x": "x_15", + "y": "y_6", + }, + Object { + "rectText": 12.855391500184762, + "value": 12.855391500184762, + "x": "x_15", + "y": "y_7", + }, + Object { + "rectText": 6.839552569406474, + "value": 6.839552569406474, + "x": "x_15", + "y": "y_8", + }, + Object { + "rectText": 6.044971885000999, + "value": 6.044971885000999, + "x": "x_15", + "y": "y_9", + }, + Object { + "rectText": 9.41560200751194, + "value": 9.41560200751194, + "x": "x_15", + "y": "y_10", + }, + Object { + "rectText": 6.6400837474901095, + "value": 6.6400837474901095, + "x": "x_15", + "y": "y_11", + }, + Object { + "rectText": 7.4638277204597046, + "value": 7.4638277204597046, + "x": "x_15", + "y": "y_12", + }, + Object { + "rectText": 3.4923248627721257, + "value": 3.4923248627721257, + "x": "x_15", + "y": "y_13", + }, + Object { + "rectText": -0.1509352342460648, + "value": -0.1509352342460648, + "x": "x_15", + "y": "y_14", + }, + Object { + "rectText": -9.439334496282449, + "value": -9.439334496282449, + "x": "x_15", + "y": "y_15", + }, + Object { + "rectText": -9.408565254995368, + "value": -9.408565254995368, + "x": "x_15", + "y": "y_16", + }, + Object { + "rectText": -10.717340944667358, + "value": -10.717340944667358, + "x": "x_15", + "y": "y_17", + }, + Object { + "rectText": -12.231659074097587, + "value": -12.231659074097587, + "x": "x_15", + "y": "y_18", + }, + Object { + "rectText": -12.304220941049874, + "value": -12.304220941049874, + "x": "x_15", + "y": "y_19", + }, + Object { + "rectText": 12.426446278371158, + "value": 12.426446278371158, + "x": "x_16", + "y": "y_0", + }, + Object { + "rectText": 4.761205803361531, + "value": 4.761205803361531, + "x": "x_16", + "y": "y_1", + }, + Object { + "rectText": 1.5514493835400103, + "value": 1.5514493835400103, + "x": "x_16", + "y": "y_2", + }, + Object { + "rectText": 10.25485330260371, + "value": 10.25485330260371, + "x": "x_16", + "y": "y_3", + }, + Object { + "rectText": 10.443516068409753, + "value": 10.443516068409753, + "x": "x_16", + "y": "y_4", + }, + Object { + "rectText": 9.90068532879486, + "value": 9.90068532879486, + "x": "x_16", + "y": "y_5", + }, + Object { + "rectText": 5.875139865786533, + "value": 5.875139865786533, + "x": "x_16", + "y": "y_6", + }, + Object { + "rectText": 10.723957376497331, + "value": 10.723957376497331, + "x": "x_16", + "y": "y_7", + }, + Object { + "rectText": 2.066756467090924, + "value": 2.066756467090924, + "x": "x_16", + "y": "y_8", + }, + Object { + "rectText": 0.39568846222827236, + "value": 0.39568846222827236, + "x": "x_16", + "y": "y_9", + }, + Object { + "rectText": 1.9106824056688325, + "value": 1.9106824056688325, + "x": "x_16", + "y": "y_10", + }, + Object { + "rectText": 3.4554008460006247, + "value": 3.4554008460006247, + "x": "x_16", + "y": "y_11", + }, + Object { + "rectText": 5.836414662127938, + "value": 5.836414662127938, + "x": "x_16", + "y": "y_12", + }, + Object { + "rectText": 10.663420634170265, + "value": 10.663420634170265, + "x": "x_16", + "y": "y_13", + }, + Object { + "rectText": 11.562765259884168, + "value": 11.562765259884168, + "x": "x_16", + "y": "y_14", + }, + Object { + "rectText": 18.312638310718047, + "value": 18.312638310718047, + "x": "x_16", + "y": "y_15", + }, + Object { + "rectText": 24.78142561950699, + "value": 24.78142561950699, + "x": "x_16", + "y": "y_16", + }, + Object { + "rectText": 25.98741506616426, + "value": 25.98741506616426, + "x": "x_16", + "y": "y_17", + }, + Object { + "rectText": 25.21878307435221, + "value": 25.21878307435221, + "x": "x_16", + "y": "y_18", + }, + Object { + "rectText": 22.0278850405599, + "value": 22.0278850405599, + "x": "x_16", + "y": "y_19", + }, + Object { + "rectText": 15.786820017213348, + "value": 15.786820017213348, + "x": "x_17", + "y": "y_0", + }, + Object { + "rectText": 23.82727745555418, + "value": 23.82727745555418, + "x": "x_17", + "y": "y_1", + }, + Object { + "rectText": 28.102083355215736, + "value": 28.102083355215736, + "x": "x_17", + "y": "y_2", + }, + Object { + "rectText": 29.181400631242038, + "value": 29.181400631242038, + "x": "x_17", + "y": "y_3", + }, + Object { + "rectText": 33.07558322142471, + "value": 33.07558322142471, + "x": "x_17", + "y": "y_4", + }, + Object { + "rectText": 36.74806639404701, + "value": 36.74806639404701, + "x": "x_17", + "y": "y_5", + }, + Object { + "rectText": 39.12143717188403, + "value": 39.12143717188403, + "x": "x_17", + "y": "y_6", + }, + Object { + "rectText": 41.76485494373556, + "value": 41.76485494373556, + "x": "x_17", + "y": "y_7", + }, + Object { + "rectText": 54.581934085152405, + "value": 54.581934085152405, + "x": "x_17", + "y": "y_8", + }, + Object { + "rectText": 56.79992555682459, + "value": 56.79992555682459, + "x": "x_17", + "y": "y_9", + }, + Object { + "rectText": 55.50321452563245, + "value": 55.50321452563245, + "x": "x_17", + "y": "y_10", + }, + Object { + "rectText": 54.703320294165096, + "value": 54.703320294165096, + "x": "x_17", + "y": "y_11", + }, + Object { + "rectText": 63.63736027633095, + "value": 63.63736027633095, + "x": "x_17", + "y": "y_12", + }, + Object { + "rectText": 62.79712211239938, + "value": 62.79712211239938, + "x": "x_17", + "y": "y_13", + }, + Object { + "rectText": 54.381939331520186, + "value": 54.381939331520186, + "x": "x_17", + "y": "y_14", + }, + Object { + "rectText": 54.77270799612626, + "value": 54.77270799612626, + "x": "x_17", + "y": "y_15", + }, + Object { + "rectText": 55.72892300395096, + "value": 55.72892300395096, + "x": "x_17", + "y": "y_16", + }, + Object { + "rectText": 55.13836837404197, + "value": 55.13836837404197, + "x": "x_17", + "y": "y_17", + }, + Object { + "rectText": 55.4498407189013, + "value": 55.4498407189013, + "x": "x_17", + "y": "y_18", + }, + Object { + "rectText": 68.76140423378733, + "value": 68.76140423378733, + "x": "x_17", + "y": "y_19", + }, + Object { + "rectText": 25.828355052498736, + "value": 25.828355052498736, + "x": "x_18", + "y": "y_0", + }, + Object { + "rectText": 14.369250386770794, + "value": 14.369250386770794, + "x": "x_18", + "y": "y_1", + }, + Object { + "rectText": 11.122082151320692, + "value": 11.122082151320692, + "x": "x_18", + "y": "y_2", + }, + Object { + "rectText": 17.203123079730577, + "value": 17.203123079730577, + "x": "x_18", + "y": "y_3", + }, + Object { + "rectText": 22.67825393852671, + "value": 22.67825393852671, + "x": "x_18", + "y": "y_4", + }, + Object { + "rectText": 26.577346684827898, + "value": 26.577346684827898, + "x": "x_18", + "y": "y_5", + }, + Object { + "rectText": 1.341905660672623, + "value": 1.341905660672623, + "x": "x_18", + "y": "y_6", + }, + Object { + "rectText": 2.2340479176319485, + "value": 2.2340479176319485, + "x": "x_18", + "y": "y_7", + }, + Object { + "rectText": 3.5319443821756225, + "value": 3.5319443821756225, + "x": "x_18", + "y": "y_8", + }, + Object { + "rectText": 9.686881597266042, + "value": 9.686881597266042, + "x": "x_18", + "y": "y_9", + }, + Object { + "rectText": -1.086930629298445, + "value": -1.086930629298445, + "x": "x_18", + "y": "y_10", + }, + Object { + "rectText": -3.275155410653531, + "value": -3.275155410653531, + "x": "x_18", + "y": "y_11", + }, + Object { + "rectText": -2.3182235215935463, + "value": -2.3182235215935463, + "x": "x_18", + "y": "y_12", + }, + Object { + "rectText": -7.102421907260435, + "value": -7.102421907260435, + "x": "x_18", + "y": "y_13", + }, + Object { + "rectText": -15.369316543252658, + "value": -15.369316543252658, + "x": "x_18", + "y": "y_14", + }, + Object { + "rectText": -13.618633943842825, + "value": -13.618633943842825, + "x": "x_18", + "y": "y_15", + }, + Object { + "rectText": -6.132435488791322, + "value": -6.132435488791322, + "x": "x_18", + "y": "y_16", + }, + Object { + "rectText": -12.222227236438126, + "value": -12.222227236438126, + "x": "x_18", + "y": "y_17", + }, + Object { + "rectText": -16.160855914516, + "value": -16.160855914516, + "x": "x_18", + "y": "y_18", + }, + Object { + "rectText": -11.104838839030073, + "value": -11.104838839030073, + "x": "x_18", + "y": "y_19", + }, + Object { + "rectText": 15.884458175971286, + "value": 15.884458175971286, + "x": "x_19", + "y": "y_0", + }, + Object { + "rectText": 9.730029718884163, + "value": 9.730029718884163, + "x": "x_19", + "y": "y_1", + }, + Object { + "rectText": 17.271525748515398, + "value": 17.271525748515398, + "x": "x_19", + "y": "y_2", + }, + Object { + "rectText": 15.96262678993938, + "value": 15.96262678993938, + "x": "x_19", + "y": "y_3", + }, + Object { + "rectText": 14.910979364805373, + "value": 14.910979364805373, + "x": "x_19", + "y": "y_4", + }, + Object { + "rectText": 16.005211030243927, + "value": 16.005211030243927, + "x": "x_19", + "y": "y_5", + }, + Object { + "rectText": 16.777803239858564, + "value": 16.777803239858564, + "x": "x_19", + "y": "y_6", + }, + Object { + "rectText": 16.088953253894616, + "value": 16.088953253894616, + "x": "x_19", + "y": "y_7", + }, + Object { + "rectText": 24.532968918280666, + "value": 24.532968918280666, + "x": "x_19", + "y": "y_8", + }, + Object { + "rectText": 29.573837224244713, + "value": 29.573837224244713, + "x": "x_19", + "y": "y_9", + }, + Object { + "rectText": 29.942519927990794, + "value": 29.942519927990794, + "x": "x_19", + "y": "y_10", + }, + Object { + "rectText": 34.69783250602105, + "value": 34.69783250602105, + "x": "x_19", + "y": "y_11", + }, + Object { + "rectText": 28.362102774855607, + "value": 28.362102774855607, + "x": "x_19", + "y": "y_12", + }, + Object { + "rectText": 25.96909143426486, + "value": 25.96909143426486, + "x": "x_19", + "y": "y_13", + }, + Object { + "rectText": 25.018616836414115, + "value": 25.018616836414115, + "x": "x_19", + "y": "y_14", + }, + Object { + "rectText": 34.04601203745518, + "value": 34.04601203745518, + "x": "x_19", + "y": "y_15", + }, + Object { + "rectText": 32.12418971970468, + "value": 32.12418971970468, + "x": "x_19", + "y": "y_16", + }, + Object { + "rectText": 30.768724196434682, + "value": 30.768724196434682, + "x": "x_19", + "y": "y_17", + }, + Object { + "rectText": 32.26936734704534, + "value": 32.26936734704534, + "x": "x_19", + "y": "y_18", + }, + Object { + "rectText": 32.93901719565705, + "value": 32.93901719565705, + "x": "x_19", + "y": "y_19", + }, + ], + "legend": "", + "value": 0, + }, + ], + "domainValuesForColorScale": Array [ + -16.160855914516, + -6.8876661903012195, + 2.3855235339135596, + 11.65871325812834, + 20.931902982343118, + 30.2050927065579, + 39.47828243077268, + 48.75147215498746, + 58.024661879202235, + 67.29785160341703, + 76.5710413276318, + ], + "hideLegend": true, + "rangeValuesForColorScale": Array [ + "rgb(158,1,66)", + "rgb(213,62,79)", + "rgb(244,109,67)", + "rgb(253,174,97)", + "rgb(254,224,139)", + "rgb(255,255,191)", + "rgb(230,245,152)", + "rgb(171,221,164)", + "rgb(102,194,165)", + "rgb(50,136,189)", + "rgb(94,79,162)", + ], + "showYAxisLables": true, + "sortOrder": "none", + "xAxisTitle": "", + "yAxisTitle": "", +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToHorizontalBarWithAxisProps - Should return HBC with axis chart props 1`] = ` +Object { + "barHeight": 12.662117371807371, + "chartTitle": "PHP Framework Popularity at Work - SitePoint, 2015", + "data": Array [ + Object { + "color": "#cf87da", + "legend": "Laravel", + "x": 1659, + "y": "Laravel", + }, + Object { + "color": "#dac157", + "legend": "Symfony2", + "x": 1067, + "y": "Symfony2", + }, + Object { + "color": "#637cef", + "legend": "Nette", + "x": 671, + "y": "Nette", + }, + Object { + "color": "#e3008c", + "legend": "CodeIgniter", + "x": 597, + "y": "CodeIgniter", + }, + Object { + "color": "#2aa0a4", + "legend": "Yii 2", + "x": 504, + "y": "Yii 2", + }, + Object { + "color": "#9373c0", + "legend": "PHPixie", + "x": 418, + "y": "PHPixie", + }, + Object { + "color": "#13a10e", + "legend": "Yii 1", + "x": 407, + "y": "Yii 1", + }, + Object { + "color": "#3a96dd", + "legend": "Zend Framework 2", + "x": 390, + "y": "Zend Framework 2", + }, + Object { + "color": "#ca5010", + "legend": "Company Internal Framework", + "x": 378, + "y": "Company Internal Framework", + }, + Object { + "color": "#57811b", + "legend": "Zend Framework 1", + "x": 274, + "y": "Zend Framework 1", + }, + Object { + "color": "#b146c2", + "legend": "CakePHP", + "x": 255, + "y": "CakePHP", + }, + Object { + "color": "#ae8c00", + "legend": "No Framework", + "x": 243, + "y": "No Framework", + }, + Object { + "color": "#93a4f4", + "legend": "We use a CMS for everything", + "x": 203, + "y": "We use a CMS for everything", + }, + Object { + "color": "#ee5fb7", + "legend": "Phalcon", + "x": 169, + "y": "Phalcon", + }, + Object { + "color": "#4cb4b7", + "legend": "Slim", + "x": 79, + "y": "Slim", + }, + Object { + "color": "#a083c9", + "legend": "Silex", + "x": 65, + "y": "Silex", + }, + Object { + "color": "#27ac22", + "legend": "Simple MVC Framework", + "x": 42, + "y": "Simple MVC Framework", + }, + Object { + "color": "#4fa1e1", + "legend": "Typo 3", + "x": 35, + "y": "Typo 3", + }, + Object { + "color": "#d77440", + "legend": "Kohana", + "x": 35, + "y": "Kohana", + }, + Object { + "color": "#73aa24", + "legend": "FuelPHP", + "x": 25, + "y": "FuelPHP", + }, + Object { + "color": "#c36bd1", + "legend": "TYPO3 Flow", + "x": 17, + "y": "TYPO3 Flow", + }, + Object { + "color": "#d0b232", + "legend": "Drupal", + "x": 11, + "y": "Drupal", + }, + Object { + "color": "#4f6bed", + "legend": "Aura", + "x": 10, + "y": "Aura", + }, + ], + "secondaryYAxistitle": "", + "showYAxisLables": true, + "styles": Object { + "root": Object { + "height": 742, + "width": 850, + }, + }, + "xAxisTitle": "Votes", + "yAxisTitle": "Framework", +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToSankeyProps - Should return sankey chart props 1`] = ` +Object { + "data": Object { + "SankeyChartData": Object { + "links": Array [ + Object { + "source": 0, + "target": 5, + "value": 20, + }, + Object { + "source": 0, + "target": 6, + "value": 3, + }, + Object { + "source": 0, + "target": 7, + "value": 5, + }, + Object { + "source": 1, + "target": 5, + "value": 14, + }, + Object { + "source": 1, + "target": 6, + "value": 1, + }, + Object { + "source": 1, + "target": 7, + "value": 1, + }, + Object { + "source": 2, + "target": 5, + "value": 3, + }, + Object { + "source": 2, + "target": 6, + "value": 17, + }, + Object { + "source": 2, + "target": 7, + "value": 2, + }, + Object { + "source": 3, + "target": 5, + "value": 3, + }, + Object { + "source": 3, + "target": 6, + "value": 9, + }, + Object { + "source": 3, + "target": 7, + "value": 2, + }, + Object { + "source": 4, + "target": 5, + "value": 5, + }, + Object { + "source": 4, + "target": 6, + "value": 9, + }, + Object { + "source": 4, + "target": 7, + "value": 8, + }, + ], + "nodes": Array [ + Object { + "color": "#ea38a6", + "name": "Remain+No – 28", + "nodeId": 0, + }, + Object { + "color": "#038387", + "name": "Leave+No – 16", + "nodeId": 1, + }, + Object { + "color": "#8764b8", + "name": "Remain+Yes – 21", + "nodeId": 2, + }, + Object { + "color": "#11910d", + "name": "Leave+Yes – 14", + "nodeId": 3, + }, + Object { + "color": "#3487c7", + "name": "Didn’t vote in at least one referendum – 21", + "nodeId": 4, + }, + Object { + "color": "#d06228", + "name": "46 – No", + "nodeId": 5, + }, + Object { + "color": "#689920", + "name": "39 – Yes", + "nodeId": 6, + }, + Object { + "color": "#ba58c9", + "name": "14 – Don’t know / would not vote", + "nodeId": 7, + }, + ], + }, + "chartTitle": "Scottish Referendum Voters who now want Independence", + }, + "enableReflow": true, + "height": 772, + "shouldResize": 1212, + "styles": Object { + "root": Object { + "fontSize": 10, + }, + }, + "width": 440, +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToScatterChartProps - Should return area chart props 1`] = ` +Object { + "data": Object { + "chartTitle": "", + "lineChartData": Array [ + Object { + "color": "#f7adda", + "data": Array [ + Object { + "x": 0, + "y": 0.17048910089864067, + }, + Object { + "x": 1, + "y": 0.05390702725063046, + }, + Object { + "x": 2, + "y": 0.7560889217240573, + }, + Object { + "x": 3, + "y": 0.7393313216390578, + }, + Object { + "x": 4, + "y": 0.7562979443674754, + }, + Object { + "x": 5, + "y": 0.983908108492343, + }, + Object { + "x": 6, + "y": 0.4552096139092071, + }, + Object { + "x": 7, + "y": 0.751939393026647, + }, + Object { + "x": 8, + "y": 0.42441695150031034, + }, + Object { + "x": 9, + "y": 0.6119820237450841, + }, + ], + "legend": "a", + }, + Object { + "color": "#9bd9db", + "data": Array [ + Object { + "x": 0, + "y": 1.0921498980687505, + }, + Object { + "x": 1, + "y": 0.628379692444796, + }, + Object { + "x": 2, + "y": 1.6804387333467445, + }, + Object { + "x": 3, + "y": 1.1741874271317159, + }, + Object { + "x": 4, + "y": 1.7098535938519392, + }, + Object { + "x": 5, + "y": 1.0165440369832146, + }, + Object { + "x": 6, + "y": 0.8201578488720772, + }, + Object { + "x": 7, + "y": 1.019179653143562, + }, + Object { + "x": 8, + "y": 0.5391840333768539, + }, + Object { + "x": 9, + "y": 0.9023036941696878, + }, + ], + "legend": "b", + }, + Object { + "color": "#b29ad4", + "data": Array [ + Object { + "x": 0, + "y": 1.5084498776097979, + }, + Object { + "x": 1, + "y": 1.0993096327196032, + }, + Object { + "x": 2, + "y": 2.5468884763826125, + }, + Object { + "x": 3, + "y": 1.3139261978658, + }, + Object { + "x": 4, + "y": 1.7288516603693358, + }, + Object { + "x": 5, + "y": 1.3500413551768342, + }, + Object { + "x": 6, + "y": 1.4111774146124456, + }, + Object { + "x": 7, + "y": 1.1245312639069405, + }, + Object { + "x": 8, + "y": 1.4068617318281056, + }, + Object { + "x": 9, + "y": 0.9236499701488171, + }, + ], + "legend": "c", + }, + Object { + "color": "#a4cc6c", + "data": Array [ + Object { + "x": 0, + "y": 1.912915766078795, + }, + Object { + "x": 1, + "y": 1.6450103381519354, + }, + Object { + "x": 2, + "y": 3.523866933241722, + }, + Object { + "x": 3, + "y": 1.656799203492564, + }, + Object { + "x": 4, + "y": 2.666064160881149, + }, + Object { + "x": 5, + "y": 2.2985767814076814, + }, + Object { + "x": 6, + "y": 1.6491300653173326, + }, + Object { + "x": 7, + "y": 1.2880873970749964, + }, + Object { + "x": 8, + "y": 2.192375146193222, + }, + Object { + "x": 9, + "y": 1.6271909616796654, + }, + ], + "legend": "d", + }, + ], + }, + "supportNegativeData": true, + "xAxisTitle": "", + "yAxisTitle": "", +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToScatterChartProps - Should return line chart props 1`] = ` +Object { + "data": Object { + "chartTitle": "", + "lineChartData": Array [ + Object { + "color": "#a7e3a5", + "data": Array [ + Object { + "x": 2015-01-01T00:00:00.000Z, + "y": 0.5353935439391206, + }, + Object { + "x": 2015-01-02T00:00:00.000Z, + "y": -0.3510205670171982, + }, + Object { + "x": 2015-01-03T00:00:00.000Z, + "y": -1.3420793330744663, + }, + Object { + "x": 2015-01-04T00:00:00.000Z, + "y": -1.683479706754631, + }, + Object { + "x": 2015-01-05T00:00:00.000Z, + "y": -2.0207368899942826, + }, + Object { + "x": 2015-01-06T00:00:00.000Z, + "y": 0.006604084375472663, + }, + Object { + "x": 2015-01-07T00:00:00.000Z, + "y": 0.8037048387382045, + }, + Object { + "x": 2015-01-08T00:00:00.000Z, + "y": 1.6685589999803645, + }, + Object { + "x": 2015-01-09T00:00:00.000Z, + "y": 1.2683547027403048, + }, + Object { + "x": 2015-01-10T00:00:00.000Z, + "y": -1.3330462677331034, + }, + Object { + "x": 2015-01-11T00:00:00.000Z, + "y": -1.8663123665480104, + }, + Object { + "x": 2015-01-12T00:00:00.000Z, + "y": -2.8051461261147357, + }, + Object { + "x": 2015-01-13T00:00:00.000Z, + "y": -4.563508055068453, + }, + Object { + "x": 2015-01-14T00:00:00.000Z, + "y": -3.7591847216910996, + }, + Object { + "x": 2015-01-15T00:00:00.000Z, + "y": -3.5134185618878746, + }, + Object { + "x": 2015-01-16T00:00:00.000Z, + "y": -5.3419268826351995, + }, + Object { + "x": 2015-01-17T00:00:00.000Z, + "y": -3.332156069299614, + }, + Object { + "x": 2015-01-18T00:00:00.000Z, + "y": -3.5678897362109545, + }, + Object { + "x": 2015-01-19T00:00:00.000Z, + "y": -3.8548236009547465, + }, + Object { + "x": 2015-01-20T00:00:00.000Z, + "y": -4.58628192762981, + }, + Object { + "x": 2015-01-21T00:00:00.000Z, + "y": -4.116554826788904, + }, + Object { + "x": 2015-01-22T00:00:00.000Z, + "y": -2.7610003378381496, + }, + Object { + "x": 2015-01-23T00:00:00.000Z, + "y": -2.621859111953831, + }, + Object { + "x": 2015-01-24T00:00:00.000Z, + "y": -2.6349689848833315, + }, + Object { + "x": 2015-01-25T00:00:00.000Z, + "y": -2.0581142585936076, + }, + Object { + "x": 2015-01-26T00:00:00.000Z, + "y": -0.7744078058377932, + }, + Object { + "x": 2015-01-27T00:00:00.000Z, + "y": 0.9002451055355818, + }, + Object { + "x": 2015-01-28T00:00:00.000Z, + "y": 0.8373590393039949, + }, + Object { + "x": 2015-01-29T00:00:00.000Z, + "y": 0.5532093840234236, + }, + Object { + "x": 2015-01-30T00:00:00.000Z, + "y": 1.469976651890828, + }, + Object { + "x": 2015-01-31T00:00:00.000Z, + "y": 3.1860367266233904, + }, + Object { + "x": 2015-02-01T00:00:00.000Z, + "y": 2.493612510772345, + }, + Object { + "x": 2015-02-02T00:00:00.000Z, + "y": 1.9464391258267615, + }, + Object { + "x": 2015-02-03T00:00:00.000Z, + "y": 1.8807283125005585, + }, + Object { + "x": 2015-02-04T00:00:00.000Z, + "y": 3.0189402685173534, + }, + Object { + "x": 2015-02-05T00:00:00.000Z, + "y": 4.556005864163605, + }, + Object { + "x": 2015-02-06T00:00:00.000Z, + "y": 5.516442345945973, + }, + Object { + "x": 2015-02-07T00:00:00.000Z, + "y": 4.319606652282435, + }, + Object { + "x": 2015-02-08T00:00:00.000Z, + "y": 6.845756127344204, + }, + Object { + "x": 2015-02-09T00:00:00.000Z, + "y": 7.053236096270982, + }, + Object { + "x": 2015-02-10T00:00:00.000Z, + "y": 7.681494725458877, + }, + Object { + "x": 2015-02-11T00:00:00.000Z, + "y": 7.526563745782537, + }, + Object { + "x": 2015-02-12T00:00:00.000Z, + "y": 8.858342186205558, + }, + Object { + "x": 2015-02-13T00:00:00.000Z, + "y": 9.021889375014881, + }, + Object { + "x": 2015-02-14T00:00:00.000Z, + "y": 8.209805336778926, + }, + Object { + "x": 2015-02-15T00:00:00.000Z, + "y": 9.383959972549016, + }, + Object { + "x": 2015-02-16T00:00:00.000Z, + "y": 11.195848970970625, + }, + Object { + "x": 2015-02-17T00:00:00.000Z, + "y": 12.561537445362251, + }, + Object { + "x": 2015-02-18T00:00:00.000Z, + "y": 14.373511358982237, + }, + Object { + "x": 2015-02-19T00:00:00.000Z, + "y": 15.887456275652418, + }, + Object { + "x": 2015-02-20T00:00:00.000Z, + "y": 14.491455240251522, + }, + Object { + "x": 2015-02-21T00:00:00.000Z, + "y": 15.199461217404735, + }, + Object { + "x": 2015-02-22T00:00:00.000Z, + "y": 16.378844807972094, + }, + Object { + "x": 2015-02-23T00:00:00.000Z, + "y": 14.348345501207364, + }, + Object { + "x": 2015-02-24T00:00:00.000Z, + "y": 14.961597203409823, + }, + Object { + "x": 2015-02-25T00:00:00.000Z, + "y": 15.457566696478484, + }, + Object { + "x": 2015-02-26T00:00:00.000Z, + "y": 14.942769687687289, + }, + Object { + "x": 2015-02-27T00:00:00.000Z, + "y": 15.721527909780036, + }, + Object { + "x": 2015-02-28T00:00:00.000Z, + "y": 13.091278962257627, + }, + Object { + "x": 2015-03-01T00:00:00.000Z, + "y": 14.295247001092115, + }, + Object { + "x": 2015-03-02T00:00:00.000Z, + "y": 15.296655272416865, + }, + Object { + "x": 2015-03-03T00:00:00.000Z, + "y": 14.436440585461526, + }, + Object { + "x": 2015-03-04T00:00:00.000Z, + "y": 13.912453188370755, + }, + Object { + "x": 2015-03-05T00:00:00.000Z, + "y": 12.433861225213807, + }, + Object { + "x": 2015-03-06T00:00:00.000Z, + "y": 14.061345247447989, + }, + Object { + "x": 2015-03-07T00:00:00.000Z, + "y": 13.326092951912521, + }, + Object { + "x": 2015-03-08T00:00:00.000Z, + "y": 13.566974950387175, + }, + Object { + "x": 2015-03-09T00:00:00.000Z, + "y": 12.96345607653163, + }, + Object { + "x": 2015-03-10T00:00:00.000Z, + "y": 12.205278846692087, + }, + Object { + "x": 2015-03-11T00:00:00.000Z, + "y": 11.364010452431279, + }, + Object { + "x": 2015-03-12T00:00:00.000Z, + "y": 12.120962982512733, + }, + Object { + "x": 2015-03-13T00:00:00.000Z, + "y": 13.570258079014422, + }, + Object { + "x": 2015-03-14T00:00:00.000Z, + "y": 14.613857418348378, + }, + Object { + "x": 2015-03-15T00:00:00.000Z, + "y": 15.48868026864105, + }, + Object { + "x": 2015-03-16T00:00:00.000Z, + "y": 15.421250297066777, + }, + Object { + "x": 2015-03-17T00:00:00.000Z, + "y": 16.562957844203055, + }, + Object { + "x": 2015-03-18T00:00:00.000Z, + "y": 16.365666723485436, + }, + Object { + "x": 2015-03-19T00:00:00.000Z, + "y": 15.848038393086913, + }, + Object { + "x": 2015-03-20T00:00:00.000Z, + "y": 16.170083705874156, + }, + Object { + "x": 2015-03-21T00:00:00.000Z, + "y": 16.446617416519754, + }, + Object { + "x": 2015-03-22T00:00:00.000Z, + "y": 15.024371154281331, + }, + Object { + "x": 2015-03-23T00:00:00.000Z, + "y": 14.802238239296665, + }, + Object { + "x": 2015-03-24T00:00:00.000Z, + "y": 13.156751496135007, + }, + Object { + "x": 2015-03-25T00:00:00.000Z, + "y": 14.06168725142282, + }, + Object { + "x": 2015-03-26T00:00:00.000Z, + "y": 14.94588113322983, + }, + Object { + "x": 2015-03-27T00:00:00.000Z, + "y": 14.127589669913032, + }, + Object { + "x": 2015-03-28T00:00:00.000Z, + "y": 13.885898170515487, + }, + Object { + "x": 2015-03-29T00:00:00.000Z, + "y": 13.692030694564533, + }, + Object { + "x": 2015-03-30T00:00:00.000Z, + "y": 14.943253908206318, + }, + Object { + "x": 2015-03-31T00:00:00.000Z, + "y": 14.529368596515058, + }, + Object { + "x": 2015-04-01T00:00:00.000Z, + "y": 14.661473471114782, + }, + Object { + "x": 2015-04-02T00:00:00.000Z, + "y": 13.67375983483632, + }, + Object { + "x": 2015-04-03T00:00:00.000Z, + "y": 13.382284458918326, + }, + Object { + "x": 2015-04-04T00:00:00.000Z, + "y": 12.527287002966496, + }, + Object { + "x": 2015-04-05T00:00:00.000Z, + "y": 12.767994473001014, + }, + Object { + "x": 2015-04-06T00:00:00.000Z, + "y": 12.651030056419879, + }, + Object { + "x": 2015-04-07T00:00:00.000Z, + "y": 12.141617852418765, + }, + Object { + "x": 2015-04-08T00:00:00.000Z, + "y": 13.606694447410502, + }, + Object { + "x": 2015-04-09T00:00:00.000Z, + "y": 13.923089943159189, + }, + Object { + "x": 2015-04-10T00:00:00.000Z, + "y": 14.003348672865656, + }, + ], + "legend": "Trace 0", + }, + Object { + "color": "#83bdeb", + "data": Array [ + Object { + "x": 2015-01-01T00:00:00.000Z, + "y": -2.58404773330316, + }, + Object { + "x": 2015-01-02T00:00:00.000Z, + "y": -1.9162964761259451, + }, + Object { + "x": 2015-01-03T00:00:00.000Z, + "y": -1.8899798841571565, + }, + Object { + "x": 2015-01-04T00:00:00.000Z, + "y": -1.098466181069551, + }, + Object { + "x": 2015-01-05T00:00:00.000Z, + "y": -1.2161136413159992, + }, + Object { + "x": 2015-01-06T00:00:00.000Z, + "y": -0.9298011508867184, + }, + Object { + "x": 2015-01-07T00:00:00.000Z, + "y": -2.5216450120142193, + }, + Object { + "x": 2015-01-08T00:00:00.000Z, + "y": -1.5547013224314532, + }, + Object { + "x": 2015-01-09T00:00:00.000Z, + "y": -3.1293219775443117, + }, + Object { + "x": 2015-01-10T00:00:00.000Z, + "y": -2.7232351981528025, + }, + Object { + "x": 2015-01-11T00:00:00.000Z, + "y": -1.704449229625379, + }, + Object { + "x": 2015-01-12T00:00:00.000Z, + "y": -1.2702366750752472, + }, + Object { + "x": 2015-01-13T00:00:00.000Z, + "y": -1.7688923656442583, + }, + Object { + "x": 2015-01-14T00:00:00.000Z, + "y": -1.9810878959630682, + }, + Object { + "x": 2015-01-15T00:00:00.000Z, + "y": -1.0881359248000217, + }, + Object { + "x": 2015-01-16T00:00:00.000Z, + "y": -0.5214761704035035, + }, + Object { + "x": 2015-01-17T00:00:00.000Z, + "y": -0.639866394654719, + }, + Object { + "x": 2015-01-18T00:00:00.000Z, + "y": -2.258513886233204, + }, + Object { + "x": 2015-01-19T00:00:00.000Z, + "y": -0.8711892253875131, + }, + Object { + "x": 2015-01-20T00:00:00.000Z, + "y": -0.45426547393253053, + }, + Object { + "x": 2015-01-21T00:00:00.000Z, + "y": -2.4076676391235785, + }, + Object { + "x": 2015-01-22T00:00:00.000Z, + "y": -2.2450025826137097, + }, + Object { + "x": 2015-01-23T00:00:00.000Z, + "y": -2.3488062397069234, + }, + Object { + "x": 2015-01-24T00:00:00.000Z, + "y": -3.2188990647525304, + }, + Object { + "x": 2015-01-25T00:00:00.000Z, + "y": -2.6042445674055594, + }, + Object { + "x": 2015-01-26T00:00:00.000Z, + "y": -2.9702468803291966, + }, + Object { + "x": 2015-01-27T00:00:00.000Z, + "y": -4.139691822816822, + }, + Object { + "x": 2015-01-28T00:00:00.000Z, + "y": -3.9967022316870042, + }, + Object { + "x": 2015-01-29T00:00:00.000Z, + "y": -4.796271521377118, + }, + Object { + "x": 2015-01-30T00:00:00.000Z, + "y": -5.244924380701339, + }, + Object { + "x": 2015-01-31T00:00:00.000Z, + "y": -6.965620503609484, + }, + Object { + "x": 2015-02-01T00:00:00.000Z, + "y": -6.430396926773768, + }, + Object { + "x": 2015-02-02T00:00:00.000Z, + "y": -5.234457265252843, + }, + Object { + "x": 2015-02-03T00:00:00.000Z, + "y": -6.181791776690352, + }, + Object { + "x": 2015-02-04T00:00:00.000Z, + "y": -7.3464387119459085, + }, + Object { + "x": 2015-02-05T00:00:00.000Z, + "y": -7.085650875056526, + }, + Object { + "x": 2015-02-06T00:00:00.000Z, + "y": -6.795217278293396, + }, + Object { + "x": 2015-02-07T00:00:00.000Z, + "y": -6.08725142043377, + }, + Object { + "x": 2015-02-08T00:00:00.000Z, + "y": -5.3416313194169875, + }, + Object { + "x": 2015-02-09T00:00:00.000Z, + "y": -4.900094995211111, + }, + Object { + "x": 2015-02-10T00:00:00.000Z, + "y": -4.715363010029477, + }, + Object { + "x": 2015-02-11T00:00:00.000Z, + "y": -3.6757033584677927, + }, + Object { + "x": 2015-02-12T00:00:00.000Z, + "y": -5.873900613367271, + }, + Object { + "x": 2015-02-13T00:00:00.000Z, + "y": -7.685787089886274, + }, + Object { + "x": 2015-02-14T00:00:00.000Z, + "y": -8.833149292574403, + }, + Object { + "x": 2015-02-15T00:00:00.000Z, + "y": -9.373517123532867, + }, + Object { + "x": 2015-02-16T00:00:00.000Z, + "y": -10.519456187180836, + }, + Object { + "x": 2015-02-17T00:00:00.000Z, + "y": -8.012082850355387, + }, + Object { + "x": 2015-02-18T00:00:00.000Z, + "y": -8.556759031756883, + }, + Object { + "x": 2015-02-19T00:00:00.000Z, + "y": -8.78527769843948, + }, + Object { + "x": 2015-02-20T00:00:00.000Z, + "y": -8.801850250864483, + }, + Object { + "x": 2015-02-21T00:00:00.000Z, + "y": -9.031427690493008, + }, + Object { + "x": 2015-02-22T00:00:00.000Z, + "y": -9.289972806031075, + }, + Object { + "x": 2015-02-23T00:00:00.000Z, + "y": -8.434541044235305, + }, + Object { + "x": 2015-02-24T00:00:00.000Z, + "y": -8.543619303217836, + }, + Object { + "x": 2015-02-25T00:00:00.000Z, + "y": -9.817816201809572, + }, + Object { + "x": 2015-02-26T00:00:00.000Z, + "y": -9.691704922707196, + }, + Object { + "x": 2015-02-27T00:00:00.000Z, + "y": -9.172230718814316, + }, + Object { + "x": 2015-02-28T00:00:00.000Z, + "y": -10.389025830978015, + }, + Object { + "x": 2015-03-01T00:00:00.000Z, + "y": -9.418276522564378, + }, + Object { + "x": 2015-03-02T00:00:00.000Z, + "y": -8.844666134378604, + }, + Object { + "x": 2015-03-03T00:00:00.000Z, + "y": -10.649699554950736, + }, + Object { + "x": 2015-03-04T00:00:00.000Z, + "y": -11.433978738990442, + }, + Object { + "x": 2015-03-05T00:00:00.000Z, + "y": -11.022214964648152, + }, + Object { + "x": 2015-03-06T00:00:00.000Z, + "y": -11.156982299530265, + }, + Object { + "x": 2015-03-07T00:00:00.000Z, + "y": -12.846500605483975, + }, + Object { + "x": 2015-03-08T00:00:00.000Z, + "y": -12.700459270895378, + }, + Object { + "x": 2015-03-09T00:00:00.000Z, + "y": -13.701718476553872, + }, + Object { + "x": 2015-03-10T00:00:00.000Z, + "y": -14.281259852458456, + }, + Object { + "x": 2015-03-11T00:00:00.000Z, + "y": -13.197701892598191, + }, + Object { + "x": 2015-03-12T00:00:00.000Z, + "y": -13.444607930505104, + }, + Object { + "x": 2015-03-13T00:00:00.000Z, + "y": -12.703127086621702, + }, + Object { + "x": 2015-03-14T00:00:00.000Z, + "y": -12.38184968649959, + }, + Object { + "x": 2015-03-15T00:00:00.000Z, + "y": -13.545422038889187, + }, + Object { + "x": 2015-03-16T00:00:00.000Z, + "y": -12.062411162554307, + }, + Object { + "x": 2015-03-17T00:00:00.000Z, + "y": -12.190051993521331, + }, + Object { + "x": 2015-03-18T00:00:00.000Z, + "y": -13.801739083658532, + }, + Object { + "x": 2015-03-19T00:00:00.000Z, + "y": -14.198265394729127, + }, + Object { + "x": 2015-03-20T00:00:00.000Z, + "y": -14.29078542197376, + }, + Object { + "x": 2015-03-21T00:00:00.000Z, + "y": -13.45263060195906, + }, + Object { + "x": 2015-03-22T00:00:00.000Z, + "y": -13.130412206893606, + }, + Object { + "x": 2015-03-23T00:00:00.000Z, + "y": -14.189794518505105, + }, + Object { + "x": 2015-03-24T00:00:00.000Z, + "y": -12.647928857811877, + }, + Object { + "x": 2015-03-25T00:00:00.000Z, + "y": -13.252175401809115, + }, + Object { + "x": 2015-03-26T00:00:00.000Z, + "y": -13.526006774399674, + }, + Object { + "x": 2015-03-27T00:00:00.000Z, + "y": -13.640567463371012, + }, + Object { + "x": 2015-03-28T00:00:00.000Z, + "y": -13.234252510186453, + }, + Object { + "x": 2015-03-29T00:00:00.000Z, + "y": -12.313307209824384, + }, + Object { + "x": 2015-03-30T00:00:00.000Z, + "y": -11.218557557877709, + }, + Object { + "x": 2015-03-31T00:00:00.000Z, + "y": -10.7821947135954, + }, + Object { + "x": 2015-04-01T00:00:00.000Z, + "y": -8.89016408336461, + }, + Object { + "x": 2015-04-02T00:00:00.000Z, + "y": -9.662631443485989, + }, + Object { + "x": 2015-04-03T00:00:00.000Z, + "y": -6.909371824212538, + }, + Object { + "x": 2015-04-04T00:00:00.000Z, + "y": -7.048202688582138, + }, + Object { + "x": 2015-04-05T00:00:00.000Z, + "y": -4.971706592042745, + }, + Object { + "x": 2015-04-06T00:00:00.000Z, + "y": -4.310618310025603, + }, + Object { + "x": 2015-04-07T00:00:00.000Z, + "y": -2.954237793688564, + }, + Object { + "x": 2015-04-08T00:00:00.000Z, + "y": -2.0883264569176156, + }, + Object { + "x": 2015-04-09T00:00:00.000Z, + "y": 1.1805740980198571, + }, + Object { + "x": 2015-04-10T00:00:00.000Z, + "y": 0.5040426644599496, + }, + ], + "legend": "Trace 1", + }, + Object { + "color": "#df8e64", + "data": Array [ + Object { + "x": 2015-01-01T00:00:00.000Z, + "y": 0.4661114764240781, + }, + Object { + "x": 2015-01-02T00:00:00.000Z, + "y": 1.0610769506804194, + }, + Object { + "x": 2015-01-03T00:00:00.000Z, + "y": 1.0620659379275244, + }, + Object { + "x": 2015-01-04T00:00:00.000Z, + "y": -0.5603096501263787, + }, + Object { + "x": 2015-01-05T00:00:00.000Z, + "y": -0.22966983294858567, + }, + Object { + "x": 2015-01-06T00:00:00.000Z, + "y": 1.1358334022099883, + }, + Object { + "x": 2015-01-07T00:00:00.000Z, + "y": 1.8697838063194905, + }, + Object { + "x": 2015-01-08T00:00:00.000Z, + "y": 1.8307593169232188, + }, + Object { + "x": 2015-01-09T00:00:00.000Z, + "y": 2.6294937170536055, + }, + Object { + "x": 2015-01-10T00:00:00.000Z, + "y": 1.456439760404607, + }, + Object { + "x": 2015-01-11T00:00:00.000Z, + "y": 3.571977139947352, + }, + Object { + "x": 2015-01-12T00:00:00.000Z, + "y": 3.305623978930223, + }, + Object { + "x": 2015-01-13T00:00:00.000Z, + "y": 4.369054542737759, + }, + Object { + "x": 2015-01-14T00:00:00.000Z, + "y": 4.134928856846778, + }, + Object { + "x": 2015-01-15T00:00:00.000Z, + "y": 2.525747905079978, + }, + Object { + "x": 2015-01-16T00:00:00.000Z, + "y": 4.45625041538837, + }, + Object { + "x": 2015-01-17T00:00:00.000Z, + "y": 5.331621195457201, + }, + Object { + "x": 2015-01-18T00:00:00.000Z, + "y": 5.01722152487662, + }, + Object { + "x": 2015-01-19T00:00:00.000Z, + "y": 3.2730061427478807, + }, + Object { + "x": 2015-01-20T00:00:00.000Z, + "y": 2.3895586625726164, + }, + Object { + "x": 2015-01-21T00:00:00.000Z, + "y": 1.5551868349111646, + }, + Object { + "x": 2015-01-22T00:00:00.000Z, + "y": 0.9222137047406664, + }, + Object { + "x": 2015-01-23T00:00:00.000Z, + "y": -0.2408476097748915, + }, + Object { + "x": 2015-01-24T00:00:00.000Z, + "y": -0.7735805458656726, + }, + Object { + "x": 2015-01-25T00:00:00.000Z, + "y": -0.8871954038346644, + }, + Object { + "x": 2015-01-26T00:00:00.000Z, + "y": -1.9822438634492547, + }, + Object { + "x": 2015-01-27T00:00:00.000Z, + "y": -0.8886612143982666, + }, + Object { + "x": 2015-01-28T00:00:00.000Z, + "y": -0.7149527896910689, + }, + Object { + "x": 2015-01-29T00:00:00.000Z, + "y": -1.1377284325144619, + }, + Object { + "x": 2015-01-30T00:00:00.000Z, + "y": -1.7585300048885872, + }, + Object { + "x": 2015-01-31T00:00:00.000Z, + "y": -2.8117170543153254, + }, + Object { + "x": 2015-02-01T00:00:00.000Z, + "y": -2.6809842525932175, + }, + Object { + "x": 2015-02-02T00:00:00.000Z, + "y": -1.6457602974924186, + }, + Object { + "x": 2015-02-03T00:00:00.000Z, + "y": -2.1361202183757593, + }, + Object { + "x": 2015-02-04T00:00:00.000Z, + "y": -3.506112394459107, + }, + Object { + "x": 2015-02-05T00:00:00.000Z, + "y": -3.338531391597358, + }, + Object { + "x": 2015-02-06T00:00:00.000Z, + "y": -5.511057758779813, + }, + Object { + "x": 2015-02-07T00:00:00.000Z, + "y": -3.5261371875358676, + }, + Object { + "x": 2015-02-08T00:00:00.000Z, + "y": -4.05255557741406, + }, + Object { + "x": 2015-02-09T00:00:00.000Z, + "y": -5.188415501615373, + }, + Object { + "x": 2015-02-10T00:00:00.000Z, + "y": -6.032557392677557, + }, + Object { + "x": 2015-02-11T00:00:00.000Z, + "y": -5.6858700345353785, + }, + Object { + "x": 2015-02-12T00:00:00.000Z, + "y": -6.667528307767753, + }, + Object { + "x": 2015-02-13T00:00:00.000Z, + "y": -6.733517550988596, + }, + Object { + "x": 2015-02-14T00:00:00.000Z, + "y": -7.0502984033473615, + }, + Object { + "x": 2015-02-15T00:00:00.000Z, + "y": -7.574898212324232, + }, + Object { + "x": 2015-02-16T00:00:00.000Z, + "y": -7.1843491903366, + }, + Object { + "x": 2015-02-17T00:00:00.000Z, + "y": -6.080355259797091, + }, + Object { + "x": 2015-02-18T00:00:00.000Z, + "y": -6.398354606750326, + }, + Object { + "x": 2015-02-19T00:00:00.000Z, + "y": -6.286331305269291, + }, + Object { + "x": 2015-02-20T00:00:00.000Z, + "y": -7.175762338255774, + }, + Object { + "x": 2015-02-21T00:00:00.000Z, + "y": -6.6277002690607105, + }, + Object { + "x": 2015-02-22T00:00:00.000Z, + "y": -6.031655281290095, + }, + Object { + "x": 2015-02-23T00:00:00.000Z, + "y": -5.243102836583583, + }, + Object { + "x": 2015-02-24T00:00:00.000Z, + "y": -4.612608200873672, + }, + Object { + "x": 2015-02-25T00:00:00.000Z, + "y": -5.180512683218164, + }, + Object { + "x": 2015-02-26T00:00:00.000Z, + "y": -5.0321319726702916, + }, + Object { + "x": 2015-02-27T00:00:00.000Z, + "y": -4.567844497333498, + }, + Object { + "x": 2015-02-28T00:00:00.000Z, + "y": -3.347239903958168, + }, + Object { + "x": 2015-03-01T00:00:00.000Z, + "y": -2.5263058621799597, + }, + Object { + "x": 2015-03-02T00:00:00.000Z, + "y": -3.554423668680612, + }, + Object { + "x": 2015-03-03T00:00:00.000Z, + "y": -1.7466537357472816, + }, + Object { + "x": 2015-03-04T00:00:00.000Z, + "y": 0.08618389027480222, + }, + Object { + "x": 2015-03-05T00:00:00.000Z, + "y": 1.0223852208396356, + }, + Object { + "x": 2015-03-06T00:00:00.000Z, + "y": 2.2260700096326724, + }, + Object { + "x": 2015-03-07T00:00:00.000Z, + "y": 2.976731277433707, + }, + Object { + "x": 2015-03-08T00:00:00.000Z, + "y": 2.5457541264066235, + }, + Object { + "x": 2015-03-09T00:00:00.000Z, + "y": 2.412842465270771, + }, + Object { + "x": 2015-03-10T00:00:00.000Z, + "y": 2.1270496073872933, + }, + Object { + "x": 2015-03-11T00:00:00.000Z, + "y": 4.350264423349324, + }, + Object { + "x": 2015-03-12T00:00:00.000Z, + "y": 3.6000820362032346, + }, + Object { + "x": 2015-03-13T00:00:00.000Z, + "y": 3.6547717673422704, + }, + Object { + "x": 2015-03-14T00:00:00.000Z, + "y": 4.29856786980301, + }, + Object { + "x": 2015-03-15T00:00:00.000Z, + "y": 4.61832134099102, + }, + Object { + "x": 2015-03-16T00:00:00.000Z, + "y": 5.1364308299997825, + }, + Object { + "x": 2015-03-17T00:00:00.000Z, + "y": 5.647209819441451, + }, + Object { + "x": 2015-03-18T00:00:00.000Z, + "y": 6.041357011724418, + }, + Object { + "x": 2015-03-19T00:00:00.000Z, + "y": 4.789997568683162, + }, + Object { + "x": 2015-03-20T00:00:00.000Z, + "y": 6.041650920258338, + }, + Object { + "x": 2015-03-21T00:00:00.000Z, + "y": 5.860878612223213, + }, + Object { + "x": 2015-03-22T00:00:00.000Z, + "y": 5.6050673038102214, + }, + Object { + "x": 2015-03-23T00:00:00.000Z, + "y": 3.900259274681964, + }, + Object { + "x": 2015-03-24T00:00:00.000Z, + "y": 2.1974477295325476, + }, + Object { + "x": 2015-03-25T00:00:00.000Z, + "y": 0.979239291658772, + }, + Object { + "x": 2015-03-26T00:00:00.000Z, + "y": 0.9769412141062032, + }, + Object { + "x": 2015-03-27T00:00:00.000Z, + "y": 1.1215546396840912, + }, + Object { + "x": 2015-03-28T00:00:00.000Z, + "y": 1.4131546401228463, + }, + Object { + "x": 2015-03-29T00:00:00.000Z, + "y": -0.5715019565360024, + }, + Object { + "x": 2015-03-30T00:00:00.000Z, + "y": -0.4798030419178908, + }, + Object { + "x": 2015-03-31T00:00:00.000Z, + "y": -0.19867316746947167, + }, + Object { + "x": 2015-04-01T00:00:00.000Z, + "y": -1.3237063703965808, + }, + Object { + "x": 2015-04-02T00:00:00.000Z, + "y": -1.5132847802948692, + }, + Object { + "x": 2015-04-03T00:00:00.000Z, + "y": -0.9466159703619573, + }, + Object { + "x": 2015-04-04T00:00:00.000Z, + "y": 1.3543877997088902, + }, + Object { + "x": 2015-04-05T00:00:00.000Z, + "y": 1.3745632832250965, + }, + Object { + "x": 2015-04-06T00:00:00.000Z, + "y": 1.2843024279329955, + }, + Object { + "x": 2015-04-07T00:00:00.000Z, + "y": 1.1384756757773304, + }, + Object { + "x": 2015-04-08T00:00:00.000Z, + "y": 1.841477239971831, + }, + Object { + "x": 2015-04-09T00:00:00.000Z, + "y": 1.0626945214201182, + }, + Object { + "x": 2015-04-10T00:00:00.000Z, + "y": 1.6018849370336259, + }, + ], + "legend": "Trace 2", + }, + ], + }, + "supportNegativeData": true, + "xAxisTitle": "", + "yAxisTitle": "", +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToVBCProps - Should return VBC props 1`] = ` +Object { + "barWidth": 24, + "chartTitle": "", + "data": Array [ + Object { + "color": "#f7adda", + "legend": "a", + "x": -1.75, + "xAxisCalloutData": "[-2 - -1.5)", + "y": 3, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": -1.25, + "xAxisCalloutData": "[-1.5 - -1)", + "y": 18, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": -0.75, + "xAxisCalloutData": "[-1 - -0.5)", + "y": 53, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": -0.25, + "xAxisCalloutData": "[-0.5 - 0)", + "y": 87, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": 0.25, + "xAxisCalloutData": "[0 - 0.5)", + "y": 129, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": 0.75, + "xAxisCalloutData": "[0.5 - 1)", + "y": 194, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": 1.25, + "xAxisCalloutData": "[1 - 1.5)", + "y": 188, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": 1.75, + "xAxisCalloutData": "[1.5 - 2)", + "y": 163, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": 2.25, + "xAxisCalloutData": "[2 - 2.5)", + "y": 102, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": 2.75, + "xAxisCalloutData": "[2.5 - 3)", + "y": 44, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": 3.25, + "xAxisCalloutData": "[3 - 3.5)", + "y": 11, + }, + Object { + "color": "#f7adda", + "legend": "a", + "x": 3.75, + "xAxisCalloutData": "[3.5 - 4)", + "y": 8, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": -2.75, + "xAxisCalloutData": "[-3 - -2.5)", + "y": 6, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": -2.25, + "xAxisCalloutData": "[-2.5 - -2)", + "y": 11, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": -1.75, + "xAxisCalloutData": "[-2 - -1.5)", + "y": 40, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": -1.25, + "xAxisCalloutData": "[-1.5 - -1)", + "y": 100, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": -0.75, + "xAxisCalloutData": "[-1 - -0.5)", + "y": 158, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": -0.25, + "xAxisCalloutData": "[-0.5 - 0)", + "y": 189, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": 0.25, + "xAxisCalloutData": "[0 - 0.5)", + "y": 192, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": 0.75, + "xAxisCalloutData": "[0.5 - 1)", + "y": 148, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": 1.25, + "xAxisCalloutData": "[1 - 1.5)", + "y": 90, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": 1.75, + "xAxisCalloutData": "[1.5 - 2)", + "y": 47, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": 2.25, + "xAxisCalloutData": "[2 - 2.5)", + "y": 18, + }, + Object { + "color": "#9bd9db", + "legend": "b", + "x": 2.75, + "xAxisCalloutData": "[2.5 - 3)", + "y": 1, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -4.25, + "xAxisCalloutData": "[-4.5 - -4)", + "y": 2, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -3.75, + "xAxisCalloutData": "[-4 - -3.5)", + "y": 4, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -3.25, + "xAxisCalloutData": "[-3.5 - -3)", + "y": 8, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -2.75, + "xAxisCalloutData": "[-3 - -2.5)", + "y": 49, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -2.25, + "xAxisCalloutData": "[-2.5 - -2)", + "y": 99, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -1.75, + "xAxisCalloutData": "[-2 - -1.5)", + "y": 137, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -1.25, + "xAxisCalloutData": "[-1.5 - -1)", + "y": 220, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -0.75, + "xAxisCalloutData": "[-1 - -0.5)", + "y": 181, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": -0.25, + "xAxisCalloutData": "[-0.5 - 0)", + "y": 142, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": 0.25, + "xAxisCalloutData": "[0 - 0.5)", + "y": 94, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": 0.75, + "xAxisCalloutData": "[0.5 - 1)", + "y": 45, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": 1.25, + "xAxisCalloutData": "[1 - 1.5)", + "y": 11, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": 1.75, + "xAxisCalloutData": "[1.5 - 2)", + "y": 6, + }, + Object { + "color": "#b29ad4", + "legend": "c", + "x": 2.25, + "xAxisCalloutData": "[2 - 2.5)", + "y": 2, + }, + ], + "mode": "plotly", + "supportNegativeData": true, + "xAxisTitle": "", + "yAxisTitle": "", +} +`; + +exports[`transform Plotly Json To chart Props transformPlotlyJsonToVSBCProps - Should return VSBC props 1`] = ` +Object { + "barWidth": "auto", + "chartTitle": "", + "data": Array [ + Object { + "chartData": Array [ + Object { + "color": "#c19c00", + "data": 2000, + "legend": "Category A", + }, + Object { + "color": "#c8d1fa", + "data": 3000, + "legend": "Category B", + }, + ], + "lineData": Array [], + "xAxisPoint": "Jan", + }, + Object { + "chartData": Array [ + Object { + "color": "#c19c00", + "data": 2100, + "legend": "Category A", + }, + Object { + "color": "#c8d1fa", + "data": 3100, + "legend": "Category B", + }, + ], + "lineData": Array [], + "xAxisPoint": "Feb", + }, + Object { + "chartData": Array [ + Object { + "color": "#c19c00", + "data": 2200, + "legend": "Category A", + }, + Object { + "color": "#c8d1fa", + "data": 3200, + "legend": "Category B", + }, + ], + "lineData": Array [], + "xAxisPoint": "Mar", + }, + Object { + "chartData": Array [ + Object { + "color": "#c19c00", + "data": 2300, + "legend": "Category A", + }, + Object { + "color": "#c8d1fa", + "data": 3300, + "legend": "Category B", + }, + ], + "lineData": Array [], + "xAxisPoint": "Apr", + }, + Object { + "chartData": Array [ + Object { + "color": "#c19c00", + "data": 2400, + "legend": "Category A", + }, + Object { + "color": "#c8d1fa", + "data": 3400, + "legend": "Category B", + }, + ], + "lineData": Array [], + "xAxisPoint": "May", + }, + ], + "mode": "plotly", + "xAxisTitle": "", + "yAxisTitle": "", + "yMaxValue": 3400, +} +`; diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_groupedverticalbarchart_test.json b/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_groupedverticalbarchart_test.json new file mode 100644 index 00000000000000..97c18b6462b187 --- /dev/null +++ b/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_groupedverticalbarchart_test.json @@ -0,0 +1,95 @@ +{ + "visualizer": "plotly", + "data": [ + { + "uid": "2f399e", + "type": "bar", + "x": ["Jan", "Feb", "Mar", "Apr", "May"], + "y": [2000, 2100, 2200, 2300, 2400], + "name": "Category A", + "zmax": 1, + "zmin": 0, + "xbins": { + "end": 2499.5, + "size": 500, + "start": -500.5 + }, + "ybins": { + "end": 23.5, + "size": 1, + "start": -1.5 + }, + "opacity": 1, + "visible": true, + "autobinx": true, + "autobiny": true, + "contours": { + "end": 0.901, + "size": 0.1, + "start": 0.1, + "coloring": "fill", + "showlines": true + }, + "showlegend": true, + "orientation": "v" + }, + { + "uid": "2f399e", + "type": "bar", + "x": ["Jan", "Feb", "Mar", "Apr", "May"], + "y": [3000, 3100, 3200, 3300, 3400], + "name": "Category B", + "zmax": 1, + "zmin": 0, + "xbins": { + "end": 2499.5, + "size": 500, + "start": -500.5 + }, + "ybins": { + "end": 23.5, + "size": 1, + "start": -1.5 + }, + "opacity": 1, + "visible": true, + "autobinx": true, + "autobiny": true, + "contours": { + "end": 0.901, + "size": 0.1, + "start": 0.1, + "coloring": "fill", + "showlines": true + }, + "showlegend": true, + "orientation": "v" + } + ], + "layout": { + "title": "PHP Framework Popularity at Work - SitePoint, 2015", + "width": 850, + "xaxis": { + "type": "linear", + "range": [-198.2562959184288, 1830.6731869091736], + "title": "Votes", + "autorange": false + }, + "yaxis": { + "type": "category", + "range": [-3.301575351429676, 23.42061223132087], + "title": "Framework", + "autorange": false + }, + "height": 742, + "margin": { + "l": 210, + "pad": 4 + }, + "barmode": "group", + "barnorm": "", + "autosize": true, + "showlegend": false + }, + "frames": [] +} diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_nesteddata_test.json b/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_nesteddata_test.json new file mode 100644 index 00000000000000..4e726910baac16 --- /dev/null +++ b/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_nesteddata_test.json @@ -0,0 +1,23 @@ +[ + { + "level1": { + "level2": { + "level3": { + "level4": { + "level5": { + "level6": { + "level7": { + "level8": { + "level9": { + "level10": "Testing data" + } + } + } + } + } + } + } + } + } + } +] diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_verticalstackedbarchart_test.json b/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_verticalstackedbarchart_test.json new file mode 100644 index 00000000000000..c87c4978b72adc --- /dev/null +++ b/packages/charts/react-charting/src/components/DeclarativeChart/tests/schema/fluent_verticalstackedbarchart_test.json @@ -0,0 +1,75 @@ +{ + "visualizer": "plotly", + "data": [ + { + "type": "bar", + "x": ["Jan", "Feb", "Mar", "Apr", "May"], + "y": [2000, 2100, 2200, 2300, 2400], + "name": "Category A", + "xaxis": "x1", + "yaxis": "y1", + "marker": { + "line": { + "width": 1 + }, + "color": "#0000FF" + }, + "opacity": 1, + "orientation": "v" + }, + { + "type": "bar", + "x": ["Jan", "Feb", "Mar", "Apr", "May"], + "y": [3000, 3100, 3200, 3300, 3400], + "name": "Category B", + "xaxis": "x1", + "yaxis": "y1", + "marker": { + "line": { + "width": 1 + }, + "color": "#007F00" + }, + "opacity": 1, + "orientation": "v" + } + ], + "layout": { + "bargap": 11.864179406671795, + "xaxis1": { + "side": "bottom", + "type": "linear", + "range": [50, 300], + "ticks": "inside", + "anchor": "y1", + "domain": [0, 1], + "mirror": "ticks", + "nticks": 6, + "showgrid": false, + "showline": true, + "tickfont": { + "size": 12 + }, + "zeroline": false + }, + "yaxis1": { + "side": "left", + "type": "linear", + "range": [0, 350], + "ticks": "inside", + "anchor": "x1", + "domain": [0, 1], + "mirror": "ticks", + "nticks": 8, + "showgrid": false, + "showline": true, + "tickfont": { + "size": 12 + }, + "zeroline": false + }, + "hovermode": "closest", + "showlegend": false + }, + "frames": [] +} From c26be3e3a85258c61111cf2dd5c19798d3a4e936 Mon Sep 17 00:00:00 2001 From: Anush Gupta <74965306+Anush2303@users.noreply.github.com> Date: Thu, 16 Jan 2025 16:07:45 +0530 Subject: [PATCH 48/78] fix(react-charting): Sankey chart Dark mode fix (#33671) --- ...eact-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json | 7 +++++++ .../src/components/SankeyChart/SankeyChart.base.tsx | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 change/@fluentui-react-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json diff --git a/change/@fluentui-react-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json b/change/@fluentui-react-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json new file mode 100644 index 00000000000000..63507f79520dc7 --- /dev/null +++ b/change/@fluentui-react-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Make Dark mode text visible", + "packageName": "@fluentui/react-charting", + "email": "74965306+Anush2303@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/react-charting/src/components/SankeyChart/SankeyChart.base.tsx b/packages/charts/react-charting/src/components/SankeyChart/SankeyChart.base.tsx index 163ce0796fb1e3..810b06acac2859 100644 --- a/packages/charts/react-charting/src/components/SankeyChart/SankeyChart.base.tsx +++ b/packages/charts/react-charting/src/components/SankeyChart/SankeyChart.base.tsx @@ -1344,7 +1344,7 @@ export class SankeyChartBase extends React.Component<ISankeyChartProps, ISankeyC private _showTooltip(text: string, checkTrcuncated: boolean, div: any, evt: any) { if (checkTrcuncated) { //Fixing tooltip position by attaching it to the element rather than page - div.style('opacity', 0.9); + div.style('opacity', 0.9).style('color', this.props.theme!.palette.neutralPrimary); div .html(text) .style('left', evt.pageX + 'px') From 4db8229aa6938526432af9511f247072c21a72ac Mon Sep 17 00:00:00 2001 From: Victor Genaev <vgenaev@gmail.com> Date: Thu, 16 Jan 2025 12:10:29 +0100 Subject: [PATCH 49/78] fix(react-tooltip): wrong call of useIsNavigatingWithKeyboard (#33666) Co-authored-by: viktorgenaev <viktorgenaev@microsoft.com> --- ...react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json | 7 +++++++ .../library/src/components/Tooltip/useTooltip.tsx | 4 ++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 change/@fluentui-react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json diff --git a/change/@fluentui-react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json b/change/@fluentui-react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json new file mode 100644 index 00000000000000..d8e0b5362d896c --- /dev/null +++ b/change/@fluentui-react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: wrong call of useIsNavigatingWithKeyboard", + "packageName": "@fluentui/react-tooltip", + "email": "viktorgenaev@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-tooltip/library/src/components/Tooltip/useTooltip.tsx b/packages/react-components/react-tooltip/library/src/components/Tooltip/useTooltip.tsx index 8d5382f23353f9..443acabe6049c8 100644 --- a/packages/react-components/react-tooltip/library/src/components/Tooltip/useTooltip.tsx +++ b/packages/react-components/react-tooltip/library/src/components/Tooltip/useTooltip.tsx @@ -177,7 +177,7 @@ export const useTooltip_unstable = (props: TooltipProps): TooltipState => { [setDelayTimeout, setVisible, state.showDelay, context], ); - const isNavigatingWithKeyboard = useIsNavigatingWithKeyboard()(); + const isNavigatingWithKeyboard = useIsNavigatingWithKeyboard(); // Callback ref that attaches a keyborg:focusin event listener. const [keyborgListenerCallbackRef] = React.useState(() => { @@ -186,7 +186,7 @@ export const useTooltip_unstable = (props: TooltipProps): TooltipState => { // For example, we don't want to show the tooltip when a dialog is closed // and Tabster programmatically restores focus to the trigger button. // See https://github.com/microsoft/fluentui/issues/27576 - if (ev.detail?.isFocusedProgrammatically && !isNavigatingWithKeyboard) { + if (ev.detail?.isFocusedProgrammatically && !isNavigatingWithKeyboard()) { ignoreNextFocusEventRef.current = true; } }) as EventListener; From 61b0ae7487a1e24a61b0f4990b4a2073d27bbe5c Mon Sep 17 00:00:00 2001 From: MidnightCrowing <110297461+MidnightCrowing@users.noreply.github.com> Date: Thu, 16 Jan 2025 20:01:33 +0800 Subject: [PATCH 50/78] docs(public-docsite-v9): fix typo from "CCS variables" to "CSS variables" (#33675) --- apps/public-docsite-v9/src/Concepts/Theming.stories.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/public-docsite-v9/src/Concepts/Theming.stories.mdx b/apps/public-docsite-v9/src/Concepts/Theming.stories.mdx index c79f39c86363bf..aae124ac7f8146 100644 --- a/apps/public-docsite-v9/src/Concepts/Theming.stories.mdx +++ b/apps/public-docsite-v9/src/Concepts/Theming.stories.mdx @@ -22,7 +22,7 @@ No matter what theme is used, the component styles are always the same. The only Those tokens are resolved to CSS variables. The `FluentProvider` component is responsible for setting the values of the CSS variables in DOM and changing them when the theme changes. When the theme is switched, only the variables are changed, all styles remain the same. -Place a `<FluentProvider />` at the root of your app and pass a theme to the `theme` prop. The provider will render a `div` and set all tokens as CSS variables on that element. The provider also propagates CCS variables to React portals created with [Portal component](?path=/docs/components-portal--default). +Place a `<FluentProvider />` at the root of your app and pass a theme to the `theme` prop. The provider will render a `div` and set all tokens as CSS variables on that element. The provider also propagates CSS variables to React portals created with [Portal component](?path=/docs/components-portal--default). ```jsx import { FluentProvider, teamsLightTheme } from '@fluentui/react-components'; From 9331bcc59d84d033784c73eab870155a02286ce5 Mon Sep 17 00:00:00 2001 From: Robert Penner <robertpenner@microsoft.com> Date: Thu, 16 Jan 2025 09:21:07 -0500 Subject: [PATCH 51/78] refactor(Collapse): streamline atom functions (#33463) --- ...-67537ce1-b461-4bec-bbcb-61d9202e6632.json | 7 + .../library/src/atoms/fade-atom.ts | 33 +++++ .../src/components/Collapse/Collapse.ts | 55 ++------ .../src/components/Collapse/collapse-atoms.ts | 120 ++++++------------ .../library/src/components/Fade/Fade.ts | 5 +- 5 files changed, 94 insertions(+), 126 deletions(-) create mode 100644 change/@fluentui-react-motion-components-preview-67537ce1-b461-4bec-bbcb-61d9202e6632.json create mode 100644 packages/react-components/react-motion-components-preview/library/src/atoms/fade-atom.ts diff --git a/change/@fluentui-react-motion-components-preview-67537ce1-b461-4bec-bbcb-61d9202e6632.json b/change/@fluentui-react-motion-components-preview-67537ce1-b461-4bec-bbcb-61d9202e6632.json new file mode 100644 index 00000000000000..970d564c51cda6 --- /dev/null +++ b/change/@fluentui-react-motion-components-preview-67537ce1-b461-4bec-bbcb-61d9202e6632.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "refactor(Collapse): streamline motion atom functions", + "packageName": "@fluentui/react-motion-components-preview", + "email": "robertpenner@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-motion-components-preview/library/src/atoms/fade-atom.ts b/packages/react-components/react-motion-components-preview/library/src/atoms/fade-atom.ts new file mode 100644 index 00000000000000..91b369be83ff71 --- /dev/null +++ b/packages/react-components/react-motion-components-preview/library/src/atoms/fade-atom.ts @@ -0,0 +1,33 @@ +import { AtomMotion, PresenceDirection, motionTokens } from '@fluentui/react-motion'; + +interface FadeAtomParams { + direction: PresenceDirection; + duration: number; + easing?: string; + fromValue?: number; +} + +/** + * Generates a motion atom object for a fade in or fade out. + * @param direction - The functional direction of the motion: 'enter' or 'exit'. + * @param duration - The duration of the motion in milliseconds. + * @param easing - The easing curve for the motion. Defaults to `motionTokens.curveLinear`. + * @param fromValue - The starting opacity value. Defaults to 0. + * @returns A motion atom object with opacity keyframes and the supplied duration and easing. + */ +export const fadeAtom = ({ + direction, + duration, + easing = motionTokens.curveLinear, + fromValue = 0, +}: FadeAtomParams): AtomMotion => { + const keyframes = [{ opacity: fromValue }, { opacity: 1 }]; + if (direction === 'exit') { + keyframes.reverse(); + } + return { + keyframes, + duration, + easing, + }; +}; diff --git a/packages/react-components/react-motion-components-preview/library/src/components/Collapse/Collapse.ts b/packages/react-components/react-motion-components-preview/library/src/components/Collapse/Collapse.ts index 6aa4b7bb66d5dc..22c8862cc3b82f 100644 --- a/packages/react-components/react-motion-components-preview/library/src/components/Collapse/Collapse.ts +++ b/packages/react-components/react-motion-components-preview/library/src/components/Collapse/Collapse.ts @@ -1,14 +1,8 @@ import { motionTokens, createPresenceComponent, AtomMotion } from '@fluentui/react-motion'; import type { PresenceMotionFnCreator } from '../../types'; import type { CollapseDelayedVariantParams, CollapseRuntimeParams, CollapseVariantParams } from './collapse-types'; -import { - sizeEnterAtom, - whitespaceEnterAtom, - opacityEnterAtom, - opacityExitAtom, - sizeExitAtom, - whitespaceExitAtom, -} from './collapse-atoms'; +import { sizeEnterAtom, sizeExitAtom, whitespaceAtom } from './collapse-atoms'; +import { fadeAtom } from '../../atoms/fade-atom'; /** Define a presence motion for collapse/expand that can stagger the size and opacity motions by a given delay. */ export const createCollapseDelayedPresence: PresenceMotionFnCreator< @@ -32,27 +26,16 @@ export const createCollapseDelayedPresence: PresenceMotionFnCreator< // ----- ENTER ----- // The enter transition is an array of up to 3 motion atoms: size, whitespace and opacity. const enterAtoms: AtomMotion[] = [ - sizeEnterAtom({ - orientation, - duration: enterSizeDuration, - easing: enterEasing, - element, - }), - whitespaceEnterAtom({ - orientation, - duration: enterSizeDuration, - easing: enterEasing, - }), + sizeEnterAtom({ orientation, duration: enterSizeDuration, easing: enterEasing, element }), + whitespaceAtom({ direction: 'enter', orientation, duration: enterSizeDuration, easing: enterEasing }), ]; // Fade in only if animateOpacity is true. Otherwise, leave opacity unaffected. if (animateOpacity) { - enterAtoms.push( - opacityEnterAtom({ - duration: enterOpacityDuration, - easing: enterEasing, - delay: enterDelay, - }), - ); + enterAtoms.push({ + ...fadeAtom({ direction: 'enter', duration: enterOpacityDuration, easing: enterEasing }), + delay: enterDelay, + fill: 'both', + }); } // ----- EXIT ----- @@ -60,24 +43,12 @@ export const createCollapseDelayedPresence: PresenceMotionFnCreator< const exitAtoms: AtomMotion[] = []; // Fade out only if animateOpacity is true. Otherwise, leave opacity unaffected. if (animateOpacity) { - exitAtoms.push( - opacityExitAtom({ - duration: exitOpacityDuration, - easing: exitEasing, - }), - ); + exitAtoms.push(fadeAtom({ direction: 'exit', duration: exitOpacityDuration, easing: exitEasing })); } exitAtoms.push( - sizeExitAtom({ - orientation, - duration: exitSizeDuration, - easing: exitEasing, - element, - delay: exitDelay, - }), - ); - exitAtoms.push( - whitespaceExitAtom({ + sizeExitAtom({ orientation, duration: exitSizeDuration, easing: exitEasing, element, delay: exitDelay }), + whitespaceAtom({ + direction: 'exit', orientation, duration: exitSizeDuration, easing: exitEasing, diff --git a/packages/react-components/react-motion-components-preview/library/src/components/Collapse/collapse-atoms.ts b/packages/react-components/react-motion-components-preview/library/src/components/Collapse/collapse-atoms.ts index 0ce27aa7d91c87..391b8eb2a24023 100644 --- a/packages/react-components/react-motion-components-preview/library/src/components/Collapse/collapse-atoms.ts +++ b/packages/react-components/react-motion-components-preview/library/src/components/Collapse/collapse-atoms.ts @@ -1,5 +1,5 @@ -import { AtomMotion } from '@fluentui/react-motion/src/types'; -import type { CollapseOrientation } from './collapse-types'; +import { AtomMotion, PresenceDirection } from '@fluentui/react-motion'; +import { CollapseOrientation } from './collapse-types'; // ----- SIZE ----- @@ -11,19 +11,21 @@ const sizeValuesForOrientation = (orientation: CollapseOrientation, element: Ele return { sizeName, overflowName, toSize }; }; +interface SizeEnterAtomParams { + orientation: CollapseOrientation; + duration: number; + easing: string; + element: HTMLElement; + fromSize?: string; +} + export const sizeEnterAtom = ({ orientation, duration, easing, element, fromSize = '0', -}: { - orientation: CollapseOrientation; - duration: number; - easing: string; - element: HTMLElement; - fromSize?: string; -}): AtomMotion => { +}: SizeEnterAtomParams): AtomMotion => { const { sizeName, overflowName, toSize } = sizeValuesForOrientation(orientation, element); return { @@ -37,6 +39,10 @@ export const sizeEnterAtom = ({ }; }; +interface SizeExitAtomParams extends SizeEnterAtomParams { + delay?: number; +} + export const sizeExitAtom = ({ orientation, duration, @@ -44,14 +50,7 @@ export const sizeExitAtom = ({ element, delay = 0, fromSize = '0', -}: { - orientation: CollapseOrientation; - duration: number; - easing: string; - element: HTMLElement; - delay?: number; - fromSize?: string; -}): AtomMotion => { +}: SizeExitAtomParams): AtomMotion => { const { sizeName, overflowName, toSize } = sizeValuesForOrientation(orientation, element); return { @@ -88,82 +87,39 @@ const whitespaceValuesForOrientation = (orientation: CollapseOrientation) => { }; }; -// Because a height of zero does not eliminate padding or margin, -// we will create keyframes to animate them to zero. -export const whitespaceEnterAtom = ({ - orientation, - duration, - easing, -}: { +interface WhitespaceAtomParams { + direction: PresenceDirection; orientation: CollapseOrientation; duration: number; easing: string; -}): AtomMotion => { - const { paddingStart, paddingEnd, marginStart, marginEnd } = whitespaceValuesForOrientation(orientation); - return { - // Animate from whitespace of zero to the current whitespace, by omitting the ending keyframe. - keyframes: [{ [paddingStart]: '0', [paddingEnd]: '0', [marginStart]: '0', [marginEnd]: '0', offset: 0 }], - duration, - easing, - }; -}; + delay?: number; +} -export const whitespaceExitAtom = ({ +/** + * A collapse animates an element's height to zero, + but the zero height does not eliminate padding or margin in the box model. + So here we generate keyframes to animate those whitespace properties to zero. + */ +export const whitespaceAtom = ({ + direction, orientation, duration, easing, delay = 0, -}: { - orientation: CollapseOrientation; - duration: number; - easing: string; - delay?: number; -}): AtomMotion => { +}: WhitespaceAtomParams): AtomMotion => { const { paddingStart, paddingEnd, marginStart, marginEnd } = whitespaceValuesForOrientation(orientation); - return { - // Animate from the current whitespace to whitespace of zero, by using offset 1 and omitting the starting keyframe. - keyframes: [{ [paddingStart]: '0', [paddingEnd]: '0', [marginStart]: '0', [marginEnd]: '0', offset: 1 }], + // The keyframe with zero whitespace is at the start for enter and at the end for exit. + const offset = direction === 'enter' ? 0 : 1; + const keyframes = [{ [paddingStart]: '0', [paddingEnd]: '0', [marginStart]: '0', [marginEnd]: '0', offset }]; + + const atom: AtomMotion = { + keyframes, duration, easing, - fill: 'forwards', delay, }; + if (direction === 'exit') { + atom.fill = 'forwards'; + } + return atom; }; - -// ----- OPACITY ----- - -export const opacityEnterAtom = ({ - duration, - easing, - delay = 0, - fromOpacity = 0, - toOpacity = 1, -}: { - duration: number; - easing: string; - delay?: number; - fromOpacity?: number; - toOpacity?: number; -}): AtomMotion => ({ - keyframes: [{ opacity: fromOpacity }, { opacity: toOpacity }], - duration, - easing, - delay, - fill: 'both', -}); - -export const opacityExitAtom = ({ - duration, - easing, - fromOpacity = 0, - toOpacity = 1, -}: { - duration: number; - easing: string; - fromOpacity?: number; - toOpacity?: number; -}): AtomMotion => ({ - keyframes: [{ opacity: toOpacity }, { opacity: fromOpacity }], - duration, - easing, -}); diff --git a/packages/react-components/react-motion-components-preview/library/src/components/Fade/Fade.ts b/packages/react-components/react-motion-components-preview/library/src/components/Fade/Fade.ts index 03ca3ea60567a1..d373d235504b69 100644 --- a/packages/react-components/react-motion-components-preview/library/src/components/Fade/Fade.ts +++ b/packages/react-components/react-motion-components-preview/library/src/components/Fade/Fade.ts @@ -1,5 +1,6 @@ import { motionTokens, createPresenceComponent } from '@fluentui/react-motion'; import type { PresenceMotionCreator } from '../../types'; +import { fadeAtom } from '../../atoms/fade-atom'; type FadeVariantParams = { /** Time (ms) for the enter transition (fade-in). Defaults to the `durationNormal` value (200 ms). */ @@ -22,8 +23,8 @@ export const createFadePresence: PresenceMotionCreator<FadeVariantParams> = ({ exitDuration = enterDuration, exitEasing = enterEasing, } = {}) => ({ - enter: { duration: enterDuration, easing: enterEasing, keyframes: [{ opacity: 0 }, { opacity: 1 }] }, - exit: { duration: exitDuration, easing: exitEasing, keyframes: [{ opacity: 1 }, { opacity: 0 }] }, + enter: fadeAtom({ direction: 'enter', duration: enterDuration, easing: enterEasing }), + exit: fadeAtom({ direction: 'exit', duration: exitDuration, easing: exitEasing }), }); /** A React component that applies fade in/out transitions to its children. */ From 620ea3f1daa6a4cf9bb37961569f4756c3b3f95f Mon Sep 17 00:00:00 2001 From: Bernardo Sunderhus <bernardo.sunderhus@gmail.com> Date: Thu, 16 Jan 2025 19:12:55 +0100 Subject: [PATCH 52/78] feature(react-tree): TreeRootReset component (#33663) --- ...-8e070f58-09e6-4a66-bd63-bbd13b27db88.json | 7 + ...-b452026f-0282-4a88-a922-34c2a983c77c.json | 7 + .../etc/react-components.api.md | 3 + .../react-components/src/index.ts | 1 + .../react-tree/library/etc/react-tree.api.md | 3 + .../src/components/TreeProvider.cy.tsx | 153 ++++++++++++++++++ .../library/src/components/TreeProvider.tsx | 10 ++ .../library/src/hooks/useRovingTabIndexes.ts | 19 ++- .../react-tree/library/src/index.ts | 2 +- 9 files changed, 198 insertions(+), 7 deletions(-) create mode 100644 change/@fluentui-react-components-8e070f58-09e6-4a66-bd63-bbd13b27db88.json create mode 100644 change/@fluentui-react-tree-b452026f-0282-4a88-a922-34c2a983c77c.json create mode 100644 packages/react-components/react-tree/library/src/components/TreeProvider.cy.tsx diff --git a/change/@fluentui-react-components-8e070f58-09e6-4a66-bd63-bbd13b27db88.json b/change/@fluentui-react-components-8e070f58-09e6-4a66-bd63-bbd13b27db88.json new file mode 100644 index 00000000000000..ddc6a6c41d1080 --- /dev/null +++ b/change/@fluentui-react-components-8e070f58-09e6-4a66-bd63-bbd13b27db88.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "feature: TreeRootReset component", + "packageName": "@fluentui/react-components", + "email": "bernardo.sunderhus@gmail.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-tree-b452026f-0282-4a88-a922-34c2a983c77c.json b/change/@fluentui-react-tree-b452026f-0282-4a88-a922-34c2a983c77c.json new file mode 100644 index 00000000000000..7e09b55e865d5d --- /dev/null +++ b/change/@fluentui-react-tree-b452026f-0282-4a88-a922-34c2a983c77c.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "feature: TreeRootReset component", + "packageName": "@fluentui/react-tree", + "email": "bernardo.sunderhus@gmail.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-components/etc/react-components.api.md b/packages/react-components/react-components/etc/react-components.api.md index 75bc436038bc95..a64d3393804726 100644 --- a/packages/react-components/react-components/etc/react-components.api.md +++ b/packages/react-components/react-components/etc/react-components.api.md @@ -1368,6 +1368,7 @@ import { TreeOpenChangeData } from '@fluentui/react-tree'; import { TreeOpenChangeEvent } from '@fluentui/react-tree'; import { TreeProps } from '@fluentui/react-tree'; import { TreeProvider } from '@fluentui/react-tree'; +import { TreeRootReset } from '@fluentui/react-tree'; import { TreeSelectionValue } from '@fluentui/react-tree'; import { TreeSlots } from '@fluentui/react-tree'; import { TreeState } from '@fluentui/react-tree'; @@ -4552,6 +4553,8 @@ export { TreeProps } export { TreeProvider } +export { TreeRootReset } + export { TreeSelectionValue } export { TreeSlots } diff --git a/packages/react-components/react-components/src/index.ts b/packages/react-components/react-components/src/index.ts index dc4d8fbed60524..1c0315c6d29141 100644 --- a/packages/react-components/react-components/src/index.ts +++ b/packages/react-components/react-components/src/index.ts @@ -1306,6 +1306,7 @@ export { useTreeItem_unstable, useTreeStyles_unstable, useTree_unstable, + TreeRootReset, } from '@fluentui/react-tree'; export type { diff --git a/packages/react-components/react-tree/library/etc/react-tree.api.md b/packages/react-components/react-tree/library/etc/react-tree.api.md index 1fbeac4b6638b2..419d5b136e4352 100644 --- a/packages/react-components/react-tree/library/etc/react-tree.api.md +++ b/packages/react-components/react-tree/library/etc/react-tree.api.md @@ -383,6 +383,9 @@ export const TreeProvider: { displayName: string; }; +// @public (undocumented) +export const TreeRootReset: (props: TreeRootResetProps) => JSX.Element; + // @public (undocumented) export type TreeSelectionValue = MultiSelectValue | SingleSelectValue; diff --git a/packages/react-components/react-tree/library/src/components/TreeProvider.cy.tsx b/packages/react-components/react-tree/library/src/components/TreeProvider.cy.tsx new file mode 100644 index 00000000000000..0b466e8aabbe76 --- /dev/null +++ b/packages/react-components/react-tree/library/src/components/TreeProvider.cy.tsx @@ -0,0 +1,153 @@ +import * as React from 'react'; +import { mount as mountBase } from '@cypress/react'; +import { Tree } from '../Tree'; +import { TreeItem, TreeItemProps } from '../TreeItem'; +import { TreeItemLayout } from '../TreeItemLayout'; +import { TreeRootReset } from './TreeProvider'; +import { Popover, PopoverTrigger, PopoverSurface } from '@fluentui/react-popover'; +import { Button } from '@fluentui/react-button'; +import { FluentProvider } from '@fluentui/react-provider'; +import { teamsLightTheme } from '@fluentui/react-theme'; +import { useRestoreFocusTarget } from '@fluentui/react-tabster'; + +const mount = (element: JSX.Element) => { + mountBase(<FluentProvider theme={teamsLightTheme}>{element}</FluentProvider>); +}; + +describe('TreeRootReset', () => { + it('ensure that a subtree will be treated as a root tree', () => { + const handleOpenChange1 = cy.spy().as('handleOpenChange1'); + const handleOpenChange2 = cy.spy().as('handleOpenChange2'); + + mount( + <Tree openItems={['item1']} onOpenChange={handleOpenChange1}> + <TreeItem value="item1" data-testid="tree-item" itemType="branch"> + <TreeItemLayout + actions={ + <> + <TreeRootReset> + <Tree onOpenChange={handleOpenChange2}> + <TreeItem data-testid="item1" id="item1" value="item1" itemType="branch"> + <TreeItemLayout>branch</TreeItemLayout> + <Tree> + <TreeItem data-testid="item2" value="item2" itemType="leaf"> + leaf + </TreeItem> + </Tree> + </TreeItem> + </Tree> + </TreeRootReset> + </> + } + /> + </TreeItem> + </Tree>, + ); + cy.get('[data-testid="item2"]').should('not.exist'); + cy.get('[data-testid="tree-item"]').focus(); + cy.get('[data-testid="item1"]').realClick(); + cy.get('@handleOpenChange1').should('not.have.been.called'); + cy.get('@handleOpenChange2').should('have.been.called'); + cy.get('[data-testid="item2"]').should('exist'); + }); + it('ensures basic navigation between multiple trees', () => { + mount(<Actions />); + cy.get('[data-testid="item1"]').should('exist').focus(); + cy.get('[data-testid="item2"]').should('not.exist'); + cy.get('[data-testid="action-button"]').should('exist').realClick(); + cy.get('[data-testid="item2"]').should('exist').focus().realPress('{esc}'); + cy.get('[data-testid="action-button"]').should('be.focused').realPress(['Shift', 'Tab']); + cy.get('[data-testid="item1"]').should('exist').should('be.focused'); + }); +}); + +type CustomTreeItemProps = TreeItemProps; + +const CustomTreeItem = ({ children, ...props }: CustomTreeItemProps) => { + const focusTargetAttribute = useRestoreFocusTarget(); + const [layoutChildren, subtree] = React.Children.toArray(children); + + return ( + <TreeItem aria-description="has actions" {...focusTargetAttribute} {...props}> + <TreeItemLayout + actions={ + <> + <Popover> + <PopoverTrigger> + <Button data-testid="action-button" aria-label="Edit" appearance="subtle" icon={<div />} /> + </PopoverTrigger> + <PopoverSurface> + <TreeRootReset> + <Tree aria-label="foo"> + <TreeItem itemType="leaf"> + <TreeItemLayout>Foo</TreeItemLayout> + </TreeItem> + <TreeItem itemType="leaf"> + <TreeItemLayout>Foo</TreeItemLayout> + </TreeItem> + <TreeItem data-testid="item2" itemType="branch"> + <TreeItemLayout>Foo</TreeItemLayout> + <Tree> + <TreeItem itemType="leaf"> + <TreeItemLayout>Foo</TreeItemLayout> + </TreeItem> + <TreeItem itemType="leaf"> + <TreeItemLayout>Foo</TreeItemLayout> + </TreeItem> + </Tree> + </TreeItem> + </Tree> + </TreeRootReset> + </PopoverSurface> + </Popover> + </> + } + > + {layoutChildren} + </TreeItemLayout> + {subtree} + </TreeItem> + ); +}; + +const Actions = () => { + return ( + <Tree aria-label="Actions"> + <CustomTreeItem data-testid="item1" itemType="branch"> + item 1 + <Tree> + <CustomTreeItem itemType="branch"> + item 1-1 + <Tree> + <CustomTreeItem itemType="leaf">item 1-1-1</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 1-1-2</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 1-1-3</CustomTreeItem> + </Tree> + </CustomTreeItem> + <CustomTreeItem itemType="leaf">item 1-2</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 1-3</CustomTreeItem> + </Tree> + </CustomTreeItem> + <CustomTreeItem itemType="branch"> + item 2 + <Tree> + <CustomTreeItem itemType="branch"> + item 2-1 + <Tree> + <CustomTreeItem itemType="leaf">item 2-1-1</CustomTreeItem> + </Tree> + </CustomTreeItem> + + <CustomTreeItem itemType="branch"> + item 3 + <Tree> + <CustomTreeItem itemType="leaf">item 3-1</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 3-2</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 3-3</CustomTreeItem> + </Tree> + </CustomTreeItem> + </Tree> + </CustomTreeItem> + </Tree> + ); +}; diff --git a/packages/react-components/react-tree/library/src/components/TreeProvider.tsx b/packages/react-components/react-tree/library/src/components/TreeProvider.tsx index ea5e678ee3e387..7e7883e6cb5fbc 100644 --- a/packages/react-components/react-tree/library/src/components/TreeProvider.tsx +++ b/packages/react-components/react-tree/library/src/components/TreeProvider.tsx @@ -21,3 +21,13 @@ export const TreeProvider = (props: React.ProviderProps<TreeContextValue | Subtr }; TreeProvider.displayName = 'TreeProvider'; + +export type TreeRootResetProps = { + children?: React.ReactNode; +}; + +export const TreeRootReset = (props: TreeRootResetProps) => ( + <SubtreeContext.Provider value={undefined as unknown as SubtreeContextValue}> + {props.children} + </SubtreeContext.Provider> +); diff --git a/packages/react-components/react-tree/library/src/hooks/useRovingTabIndexes.ts b/packages/react-components/react-tree/library/src/hooks/useRovingTabIndexes.ts index 14d9bc448b178e..bbfe9bdb188c4d 100644 --- a/packages/react-components/react-tree/library/src/hooks/useRovingTabIndexes.ts +++ b/packages/react-components/react-tree/library/src/hooks/useRovingTabIndexes.ts @@ -2,7 +2,14 @@ import * as React from 'react'; import { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts'; import { HTMLElementWalker } from '../utils/createHTMLElementWalker'; import { useFocusedElementChange } from '@fluentui/react-tabster'; -import { elementContains } from '@fluentui/react-utilities'; + +const findTreeItemRoot = (element: HTMLElement) => { + let parent = element.parentElement; + while (parent && parent.getAttribute('role') !== 'tree') { + parent = parent.parentElement; + } + return parent; +}; /** * @internal @@ -14,11 +21,11 @@ export function useRovingTabIndex() { const { targetDocument } = useFluent(); useFocusedElementChange(element => { - if ( - element?.getAttribute('role') === 'treeitem' && - walkerRef.current && - elementContains(walkerRef.current.root, element) - ) { + if (element?.getAttribute('role') === 'treeitem' && walkerRef.current && walkerRef.current.root.contains(element)) { + const treeitemRoot = findTreeItemRoot(element); + if (walkerRef.current.root !== treeitemRoot) { + return; + } rove(element); } }); diff --git a/packages/react-components/react-tree/library/src/index.ts b/packages/react-components/react-tree/library/src/index.ts index f018799865bba0..bb0478843dcf80 100644 --- a/packages/react-components/react-tree/library/src/index.ts +++ b/packages/react-components/react-tree/library/src/index.ts @@ -32,7 +32,7 @@ export { export type { FlatTreeSlots, FlatTreeProps, FlatTreeState } from './FlatTree'; -export { TreeProvider } from './components/TreeProvider'; +export { TreeProvider, TreeRootReset } from './components/TreeProvider'; export { useTreeContext_unstable, From e9706f78650b2a72e09dca1c5f69f23f4967f33b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kry=C5=A1tof=20Mat=C4=9Bjka?= <krystof.matejka@microsoft.com> Date: Thu, 16 Jan 2025 19:41:42 +0100 Subject: [PATCH 53/78] fix(TagItemSuggestion v8): pass rest of the props to the underlying component (#32839) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Kryštof Matějka <kmatejka@microsoft.com> Co-authored-by: Makoto Morimoto <Humberto.Morimoto@microsoft.com> --- ...entui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json | 7 +++++++ .../components/pickers/TagPicker/TagItemSuggestion.tsx | 9 +++++++-- 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 change/@fluentui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json diff --git a/change/@fluentui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json b/change/@fluentui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json new file mode 100644 index 00000000000000..97c6822b1874fc --- /dev/null +++ b/change/@fluentui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: Passing rest of ITagItemSuggestionProps to the underlying component.", + "packageName": "@fluentui/react", + "email": "kmatejka@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react/src/components/pickers/TagPicker/TagItemSuggestion.tsx b/packages/react/src/components/pickers/TagPicker/TagItemSuggestion.tsx index 130e380acd0e6a..67d339b1bfa888 100644 --- a/packages/react/src/components/pickers/TagPicker/TagItemSuggestion.tsx +++ b/packages/react/src/components/pickers/TagPicker/TagItemSuggestion.tsx @@ -14,13 +14,18 @@ const getClassNames = classNamesFunction<ITagItemSuggestionStyleProps, ITagItemS * {@docCategory TagPicker} */ export const TagItemSuggestionBase = (props: ITagItemSuggestionProps) => { - const { styles, theme, children } = props; + const { styles, theme, children, ...rest } = props; const classNames = getClassNames(styles, { theme: theme!, }); - return <div className={classNames.suggestionTextOverflow}> {children} </div>; + return ( + <div className={classNames.suggestionTextOverflow} {...rest}> + {' '} + {children}{' '} + </div> + ); }; export const TagItemSuggestion = styled< From 6e8378b3d1ef9b27ed944b5eae855c59ce348836 Mon Sep 17 00:00:00 2001 From: "Kevin T. Coughlin" <706967+KevinTCoughlin@users.noreply.github.com> Date: Thu, 16 Jan 2025 14:26:24 -0800 Subject: [PATCH 54/78] Remove border property containing typo from .ms-PositioningContainer-layerHost root (#32885) Co-authored-by: Makoto Morimoto <Humberto.Morimoto@microsoft.com> --- ...luentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json | 7 +++++++ .../PositioningContainer/PositioningContainer.styles.ts | 1 - .../Coachmark/__snapshots__/Coachmark.test.tsx.snap | 3 --- 3 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 change/@fluentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json diff --git a/change/@fluentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json b/change/@fluentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json new file mode 100644 index 00000000000000..531341022a7daa --- /dev/null +++ b/change/@fluentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Delete border property from ms-PositioningContainer-layerHost containing typo", + "packageName": "@fluentui/react", + "email": "706967+KevinTCoughlin@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/react/src/components/Coachmark/PositioningContainer/PositioningContainer.styles.ts b/packages/react/src/components/Coachmark/PositioningContainer/PositioningContainer.styles.ts index 9a937fa4728542..0b6c0b04ae5038 100644 --- a/packages/react/src/components/Coachmark/PositioningContainer/PositioningContainer.styles.ts +++ b/packages/react/src/components/Coachmark/PositioningContainer/PositioningContainer.styles.ts @@ -27,7 +27,6 @@ export const getClassNames = memoizeFunction((): IPositioningContainerNames => { { position: 'absolute', boxSizing: 'border-box', - border: '1px solid ${}', selectors: { [HighContrastSelector]: { border: '1px solid WindowText', diff --git a/packages/react/src/components/Coachmark/__snapshots__/Coachmark.test.tsx.snap b/packages/react/src/components/Coachmark/__snapshots__/Coachmark.test.tsx.snap index 35d2abd3f2213f..88104bf8a4a12f 100644 --- a/packages/react/src/components/Coachmark/__snapshots__/Coachmark.test.tsx.snap +++ b/packages/react/src/components/Coachmark/__snapshots__/Coachmark.test.tsx.snap @@ -39,7 +39,6 @@ exports[`Coachmark renders Coachmark (color properties) 1`] = ` class= ms-PositioningContainer-layerHost { - border: 1px solid \${}; box-sizing: border-box; outline: transparent; position: absolute; @@ -275,7 +274,6 @@ exports[`Coachmark renders Coachmark (correctly) 1`] = ` class= ms-PositioningContainer-layerHost { - border: 1px solid \${}; box-sizing: border-box; outline: transparent; position: absolute; @@ -513,7 +511,6 @@ exports[`Coachmark renders Coachmark (isCollapsed) 1`] = ` class= ms-PositioningContainer-layerHost { - border: 1px solid \${}; box-sizing: border-box; outline: transparent; position: absolute; From 24bd1b2e8063db6c121ee02425db564fbb762f5a Mon Sep 17 00:00:00 2001 From: Andrew Vineyard <andrewsdoing@gmail.com> Date: Thu, 16 Jan 2025 17:50:39 -0600 Subject: [PATCH 55/78] Update styles-handbook.md with working URL (#33679) --- .../contributing/rfcs/react-components/styles-handbook.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/react-v9/contributing/rfcs/react-components/styles-handbook.md b/docs/react-v9/contributing/rfcs/react-components/styles-handbook.md index 749b39684ef147..2b9cf9e008790c 100644 --- a/docs/react-v9/contributing/rfcs/react-components/styles-handbook.md +++ b/docs/react-v9/contributing/rfcs/react-components/styles-handbook.md @@ -962,7 +962,7 @@ function Checkbox(props) { } ``` -[fluent-colors]: https://react.fluentui.dev/?path=/docs/theme-colors--page +[fluent-colors]: https://react.fluentui.dev/?path=/docs/theme-colors--docs [griffel]: https://griffel.js.org [griffel-aot]: https://griffel.js.org/react/ahead-of-time-compilation/introduction [griffel-atomic-css]: https://griffel.js.org/react/guides/atomic-css From baf887d95f91874c814a7cae749c20e797f828be Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Fri, 17 Jan 2025 04:07:56 +0000 Subject: [PATCH 56/78] release: applying package updates - web-components --- ...-cfdeb418-e440-4904-9a73-4b8291c7c99d.json | 7 ----- ...-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json | 7 ----- ...-674e26a9-57d5-4147-bda1-e4a467529eaf.json | 7 ----- ...-a03312db-25ed-42ac-8259-b9754b5afdd9.json | 7 ----- .../chart-web-components/CHANGELOG.json | 23 +++++++++++++++ .../charts/chart-web-components/CHANGELOG.md | 11 ++++++- .../charts/chart-web-components/package.json | 4 +-- packages/web-components/CHANGELOG.json | 29 +++++++++++++++++++ packages/web-components/CHANGELOG.md | 12 +++++++- packages/web-components/package.json | 2 +- 10 files changed, 76 insertions(+), 33 deletions(-) delete mode 100644 change/@fluentui-chart-web-components-cfdeb418-e440-4904-9a73-4b8291c7c99d.json delete mode 100644 change/@fluentui-web-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json delete mode 100644 change/@fluentui-web-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json delete mode 100644 change/@fluentui-web-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json diff --git a/change/@fluentui-chart-web-components-cfdeb418-e440-4904-9a73-4b8291c7c99d.json b/change/@fluentui-chart-web-components-cfdeb418-e440-4904-9a73-4b8291c7c99d.json deleted file mode 100644 index cad856081e15fb..00000000000000 --- a/change/@fluentui-chart-web-components-cfdeb418-e440-4904-9a73-4b8291c7c99d.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: sync failed release pipeline with git", - "packageName": "@fluentui/chart-web-components", - "email": "martinhochel@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-web-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json b/change/@fluentui-web-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json deleted file mode 100644 index 99a9e9c5639d0d..00000000000000 --- a/change/@fluentui-web-components-49fd3f00-10b9-4573-a6ac-bce95c8f2fe5.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "fix: revert logical properties in spinner to support rtl\"", - "packageName": "@fluentui/web-components", - "email": "rupertdavid@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-web-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json b/change/@fluentui-web-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json deleted file mode 100644 index 812ad60eb4fcee..00000000000000 --- a/change/@fluentui-web-components-674e26a9-57d5-4147-bda1-e4a467529eaf.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "build tokens package before running e2e tests", - "packageName": "@fluentui/web-components", - "email": "863023+radium-v@users.noreply.github.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-web-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json b/change/@fluentui-web-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json deleted file mode 100644 index df9f992ebe5ced..00000000000000 --- a/change/@fluentui-web-components-a03312db-25ed-42ac-8259-b9754b5afdd9.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "prerelease", - "comment": "fix: update disabled switch styles to GrayText for high-contrast mode", - "packageName": "@fluentui/web-components", - "email": "rupertdavid@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/packages/charts/chart-web-components/CHANGELOG.json b/packages/charts/chart-web-components/CHANGELOG.json index 083c48da4b8382..0824e940714c8e 100644 --- a/packages/charts/chart-web-components/CHANGELOG.json +++ b/packages/charts/chart-web-components/CHANGELOG.json @@ -1,6 +1,29 @@ { "name": "@fluentui/chart-web-components", "entries": [ + { + "date": "Fri, 17 Jan 2025 04:07:40 GMT", + "tag": "@fluentui/chart-web-components_v0.0.0", + "version": "0.0.0", + "comments": { + "none": [ + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/chart-web-components", + "commit": "408fe44060b746844a9c76c67391b18d76d1f26e", + "comment": "chore: sync failed release pipeline with git" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/chart-web-components", + "comment": "Bump @fluentui/web-components to v3.0.0-beta.77", + "commit": "24bd1b2e8063db6c121ee02425db564fbb762f5a" + } + ] + } + }, { "date": "Tue, 14 Jan 2025 14:42:14 GMT", "tag": "@fluentui/chart-web-components_v0.0.0-alpha.2", diff --git a/packages/charts/chart-web-components/CHANGELOG.md b/packages/charts/chart-web-components/CHANGELOG.md index 19eff92c0072a1..c5f2184dfb5e5b 100644 --- a/packages/charts/chart-web-components/CHANGELOG.md +++ b/packages/charts/chart-web-components/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/chart-web-components -This log was last generated on Tue, 14 Jan 2025 14:42:14 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 04:07:40 GMT and should not be manually modified. <!-- Start content --> +## [0.0.0](https://github.com/microsoft/fluentui/tree/@fluentui/chart-web-components_v0.0.0) + +Fri, 17 Jan 2025 04:07:40 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/chart-web-components_v0.0.0-alpha.2..@fluentui/chart-web-components_v0.0.0) + +### Patches + +- Bump @fluentui/web-components to v3.0.0-beta.77 ([PR #33679](https://github.com/microsoft/fluentui/pull/33679) by beachball) + ## [0.0.0-alpha.2](https://github.com/microsoft/fluentui/tree/@fluentui/chart-web-components_v0.0.0-alpha.2) Tue, 14 Jan 2025 14:42:14 GMT diff --git a/packages/charts/chart-web-components/package.json b/packages/charts/chart-web-components/package.json index 280ff647ca39fa..1ad8f593736763 100644 --- a/packages/charts/chart-web-components/package.json +++ b/packages/charts/chart-web-components/package.json @@ -1,7 +1,7 @@ { "name": "@fluentui/chart-web-components", "description": "A library of Fluent Chart Web Components", - "version": "0.0.0-alpha.2", + "version": "0.0.0", "author": { "name": "Microsoft" }, @@ -98,7 +98,7 @@ "dependencies": { "@microsoft/fast-web-utilities": "^6.0.0", "@fluentui/tokens": "^1.0.0-alpha.21", - "@fluentui/web-components": "^3.0.0-beta.76", + "@fluentui/web-components": "^3.0.0-beta.77", "@types/d3-selection": "^3.0.0", "@types/d3-shape": "^3.0.0", "d3-selection": "^3.0.0", diff --git a/packages/web-components/CHANGELOG.json b/packages/web-components/CHANGELOG.json index 910eaf1123eb5e..862108c9a70571 100644 --- a/packages/web-components/CHANGELOG.json +++ b/packages/web-components/CHANGELOG.json @@ -1,6 +1,35 @@ { "name": "@fluentui/web-components", "entries": [ + { + "date": "Fri, 17 Jan 2025 04:07:40 GMT", + "tag": "@fluentui/web-components_v3.0.0-beta.77", + "version": "3.0.0-beta.77", + "comments": { + "prerelease": [ + { + "author": "rupertdavid@microsoft.com", + "package": "@fluentui/web-components", + "commit": "00458f3bbe3f12c0cef556f8d8fd564ffa66983c", + "comment": "fix: revert logical properties in spinner to support rtl\"" + }, + { + "author": "rupertdavid@microsoft.com", + "package": "@fluentui/web-components", + "commit": "1e110d6492d33ca8959aaddc35e21cbd8992706b", + "comment": "fix: update disabled switch styles to GrayText for high-contrast mode" + } + ], + "none": [ + { + "author": "863023+radium-v@users.noreply.github.com", + "package": "@fluentui/web-components", + "commit": "e7e2987a4b0c8c36984dc9732937e2e58fb8fb35", + "comment": "build tokens package before running e2e tests" + } + ] + } + }, { "date": "Thu, 09 Jan 2025 04:07:00 GMT", "tag": "@fluentui/web-components_v3.0.0-beta.76", diff --git a/packages/web-components/CHANGELOG.md b/packages/web-components/CHANGELOG.md index baea4c5c33bbe3..470c51a4a5c90c 100644 --- a/packages/web-components/CHANGELOG.md +++ b/packages/web-components/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/web-components -This log was last generated on Thu, 09 Jan 2025 04:07:00 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 04:07:40 GMT and should not be manually modified. <!-- Start content --> +## [3.0.0-beta.77](https://github.com/microsoft/fluentui/tree/@fluentui/web-components_v3.0.0-beta.77) + +Fri, 17 Jan 2025 04:07:40 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/web-components_v3.0.0-beta.76..@fluentui/web-components_v3.0.0-beta.77) + +### Changes + +- fix: revert logical properties in spinner to support rtl" ([PR #33654](https://github.com/microsoft/fluentui/pull/33654) by rupertdavid@microsoft.com) +- fix: update disabled switch styles to GrayText for high-contrast mode ([PR #33637](https://github.com/microsoft/fluentui/pull/33637) by rupertdavid@microsoft.com) + ## [3.0.0-beta.76](https://github.com/microsoft/fluentui/tree/@fluentui/web-components_v3.0.0-beta.76) Thu, 09 Jan 2025 04:07:00 GMT diff --git a/packages/web-components/package.json b/packages/web-components/package.json index 4b79588c2a395e..4328ee523c54d5 100644 --- a/packages/web-components/package.json +++ b/packages/web-components/package.json @@ -1,7 +1,7 @@ { "name": "@fluentui/web-components", "description": "A library of Fluent Web Components", - "version": "3.0.0-beta.76", + "version": "3.0.0-beta.77", "author": { "name": "Microsoft", "url": "https://discord.gg/FcSNfg4" From 7026db8973fd90f6e58e40187797d03528650c12 Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Fri, 17 Jan 2025 07:21:52 +0000 Subject: [PATCH 57/78] release: applying package updates - react v8 --- ...-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json | 7 ----- ...-6c85af8f-ca2c-49b6-9cde-63be43588f00.json | 7 ----- ...-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json | 7 ----- ...-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json | 7 ----- packages/azure-themes/CHANGELOG.json | 15 +++++++++++ packages/azure-themes/CHANGELOG.md | 11 +++++++- packages/azure-themes/package.json | 4 +-- packages/charts/react-charting/CHANGELOG.json | 27 +++++++++++++++++++ packages/charts/react-charting/CHANGELOG.md | 13 ++++++++- packages/charts/react-charting/package.json | 6 ++--- packages/cra-template/package.json | 2 +- packages/fluent2-theme/CHANGELOG.json | 15 +++++++++++ packages/fluent2-theme/CHANGELOG.md | 11 +++++++- packages/fluent2-theme/package.json | 4 +-- packages/react-cards/CHANGELOG.json | 15 +++++++++++ packages/react-cards/CHANGELOG.md | 11 +++++++- packages/react-cards/package.json | 4 +-- .../library/package.json | 4 +-- packages/react-date-time/CHANGELOG.json | 15 +++++++++++ packages/react-date-time/CHANGELOG.md | 11 +++++++- packages/react-date-time/package.json | 4 +-- .../react-docsite-components/CHANGELOG.json | 21 +++++++++++++++ .../react-docsite-components/CHANGELOG.md | 12 ++++++++- .../react-docsite-components/package.json | 6 ++--- packages/react-examples/package.json | 14 +++++----- packages/react-experiments/CHANGELOG.json | 15 +++++++++++ packages/react-experiments/CHANGELOG.md | 11 +++++++- packages/react-experiments/package.json | 4 +-- packages/react-monaco-editor/CHANGELOG.json | 21 +++++++++++++++ packages/react-monaco-editor/CHANGELOG.md | 12 ++++++++- packages/react-monaco-editor/package.json | 6 ++--- packages/react/CHANGELOG.json | 27 +++++++++++++++++++ packages/react/CHANGELOG.md | 13 ++++++++- packages/react/package.json | 2 +- packages/storybook/package.json | 6 ++--- packages/theme-samples/CHANGELOG.json | 15 +++++++++++ packages/theme-samples/CHANGELOG.md | 11 +++++++- packages/theme-samples/package.json | 4 +-- 38 files changed, 327 insertions(+), 73 deletions(-) delete mode 100644 change/@fluentui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json delete mode 100644 change/@fluentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json delete mode 100644 change/@fluentui-react-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json delete mode 100644 change/@fluentui-react-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json diff --git a/change/@fluentui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json b/change/@fluentui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json deleted file mode 100644 index 97c6822b1874fc..00000000000000 --- a/change/@fluentui-react-04cc1ab9-345e-4196-a9fd-d0ad829eec9b.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: Passing rest of ITagItemSuggestionProps to the underlying component.", - "packageName": "@fluentui/react", - "email": "kmatejka@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json b/change/@fluentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json deleted file mode 100644 index 531341022a7daa..00000000000000 --- a/change/@fluentui-react-6c85af8f-ca2c-49b6-9cde-63be43588f00.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Delete border property from ms-PositioningContainer-layerHost containing typo", - "packageName": "@fluentui/react", - "email": "706967+KevinTCoughlin@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json b/change/@fluentui-react-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json deleted file mode 100644 index a14b5ba95b418d..00000000000000 --- a/change/@fluentui-react-aeee29c3-70b1-47de-a1a6-ee1ec2c0597d.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "add missing data-id attribute to close button in TagItem", - "packageName": "@fluentui/react", - "email": "kmatejka@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json b/change/@fluentui-react-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json deleted file mode 100644 index 63507f79520dc7..00000000000000 --- a/change/@fluentui-react-charting-cb76b3ea-9897-40ea-8f98-241f3265bb1a.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Make Dark mode text visible", - "packageName": "@fluentui/react-charting", - "email": "74965306+Anush2303@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/packages/azure-themes/CHANGELOG.json b/packages/azure-themes/CHANGELOG.json index 4aaf5704766b85..d422a264bc9375 100644 --- a/packages/azure-themes/CHANGELOG.json +++ b/packages/azure-themes/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/azure-themes", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/azure-themes_v8.6.120", + "version": "8.6.120", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/azure-themes", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:23 GMT", "tag": "@fluentui/azure-themes_v8.6.119", diff --git a/packages/azure-themes/CHANGELOG.md b/packages/azure-themes/CHANGELOG.md index c5e0dc641af2fe..5599d162f0a4ee 100644 --- a/packages/azure-themes/CHANGELOG.md +++ b/packages/azure-themes/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/azure-themes -This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [8.6.120](https://github.com/microsoft/fluentui/tree/@fluentui/azure-themes_v8.6.120) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/azure-themes_v8.6.119..@fluentui/azure-themes_v8.6.120) + +### Patches + +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [8.6.119](https://github.com/microsoft/fluentui/tree/@fluentui/azure-themes_v8.6.119) Mon, 13 Jan 2025 07:21:23 GMT diff --git a/packages/azure-themes/package.json b/packages/azure-themes/package.json index 49ed3c4f1ba138..b6a061aef01ccc 100644 --- a/packages/azure-themes/package.json +++ b/packages/azure-themes/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/azure-themes", - "version": "8.6.119", + "version": "8.6.120", "description": "Azure themes for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" } diff --git a/packages/charts/react-charting/CHANGELOG.json b/packages/charts/react-charting/CHANGELOG.json index 39fddc4b97a2dc..3865d8a3ef769e 100644 --- a/packages/charts/react-charting/CHANGELOG.json +++ b/packages/charts/react-charting/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-charting", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/react-charting_v5.23.41", + "version": "5.23.41", + "comments": { + "patch": [ + { + "author": "74965306+Anush2303@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "c26be3e3a85258c61111cf2dd5c19798d3a4e936", + "comment": "Make Dark mode text visible" + }, + { + "author": "beachball", + "package": "@fluentui/react-charting", + "comment": "Bump @fluentui/theme-samples to v8.7.196", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + }, + { + "author": "beachball", + "package": "@fluentui/react-charting", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:22 GMT", "tag": "@fluentui/react-charting_v5.23.40", diff --git a/packages/charts/react-charting/CHANGELOG.md b/packages/charts/react-charting/CHANGELOG.md index 42e32365cd9654..b3da0add0090fb 100644 --- a/packages/charts/react-charting/CHANGELOG.md +++ b/packages/charts/react-charting/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-charting -This log was last generated on Mon, 13 Jan 2025 07:21:22 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [5.23.41](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.41) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charting_v5.23.40..@fluentui/react-charting_v5.23.41) + +### Patches + +- Make Dark mode text visible ([PR #33671](https://github.com/microsoft/fluentui/pull/33671) by 74965306+Anush2303@users.noreply.github.com) +- Bump @fluentui/theme-samples to v8.7.196 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [5.23.40](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.40) Mon, 13 Jan 2025 07:21:22 GMT diff --git a/packages/charts/react-charting/package.json b/packages/charts/react-charting/package.json index 80f4f6edff1ebd..808b802f2c80ab 100644 --- a/packages/charts/react-charting/package.json +++ b/packages/charts/react-charting/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-charting", - "version": "5.23.40", + "version": "5.23.41", "description": "React web charting controls for Microsoft fluentui system.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -40,7 +40,7 @@ }, "dependencies": { "@fluentui/react-focus": "^8.9.20", - "@fluentui/theme-samples": "^8.7.195", + "@fluentui/theme-samples": "^8.7.196", "@microsoft/load-themed-styles": "^1.10.26", "@types/d3-array": "^3.0.0", "@types/d3-axis": "^3.0.0", @@ -66,7 +66,7 @@ "tslib": "^2.1.0" }, "peerDependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@types/react": ">=16.8.0 <19.0.0", "@types/react-dom": ">=16.8.0 <19.0.0", "react": ">=16.8.0 <19.0.0", diff --git a/packages/cra-template/package.json b/packages/cra-template/package.json index 53539c3f54f811..93d870af2b4e44 100644 --- a/packages/cra-template/package.json +++ b/packages/cra-template/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/cra-template", - "version": "8.4.196", + "version": "8.4.197", "description": "Create React App template for Fluent UI React (@fluentui/react)", "repository": { "type": "git", diff --git a/packages/fluent2-theme/CHANGELOG.json b/packages/fluent2-theme/CHANGELOG.json index 5accf0e86228d6..d1bb9fd55ca5a1 100644 --- a/packages/fluent2-theme/CHANGELOG.json +++ b/packages/fluent2-theme/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/fluent2-theme", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/fluent2-theme_v8.107.124", + "version": "8.107.124", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/fluent2-theme", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:23 GMT", "tag": "@fluentui/fluent2-theme_v8.107.123", diff --git a/packages/fluent2-theme/CHANGELOG.md b/packages/fluent2-theme/CHANGELOG.md index 669e0f54e84205..0c6911011eb685 100644 --- a/packages/fluent2-theme/CHANGELOG.md +++ b/packages/fluent2-theme/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/fluent2-theme -This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [8.107.124](https://github.com/microsoft/fluentui/tree/@fluentui/fluent2-theme_v8.107.124) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/fluent2-theme_v8.107.123..@fluentui/fluent2-theme_v8.107.124) + +### Patches + +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [8.107.123](https://github.com/microsoft/fluentui/tree/@fluentui/fluent2-theme_v8.107.123) Mon, 13 Jan 2025 07:21:23 GMT diff --git a/packages/fluent2-theme/package.json b/packages/fluent2-theme/package.json index c9bd931fde9043..6922e4d226a17b 100644 --- a/packages/fluent2-theme/package.json +++ b/packages/fluent2-theme/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/fluent2-theme", - "version": "8.107.123", + "version": "8.107.124", "description": "A Fluent2 theme for Fluent UI React 8.x", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" } diff --git a/packages/react-cards/CHANGELOG.json b/packages/react-cards/CHANGELOG.json index 894fc0a4338fa7..55faad53754276 100644 --- a/packages/react-cards/CHANGELOG.json +++ b/packages/react-cards/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-cards", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/react-cards_v0.205.196", + "version": "0.205.196", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-cards", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:23 GMT", "tag": "@fluentui/react-cards_v0.205.195", diff --git a/packages/react-cards/CHANGELOG.md b/packages/react-cards/CHANGELOG.md index 8842b2aa64790c..6772d275a15ad3 100644 --- a/packages/react-cards/CHANGELOG.md +++ b/packages/react-cards/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-cards -This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [0.205.196](https://github.com/microsoft/fluentui/tree/@fluentui/react-cards_v0.205.196) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-cards_v0.205.195..@fluentui/react-cards_v0.205.196) + +### Patches + +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [0.205.195](https://github.com/microsoft/fluentui/tree/@fluentui/react-cards_v0.205.195) Mon, 13 Jan 2025 07:21:23 GMT diff --git a/packages/react-cards/package.json b/packages/react-cards/package.json index d3b373b949b12f..1d983cc06104c4 100644 --- a/packages/react-cards/package.json +++ b/packages/react-cards/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-cards", - "version": "0.205.195", + "version": "0.205.196", "description": "Deprecated experimental Card container components for Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -33,7 +33,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@fluentui/foundation-legacy": "^8.4.23", "@fluentui/set-version": "^8.2.23", "@microsoft/load-themed-styles": "^1.10.26", diff --git a/packages/react-components/react-migration-v8-v9/library/package.json b/packages/react-components/react-migration-v8-v9/library/package.json index c7cc7dd2fc481f..d5f844d5560978 100644 --- a/packages/react-components/react-migration-v8-v9/library/package.json +++ b/packages/react-components/react-migration-v8-v9/library/package.json @@ -19,8 +19,8 @@ }, "dependencies": { "@ctrl/tinycolor": "^3.3.4", - "@fluentui/fluent2-theme": "^8.107.123", - "@fluentui/react": "^8.122.6", + "@fluentui/fluent2-theme": "^8.107.124", + "@fluentui/react": "^8.122.7", "@fluentui/react-components": "^9.57.0", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-hooks": "^8.8.16", diff --git a/packages/react-date-time/CHANGELOG.json b/packages/react-date-time/CHANGELOG.json index ae36148a7907cd..13d1d5535aa14a 100644 --- a/packages/react-date-time/CHANGELOG.json +++ b/packages/react-date-time/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-date-time", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/react-date-time_v8.7.196", + "version": "8.7.196", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-date-time", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:23 GMT", "tag": "@fluentui/react-date-time_v8.7.195", diff --git a/packages/react-date-time/CHANGELOG.md b/packages/react-date-time/CHANGELOG.md index b49bc61fd8e02c..e5498181ef7b9c 100644 --- a/packages/react-date-time/CHANGELOG.md +++ b/packages/react-date-time/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-date-time -This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [8.7.196](https://github.com/microsoft/fluentui/tree/@fluentui/react-date-time_v8.7.196) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-date-time_v8.7.195..@fluentui/react-date-time_v8.7.196) + +### Patches + +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [8.7.195](https://github.com/microsoft/fluentui/tree/@fluentui/react-date-time_v8.7.195) Mon, 13 Jan 2025 07:21:23 GMT diff --git a/packages/react-date-time/package.json b/packages/react-date-time/package.json index f487bb5a933dac..dad5ed73ea5ba7 100644 --- a/packages/react-date-time/package.json +++ b/packages/react-date-time/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-date-time", - "version": "8.7.195", + "version": "8.7.196", "description": "Date and time related React components for building experiences for Microsoft 365.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" }, diff --git a/packages/react-docsite-components/CHANGELOG.json b/packages/react-docsite-components/CHANGELOG.json index 5d7a22a2596c23..25c7b12d0ca2af 100644 --- a/packages/react-docsite-components/CHANGELOG.json +++ b/packages/react-docsite-components/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-docsite-components", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/react-docsite-components_v8.13.161", + "version": "8.13.161", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + }, + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react-monaco-editor to v1.7.279", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:23 GMT", "tag": "@fluentui/react-docsite-components_v8.13.160", diff --git a/packages/react-docsite-components/CHANGELOG.md b/packages/react-docsite-components/CHANGELOG.md index 33839b07639803..0bcbda66e29a6b 100644 --- a/packages/react-docsite-components/CHANGELOG.md +++ b/packages/react-docsite-components/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-docsite-components -This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [8.13.161](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.161) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-docsite-components_v8.13.160..@fluentui/react-docsite-components_v8.13.161) + +### Patches + +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) +- Bump @fluentui/react-monaco-editor to v1.7.279 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [8.13.160](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.160) Mon, 13 Jan 2025 07:21:23 GMT diff --git a/packages/react-docsite-components/package.json b/packages/react-docsite-components/package.json index f4ee726ea14112..846e8494ce15e2 100644 --- a/packages/react-docsite-components/package.json +++ b/packages/react-docsite-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-docsite-components", - "version": "8.13.160", + "version": "8.13.161", "description": "Fluent UI React components for building documentation sites.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -35,14 +35,14 @@ "react-dom": ">=16.8.0 <19.0.0" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@fluentui/theme": "^2.6.64", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", "@fluentui/public-docsite-setup": "^0.3.34", "@fluentui/react-hooks": "^8.8.16", "@fluentui/set-version": "^8.2.23", - "@fluentui/react-monaco-editor": "^1.7.278", + "@fluentui/react-monaco-editor": "^1.7.279", "color-check": "0.0.2", "markdown-to-jsx": "^7.0.0", "office-ui-fabric-core": "^11.0.0", diff --git a/packages/react-examples/package.json b/packages/react-examples/package.json index 4b8954b9a8ddac..52d192909d0151 100644 --- a/packages/react-examples/package.json +++ b/packages/react-examples/package.json @@ -27,18 +27,18 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/azure-themes": "^8.6.119", + "@fluentui/azure-themes": "^8.6.120", "@fluentui/date-time-utilities": "^8.6.9", "@fluentui/dom-utilities": "^2.3.9", "@fluentui/example-data": "^8.4.25", "@fluentui/font-icons-mdl2": "^8.5.57", "@fluentui/foundation-legacy": "^8.4.23", "@fluentui/merge-styles": "^8.6.13", - "@fluentui/react": "^8.122.6", - "@fluentui/react-cards": "^0.205.195", - "@fluentui/react-charting": "^5.23.40", - "@fluentui/react-docsite-components": "^8.13.160", - "@fluentui/react-experiments": "^8.14.192", + "@fluentui/react": "^8.122.7", + "@fluentui/react-cards": "^0.205.196", + "@fluentui/react-charting": "^5.23.41", + "@fluentui/react-docsite-components": "^8.13.161", + "@fluentui/react-experiments": "^8.14.193", "@fluentui/react-file-type-icons": "^8.12.7", "@fluentui/react-focus": "^8.9.20", "@fluentui/react-hooks": "^8.8.16", @@ -47,7 +47,7 @@ "@fluentui/scheme-utilities": "^8.3.65", "@fluentui/style-utilities": "^8.11.6", "@fluentui/theme": "^2.6.64", - "@fluentui/theme-samples": "^8.7.195", + "@fluentui/theme-samples": "^8.7.196", "@fluentui/utilities": "^8.15.19", "@microsoft/load-themed-styles": "^1.10.26", "d3-fetch": "3.0.1", diff --git a/packages/react-experiments/CHANGELOG.json b/packages/react-experiments/CHANGELOG.json index 868b4ed9328a7a..25d945574899a8 100644 --- a/packages/react-experiments/CHANGELOG.json +++ b/packages/react-experiments/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-experiments", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/react-experiments_v8.14.193", + "version": "8.14.193", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-experiments", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:23 GMT", "tag": "@fluentui/react-experiments_v8.14.192", diff --git a/packages/react-experiments/CHANGELOG.md b/packages/react-experiments/CHANGELOG.md index b60f783ca0d8a9..c4bcce1227cca6 100644 --- a/packages/react-experiments/CHANGELOG.md +++ b/packages/react-experiments/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-experiments -This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [8.14.193](https://github.com/microsoft/fluentui/tree/@fluentui/react-experiments_v8.14.193) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-experiments_v8.14.192..@fluentui/react-experiments_v8.14.193) + +### Patches + +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [8.14.192](https://github.com/microsoft/fluentui/tree/@fluentui/react-experiments_v8.14.192) Mon, 13 Jan 2025 07:21:23 GMT diff --git a/packages/react-experiments/package.json b/packages/react-experiments/package.json index f01f7b540cd0c9..c08698e4eb6eb4 100644 --- a/packages/react-experiments/package.json +++ b/packages/react-experiments/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-experiments", - "version": "8.14.192", + "version": "8.14.193", "description": "Experimental React components for building experiences for Microsoft 365.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -38,7 +38,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@fluentui/theme": "^2.6.64", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", diff --git a/packages/react-monaco-editor/CHANGELOG.json b/packages/react-monaco-editor/CHANGELOG.json index a9165e4ed2632c..3bc576576e9b58 100644 --- a/packages/react-monaco-editor/CHANGELOG.json +++ b/packages/react-monaco-editor/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-monaco-editor", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/react-monaco-editor_v1.7.279", + "version": "1.7.279", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + }, + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react-charting to v5.23.41", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:23 GMT", "tag": "@fluentui/react-monaco-editor_v1.7.278", diff --git a/packages/react-monaco-editor/CHANGELOG.md b/packages/react-monaco-editor/CHANGELOG.md index 347343e2e9ed51..c29dc163f96936 100644 --- a/packages/react-monaco-editor/CHANGELOG.md +++ b/packages/react-monaco-editor/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-monaco-editor -This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [1.7.279](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.279) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-monaco-editor_v1.7.278..@fluentui/react-monaco-editor_v1.7.279) + +### Patches + +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) +- Bump @fluentui/react-charting to v5.23.41 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [1.7.278](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.278) Mon, 13 Jan 2025 07:21:23 GMT diff --git a/packages/react-monaco-editor/package.json b/packages/react-monaco-editor/package.json index 661f83943e8eef..92edf729901440 100644 --- a/packages/react-monaco-editor/package.json +++ b/packages/react-monaco-editor/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-monaco-editor", - "version": "1.7.278", + "version": "1.7.279", "description": "Live React example editing using monaco", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -29,12 +29,12 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", "@fluentui/monaco-editor": "^1.3.24", "@fluentui/react-hooks": "^8.8.16", - "@fluentui/react-charting": "^5.23.40", + "@fluentui/react-charting": "^5.23.41", "raw-loader": "4.0.2", "react-syntax-highlighter": "^10.1.3", "tslib": "^2.1.0" diff --git a/packages/react/CHANGELOG.json b/packages/react/CHANGELOG.json index 88716d9606fe0a..eb7da96614886e 100644 --- a/packages/react/CHANGELOG.json +++ b/packages/react/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:31 GMT", + "tag": "@fluentui/react_v8.122.7", + "version": "8.122.7", + "comments": { + "patch": [ + { + "author": "kmatejka@microsoft.com", + "package": "@fluentui/react", + "commit": "e9706f78650b2a72e09dca1c5f69f23f4967f33b", + "comment": "fix: Passing rest of ITagItemSuggestionProps to the underlying component." + }, + { + "author": "706967+KevinTCoughlin@users.noreply.github.com", + "package": "@fluentui/react", + "commit": "6e8378b3d1ef9b27ed944b5eae855c59ce348836", + "comment": "Delete border property from ms-PositioningContainer-layerHost containing typo" + }, + { + "author": "kmatejka@microsoft.com", + "package": "@fluentui/react", + "commit": "614e8b594da0eec4104f9fcaa034a4352fee5c74", + "comment": "add missing data-id attribute to close button in TagItem" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:22 GMT", "tag": "@fluentui/react_v8.122.6", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 7d8b9d600a8490..8e1e2d1642a521 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react -This log was last generated on Mon, 13 Jan 2025 07:21:22 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:31 GMT and should not be manually modified. <!-- Start content --> +## [8.122.7](https://github.com/microsoft/fluentui/tree/@fluentui/react_v8.122.7) + +Fri, 17 Jan 2025 07:21:31 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react_v8.122.6..@fluentui/react_v8.122.7) + +### Patches + +- fix: Passing rest of ITagItemSuggestionProps to the underlying component. ([PR #32839](https://github.com/microsoft/fluentui/pull/32839) by kmatejka@microsoft.com) +- Delete border property from ms-PositioningContainer-layerHost containing typo ([PR #32885](https://github.com/microsoft/fluentui/pull/32885) by 706967+KevinTCoughlin@users.noreply.github.com) +- add missing data-id attribute to close button in TagItem ([PR #31956](https://github.com/microsoft/fluentui/pull/31956) by kmatejka@microsoft.com) + ## [8.122.6](https://github.com/microsoft/fluentui/tree/@fluentui/react_v8.122.6) Mon, 13 Jan 2025 07:21:22 GMT diff --git a/packages/react/package.json b/packages/react/package.json index 8a452f08378d43..fe335a033141be 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react", - "version": "8.122.6", + "version": "8.122.7", "description": "Reusable React components for building web experiences.", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/storybook/package.json b/packages/storybook/package.json index 97be09debf8faf..fdace2fd7618c0 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -22,11 +22,11 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@fluentui/theme": "^2.6.64", "@storybook/addon-essentials": "7.6.20", - "@fluentui/azure-themes": "^8.6.119", - "@fluentui/theme-samples": "^8.7.195", + "@fluentui/azure-themes": "^8.6.120", + "@fluentui/theme-samples": "^8.7.196", "tslib": "^2.1.0" }, "peerDependencies": { diff --git a/packages/theme-samples/CHANGELOG.json b/packages/theme-samples/CHANGELOG.json index 694a5edcd67cdf..ff0fa6af1a1f81 100644 --- a/packages/theme-samples/CHANGELOG.json +++ b/packages/theme-samples/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/theme-samples", "entries": [ + { + "date": "Fri, 17 Jan 2025 07:21:32 GMT", + "tag": "@fluentui/theme-samples_v8.7.196", + "version": "8.7.196", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/theme-samples", + "comment": "Bump @fluentui/react to v8.122.7", + "commit": "baf887d95f91874c814a7cae749c20e797f828be" + } + ] + } + }, { "date": "Mon, 13 Jan 2025 07:21:23 GMT", "tag": "@fluentui/theme-samples_v8.7.195", diff --git a/packages/theme-samples/CHANGELOG.md b/packages/theme-samples/CHANGELOG.md index e21be703fbb89f..6ed21c779e917d 100644 --- a/packages/theme-samples/CHANGELOG.md +++ b/packages/theme-samples/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/theme-samples -This log was last generated on Mon, 13 Jan 2025 07:21:23 GMT and should not be manually modified. +This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. <!-- Start content --> +## [8.7.196](https://github.com/microsoft/fluentui/tree/@fluentui/theme-samples_v8.7.196) + +Fri, 17 Jan 2025 07:21:32 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/theme-samples_v8.7.195..@fluentui/theme-samples_v8.7.196) + +### Patches + +- Bump @fluentui/react to v8.122.7 ([commit](https://github.com/microsoft/fluentui/commit/baf887d95f91874c814a7cae749c20e797f828be) by beachball) + ## [8.7.195](https://github.com/microsoft/fluentui/tree/@fluentui/theme-samples_v8.7.195) Mon, 13 Jan 2025 07:21:23 GMT diff --git a/packages/theme-samples/package.json b/packages/theme-samples/package.json index c89e224f28e127..d46cde211cdeaa 100644 --- a/packages/theme-samples/package.json +++ b/packages/theme-samples/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/theme-samples", - "version": "8.7.195", + "version": "8.7.196", "description": "Sample themes for use with Fabric components.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -26,7 +26,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.6", + "@fluentui/react": "^8.122.7", "@fluentui/set-version": "^8.2.23", "@fluentui/scheme-utilities": "^8.3.65", "tslib": "^2.1.0" From dc365b11fcca7eb0077460510eb78d93d3315ecd Mon Sep 17 00:00:00 2001 From: Anush Gupta <74965306+Anush2303@users.noreply.github.com> Date: Fri, 17 Jan 2025 14:46:58 +0530 Subject: [PATCH 58/78] fix(react-charting): declarative chart bug fixes (#33567) --- ...-4aabb452-e7e3-47e3-9964-7a7c4814e759.json | 7 + .../components/AreaChart/AreaChart.base.tsx | 4 +- .../DeclarativeChart/PlotlySchemaAdapter.ts | 18 +- .../PlotlySchemaAdapterUT.test.tsx | 6 +- .../DeclarativeChartRTL.test.tsx.snap | 2 +- .../PlotlySchemaAdapterUT.test.tsx.snap | 178 +++++++++--------- 6 files changed, 112 insertions(+), 103 deletions(-) create mode 100644 change/@fluentui-react-charting-4aabb452-e7e3-47e3-9964-7a7c4814e759.json diff --git a/change/@fluentui-react-charting-4aabb452-e7e3-47e3-9964-7a7c4814e759.json b/change/@fluentui-react-charting-4aabb452-e7e3-47e3-9964-7a7c4814e759.json new file mode 100644 index 00000000000000..157b74502e849c --- /dev/null +++ b/change/@fluentui-react-charting-4aabb452-e7e3-47e3-9964-7a7c4814e759.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Declarative chart bug fixes", + "packageName": "@fluentui/react-charting", + "email": "74965306+Anush2303@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/react-charting/src/components/AreaChart/AreaChart.base.tsx b/packages/charts/react-charting/src/components/AreaChart/AreaChart.base.tsx index 300ef5a45656be..02933ecb66672e 100644 --- a/packages/charts/react-charting/src/components/AreaChart/AreaChart.base.tsx +++ b/packages/charts/react-charting/src/components/AreaChart/AreaChart.base.tsx @@ -450,7 +450,9 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt }); stackedData.push(currentStack); }); - this._isMultiStackChart = stackedData && stackedData.length > 1 ? true : false; + this._isMultiStackChart = !!(this.props.legendProps?.selectedLegends + ? stackedData?.length >= 1 + : stackedData?.length > 1); return { stackedData, maxOfYVal, diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts index d570f55a927c4e..bfdc4419d3ca55 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts @@ -24,10 +24,11 @@ import { IHorizontalBarChartWithAxisProps } from '../HorizontalBarChartWithAxis/ import { ILineChartProps } from '../LineChart/index'; import { IAreaChartProps } from '../AreaChart/index'; import { IHeatMapChartProps } from '../HeatMapChart/index'; -import { DataVizPalette, getNextColor } from '../../utilities/colors'; +import { DataVizPalette, getColorFromToken, getNextColor } from '../../utilities/colors'; import { GaugeChartVariant, IGaugeChartProps, IGaugeChartSegment } from '../GaugeChart/index'; import { IGroupedVerticalBarChartProps } from '../GroupedVerticalBarChart/index'; import { IVerticalBarChartProps } from '../VerticalBarChart/index'; +import { timeParse } from 'd3-time-format'; const isDate = (value: any): boolean => !isNaN(Date.parse(value)); const isNumber = (value: any): boolean => !isNaN(parseFloat(value)) && isFinite(value); @@ -35,9 +36,10 @@ export const isDateArray = (array: any[]): boolean => isArrayOrTypedArray(array) export const isNumberArray = (array: any[]): boolean => isArrayOrTypedArray(array) && array.every(isNumber); export const isMonthArray = (array: any[]): boolean => { if (array && array.length > 0) { - const presentYear = new Date().getFullYear(); + const parseFullMonth = timeParse('%B'); + const parseShortMonth = timeParse('%b'); return array.every(possiblyMonthValue => { - return isDate(`${possiblyMonthValue} 01, ${presentYear}`); + return parseFullMonth(possiblyMonthValue) !== null || parseShortMonth(possiblyMonthValue) !== null; }); } return false; @@ -147,7 +149,7 @@ export const transformPlotlyJsonToDonutProps = ( height, innerRadius, hideLabels, - showLabelsInPercent: firstData.textinfo ? firstData.textinfo === 'percent' : true, + showLabelsInPercent: firstData.textinfo ? ['percent', 'label+percent'].includes(firstData.textinfo) : true, styles, }; }; @@ -404,7 +406,9 @@ export const transformPlotlyJsonToHorizontalBarWithAxisProps = ( }; }); }) - .flat(); + .flat() + //reversing the order to invert the Y bars order as required by plotly. + .reverse(); const chartHeight: number = typeof layout.height === 'number' ? layout.height : 450; const margin: number = typeof layout.margin?.l === 'number' ? layout.margin?.l : 0; @@ -579,11 +583,11 @@ export const transformPlotlyJsonToGaugeProps = ( const diff = firstData.value - firstData.delta.reference; if (diff >= 0) { sublabel = `\u25B2 ${diff}`; - const color = getColor(firstData.delta.increasing?.color || '', colorMap, isDarkTheme); + const color = getColorFromToken(DataVizPalette.success, isDarkTheme); sublabelColor = color; } else { sublabel = `\u25BC ${Math.abs(diff)}`; - const color = getColor(firstData.delta.decreasing?.color || '', colorMap, isDarkTheme); + const color = getColorFromToken(DataVizPalette.error, isDarkTheme); sublabelColor = color; } } diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapterUT.test.tsx b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapterUT.test.tsx index 174ca2d90161bd..b0764953469fac 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapterUT.test.tsx +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapterUT.test.tsx @@ -102,11 +102,7 @@ describe('isMonthArray', () => { expect(isMonthArray([date, date.getDate() + 1, date.getDate() + 2])).toBe(false); }); - test('Should return true when input array contains months data', () => { - expect(isMonthArray([10, 11, 1])).toBe(true); - }); - - test('Should return false when input array contains numeric data(apart from months 1 to 12)', () => { + test('Should return false when input array contains numeric data', () => { expect(isMonthArray([20, 30, 40])).toBe(false); }); diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap index a4e8dfbfe3165e..bf5cdb41de7cbd 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap @@ -4187,7 +4187,7 @@ exports[`DeclarativeChart Should render gaugechart in DeclarativeChart 1`] = ` class= { - fill: #9373c0; + fill: #107c10; font-size: 12px; font-weight: 600; } diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap index 2e2347d3576bc3..8966e3f55d1b98 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap @@ -384,7 +384,7 @@ Object { ], "styles": Object { "sublabel": Object { - "fill": "#f7adda", + "fill": "#54b054", }, }, "sublabel": "▲ 20", @@ -2844,70 +2844,70 @@ Object { "chartTitle": "PHP Framework Popularity at Work - SitePoint, 2015", "data": Array [ Object { - "color": "#cf87da", - "legend": "Laravel", - "x": 1659, - "y": "Laravel", + "color": "#4f6bed", + "legend": "Aura", + "x": 10, + "y": "Aura", }, Object { - "color": "#dac157", - "legend": "Symfony2", - "x": 1067, - "y": "Symfony2", + "color": "#d0b232", + "legend": "Drupal", + "x": 11, + "y": "Drupal", }, Object { - "color": "#637cef", - "legend": "Nette", - "x": 671, - "y": "Nette", + "color": "#c36bd1", + "legend": "TYPO3 Flow", + "x": 17, + "y": "TYPO3 Flow", }, Object { - "color": "#e3008c", - "legend": "CodeIgniter", - "x": 597, - "y": "CodeIgniter", + "color": "#73aa24", + "legend": "FuelPHP", + "x": 25, + "y": "FuelPHP", }, Object { - "color": "#2aa0a4", - "legend": "Yii 2", - "x": 504, - "y": "Yii 2", + "color": "#d77440", + "legend": "Kohana", + "x": 35, + "y": "Kohana", }, Object { - "color": "#9373c0", - "legend": "PHPixie", - "x": 418, - "y": "PHPixie", + "color": "#4fa1e1", + "legend": "Typo 3", + "x": 35, + "y": "Typo 3", }, Object { - "color": "#13a10e", - "legend": "Yii 1", - "x": 407, - "y": "Yii 1", + "color": "#27ac22", + "legend": "Simple MVC Framework", + "x": 42, + "y": "Simple MVC Framework", }, Object { - "color": "#3a96dd", - "legend": "Zend Framework 2", - "x": 390, - "y": "Zend Framework 2", + "color": "#a083c9", + "legend": "Silex", + "x": 65, + "y": "Silex", }, Object { - "color": "#ca5010", - "legend": "Company Internal Framework", - "x": 378, - "y": "Company Internal Framework", + "color": "#4cb4b7", + "legend": "Slim", + "x": 79, + "y": "Slim", }, Object { - "color": "#57811b", - "legend": "Zend Framework 1", - "x": 274, - "y": "Zend Framework 1", + "color": "#ee5fb7", + "legend": "Phalcon", + "x": 169, + "y": "Phalcon", }, Object { - "color": "#b146c2", - "legend": "CakePHP", - "x": 255, - "y": "CakePHP", + "color": "#93a4f4", + "legend": "We use a CMS for everything", + "x": 203, + "y": "We use a CMS for everything", }, Object { "color": "#ae8c00", @@ -2916,70 +2916,70 @@ Object { "y": "No Framework", }, Object { - "color": "#93a4f4", - "legend": "We use a CMS for everything", - "x": 203, - "y": "We use a CMS for everything", + "color": "#b146c2", + "legend": "CakePHP", + "x": 255, + "y": "CakePHP", }, Object { - "color": "#ee5fb7", - "legend": "Phalcon", - "x": 169, - "y": "Phalcon", + "color": "#57811b", + "legend": "Zend Framework 1", + "x": 274, + "y": "Zend Framework 1", }, Object { - "color": "#4cb4b7", - "legend": "Slim", - "x": 79, - "y": "Slim", + "color": "#ca5010", + "legend": "Company Internal Framework", + "x": 378, + "y": "Company Internal Framework", }, Object { - "color": "#a083c9", - "legend": "Silex", - "x": 65, - "y": "Silex", + "color": "#3a96dd", + "legend": "Zend Framework 2", + "x": 390, + "y": "Zend Framework 2", }, Object { - "color": "#27ac22", - "legend": "Simple MVC Framework", - "x": 42, - "y": "Simple MVC Framework", + "color": "#13a10e", + "legend": "Yii 1", + "x": 407, + "y": "Yii 1", }, Object { - "color": "#4fa1e1", - "legend": "Typo 3", - "x": 35, - "y": "Typo 3", + "color": "#9373c0", + "legend": "PHPixie", + "x": 418, + "y": "PHPixie", }, Object { - "color": "#d77440", - "legend": "Kohana", - "x": 35, - "y": "Kohana", + "color": "#2aa0a4", + "legend": "Yii 2", + "x": 504, + "y": "Yii 2", }, Object { - "color": "#73aa24", - "legend": "FuelPHP", - "x": 25, - "y": "FuelPHP", + "color": "#e3008c", + "legend": "CodeIgniter", + "x": 597, + "y": "CodeIgniter", }, Object { - "color": "#c36bd1", - "legend": "TYPO3 Flow", - "x": 17, - "y": "TYPO3 Flow", + "color": "#637cef", + "legend": "Nette", + "x": 671, + "y": "Nette", }, Object { - "color": "#d0b232", - "legend": "Drupal", - "x": 11, - "y": "Drupal", + "color": "#dac157", + "legend": "Symfony2", + "x": 1067, + "y": "Symfony2", }, Object { - "color": "#4f6bed", - "legend": "Aura", - "x": 10, - "y": "Aura", + "color": "#cf87da", + "legend": "Laravel", + "x": 1659, + "y": "Laravel", }, ], "secondaryYAxistitle": "", From fd420e1e0b66e04c8a423cff3eea6d21d9434d2d Mon Sep 17 00:00:00 2001 From: Victor Genaev <vgenaev@gmail.com> Date: Fri, 17 Jan 2025 12:53:47 +0100 Subject: [PATCH 59/78] chore: replace deprecation eslint plugin in favor of ts-eslint/no-deprecated (#33602) --- apps/chart-docsite/.eslintrc.json | 2 +- apps/public-docsite-resources/.eslintrc.json | 4 +- apps/public-docsite-v9/.eslintrc.json | 4 +- apps/public-docsite/.eslintrc.json | 4 +- apps/theming-designer/.eslintrc.json | 4 +- apps/vr-tests-react-components/.eslintrc.json | 4 +- apps/vr-tests/.eslintrc.json | 4 +- ...-af108562-5adb-43f5-b0f2-06358f95ab65.json | 7 ++ ...-fa5bccc0-99d9-46ae-8cc6-5fbdd18360cb.json | 7 ++ ...-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json | 7 ++ ...-05901292-a3b8-4d34-834a-8f5d74736e99.json | 7 ++ ...-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json | 7 ++ ...-f28e7eb2-d3a4-4060-95af-0c74756f900d.json | 7 ++ ...-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json | 7 ++ ...-b082df99-c014-4ba8-8523-fdc134b25bcb.json | 7 ++ ...-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json | 7 ++ ...-9cab8d3a-1bcd-4c03-8138-82520de36649.json | 7 ++ ...-aa5b0252-40de-497c-88f5-377ada948719.json | 7 ++ ...-1411f212-27ea-4335-bcd3-b210359b0bd1.json | 7 ++ ...-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json | 7 ++ ...-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json | 7 ++ ...-4944bee5-948a-4649-87a1-8362f68d4635.json | 7 ++ ...-14e136f0-eeb5-4113-8921-e732772e0a04.json | 7 ++ ...-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json | 7 ++ ...-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json | 7 ++ ...-d79ea04c-0316-4c1e-9c1e-96710298947a.json | 7 ++ ...-51e8bb80-2224-47a8-8a42-282214bcee42.json | 7 ++ ...-045b67fd-ae48-4ed9-abbd-669235409ead.json | 7 ++ ...-946876fa-b8f4-4e15-bf15-54f86a508654.json | 7 ++ ...-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json | 7 ++ ...-7795f18a-df86-480a-8546-efca47ef6069.json | 7 ++ ...-02147114-2b1f-427d-a369-c495dcc060f7.json | 7 ++ ...-7ff1890e-77cb-4078-be01-2673bb29a80b.json | 7 ++ ...-59106324-2e52-43e5-b407-87f41706faa5.json | 7 ++ ...-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json | 7 ++ ...-041ffd34-f086-4af7-a72a-66dbbd56617b.json | 7 ++ ...-c489edef-c7ee-4bf0-8f32-8565edccb381.json | 7 ++ ...-a4a177a3-0514-4657-9fdd-a0e90d44e813.json | 7 ++ ...-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json | 7 ++ ...-287da350-699b-410f-bd97-7cb590731302.json | 7 ++ ...-82544042-02b6-4262-91cd-e7f9fe24bad2.json | 7 ++ ...-00dd23f0-89d0-486d-844f-30a880feb0f5.json | 7 ++ ...-1e695416-a364-41c7-98b1-5cc336ce40ed.json | 7 ++ ...-9d03e3c6-0e57-491d-bbb2-ff84af746057.json | 7 ++ ...-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json | 7 ++ package.json | 1 - packages/charts/react-charting/src/Styling.ts | 6 +- .../charts/react-charting/src/Utilities.ts | 14 --- .../components/DonutChart/DonutChart.base.tsx | 1 + .../HorizontalBarChart.base.tsx | 1 + .../MultiStackedBarChart.base.tsx | 1 + .../StackedBarChart/StackedBarChart.base.tsx | 1 + .../VerticalStackedBarChart.base.tsx | 2 +- .../src/utilities/SVGTooltipText.tsx | 2 +- packages/codemods/.eslintrc.json | 2 +- .../codeMods/utilities/helpers/propHelpers.ts | 2 +- packages/eslint-plugin/package.json | 1 - packages/eslint-plugin/src/configs/core.js | 15 +-- packages/font-icons-mdl2/src/IconNames.ts | 2 +- .../font-icons-mdl2/src/iconNames.test.ts | 2 +- packages/font-icons-mdl2/src/index.ts | 4 +- .../foundation-legacy/src/ThemeProvider.tsx | 2 +- packages/keyboard-key/src/index.ts | 4 +- packages/merge-styles/src/DeepPartial.ts | 2 +- packages/merge-styles/src/IStyleSet.ts | 10 +- packages/merge-styles/src/Stylesheet.ts | 4 +- packages/merge-styles/src/index.ts | 4 +- packages/react-cards/.eslintrc.json | 2 +- .../src/components/Accordion/useAccordion.ts | 2 +- .../useAccordionItemContextValues.ts | 2 +- .../useActivedescendant.test.tsx | 4 +- .../react-aria/library/src/button/index.ts | 2 +- .../button/useARIAButtonShorthand.test.tsx | 8 +- .../src/button/useARIAButtonShorthand.ts | 4 +- .../react-aria/library/src/index.ts | 2 +- .../react-avatar/library/src/Avatar.ts | 2 +- .../library/src/components/Avatar/index.ts | 2 +- .../react-avatar/library/src/index.ts | 2 +- .../components/Combobox/renderCombobox.tsx | 4 +- .../components/Dropdown/renderDropdown.tsx | 4 +- .../library/src/contexts/ComboboxContext.ts | 2 +- .../react-combobox/library/src/index.ts | 2 +- .../react-components/src/index.ts | 20 ++-- .../react-components/src/unstable/index.ts | 4 +- .../react-icons-compat/library/src/icon.ts | 2 +- .../src/createElement.test.tsx | 10 +- .../react-jsx-runtime/src/interop.test.tsx | 8 +- .../src/jsx-runtime.test.tsx | 10 +- .../react-menu/library/src/Menu.ts | 2 +- .../react-menu/library/src/MenuList.ts | 2 +- .../library/src/components/Menu/index.ts | 2 +- .../library/src/components/MenuList/index.ts | 2 +- .../library/src/components/index.ts | 2 +- .../react-menu/library/src/index.ts | 4 +- .../components/MessageBar/MessageBar.test.tsx | 10 +- .../components/MessageBar/useMessageBar.ts | 2 +- .../library/src/slots/presenceMotionSlot.tsx | 2 +- .../src/components/Popover/usePopover.ts | 2 +- .../react-positioning/src/usePositioning.ts | 2 +- .../useFluentProviderThemeStyleTag.test.tsx | 2 +- .../react-radio/library/src/contexts/index.ts | 2 +- .../react-radio/library/src/index.ts | 2 +- .../src/preset/manager.ts | 6 +- .../react-switch/library/src/Switch.ts | 2 +- .../library/src/components/Switch/index.ts | 2 +- .../react-switch/library/src/index.ts | 2 +- .../useDataGridHeaderCell.ts | 2 +- .../useTableSelectionCell.tsx | 2 +- .../src/components/Tab/useTabStyles.styles.ts | 2 +- .../react-tabster/src/index.ts | 4 +- .../TreeItem/useTreeItemContextValues.ts | 4 +- .../src/compose/deprecated/getSlots.test.tsx | 26 ++--- .../src/compose/deprecated/getSlots.ts | 10 +- .../compose/deprecated/getSlotsNext.test.tsx | 26 ++--- .../src/compose/deprecated/getSlotsNext.ts | 12 +- .../deprecated/resolveShorthand.test.tsx | 16 +-- .../compose/deprecated/resolveShorthand.ts | 6 +- .../src/compose/getIntrinsicElementProps.ts | 2 +- .../react-utilities/src/compose/index.ts | 10 +- .../src/hooks/useOnClickOutside.ts | 4 +- .../react-utilities/src/index.ts | 14 +-- .../react-utilities/src/ssr/canUseDOM.ts | 2 +- .../src/utils/getNativeElementProps.test.ts | 10 +- .../src/utils/getNativeElementProps.ts | 2 +- .../react-utilities/src/utils/index.ts | 2 +- .../react-conformance/src/isConformant.ts | 2 +- packages/react-date-time/src/Calendar.ts | 6 +- packages/react-date-time/src/DatePicker.ts | 4 +- .../react-docsite-components/.eslintrc.json | 12 +- .../Card/Card.Configure.Example.tsx | 2 +- .../Card/Card.Horizontal.Example.tsx | 2 +- .../Card/Card.Vertical.Example.tsx | 2 +- .../Chiclet/Chiclet.Footer.Example.tsx | 2 +- .../Chiclet/Chiclet.Xsmall.Footer.Example.tsx | 2 +- .../CollapsibleSection.Styled.Example.tsx | 2 +- ...PeopleSuggestions.HeaderFooter.Example.tsx | 2 +- .../Slider/Slider.Example.tsx | 2 +- .../Slider/Slider.Vertical.Example.tsx | 2 +- .../Theming.Schemes.Custom.Example.tsx | 6 +- .../Theming.Schemes.Variant.Example.tsx | 6 +- .../UnifiedPeoplePicker.WithEdit.Example.tsx | 2 +- .../FocusZone/FocusZone.List.Example.tsx | 2 +- .../react/Layer/Layer.Customized.Example.tsx | 2 +- .../src/react/Modal/Modal.Basic.Example.tsx | 2 +- .../react/Modal/Modal.Modeless.Example.tsx | 2 +- .../Panel.HandleDismissTarget.Example.tsx | 2 +- .../examples/PeoplePickerExampleData.ts | 2 +- .../Pivot/Pivot.OverflowMenu.Example.tsx | 2 +- .../ThemeGenerator/ThemeGenerator.doc.tsx | 2 +- packages/react-experiments/src/Foundation.ts | 4 +- packages/react-experiments/src/Styling.ts | 6 +- packages/react-experiments/src/Utilities.ts | 14 --- .../src/components/BAFAccordion/Accordion.tsx | 2 +- .../CollapsibleSection.state.tsx | 6 +- .../FloatingSuggestions.tsx | 2 +- .../FolderCover/FolderCover.types.ts | 2 +- .../SelectedItemsList/Items/CopyableItem.tsx | 2 +- .../subcomponents/DefaultEditingItem.tsx | 2 +- .../src/components/Sidebar/Sidebar.tsx | 6 +- .../src/components/Slider/Slider.base.tsx | 2 +- .../src/components/Slider/Slider.styles.tsx | 2 +- .../src/components/Slider/Slider.test.tsx | 2 +- .../src/components/Slider/Slider.tsx | 2 +- .../src/components/Slider/Slider.types.ts | 2 +- .../components/TilesList/TilesList.types.ts | 2 +- .../UnifiedPicker/UnifiedPicker.tsx | 8 +- .../src/components/FocusZone/FocusZone.tsx | 46 ++++---- .../react-hooks/src/useConstCallback.test.tsx | 2 +- .../react-hooks/src/useMountSync.test.tsx | 2 +- .../src/utilities/getQueryParam.ts | 2 +- packages/react/src/Icons.ts | 5 +- packages/react/src/Styling.ts | 3 - packages/react/src/Utilities.ts | 14 --- .../components/ActivityItem/ActivityItem.tsx | 6 +- .../src/components/Autofill/Autofill.tsx | 10 +- .../src/components/Button/BaseButton.tsx | 32 +++--- .../react/src/components/Button/Button.tsx | 2 +- .../src/components/Button/Button.types.ts | 4 +- .../src/components/Calendar/Calendar.base.tsx | 4 +- .../Calendar/CalendarDay/CalendarDay.base.tsx | 2 +- .../CalendarMonth/CalendarMonth.base.tsx | 2 +- .../CalendarYear/CalendarYear.base.tsx | 6 +- .../CalendarDayGrid/CalendarGridDayCell.tsx | 10 +- .../Callout/CalloutContent.base.tsx | 2 +- .../src/components/Check/Check.styles.ts | 2 +- .../components/Coachmark/Coachmark.base.tsx | 6 +- .../ColorPicker/ColorPicker.base.tsx | 12 +- .../ColorRectangle/ColorRectangle.base.tsx | 2 +- .../ColorSlider/ColorSlider.base.tsx | 8 +- .../ColorSlider/ColorSlider.styles.ts | 2 +- .../src/components/ComboBox/ComboBox.tsx | 22 ++-- .../components/CommandBar/CommandBar.base.tsx | 4 +- .../ContextualMenu/ContextualMenu.base.tsx | 48 ++++---- .../ContextualMenu.classNames.ts | 6 +- .../ContextualMenu/ContextualMenu.types.ts | 8 +- .../ContextualMenuItem.base.tsx | 4 +- .../ContextualMenuItem.test.tsx | 12 +- .../ContextualMenuItem.types.ts | 2 +- .../ContextualMenuAnchor.test.tsx | 4 +- .../ContextualMenuAnchor.tsx | 2 +- .../ContextualMenuButton.test.tsx | 4 +- .../ContextualMenuButton.tsx | 2 +- .../ContextualMenuItemWrapper.types.ts | 2 +- .../ContextualMenuSplitButton.test.tsx | 4 +- .../ContextualMenuSplitButton.tsx | 10 +- .../src/components/ContextualMenu/index.ts | 3 +- .../components/DatePicker/DatePicker.base.tsx | 2 +- .../DetailsList/DetailsColumn.base.tsx | 4 +- .../DetailsList/DetailsHeader.base.tsx | 12 +- .../DetailsList/DetailsList.base.tsx | 18 +-- .../DetailsList/DetailsRowCheck.tsx | 4 +- .../src/components/Dialog/Dialog.base.tsx | 12 +- .../src/components/Dialog/Dialog.styles.ts | 2 +- .../src/components/Dialog/Dialog.types.ts | 2 +- .../components/Dialog/DialogContent.base.tsx | 4 +- .../Divider/VerticalDivider.base.tsx | 2 +- .../Divider/VerticalDivider.classNames.ts | 2 +- .../Divider/VerticalDivider.styles.ts | 2 +- .../Divider/VerticalDivider.types.ts | 2 +- .../DocumentCard/DocumentCard.base.tsx | 4 +- .../DocumentCard/DocumentCardLogo.styles.ts | 2 +- .../DocumentCard/DocumentCardPreview.base.tsx | 6 +- .../src/components/Dropdown/Dropdown.base.tsx | 20 ++-- .../ExtendedPicker/BaseExtendedPicker.tsx | 2 +- .../src/components/Fabric/Fabric.base.tsx | 2 +- .../src/components/Fabric/Fabric.test.tsx | 2 +- .../src/components/Facepile/Facepile.base.tsx | 2 +- .../FloatingPicker/BaseFloatingPicker.tsx | 2 +- .../PeoplePickerItems/SelectedItemDefault.tsx | 2 +- .../Suggestions/SuggestionsStore.ts | 2 +- .../FocusTrapZone/FocusTrapZone.tsx | 4 +- .../GroupedList/GroupHeader.base.tsx | 7 +- .../GroupedList/GroupSpacer.types.ts | 2 +- .../GroupedList/GroupedList.base.tsx | 2 +- .../GroupedList/GroupedListV2.base.tsx | 3 +- .../HoverCard/ExpandingCard.base.tsx | 2 +- .../components/HoverCard/HoverCard.base.tsx | 6 +- .../HoverCard/PlainCard/PlainCard.base.tsx | 2 +- .../react/src/components/Icon/Icon.base.tsx | 4 +- .../react/src/components/Icon/Icon.styles.ts | 2 +- .../react/src/components/Icon/Icon.types.ts | 2 +- .../src/components/Keytip/Keytip.styles.ts | 4 +- .../react/src/components/Layer/Layer.base.tsx | 6 +- .../react/src/components/Link/Link.test.tsx | 2 +- .../components/MessageBar/MessageBar.base.tsx | 2 +- .../components/MessageBar/MessageBar.types.ts | 2 +- .../react/src/components/Modal/Modal.base.tsx | 18 +-- .../src/components/Modal/Modal.styles.ts | 2 +- .../react/src/components/Nav/Nav.base.tsx | 6 +- .../react/src/components/Panel/Panel.base.tsx | 2 +- .../src/components/Persona/Persona.base.tsx | 8 +- .../Persona/PersonaCoin/PersonaCoin.base.tsx | 10 +- .../src/components/Persona/PersonaConsts.tsx | 4 +- .../Persona/PersonaInitialsColor.ts | 6 +- .../react/src/components/Pivot/Pivot.base.tsx | 4 +- packages/react/src/components/Popup/Popup.tsx | 4 +- .../ProgressIndicator.base.tsx | 4 +- .../src/components/Rating/Rating.base.tsx | 4 +- .../components/SearchBox/SearchBox.base.tsx | 8 +- .../BaseSelectedItemsList.tsx | 2 +- .../SelectedPeopleList/Items/EditingItem.tsx | 2 +- .../ShimmerCircle/ShimmerCircle.base.tsx | 2 +- .../ShimmerCircle/ShimmerCircle.styles.ts | 2 +- .../Shimmer/ShimmerGap/ShimmerGap.base.tsx | 2 +- .../Shimmer/ShimmerGap/ShimmerGap.styles.ts | 2 +- .../Shimmer/ShimmerLine/ShimmerLine.base.tsx | 2 +- .../Shimmer/ShimmerLine/ShimmerLine.styles.ts | 2 +- .../react/src/components/Slider/useSlider.ts | 4 +- .../components/SpinButton/SpinButton.base.tsx | 6 +- .../components/SpinButton/SpinButton.test.tsx | 2 +- .../src/components/Spinner/Spinner.base.tsx | 4 +- .../src/components/Spinner/Spinner.types.ts | 2 +- .../src/components/Stack/Stack.styles.ts | 4 +- .../react/src/components/Stack/Stack.test.tsx | 2 +- packages/react/src/components/Stack/Stack.tsx | 2 +- .../ColorPickerGridCell.base.tsx | 2 +- .../SwatchColorPicker.base.tsx | 10 +- .../TeachingBubble/TeachingBubble.base.tsx | 4 +- .../TeachingBubbleContent.base.tsx | 4 +- .../MaskedTextField/MaskedTextField.tsx | 8 +- .../components/TextField/TextField.base.tsx | 2 +- .../src/components/TimePicker/TimePicker.tsx | 2 +- .../src/components/Toggle/Toggle.base.tsx | 6 +- .../components/Tooltip/TooltipHost.base.tsx | 4 +- .../WeeklyDayPicker/WeeklyDayPicker.base.tsx | 4 +- .../src/components/pickers/BasePicker.tsx | 12 +- .../PeoplePickerItem.types.ts | 2 +- .../PeoplePickerItems/SelectedItemDefault.tsx | 2 +- packages/react/src/index.ts | 103 ++---------------- .../utilities/ButtonGrid/ButtonGrid.base.tsx | 4 +- .../utilities/DraggableZone/DraggableZone.tsx | 2 +- .../ThemeProvider/makeStyles.test.tsx | 10 +- .../src/utilities/ThemeProvider/makeStyles.ts | 4 +- .../ThemeProvider/useThemeProviderClasses.tsx | 2 +- .../contextualMenu/contextualMenuUtility.ts | 2 +- .../decorators/withResponsiveMode.test.tsx | 2 +- .../decorators/withResponsiveMode.tsx | 2 +- .../src/utilities/positioning/positioning.ts | 14 +-- .../positioning/positioning.types.ts | 1 - .../src/utilities/selection/SelectionZone.tsx | 12 +- packages/set-version/.eslintrc.json | 11 +- packages/style-utilities/src/index.ts | 6 +- .../src/styles/CommonStyles.ts | 4 +- .../style-utilities/src/utilities/icons.ts | 2 +- .../theme/src/utilities/makeSemanticColors.ts | 6 +- packages/utilities/src/BaseComponent.test.tsx | 4 +- packages/utilities/src/BaseComponent.ts | 6 +- packages/utilities/src/EventGroup.test.ts | 4 +- packages/utilities/src/EventGroup.ts | 2 +- .../src/customizations/Customizer.test.tsx | 2 +- .../src/customizations/customizable.test.tsx | 2 +- packages/utilities/src/dom.ts | 2 +- packages/utilities/src/dom/canUseDOM.ts | 2 +- packages/utilities/src/dom/raiseClick.ts | 4 +- packages/utilities/src/index.ts | 28 ++--- .../src/initializeFocusRects.test.ts | 2 +- .../utilities/src/initializeFocusRects.ts | 2 +- packages/utilities/src/math.ts | 4 +- packages/utilities/src/styled.test.tsx | 2 +- packages/utilities/src/useFocusRects.ts | 4 +- packages/webpack-utilities/.eslintrc.json | 11 +- scripts/executors/src/generate-ui.ts | 2 +- scripts/tasks/src/index.ts | 5 - syncpack.config.js | 1 - yarn.lock | 11 +- 325 files changed, 954 insertions(+), 823 deletions(-) create mode 100644 change/@fluentui-codemods-af108562-5adb-43f5-b0f2-06358f95ab65.json create mode 100644 change/@fluentui-eslint-plugin-fa5bccc0-99d9-46ae-8cc6-5fbdd18360cb.json create mode 100644 change/@fluentui-font-icons-mdl2-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json create mode 100644 change/@fluentui-foundation-legacy-05901292-a3b8-4d34-834a-8f5d74736e99.json create mode 100644 change/@fluentui-keyboard-key-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json create mode 100644 change/@fluentui-merge-styles-f28e7eb2-d3a4-4060-95af-0c74756f900d.json create mode 100644 change/@fluentui-react-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json create mode 100644 change/@fluentui-react-accordion-b082df99-c014-4ba8-8523-fdc134b25bcb.json create mode 100644 change/@fluentui-react-aria-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json create mode 100644 change/@fluentui-react-avatar-9cab8d3a-1bcd-4c03-8138-82520de36649.json create mode 100644 change/@fluentui-react-charting-aa5b0252-40de-497c-88f5-377ada948719.json create mode 100644 change/@fluentui-react-color-picker-preview-1411f212-27ea-4335-bcd3-b210359b0bd1.json create mode 100644 change/@fluentui-react-combobox-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json create mode 100644 change/@fluentui-react-components-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json create mode 100644 change/@fluentui-react-conformance-4944bee5-948a-4649-87a1-8362f68d4635.json create mode 100644 change/@fluentui-react-date-time-14e136f0-eeb5-4113-8921-e732772e0a04.json create mode 100644 change/@fluentui-react-experiments-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json create mode 100644 change/@fluentui-react-focus-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json create mode 100644 change/@fluentui-react-icons-compat-d79ea04c-0316-4c1e-9c1e-96710298947a.json create mode 100644 change/@fluentui-react-menu-51e8bb80-2224-47a8-8a42-282214bcee42.json create mode 100644 change/@fluentui-react-message-bar-045b67fd-ae48-4ed9-abbd-669235409ead.json create mode 100644 change/@fluentui-react-monaco-editor-946876fa-b8f4-4e15-bf15-54f86a508654.json create mode 100644 change/@fluentui-react-motion-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json create mode 100644 change/@fluentui-react-motion-components-preview-7795f18a-df86-480a-8546-efca47ef6069.json create mode 100644 change/@fluentui-react-popover-02147114-2b1f-427d-a369-c495dcc060f7.json create mode 100644 change/@fluentui-react-positioning-7ff1890e-77cb-4078-be01-2673bb29a80b.json create mode 100644 change/@fluentui-react-radio-59106324-2e52-43e5-b407-87f41706faa5.json create mode 100644 change/@fluentui-react-switch-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json create mode 100644 change/@fluentui-react-table-041ffd34-f086-4af7-a72a-66dbbd56617b.json create mode 100644 change/@fluentui-react-tabs-c489edef-c7ee-4bf0-8f32-8565edccb381.json create mode 100644 change/@fluentui-react-tabster-a4a177a3-0514-4657-9fdd-a0e90d44e813.json create mode 100644 change/@fluentui-react-tooltip-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json create mode 100644 change/@fluentui-react-tree-287da350-699b-410f-bd97-7cb590731302.json create mode 100644 change/@fluentui-react-utilities-82544042-02b6-4262-91cd-e7f9fe24bad2.json create mode 100644 change/@fluentui-react-virtualizer-00dd23f0-89d0-486d-844f-30a880feb0f5.json create mode 100644 change/@fluentui-style-utilities-1e695416-a364-41c7-98b1-5cc336ce40ed.json create mode 100644 change/@fluentui-theme-9d03e3c6-0e57-491d-bbb2-ff84af746057.json create mode 100644 change/@fluentui-utilities-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json diff --git a/apps/chart-docsite/.eslintrc.json b/apps/chart-docsite/.eslintrc.json index 45462ffe5954dc..a75719fd243047 100644 --- a/apps/chart-docsite/.eslintrc.json +++ b/apps/chart-docsite/.eslintrc.json @@ -4,7 +4,7 @@ "rules": { "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/jsx-no-bind": "off", - "deprecation/deprecation": "off", + "@typescript-eslint/no-deprecated": "off", "import/no-extraneous-dependencies": ["error", { "packageDir": [".", "../.."] }] } } diff --git a/apps/public-docsite-resources/.eslintrc.json b/apps/public-docsite-resources/.eslintrc.json index b9cc959897e9b2..9fc74280fa19bb 100644 --- a/apps/public-docsite-resources/.eslintrc.json +++ b/apps/public-docsite-resources/.eslintrc.json @@ -5,7 +5,7 @@ "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/explicit-member-accessibility": "off", "@typescript-eslint/member-ordering": "off", - "deprecation/deprecation": "off", - "no-restricted-globals": "off" + "no-restricted-globals": "off", + "@typescript-eslint/no-deprecated": "off" } } diff --git a/apps/public-docsite-v9/.eslintrc.json b/apps/public-docsite-v9/.eslintrc.json index 45462ffe5954dc..21b3d1e6a45479 100644 --- a/apps/public-docsite-v9/.eslintrc.json +++ b/apps/public-docsite-v9/.eslintrc.json @@ -4,7 +4,7 @@ "rules": { "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/jsx-no-bind": "off", - "deprecation/deprecation": "off", - "import/no-extraneous-dependencies": ["error", { "packageDir": [".", "../.."] }] + "import/no-extraneous-dependencies": ["error", { "packageDir": [".", "../.."] }], + "@typescript-eslint/no-deprecated": "off" } } diff --git a/apps/public-docsite/.eslintrc.json b/apps/public-docsite/.eslintrc.json index 4a1010d7c11d98..6a0ccc21bb36a8 100644 --- a/apps/public-docsite/.eslintrc.json +++ b/apps/public-docsite/.eslintrc.json @@ -3,10 +3,10 @@ "root": true, "rules": { "@typescript-eslint/no-explicit-any": "off", - "deprecation/deprecation": "off", "import/no-webpack-loader-syntax": "off", // ok in this project "prefer-const": "off", "react/jsx-no-bind": "off", - "no-restricted-globals": "off" + "no-restricted-globals": "off", + "@typescript-eslint/no-deprecated": "off" } } diff --git a/apps/theming-designer/.eslintrc.json b/apps/theming-designer/.eslintrc.json index 0d9ca4c10f823d..5ad87795c4a5b2 100644 --- a/apps/theming-designer/.eslintrc.json +++ b/apps/theming-designer/.eslintrc.json @@ -3,8 +3,8 @@ "root": true, "rules": { "@typescript-eslint/no-explicit-any": "off", - "deprecation/deprecation": "off", "prefer-const": "off", - "no-restricted-globals": "off" + "no-restricted-globals": "off", + "@typescript-eslint/no-deprecated": "off" } } diff --git a/apps/vr-tests-react-components/.eslintrc.json b/apps/vr-tests-react-components/.eslintrc.json index 3301180702eb44..deda75964dbfd1 100644 --- a/apps/vr-tests-react-components/.eslintrc.json +++ b/apps/vr-tests-react-components/.eslintrc.json @@ -7,8 +7,8 @@ "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/naming-convention": "off", "@typescript-eslint/jsx-no-bind": "off", - "deprecation/deprecation": "off", "import/no-extraneous-dependencies": ["error", { "packageDir": [".", "../.."] }], - "@nx/workspace-no-restricted-globals": "off" + "@nx/workspace-no-restricted-globals": "off", + "@typescript-eslint/no-deprecated": "off" } } diff --git a/apps/vr-tests/.eslintrc.json b/apps/vr-tests/.eslintrc.json index 54ac641d7b3bfc..5f50754feeb77e 100644 --- a/apps/vr-tests/.eslintrc.json +++ b/apps/vr-tests/.eslintrc.json @@ -4,8 +4,8 @@ "rules": { "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/jsx-no-bind": "off", - "deprecation/deprecation": "off", "import/no-extraneous-dependencies": ["error", { "packageDir": [".", "../.."] }], - "no-restricted-globals": "off" + "no-restricted-globals": "off", + "@typescript-eslint/no-deprecated": "off" } } diff --git a/change/@fluentui-codemods-af108562-5adb-43f5-b0f2-06358f95ab65.json b/change/@fluentui-codemods-af108562-5adb-43f5-b0f2-06358f95ab65.json new file mode 100644 index 00000000000000..e59c56d1811400 --- /dev/null +++ b/change/@fluentui-codemods-af108562-5adb-43f5-b0f2-06358f95ab65.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/codemods", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-eslint-plugin-fa5bccc0-99d9-46ae-8cc6-5fbdd18360cb.json b/change/@fluentui-eslint-plugin-fa5bccc0-99d9-46ae-8cc6-5fbdd18360cb.json new file mode 100644 index 00000000000000..ddfba557f6a9a4 --- /dev/null +++ b/change/@fluentui-eslint-plugin-fa5bccc0-99d9-46ae-8cc6-5fbdd18360cb.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/eslint-plugin", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-font-icons-mdl2-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json b/change/@fluentui-font-icons-mdl2-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json new file mode 100644 index 00000000000000..6ac801eaac0088 --- /dev/null +++ b/change/@fluentui-font-icons-mdl2-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/font-icons-mdl2", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-foundation-legacy-05901292-a3b8-4d34-834a-8f5d74736e99.json b/change/@fluentui-foundation-legacy-05901292-a3b8-4d34-834a-8f5d74736e99.json new file mode 100644 index 00000000000000..b7ada786f9ef0a --- /dev/null +++ b/change/@fluentui-foundation-legacy-05901292-a3b8-4d34-834a-8f5d74736e99.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/foundation-legacy", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-keyboard-key-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json b/change/@fluentui-keyboard-key-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json new file mode 100644 index 00000000000000..34089c5205b9cf --- /dev/null +++ b/change/@fluentui-keyboard-key-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/keyboard-key", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-merge-styles-f28e7eb2-d3a4-4060-95af-0c74756f900d.json b/change/@fluentui-merge-styles-f28e7eb2-d3a4-4060-95af-0c74756f900d.json new file mode 100644 index 00000000000000..252227e0745e4d --- /dev/null +++ b/change/@fluentui-merge-styles-f28e7eb2-d3a4-4060-95af-0c74756f900d.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/merge-styles", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json b/change/@fluentui-react-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json new file mode 100644 index 00000000000000..31063dd50b8723 --- /dev/null +++ b/change/@fluentui-react-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-accordion-b082df99-c014-4ba8-8523-fdc134b25bcb.json b/change/@fluentui-react-accordion-b082df99-c014-4ba8-8523-fdc134b25bcb.json new file mode 100644 index 00000000000000..ae55ba19bba18f --- /dev/null +++ b/change/@fluentui-react-accordion-b082df99-c014-4ba8-8523-fdc134b25bcb.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-accordion", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-aria-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json b/change/@fluentui-react-aria-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json new file mode 100644 index 00000000000000..dc9f1971ad978a --- /dev/null +++ b/change/@fluentui-react-aria-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-aria", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-avatar-9cab8d3a-1bcd-4c03-8138-82520de36649.json b/change/@fluentui-react-avatar-9cab8d3a-1bcd-4c03-8138-82520de36649.json new file mode 100644 index 00000000000000..9d3bbebf5cb5e1 --- /dev/null +++ b/change/@fluentui-react-avatar-9cab8d3a-1bcd-4c03-8138-82520de36649.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-avatar", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-charting-aa5b0252-40de-497c-88f5-377ada948719.json b/change/@fluentui-react-charting-aa5b0252-40de-497c-88f5-377ada948719.json new file mode 100644 index 00000000000000..cb303b57fb9e0b --- /dev/null +++ b/change/@fluentui-react-charting-aa5b0252-40de-497c-88f5-377ada948719.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-charting", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-color-picker-preview-1411f212-27ea-4335-bcd3-b210359b0bd1.json b/change/@fluentui-react-color-picker-preview-1411f212-27ea-4335-bcd3-b210359b0bd1.json new file mode 100644 index 00000000000000..6e323e0af85625 --- /dev/null +++ b/change/@fluentui-react-color-picker-preview-1411f212-27ea-4335-bcd3-b210359b0bd1.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-color-picker-preview", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-combobox-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json b/change/@fluentui-react-combobox-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json new file mode 100644 index 00000000000000..793132b08fa9f9 --- /dev/null +++ b/change/@fluentui-react-combobox-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-combobox", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-components-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json b/change/@fluentui-react-components-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json new file mode 100644 index 00000000000000..6c9209a8e0effa --- /dev/null +++ b/change/@fluentui-react-components-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-components", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-conformance-4944bee5-948a-4649-87a1-8362f68d4635.json b/change/@fluentui-react-conformance-4944bee5-948a-4649-87a1-8362f68d4635.json new file mode 100644 index 00000000000000..58fe9ad666bf04 --- /dev/null +++ b/change/@fluentui-react-conformance-4944bee5-948a-4649-87a1-8362f68d4635.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-conformance", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-date-time-14e136f0-eeb5-4113-8921-e732772e0a04.json b/change/@fluentui-react-date-time-14e136f0-eeb5-4113-8921-e732772e0a04.json new file mode 100644 index 00000000000000..62abe8ca9a7ab9 --- /dev/null +++ b/change/@fluentui-react-date-time-14e136f0-eeb5-4113-8921-e732772e0a04.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-date-time", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-experiments-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json b/change/@fluentui-react-experiments-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json new file mode 100644 index 00000000000000..74c5f58ffe8cf0 --- /dev/null +++ b/change/@fluentui-react-experiments-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-experiments", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-focus-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json b/change/@fluentui-react-focus-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json new file mode 100644 index 00000000000000..2961f1f4a9d0ae --- /dev/null +++ b/change/@fluentui-react-focus-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-focus", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-icons-compat-d79ea04c-0316-4c1e-9c1e-96710298947a.json b/change/@fluentui-react-icons-compat-d79ea04c-0316-4c1e-9c1e-96710298947a.json new file mode 100644 index 00000000000000..3fb672d36efa9b --- /dev/null +++ b/change/@fluentui-react-icons-compat-d79ea04c-0316-4c1e-9c1e-96710298947a.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-icons-compat", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-menu-51e8bb80-2224-47a8-8a42-282214bcee42.json b/change/@fluentui-react-menu-51e8bb80-2224-47a8-8a42-282214bcee42.json new file mode 100644 index 00000000000000..369c63a243bb20 --- /dev/null +++ b/change/@fluentui-react-menu-51e8bb80-2224-47a8-8a42-282214bcee42.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-menu", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-message-bar-045b67fd-ae48-4ed9-abbd-669235409ead.json b/change/@fluentui-react-message-bar-045b67fd-ae48-4ed9-abbd-669235409ead.json new file mode 100644 index 00000000000000..f62fce2bae66b0 --- /dev/null +++ b/change/@fluentui-react-message-bar-045b67fd-ae48-4ed9-abbd-669235409ead.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-message-bar", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-monaco-editor-946876fa-b8f4-4e15-bf15-54f86a508654.json b/change/@fluentui-react-monaco-editor-946876fa-b8f4-4e15-bf15-54f86a508654.json new file mode 100644 index 00000000000000..cce342d863249c --- /dev/null +++ b/change/@fluentui-react-monaco-editor-946876fa-b8f4-4e15-bf15-54f86a508654.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-monaco-editor", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-motion-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json b/change/@fluentui-react-motion-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json new file mode 100644 index 00000000000000..57cfdd1c1b62b2 --- /dev/null +++ b/change/@fluentui-react-motion-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-motion", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-motion-components-preview-7795f18a-df86-480a-8546-efca47ef6069.json b/change/@fluentui-react-motion-components-preview-7795f18a-df86-480a-8546-efca47ef6069.json new file mode 100644 index 00000000000000..36a3d3b7e344cc --- /dev/null +++ b/change/@fluentui-react-motion-components-preview-7795f18a-df86-480a-8546-efca47ef6069.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-motion-components-preview", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-popover-02147114-2b1f-427d-a369-c495dcc060f7.json b/change/@fluentui-react-popover-02147114-2b1f-427d-a369-c495dcc060f7.json new file mode 100644 index 00000000000000..7c818960694aea --- /dev/null +++ b/change/@fluentui-react-popover-02147114-2b1f-427d-a369-c495dcc060f7.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-popover", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-positioning-7ff1890e-77cb-4078-be01-2673bb29a80b.json b/change/@fluentui-react-positioning-7ff1890e-77cb-4078-be01-2673bb29a80b.json new file mode 100644 index 00000000000000..fa917f363eb6e0 --- /dev/null +++ b/change/@fluentui-react-positioning-7ff1890e-77cb-4078-be01-2673bb29a80b.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-positioning", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-radio-59106324-2e52-43e5-b407-87f41706faa5.json b/change/@fluentui-react-radio-59106324-2e52-43e5-b407-87f41706faa5.json new file mode 100644 index 00000000000000..85b8c6c078c718 --- /dev/null +++ b/change/@fluentui-react-radio-59106324-2e52-43e5-b407-87f41706faa5.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-radio", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-switch-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json b/change/@fluentui-react-switch-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json new file mode 100644 index 00000000000000..e6327946c49fac --- /dev/null +++ b/change/@fluentui-react-switch-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-switch", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-table-041ffd34-f086-4af7-a72a-66dbbd56617b.json b/change/@fluentui-react-table-041ffd34-f086-4af7-a72a-66dbbd56617b.json new file mode 100644 index 00000000000000..9855003d9f9cca --- /dev/null +++ b/change/@fluentui-react-table-041ffd34-f086-4af7-a72a-66dbbd56617b.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-table", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-tabs-c489edef-c7ee-4bf0-8f32-8565edccb381.json b/change/@fluentui-react-tabs-c489edef-c7ee-4bf0-8f32-8565edccb381.json new file mode 100644 index 00000000000000..add9f9f3024781 --- /dev/null +++ b/change/@fluentui-react-tabs-c489edef-c7ee-4bf0-8f32-8565edccb381.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-tabs", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-tabster-a4a177a3-0514-4657-9fdd-a0e90d44e813.json b/change/@fluentui-react-tabster-a4a177a3-0514-4657-9fdd-a0e90d44e813.json new file mode 100644 index 00000000000000..8e5d56c1248819 --- /dev/null +++ b/change/@fluentui-react-tabster-a4a177a3-0514-4657-9fdd-a0e90d44e813.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-tabster", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-tooltip-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json b/change/@fluentui-react-tooltip-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json new file mode 100644 index 00000000000000..c1ea720b6a9e45 --- /dev/null +++ b/change/@fluentui-react-tooltip-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-tooltip", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-tree-287da350-699b-410f-bd97-7cb590731302.json b/change/@fluentui-react-tree-287da350-699b-410f-bd97-7cb590731302.json new file mode 100644 index 00000000000000..712df07693df6e --- /dev/null +++ b/change/@fluentui-react-tree-287da350-699b-410f-bd97-7cb590731302.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-tree", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-utilities-82544042-02b6-4262-91cd-e7f9fe24bad2.json b/change/@fluentui-react-utilities-82544042-02b6-4262-91cd-e7f9fe24bad2.json new file mode 100644 index 00000000000000..6b1ae1f1853dd9 --- /dev/null +++ b/change/@fluentui-react-utilities-82544042-02b6-4262-91cd-e7f9fe24bad2.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-utilities", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-react-virtualizer-00dd23f0-89d0-486d-844f-30a880feb0f5.json b/change/@fluentui-react-virtualizer-00dd23f0-89d0-486d-844f-30a880feb0f5.json new file mode 100644 index 00000000000000..556a8a1950726c --- /dev/null +++ b/change/@fluentui-react-virtualizer-00dd23f0-89d0-486d-844f-30a880feb0f5.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/react-virtualizer", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-style-utilities-1e695416-a364-41c7-98b1-5cc336ce40ed.json b/change/@fluentui-style-utilities-1e695416-a364-41c7-98b1-5cc336ce40ed.json new file mode 100644 index 00000000000000..56b5682720cded --- /dev/null +++ b/change/@fluentui-style-utilities-1e695416-a364-41c7-98b1-5cc336ce40ed.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/style-utilities", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-theme-9d03e3c6-0e57-491d-bbb2-ff84af746057.json b/change/@fluentui-theme-9d03e3c6-0e57-491d-bbb2-ff84af746057.json new file mode 100644 index 00000000000000..1afa956ec2955e --- /dev/null +++ b/change/@fluentui-theme-9d03e3c6-0e57-491d-bbb2-ff84af746057.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/theme", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/change/@fluentui-utilities-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json b/change/@fluentui-utilities-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json new file mode 100644 index 00000000000000..463e5c9a6e8735 --- /dev/null +++ b/change/@fluentui-utilities-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json @@ -0,0 +1,7 @@ +{ + "type": "none", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", + "packageName": "@fluentui/utilities", + "email": "vgenaev@gmail.com", + "dependentChangeType": "none" +} diff --git a/package.json b/package.json index 77c06c19c1c95f..b05c90218db7e1 100644 --- a/package.json +++ b/package.json @@ -231,7 +231,6 @@ "eslint-config-airbnb": "18.2.1", "eslint-config-prettier": "8.3.0", "eslint-import-resolver-typescript": "3.6.1", - "eslint-plugin-deprecation": "3.0.0", "eslint-plugin-es": "4.1.0", "eslint-plugin-import": "2.29.1", "eslint-plugin-jest": "28.8.0", diff --git a/packages/charts/react-charting/src/Styling.ts b/packages/charts/react-charting/src/Styling.ts index 31e6ed2005a051..563a5a90452e3b 100644 --- a/packages/charts/react-charting/src/Styling.ts +++ b/packages/charts/react-charting/src/Styling.ts @@ -6,7 +6,7 @@ export { DefaultEffects, DefaultFontStyles, DefaultPalette, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated EdgeChromiumHighContrastSelector, FontClassNames, FontSizes, @@ -39,11 +39,11 @@ export { createTheme, focusClear, fontFace, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getEdgeChromiumNoHighContrastAdjustSelector, getFadedOverflowStyle, getFocusOutlineStyle, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getFocusStyle, getGlobalClassNames, getHighContrastNoAdjustStyle, diff --git a/packages/charts/react-charting/src/Utilities.ts b/packages/charts/react-charting/src/Utilities.ts index 0850eaa19b0634..82dae884afcb13 100644 --- a/packages/charts/react-charting/src/Utilities.ts +++ b/packages/charts/react-charting/src/Utilities.ts @@ -1,10 +1,8 @@ export { Async, AutoScroll, - // eslint-disable-next-line deprecation/deprecation BaseComponent, Customizations, - // eslint-disable-next-line deprecation/deprecation Customizer, CustomizerContext, DATA_IS_SCROLLABLE_ATTRIBUTE, @@ -87,7 +85,6 @@ export { getRTL, getRTLSafeKeyCode, getRect, - // eslint-disable-next-line deprecation/deprecation getResourceUrl, getScrollbarWidth, getVirtualParent, @@ -99,11 +96,9 @@ export { hoistStatics, htmlElementProperties, iframeProperties, - // eslint-disable-next-line deprecation/deprecation imageProperties, imgProperties, initializeComponentRef, - // eslint-disable-next-line deprecation/deprecation initializeFocusRects, inputProperties, isControlled, @@ -135,7 +130,6 @@ export { optionProperties, portalContainsElement, precisionRound, - // eslint-disable-next-line deprecation/deprecation raiseClick, removeIndex, replaceElement, @@ -145,15 +139,12 @@ export { safeRequestAnimationFrame, safeSetTimeout, selectProperties, - // eslint-disable-next-line deprecation/deprecation setBaseUrl, setFocusVisibility, - // eslint-disable-next-line deprecation/deprecation setLanguage, setMemoizeWeakMap, setPortalAttribute, setRTL, - // eslint-disable-next-line deprecation/deprecation setSSR, setVirtualParent, setWarningCallback, @@ -184,7 +175,6 @@ export type { ICancelable, IChangeDescription, IChangeEventCallback, - // eslint-disable-next-line deprecation/deprecation IClassNames, IClassNamesFunctionOptions, IComponentAs, @@ -207,7 +197,6 @@ export type { IPerfData, IPerfMeasurement, IPerfSummary, - // eslint-disable-next-line deprecation/deprecation IPoint, IPropsWithStyles, IRectangle, @@ -226,13 +215,10 @@ export type { IStyleFunctionOrObject, IVirtualElement, IWarnControlledUsageParams, - // eslint-disable-next-line deprecation/deprecation Omit, Point, RefObject, - // eslint-disable-next-line deprecation/deprecation Settings, - // eslint-disable-next-line deprecation/deprecation SettingsFunction, StyleFunction, } from '@fluentui/react/lib/Utilities'; diff --git a/packages/charts/react-charting/src/components/DonutChart/DonutChart.base.tsx b/packages/charts/react-charting/src/components/DonutChart/DonutChart.base.tsx index 79c4414e3307ab..5fc0da02192505 100644 --- a/packages/charts/react-charting/src/components/DonutChart/DonutChart.base.tsx +++ b/packages/charts/react-charting/src/components/DonutChart/DonutChart.base.tsx @@ -178,6 +178,7 @@ export class DonutChartBase extends React.Component<IDonutChartProps, IDonutChar hidden={!(!this.props.hideTooltip && this.state.showHover)} id={this._calloutId} onDismiss={this._closeCallout} + // eslint-disable-next-line @typescript-eslint/no-deprecated preventDismissOnLostFocus={true} /** Keep the callout updated with details of focused/hovered arc */ shouldUpdateWhenHidden={true} diff --git a/packages/charts/react-charting/src/components/HorizontalBarChart/HorizontalBarChart.base.tsx b/packages/charts/react-charting/src/components/HorizontalBarChart/HorizontalBarChart.base.tsx index e772604c570007..50db899116eac8 100644 --- a/packages/charts/react-charting/src/components/HorizontalBarChart/HorizontalBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/HorizontalBarChart/HorizontalBarChart.base.tsx @@ -163,6 +163,7 @@ export class HorizontalBarChartBase extends React.Component<IHorizontalBarChartP directionalHint={DirectionalHint.topAutoEdge} id={this._calloutId} onDismiss={this._closeCallout} + // eslint-disable-next-line @typescript-eslint/no-deprecated preventDismissOnLostFocus={true} {...this.props.calloutProps!} {...getAccessibleDataObject(this.state.callOutAccessibilityData)} diff --git a/packages/charts/react-charting/src/components/StackedBarChart/MultiStackedBarChart.base.tsx b/packages/charts/react-charting/src/components/StackedBarChart/MultiStackedBarChart.base.tsx index 44e426a05f7118..2b23989b914a2e 100644 --- a/packages/charts/react-charting/src/components/StackedBarChart/MultiStackedBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/StackedBarChart/MultiStackedBarChart.base.tsx @@ -148,6 +148,7 @@ export class MultiStackedBarChartBase extends React.Component<IMultiStackedBarCh directionalHint={DirectionalHint.topAutoEdge} id={this._calloutId} onDismiss={this._closeCallout} + // eslint-disable-next-line @typescript-eslint/no-deprecated preventDismissOnLostFocus={true} /** Keep the callout updated with details of focused/hovered bar */ shouldUpdateWhenHidden={true} diff --git a/packages/charts/react-charting/src/components/StackedBarChart/StackedBarChart.base.tsx b/packages/charts/react-charting/src/components/StackedBarChart/StackedBarChart.base.tsx index 8faedf374fb215..5b4fce09229138 100644 --- a/packages/charts/react-charting/src/components/StackedBarChart/StackedBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/StackedBarChart/StackedBarChart.base.tsx @@ -172,6 +172,7 @@ export class StackedBarChartBase extends React.Component<IStackedBarChartProps, directionalHint={DirectionalHint.topAutoEdge} id={this._calloutId} onDismiss={this._closeCallout} + // eslint-disable-next-line @typescript-eslint/no-deprecated preventDismissOnLostFocus={true} /** Keep the callout updated with details of focused/hovered bar */ shouldUpdateWhenHidden={true} diff --git a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx index bae69324657ec7..5577c5829b4a35 100644 --- a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx @@ -524,7 +524,7 @@ export class VerticalStackedBarChartBase this._barWidth = getBarWidth(this.props.barWidth, this.props.maxBarWidth); const { theme } = this.props; const { palette } = theme!; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated this._colors = this.props.colors || [palette.blueLight, palette.blue, palette.blueMid, palette.red, palette.black]; this._xAxisType = getTypeOfAxis(this.props.data[0].xAxisPoint, true) as XAxisTypes; this._lineObject = this._getFormattedLineData(this.props.data); diff --git a/packages/charts/react-charting/src/utilities/SVGTooltipText.tsx b/packages/charts/react-charting/src/utilities/SVGTooltipText.tsx index eb625317a5465b..d130fee6d592e7 100644 --- a/packages/charts/react-charting/src/utilities/SVGTooltipText.tsx +++ b/packages/charts/react-charting/src/utilities/SVGTooltipText.tsx @@ -252,7 +252,7 @@ export class SVGTooltipText }; private _onTooltipKeyDown = (ev: React.KeyboardEvent<SVGElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if ((ev.which === KeyCodes.escape || ev.ctrlKey) && this.state.isTooltipVisible) { this._hideTooltip(); ev.stopPropagation(); diff --git a/packages/codemods/.eslintrc.json b/packages/codemods/.eslintrc.json index 3659e1a174fbb0..554b7ea5d198a2 100644 --- a/packages/codemods/.eslintrc.json +++ b/packages/codemods/.eslintrc.json @@ -9,7 +9,7 @@ "@typescript-eslint/no-explicit-any": "off", "@typescript-eslint/naming-convention": "off", "import/no-extraneous-dependencies": "off", - "deprecation/deprecation": "off" + "@typescript-eslint/no-deprecated": "off" } } ] diff --git a/packages/codemods/src/codeMods/utilities/helpers/propHelpers.ts b/packages/codemods/src/codeMods/utilities/helpers/propHelpers.ts index 5c2d951a2a3b0d..814aaa3a9ee055 100644 --- a/packages/codemods/src/codeMods/utilities/helpers/propHelpers.ts +++ b/packages/codemods/src/codeMods/utilities/helpers/propHelpers.ts @@ -255,7 +255,7 @@ function tryInsertExistingDecomposedProp(oldProp: string, statement: VariableSta const decompObject = statement.getFirstDescendantByKind(SyntaxKind.ObjectBindingPattern); if (decompObject) { let objectText = decompObject.getText(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated objectText = objectText.substr(0, 1) + ` ${oldProp},` + objectText.substr(1); decompObject.replaceWithText(objectText); return true; diff --git a/packages/eslint-plugin/package.json b/packages/eslint-plugin/package.json index 797cd8dce675b5..87282caa800235 100644 --- a/packages/eslint-plugin/package.json +++ b/packages/eslint-plugin/package.json @@ -19,7 +19,6 @@ "eslint-config-airbnb": "^18.2.1", "eslint-config-prettier": "^8.3.0", "eslint-import-resolver-typescript": "^3.6.1", - "eslint-plugin-deprecation": "^3.0.0", "eslint-plugin-import": "^2.29.1", "eslint-plugin-jest": "^28.6.0", "eslint-plugin-jsdoc": "^48.7.0", diff --git a/packages/eslint-plugin/src/configs/core.js b/packages/eslint-plugin/src/configs/core.js index 72bbfac84c0783..879695816f13ee 100644 --- a/packages/eslint-plugin/src/configs/core.js +++ b/packages/eslint-plugin/src/configs/core.js @@ -14,16 +14,7 @@ const config = { 'prettier', ], parser: '@typescript-eslint/parser', - plugins: [ - 'import', - '@fluentui', - '@rnx-kit', - '@typescript-eslint', - 'deprecation', - 'jest', - 'jsdoc', - ...__internal.plugins, - ], + plugins: ['import', '@fluentui', '@rnx-kit', '@typescript-eslint', 'jest', 'jsdoc', ...__internal.plugins], settings: { 'import/resolver': { // @see https://github.com/alexgorbatchev/eslint-import-resolver-typescript#configuration @@ -248,7 +239,7 @@ const typeAwareRules = { /** * plugin: https://github.com/gund/eslint-plugin-deprecation */ - 'deprecation/deprecation': 'error', + '@typescript-eslint/no-deprecated': 'error', }; /** @@ -318,7 +309,7 @@ const getOverrides = () => [ { files: 'src/**/*.deprecated.test.{ts,tsx}', rules: { - 'deprecation/deprecation': 'off', // the purpose of these tests + '@typescript-eslint/no-deprecated': 'off', }, }, { diff --git a/packages/font-icons-mdl2/src/IconNames.ts b/packages/font-icons-mdl2/src/IconNames.ts index 3041a5bc2ca612..371cf9f7253cc6 100644 --- a/packages/font-icons-mdl2/src/IconNames.ts +++ b/packages/font-icons-mdl2/src/IconNames.ts @@ -1805,5 +1805,5 @@ export const enum IconNames { SizeLegacy = 'SizeLegacy', } -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export type IconNamesInput = keyof typeof IconNames; diff --git a/packages/font-icons-mdl2/src/iconNames.test.ts b/packages/font-icons-mdl2/src/iconNames.test.ts index 022c8aeddd4f51..a73a638b33f498 100644 --- a/packages/font-icons-mdl2/src/iconNames.test.ts +++ b/packages/font-icons-mdl2/src/iconNames.test.ts @@ -1,6 +1,6 @@ import { IconNames, IconNamesInput } from './IconNames'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated declare const allIconNamesValues: IconNames; function validateIconNamesValues(allowedIconNamesValues: IconNamesInput): void { diff --git a/packages/font-icons-mdl2/src/index.ts b/packages/font-icons-mdl2/src/index.ts index de32b506be3675..afaf1c0f9de156 100644 --- a/packages/font-icons-mdl2/src/index.ts +++ b/packages/font-icons-mdl2/src/index.ts @@ -69,9 +69,9 @@ export function initializeIcons( registerIconAliases(); } -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ export type { IconNamesInput } from './IconNames'; export { IconNames } from './IconNames'; -/* eslint-enable deprecation/deprecation */ +/* eslint-enable @typescript-eslint/no-deprecated */ import './version'; diff --git a/packages/foundation-legacy/src/ThemeProvider.tsx b/packages/foundation-legacy/src/ThemeProvider.tsx index e28335d078e2da..12a572e8f2e3fc 100644 --- a/packages/foundation-legacy/src/ThemeProvider.tsx +++ b/packages/foundation-legacy/src/ThemeProvider.tsx @@ -25,6 +25,6 @@ export const ThemeProvider: React.FunctionComponent<IThemeProviderProps> = (prop return getThemedContext(context, scheme, theme); }; - // eslint-disable-next-line react/jsx-no-bind, deprecation/deprecation + // eslint-disable-next-line react/jsx-no-bind, @typescript-eslint/no-deprecated return <Customizer {...rest} contextTransform={contextTransform} />; }; diff --git a/packages/keyboard-key/src/index.ts b/packages/keyboard-key/src/index.ts index 8120aad882e9f6..da8e3ae8b3269d 100644 --- a/packages/keyboard-key/src/index.ts +++ b/packages/keyboard-key/src/index.ts @@ -182,7 +182,7 @@ const isObject = (val: any): val is KeyboardEventLike => { */ export function getCode(eventOrKey: Partial<KeyboardEventLike> | string): number | undefined { if (isObject(eventOrKey)) { - // eslint-disable-next-line deprecation/deprecation, @typescript-eslint/no-explicit-any + // eslint-disable-next-line @typescript-eslint/no-deprecated, @typescript-eslint/no-explicit-any return eventOrKey.keyCode || eventOrKey.which || (keyboardKey as any)[eventOrKey.key as string]; } // eslint-disable-next-line @typescript-eslint/no-explicit-any @@ -204,7 +204,7 @@ export function getKey(eventOrCode: Partial<KeyboardEventLike> | number): string return event.key; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let name = codes[(isEvent ? event.keyCode || event.which : eventOrCode) as number]; if (Array.isArray(name)) { diff --git a/packages/merge-styles/src/DeepPartial.ts b/packages/merge-styles/src/DeepPartial.ts index ca351bd5feb541..f2e7ad6463bc4f 100644 --- a/packages/merge-styles/src/DeepPartial.ts +++ b/packages/merge-styles/src/DeepPartial.ts @@ -3,7 +3,7 @@ * @deprecated - This type will hit infinite type instantiation recursion. Please use {@link DeepPartialV2} */ export type DeepPartial<T> = { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [P in keyof T]?: T[P] extends Array<infer U> ? Array<DeepPartial<U>> : T[P] extends object ? DeepPartial<T[P]> : T[P]; }; diff --git a/packages/merge-styles/src/IStyleSet.ts b/packages/merge-styles/src/IStyleSet.ts index 7f6c20b407d46a..8a9274af481f5d 100644 --- a/packages/merge-styles/src/IStyleSet.ts +++ b/packages/merge-styles/src/IStyleSet.ts @@ -12,9 +12,9 @@ export type Diff<T extends keyof any, U extends keyof any> = ({ [P in T]: P } & /** * @deprecated Use the version provided by TypeScript instead. */ -// eslint-disable-next-line deprecation/deprecation, @typescript-eslint/naming-convention +// eslint-disable-next-line @typescript-eslint/no-deprecated, @typescript-eslint/naming-convention type _Omit<U, K extends keyof U> = Pick<U, Diff<keyof U, K>>; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export type { _Omit as Omit }; /** @@ -40,7 +40,7 @@ export interface IStyleSetBase { * property. */ export type IStyleSet<TStyleSet extends IStyleSetBase = { [key: string]: any }> = { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [P in keyof _Omit<TStyleSet, 'subComponentStyles'>]: IStyle; } & { subComponentStyles?: { [P in keyof TStyleSet['subComponentStyles']]: IStyleFunctionOrObject<any, any> }; @@ -50,7 +50,7 @@ export type IStyleSet<TStyleSet extends IStyleSetBase = { [key: string]: any }> * A concatenated style set differs from `IStyleSet` in that subComponentStyles will always be a style function. */ export type IConcatenatedStyleSet<TStyleSet extends IStyleSetBase> = { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [P in keyof _Omit<TStyleSet, 'subComponentStyles'>]: IStyle; } & { subComponentStyles?: { [P in keyof TStyleSet['subComponentStyles']]: IStyleFunction<any, any> }; @@ -61,7 +61,7 @@ export type IConcatenatedStyleSet<TStyleSet extends IStyleSetBase> = { * into a class name. Additionally, all subComponentStyles are style functions. */ export type IProcessedStyleSet<TStyleSet extends IStyleSetBase> = { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [P in keyof _Omit<TStyleSet, 'subComponentStyles'>]: string; } & { subComponentStyles: { diff --git a/packages/merge-styles/src/Stylesheet.ts b/packages/merge-styles/src/Stylesheet.ts index 4ffe12028d9a4f..0130f878d479a0 100644 --- a/packages/merge-styles/src/Stylesheet.ts +++ b/packages/merge-styles/src/Stylesheet.ts @@ -347,9 +347,9 @@ export class Stylesheet { this._rules.push(rule); } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (this._config.onInsertRule) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated this._config.onInsertRule(rule); } diff --git a/packages/merge-styles/src/index.ts b/packages/merge-styles/src/index.ts index 273d88371f2fd0..72d6836a34aac8 100644 --- a/packages/merge-styles/src/index.ts +++ b/packages/merge-styles/src/index.ts @@ -6,10 +6,10 @@ export type { IKeyframes } from './IKeyframes'; export type { IStyleFunction, IStyleFunctionOrObject } from './IStyleFunction'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export type { DeepPartial } from './DeepPartial'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export type { IConcatenatedStyleSet, IProcessedStyleSet, IStyleSet, IStyleSetBase, Omit } from './IStyleSet'; export type { diff --git a/packages/react-cards/.eslintrc.json b/packages/react-cards/.eslintrc.json index fcffc3d29ca9e6..4c0d4b83a6d43a 100644 --- a/packages/react-cards/.eslintrc.json +++ b/packages/react-cards/.eslintrc.json @@ -9,7 +9,7 @@ "files": "**/*.{ts,tsx}", "rules": { // The components in this package are all deprecated - "deprecation/deprecation": "off" + "@typescript-eslint/no-deprecated": "off" } } ] diff --git a/packages/react-components/react-accordion/library/src/components/Accordion/useAccordion.ts b/packages/react-components/react-accordion/library/src/components/Accordion/useAccordion.ts index 2901ae3fa5b778..38ee613568d58f 100644 --- a/packages/react-components/react-accordion/library/src/components/Accordion/useAccordion.ts +++ b/packages/react-components/react-accordion/library/src/components/Accordion/useAccordion.ts @@ -20,7 +20,7 @@ export const useAccordion_unstable = <Value = AccordionItemValue>( multiple = false, collapsible = false, onToggle, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated navigation, } = props; const [openItems, setOpenItems] = useControllableState({ diff --git a/packages/react-components/react-accordion/library/src/components/AccordionItem/useAccordionItemContextValues.ts b/packages/react-components/react-accordion/library/src/components/AccordionItem/useAccordionItemContextValues.ts index 48aa5b3207e9f9..801e3580b89ef8 100644 --- a/packages/react-components/react-accordion/library/src/components/AccordionItem/useAccordionItemContextValues.ts +++ b/packages/react-components/react-accordion/library/src/components/AccordionItem/useAccordionItemContextValues.ts @@ -3,7 +3,7 @@ import type { AccordionItemContextValues, AccordionItemState } from './Accordion import { AccordionItemContextValue } from '../../contexts/accordionItem'; export function useAccordionItemContextValues_unstable(state: AccordionItemState): AccordionItemContextValues { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { disabled, open, value, onHeaderClick } = state; const accordionItem = React.useMemo<AccordionItemContextValue>( () => ({ disabled, open, value, onHeaderClick }), diff --git a/packages/react-components/react-aria/library/src/activedescendant/useActivedescendant.test.tsx b/packages/react-components/react-aria/library/src/activedescendant/useActivedescendant.test.tsx index 45ceea2b591653..b8f8fe07cc8312 100644 --- a/packages/react-components/react-aria/library/src/activedescendant/useActivedescendant.test.tsx +++ b/packages/react-components/react-aria/library/src/activedescendant/useActivedescendant.test.tsx @@ -272,7 +272,7 @@ describe('useActivedescendant', () => { const { getByRole } = render(<Test imperativeRef={imperativeRef} />); // there should not be a last active descendant yet - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(imperativeRef.current?.focusLastActive()).toBeFalsy(); imperativeRef.current?.focus('option-3'); @@ -281,7 +281,7 @@ describe('useActivedescendant', () => { imperativeRef.current?.blur(); expect(imperativeRef.current?.active()).toBeUndefined(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(imperativeRef.current?.focusLastActive()).toBeTruthy(); expect(imperativeRef.current?.active()).toBe('option-3'); diff --git a/packages/react-components/react-aria/library/src/button/index.ts b/packages/react-components/react-aria/library/src/button/index.ts index a4eca5f0101884..39a345a2417328 100644 --- a/packages/react-components/react-aria/library/src/button/index.ts +++ b/packages/react-components/react-aria/library/src/button/index.ts @@ -1,5 +1,5 @@ export { useARIAButtonProps } from './useARIAButtonProps'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export { useARIAButtonShorthand } from './useARIAButtonShorthand'; export type { ARIAButtonAlteredProps, diff --git a/packages/react-components/react-aria/library/src/button/useARIAButtonShorthand.test.tsx b/packages/react-components/react-aria/library/src/button/useARIAButtonShorthand.test.tsx index a2d40caa9ccce4..64438aec8bedc7 100644 --- a/packages/react-components/react-aria/library/src/button/useARIAButtonShorthand.test.tsx +++ b/packages/react-components/react-aria/library/src/button/useARIAButtonShorthand.test.tsx @@ -5,22 +5,22 @@ describe('useARIAButtonShorthands', () => { it('should return shorthands', () => { const { result: { current: buttonShorthand }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } = renderHook(() => useARIAButtonShorthand({ as: 'button' }, { required: true })); expect(buttonShorthand.as).toBe('button'); const { result: { current: buttonShorthand2 }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } = renderHook(() => useARIAButtonShorthand({ as: undefined }, { required: true })); expect(buttonShorthand2.as).toBe(undefined); const { result: { current: anchorShorthand }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } = renderHook(() => useARIAButtonShorthand({ as: 'a' }, { required: true })); expect(anchorShorthand.as).toBe('a'); const { result: { current: divShorthand }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } = renderHook(() => useARIAButtonShorthand({ as: 'div' }, { required: true })); expect(divShorthand.as).toBe('div'); }); diff --git a/packages/react-components/react-aria/library/src/button/useARIAButtonShorthand.ts b/packages/react-components/react-aria/library/src/button/useARIAButtonShorthand.ts index b5b18bae1c3146..9d8b64067a863e 100644 --- a/packages/react-components/react-aria/library/src/button/useARIAButtonShorthand.ts +++ b/packages/react-components/react-aria/library/src/button/useARIAButtonShorthand.ts @@ -14,9 +14,9 @@ import type { ARIAButtonProps, ARIAButtonSlotProps, ARIAButtonType } from './typ * for multiple scenarios of shorthand properties. Ensuring 1st rule of ARIA for cases * where no attribute addition is required. */ -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export const useARIAButtonShorthand: ResolveShorthandFunction<ARIAButtonSlotProps> = (value, options) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const shorthand = resolveShorthand(value, options); const shorthandARIAButton = useARIAButtonProps<ARIAButtonType, ARIAButtonProps>(shorthand?.as ?? 'button', shorthand); return shorthand && shorthandARIAButton; diff --git a/packages/react-components/react-aria/library/src/index.ts b/packages/react-components/react-aria/library/src/index.ts index 45a9dc54c4afdd..ad3356f83b1de0 100644 --- a/packages/react-components/react-aria/library/src/index.ts +++ b/packages/react-components/react-aria/library/src/index.ts @@ -1,5 +1,5 @@ export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated useARIAButtonShorthand, useARIAButtonProps, } from './button/index'; diff --git a/packages/react-components/react-avatar/library/src/Avatar.ts b/packages/react-components/react-avatar/library/src/Avatar.ts index 8ca97c6548782f..642b24efddd5c4 100644 --- a/packages/react-components/react-avatar/library/src/Avatar.ts +++ b/packages/react-components/react-avatar/library/src/Avatar.ts @@ -3,7 +3,7 @@ export type { AvatarProps, AvatarShape, AvatarSize, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated AvatarSizes, AvatarSlots, AvatarState, diff --git a/packages/react-components/react-avatar/library/src/components/Avatar/index.ts b/packages/react-components/react-avatar/library/src/components/Avatar/index.ts index e797bdbe9904cd..410a795a32eb43 100644 --- a/packages/react-components/react-avatar/library/src/components/Avatar/index.ts +++ b/packages/react-components/react-avatar/library/src/components/Avatar/index.ts @@ -3,7 +3,7 @@ export type { AvatarProps, AvatarShape, AvatarSize, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated AvatarSizes, AvatarSlots, AvatarState, diff --git a/packages/react-components/react-avatar/library/src/index.ts b/packages/react-components/react-avatar/library/src/index.ts index af3c17671056a6..6575eeafb28f75 100644 --- a/packages/react-components/react-avatar/library/src/index.ts +++ b/packages/react-components/react-avatar/library/src/index.ts @@ -11,7 +11,7 @@ export type { AvatarSlots, AvatarState, AvatarShape, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated AvatarSizes, AvatarSize, } from './Avatar'; diff --git a/packages/react-components/react-combobox/library/src/components/Combobox/renderCombobox.tsx b/packages/react-components/react-combobox/library/src/components/Combobox/renderCombobox.tsx index b0a5796ec06ca7..5702e653d61545 100644 --- a/packages/react-components/react-combobox/library/src/components/Combobox/renderCombobox.tsx +++ b/packages/react-components/react-combobox/library/src/components/Combobox/renderCombobox.tsx @@ -18,7 +18,7 @@ export const renderCombobox_unstable = (state: ComboboxState, contextValues: Com <state.root> <ActiveDescendantContextProvider value={contextValues.activeDescendant}> <ListboxProvider value={contextValues.listbox}> - {/*eslint-disable-next-line deprecation/deprecation*/} + {/*eslint-disable-next-line @typescript-eslint/no-deprecated*/} <ComboboxContext.Provider value={contextValues.combobox}> <state.input /> {state.clearIcon && <state.clearIcon />} @@ -31,7 +31,7 @@ export const renderCombobox_unstable = (state: ComboboxState, contextValues: Com <state.listbox /> </Portal> ))} - {/*eslint-disable-next-line deprecation/deprecation*/} + {/*eslint-disable-next-line @typescript-eslint/no-deprecated*/} </ComboboxContext.Provider> </ListboxProvider> </ActiveDescendantContextProvider> diff --git a/packages/react-components/react-combobox/library/src/components/Dropdown/renderDropdown.tsx b/packages/react-components/react-combobox/library/src/components/Dropdown/renderDropdown.tsx index 130540c32d52fe..69238109c1ef71 100644 --- a/packages/react-components/react-combobox/library/src/components/Dropdown/renderDropdown.tsx +++ b/packages/react-components/react-combobox/library/src/components/Dropdown/renderDropdown.tsx @@ -19,7 +19,7 @@ export const renderDropdown_unstable = (state: DropdownState, contextValues: Dro <state.root> <ActiveDescendantContextProvider value={contextValues.activeDescendant}> <ListboxContext.Provider value={contextValues.listbox}> - {/*eslint-disable-next-line deprecation/deprecation*/} + {/*eslint-disable-next-line @typescript-eslint/no-deprecated*/} <ComboboxContext.Provider value={contextValues.combobox}> <state.button> {state.button.children} @@ -34,7 +34,7 @@ export const renderDropdown_unstable = (state: DropdownState, contextValues: Dro <state.listbox /> </Portal> ))} - {/*eslint-disable-next-line deprecation/deprecation*/} + {/*eslint-disable-next-line @typescript-eslint/no-deprecated*/} </ComboboxContext.Provider> </ListboxContext.Provider> </ActiveDescendantContextProvider> diff --git a/packages/react-components/react-combobox/library/src/contexts/ComboboxContext.ts b/packages/react-components/react-combobox/library/src/contexts/ComboboxContext.ts index 1d96af9f998140..128877010abdf7 100644 --- a/packages/react-components/react-combobox/library/src/contexts/ComboboxContext.ts +++ b/packages/react-components/react-combobox/library/src/contexts/ComboboxContext.ts @@ -50,5 +50,5 @@ export const ComboboxContext = createContext<ComboboxContextValue>({ * @see ListboxProvider * @see useListboxContext_unstable */ -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export const ComboboxProvider = ComboboxContext.Provider; diff --git a/packages/react-components/react-combobox/library/src/index.ts b/packages/react-components/react-combobox/library/src/index.ts index 1ca229c8b342dd..66637ff8ccf367 100644 --- a/packages/react-components/react-combobox/library/src/index.ts +++ b/packages/react-components/react-combobox/library/src/index.ts @@ -1,4 +1,4 @@ -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export { ComboboxProvider } from './contexts/ComboboxContext'; export type { ComboboxContextValue } from './contexts/ComboboxContext'; export { ListboxProvider, useListboxContext_unstable } from './contexts/ListboxContext'; diff --git a/packages/react-components/react-components/src/index.ts b/packages/react-components/react-components/src/index.ts index 1c0315c6d29141..8c37965039c6c1 100644 --- a/packages/react-components/react-components/src/index.ts +++ b/packages/react-components/react-components/src/index.ts @@ -103,19 +103,19 @@ export { export type { AnnounceContextValue } from '@fluentui/react-shared-contexts'; export { // getNativeElementProps is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getNativeElementProps, getIntrinsicElementProps, getPartitionedNativeProps, // getSlots is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots, slot, assertSlots, IdPrefixProvider, resetIdsForTests, // resolveShorthand is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated resolveShorthand, SSRProvider, useAnimationFrame, @@ -134,10 +134,10 @@ export type { ComponentState, ForwardRefComponent, // ResolveShorthandFunction is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ResolveShorthandFunction, // ResolveShorthandOptions is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ResolveShorthandOptions, Slot, SlotOptions, @@ -241,7 +241,7 @@ export type { AvatarNamedColor, AvatarProps, // AvatarSizes is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated AvatarSizes, AvatarSize, AvatarSlots, @@ -374,7 +374,7 @@ export { optionGroupClassNames, useOptionGroupStyles_unstable, useOptionGroup_unstable, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ComboboxProvider, useComboboxContextValues, ListboxProvider, @@ -562,7 +562,7 @@ export type { MenuOpenChangeData, MenuOpenEvent, // MenuOpenEvents is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated MenuOpenEvents, MenuPopoverProps, MenuPopoverSlots, @@ -578,7 +578,7 @@ export type { MenuTriggerState, SelectableHandler, // UninitializedMenuListState is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated UninitializedMenuListState, } from '@fluentui/react-menu'; export { @@ -630,7 +630,7 @@ export { renderRadio_unstable, renderRadioGroup_unstable, useRadio_unstable, - useRadioGroupContext_unstable, // eslint-disable-line deprecation/deprecation + useRadioGroupContext_unstable, // eslint-disable-line @typescript-eslint/no-deprecated useRadioGroupContextValue_unstable, useRadioGroupContextValues, useRadioGroup_unstable, diff --git a/packages/react-components/react-components/src/unstable/index.ts b/packages/react-components/react-components/src/unstable/index.ts index 97cbbb4f339bda..b821e46f85ef9c 100644 --- a/packages/react-components/react-components/src/unstable/index.ts +++ b/packages/react-components/react-components/src/unstable/index.ts @@ -7,7 +7,7 @@ // - use/consume `*-preview` packages directly for preview/unstable Fluent UI core controls early access // ===================================================================================================== -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ export { Alert, alertClassNames, @@ -37,7 +37,7 @@ export type { InfoLabelSlots, InfoLabelState, } from '@fluentui/react-infobutton'; -/* eslint-enable deprecation/deprecation */ +/* eslint-enable @typescript-eslint/no-deprecated */ export { Virtualizer, diff --git a/packages/react-components/react-icons-compat/library/src/icon.ts b/packages/react-components/react-icons-compat/library/src/icon.ts index 9c64d247c04927..47e689293d0e31 100644 --- a/packages/react-components/react-icons-compat/library/src/icon.ts +++ b/packages/react-components/react-icons-compat/library/src/icon.ts @@ -171,7 +171,7 @@ export function getIcon(name?: string): IconRecord | undefined { } } } else { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (!options.disableWarnings && options.warnOnMissingIcons) { // eslint-disable-next-line no-console console.warn( diff --git a/packages/react-components/react-jsx-runtime/src/createElement.test.tsx b/packages/react-components/react-jsx-runtime/src/createElement.test.tsx index 59cd16ff8b906e..3b670e327d6f50 100644 --- a/packages/react-components/react-jsx-runtime/src/createElement.test.tsx +++ b/packages/react-components/react-jsx-runtime/src/createElement.test.tsx @@ -77,12 +77,12 @@ describe('createElement with getSlotsNext', () => { const state: TestComponentState = { components: { slot: 'div' }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slot: resolveShorthand(props.slot, { defaultProps: { children: 'Default Children', id: 'slot' }, }), }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { slots, slotProps } = getSlotsNext<TestComponentSlots>(state); return <slots.slot {...slotProps.slot} />; @@ -120,12 +120,12 @@ describe('createElement with getSlotsNext', () => { const state: TestComponentState = { components: { inner: 'div', outer: 'div' }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated inner: resolveShorthand(props.inner, { defaultProps: { id: 'inner' } }), - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated outer: resolveShorthand(props.outer, { defaultProps: { id: 'outer' } }), }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { slots, slotProps } = getSlotsNext<TestComponentSlots>(state); return ( diff --git a/packages/react-components/react-jsx-runtime/src/interop.test.tsx b/packages/react-components/react-jsx-runtime/src/interop.test.tsx index d6c46a016b4ef4..24d2f754c91f99 100644 --- a/packages/react-components/react-jsx-runtime/src/interop.test.tsx +++ b/packages/react-components/react-jsx-runtime/src/interop.test.tsx @@ -19,7 +19,7 @@ describe('resolveShorthand with assertSlots', () => { const TestComponent = (props: TestComponentProps) => { const state: TestComponentState = { components: { someSlot: 'div' }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated someSlot: resolveShorthand(props.someSlot, { required: true, defaultProps: { children: 'Default Children', id: 'slot' }, @@ -64,9 +64,9 @@ describe('resolveShorthand with assertSlots', () => { const TestComponent = (props: TestComponentProps) => { const state: TestComponentState = { components: { outer: 'div', inner: 'div' }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated inner: resolveShorthand(props.inner, { defaultProps: { id: 'inner' }, required: true }), - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated outer: resolveShorthand(props.outer, { defaultProps: { id: 'outer' }, required: true }), }; assertSlots<TestComponentSlots>(state); @@ -125,7 +125,7 @@ describe('resolveShorthand with assertSlots', () => { const TestComponent = (props: TestComponentProps) => { const state: TestComponentState = { components: { slot: 'div' }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slot: resolveShorthand(props.slot, { required: true }), }; assertSlots<TestComponentSlots>(state); diff --git a/packages/react-components/react-jsx-runtime/src/jsx-runtime.test.tsx b/packages/react-components/react-jsx-runtime/src/jsx-runtime.test.tsx index 66d5a5343aa3ca..ed8b53687fcabe 100644 --- a/packages/react-components/react-jsx-runtime/src/jsx-runtime.test.tsx +++ b/packages/react-components/react-jsx-runtime/src/jsx-runtime.test.tsx @@ -71,12 +71,12 @@ describe('createElement with getSlotsNext', () => { const state: TestComponentState = { components: { slot: 'div' }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slot: resolveShorthand(props.slot, { defaultProps: { children: 'Default Children', id: 'slot' }, }), }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { slots, slotProps } = getSlotsNext<TestComponentSlots>(state); return <slots.slot {...slotProps.slot} />; @@ -114,12 +114,12 @@ describe('createElement with getSlotsNext', () => { const state: TestComponentState = { components: { inner: 'div', outer: 'div' }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated inner: resolveShorthand(props.inner, { defaultProps: { id: 'inner' } }), - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated outer: resolveShorthand(props.outer, { defaultProps: { id: 'outer' } }), }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { slots, slotProps } = getSlotsNext<TestComponentSlots>(state); return ( diff --git a/packages/react-components/react-menu/library/src/Menu.ts b/packages/react-components/react-menu/library/src/Menu.ts index a1d64d15e3ae75..4a6cc2cb8481fd 100644 --- a/packages/react-components/react-menu/library/src/Menu.ts +++ b/packages/react-components/react-menu/library/src/Menu.ts @@ -2,7 +2,7 @@ export type { MenuContextValues, MenuOpenChangeData, MenuOpenEvent, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated MenuOpenEvents, MenuProps, MenuSlots, diff --git a/packages/react-components/react-menu/library/src/MenuList.ts b/packages/react-components/react-menu/library/src/MenuList.ts index 5869d3b2473fcc..bdf7061fb1a954 100644 --- a/packages/react-components/react-menu/library/src/MenuList.ts +++ b/packages/react-components/react-menu/library/src/MenuList.ts @@ -5,7 +5,7 @@ export type { MenuListProps, MenuListSlots, MenuListState, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated UninitializedMenuListState, } from './components/MenuList/index'; export { diff --git a/packages/react-components/react-menu/library/src/components/Menu/index.ts b/packages/react-components/react-menu/library/src/components/Menu/index.ts index 0830f525ad16ad..f8f52e39aa00d2 100644 --- a/packages/react-components/react-menu/library/src/components/Menu/index.ts +++ b/packages/react-components/react-menu/library/src/components/Menu/index.ts @@ -3,7 +3,7 @@ export type { MenuContextValues, MenuOpenChangeData, MenuOpenEvent, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated MenuOpenEvents, MenuProps, MenuSlots, diff --git a/packages/react-components/react-menu/library/src/components/MenuList/index.ts b/packages/react-components/react-menu/library/src/components/MenuList/index.ts index 66b24f6405c9a2..eb018a4ed49ead 100644 --- a/packages/react-components/react-menu/library/src/components/MenuList/index.ts +++ b/packages/react-components/react-menu/library/src/components/MenuList/index.ts @@ -6,7 +6,7 @@ export type { MenuListProps, MenuListSlots, MenuListState, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated UninitializedMenuListState, } from './MenuList.types'; export { renderMenuList_unstable } from './renderMenuList'; diff --git a/packages/react-components/react-menu/library/src/components/index.ts b/packages/react-components/react-menu/library/src/components/index.ts index 778a42b08abe47..eb7e7cd5f0785b 100644 --- a/packages/react-components/react-menu/library/src/components/index.ts +++ b/packages/react-components/react-menu/library/src/components/index.ts @@ -13,7 +13,7 @@ export type { MenuListProps, MenuListSlots, MenuListState, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated UninitializedMenuListState, } from './MenuList/index'; export { diff --git a/packages/react-components/react-menu/library/src/index.ts b/packages/react-components/react-menu/library/src/index.ts index 85019a022946d0..1d2d53e93f1fa0 100644 --- a/packages/react-components/react-menu/library/src/index.ts +++ b/packages/react-components/react-menu/library/src/index.ts @@ -12,7 +12,7 @@ export type { MenuOpenChangeData, MenuOpenEvent, // MenuOpenEvents is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated MenuOpenEvents, MenuProps, MenuSlots, @@ -83,7 +83,7 @@ export type { MenuListSlots, MenuListState, // UninitializedMenuListState is deprecated but removing it would be a breaking change - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated UninitializedMenuListState, } from './MenuList'; export { diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBar/MessageBar.test.tsx b/packages/react-components/react-message-bar/library/src/components/MessageBar/MessageBar.test.tsx index 056dce8a52bfdf..bd108f6054cab9 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBar/MessageBar.test.tsx +++ b/packages/react-components/react-message-bar/library/src/components/MessageBar/MessageBar.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { render } from '@testing-library/react'; import { isConformant } from '../../testing/isConformant'; import { MessageBar } from './MessageBar'; -import { AnnounceProvider_unstable } from '@fluentui/react-shared-contexts'; +import { AnnounceProvider } from '@fluentui/react-shared-contexts'; import { MessageBarBody } from '../MessageBarBody/MessageBarBody'; import { MessageBarTitle } from '../MessageBarTitle/MessageBarTitle'; import { MessageBarActions } from '../MessageBarActions/MessageBarActions'; @@ -67,13 +67,13 @@ describe('MessageBar', () => { ])('should announce %s with %s intent', (politeness, intent) => { const announce = jest.fn(); render( - <AnnounceProvider_unstable value={{ announce }}> + <AnnounceProvider value={{ announce }}> <MessageBar intent={intent}> <MessageBarBody> <MessageBarTitle>Title</MessageBarTitle>Body </MessageBarBody> </MessageBar> - </AnnounceProvider_unstable>, + </AnnounceProvider>, ); expect(announce).toHaveBeenCalledTimes(1); @@ -86,7 +86,7 @@ describe('MessageBar', () => { it('should announce actions', () => { const announce = jest.fn(); render( - <AnnounceProvider_unstable value={{ announce }}> + <AnnounceProvider value={{ announce }}> <MessageBar> <MessageBarBody> <MessageBarTitle>Title</MessageBarTitle>Body @@ -96,7 +96,7 @@ describe('MessageBar', () => { <button>Action 2</button> </MessageBarActions> </MessageBar> - </AnnounceProvider_unstable>, + </AnnounceProvider>, ); expect(announce).toHaveBeenCalledTimes(1); diff --git a/packages/react-components/react-message-bar/library/src/components/MessageBar/useMessageBar.ts b/packages/react-components/react-message-bar/library/src/components/MessageBar/useMessageBar.ts index 1c6145749da4fa..7ab387059a5841 100644 --- a/packages/react-components/react-message-bar/library/src/components/MessageBar/useMessageBar.ts +++ b/packages/react-components/react-message-bar/library/src/components/MessageBar/useMessageBar.ts @@ -21,7 +21,7 @@ export const useMessageBar_unstable = (props: MessageBarProps, ref: React.Ref<HT const autoReflow = layout === 'auto'; const { ref: reflowRef, reflowing } = useMessageBarReflow(autoReflow); const computedLayout = autoReflow ? (reflowing ? 'multiline' : 'singleline') : layout; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { className: transitionClassName, nodeRef } = useMessageBarTransitionContext(); const actionsRef = React.useRef<HTMLDivElement | null>(null); const bodyRef = React.useRef<HTMLDivElement | null>(null); diff --git a/packages/react-components/react-motion/library/src/slots/presenceMotionSlot.tsx b/packages/react-components/react-motion/library/src/slots/presenceMotionSlot.tsx index 5c85af9d4b9b79..54f108e3b66c74 100644 --- a/packages/react-components/react-motion/library/src/slots/presenceMotionSlot.tsx +++ b/packages/react-components/react-motion/library/src/slots/presenceMotionSlot.tsx @@ -42,7 +42,7 @@ export function presenceMotionSlot<MotionParams extends Record<string, MotionPar defaultProps: PresenceMotionSlotRenderProps & MotionParams; }, ): SlotComponentType<PresenceMotionSlotRenderProps & MotionParams> { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { as, children, ...rest } = motion ?? {}; if (process.env.NODE_ENV !== 'production') { diff --git a/packages/react-components/react-popover/library/src/components/Popover/usePopover.ts b/packages/react-components/react-popover/library/src/components/Popover/usePopover.ts index 67e026e21b30c2..2ab6254edfee08 100644 --- a/packages/react-components/react-popover/library/src/components/Popover/usePopover.ts +++ b/packages/react-components/react-popover/library/src/components/Popover/usePopover.ts @@ -129,7 +129,7 @@ export const usePopover_unstable = (props: PopoverProps): PopoverState => { return { ...initialState, ...positioningRefs, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated inertTrapFocus: props.inertTrapFocus ?? (props.legacyTrapFocus === undefined ? false : !props.legacyTrapFocus), popoverTrigger, popoverSurface, diff --git a/packages/react-components/react-positioning/src/usePositioning.ts b/packages/react-components/react-positioning/src/usePositioning.ts index 8dd68e3434ecfa..28280848b1a078 100644 --- a/packages/react-components/react-positioning/src/usePositioning.ts +++ b/packages/react-components/react-positioning/src/usePositioning.ts @@ -173,7 +173,7 @@ function usePositioningOptions(options: PositioningOptions) { pinned, position, unstable_disableTether: disableTether, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated positionFixed, strategy, overflowBoundaryPadding, diff --git a/packages/react-components/react-provider/library/src/components/FluentProvider/useFluentProviderThemeStyleTag.test.tsx b/packages/react-components/react-provider/library/src/components/FluentProvider/useFluentProviderThemeStyleTag.test.tsx index 4f59835acae0a4..9ddac75eeec9df 100644 --- a/packages/react-components/react-provider/library/src/components/FluentProvider/useFluentProviderThemeStyleTag.test.tsx +++ b/packages/react-components/react-provider/library/src/components/FluentProvider/useFluentProviderThemeStyleTag.test.tsx @@ -111,7 +111,7 @@ describe('useFluentProviderThemeStyleTag', () => { expect(targetDocument.body.querySelector('style')).toBeNull(); expect(targetDocument.head.querySelectorAll('style').length).toBe(1); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(targetDocument.createElement).toHaveBeenCalledTimes(0); }); }); diff --git a/packages/react-components/react-radio/library/src/contexts/index.ts b/packages/react-components/react-radio/library/src/contexts/index.ts index 54f7374332d554..8616aab3210787 100644 --- a/packages/react-components/react-radio/library/src/contexts/index.ts +++ b/packages/react-components/react-radio/library/src/contexts/index.ts @@ -2,7 +2,7 @@ export { RadioGroupContext, RadioGroupProvider, useRadioGroupContextValue_unstable, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated useRadioGroupContext_unstable, } from './RadioGroupContext'; export { useRadioGroupContextValues } from './useRadioGroupContextValues'; diff --git a/packages/react-components/react-radio/library/src/index.ts b/packages/react-components/react-radio/library/src/index.ts index ffddc5faeeb928..68d15286c7fd13 100644 --- a/packages/react-components/react-radio/library/src/index.ts +++ b/packages/react-components/react-radio/library/src/index.ts @@ -18,6 +18,6 @@ export type { RadioProps, RadioSlots, RadioState, RadioOnChangeData } from './Ra export { RadioGroupProvider, useRadioGroupContextValues, - useRadioGroupContext_unstable, // eslint-disable-line deprecation/deprecation + useRadioGroupContext_unstable, // eslint-disable-line @typescript-eslint/no-deprecated useRadioGroupContextValue_unstable, } from './contexts/index'; diff --git a/packages/react-components/react-storybook-addon/src/preset/manager.ts b/packages/react-components/react-storybook-addon/src/preset/manager.ts index 8ad58779eb9d57..bfa487a41be5a6 100644 --- a/packages/react-components/react-storybook-addon/src/preset/manager.ts +++ b/packages/react-components/react-storybook-addon/src/preset/manager.ts @@ -8,20 +8,20 @@ import { DirectionSwitch } from '../components/DirectionSwitch'; addons.register(ADDON_ID, () => { addons.add(THEME_ID, { title: 'Fluent Theme Picker', - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated type: types.TOOL, match: ({ viewMode }) => !!(viewMode && viewMode.match(/^(story|docs)$/)), render: ThemePicker, }); addons.add(DIR_ID, { title: 'Direction Switch', - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated type: types.TOOL, match: ({ viewMode }) => !!(viewMode && viewMode.match(/^(story|docs)$/)), render: DirectionSwitch, }); addons.add(STRICT_MODE_ID, { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated type: types.TOOL, title: 'React Strict Mode', match: ({ viewMode }) => !!(viewMode && viewMode.match(/^(story|docs)$/)), diff --git a/packages/react-components/react-switch/library/src/Switch.ts b/packages/react-components/react-switch/library/src/Switch.ts index 4ca85158f1edd1..bbdd746cfad93b 100644 --- a/packages/react-components/react-switch/library/src/Switch.ts +++ b/packages/react-components/react-switch/library/src/Switch.ts @@ -2,7 +2,7 @@ export type { SwitchOnChangeData, SwitchProps, SwitchSlots, SwitchState } from ' export { Switch, renderSwitch_unstable, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switchClassName, switchClassNames, useSwitchStyles_unstable, diff --git a/packages/react-components/react-switch/library/src/components/Switch/index.ts b/packages/react-components/react-switch/library/src/components/Switch/index.ts index d94c2b603d131e..4853a54d26424c 100644 --- a/packages/react-components/react-switch/library/src/components/Switch/index.ts +++ b/packages/react-components/react-switch/library/src/components/Switch/index.ts @@ -3,7 +3,7 @@ export type { SwitchOnChangeData, SwitchProps, SwitchSlots, SwitchState } from ' export { renderSwitch_unstable } from './renderSwitch'; export { useSwitch_unstable } from './useSwitch'; export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switchClassName, switchClassNames, useSwitchStyles_unstable, diff --git a/packages/react-components/react-switch/library/src/index.ts b/packages/react-components/react-switch/library/src/index.ts index 6ca6e3524f037b..b2ae66ee66258d 100644 --- a/packages/react-components/react-switch/library/src/index.ts +++ b/packages/react-components/react-switch/library/src/index.ts @@ -1,7 +1,7 @@ export { Switch, renderSwitch_unstable, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switchClassName, switchClassNames, useSwitchStyles_unstable, diff --git a/packages/react-components/react-table/library/src/components/DataGridHeaderCell/useDataGridHeaderCell.ts b/packages/react-components/react-table/library/src/components/DataGridHeaderCell/useDataGridHeaderCell.ts index ab2fc0cebe2416..285f4cf3532033 100644 --- a/packages/react-components/react-table/library/src/components/DataGridHeaderCell/useDataGridHeaderCell.ts +++ b/packages/react-components/react-table/library/src/components/DataGridHeaderCell/useDataGridHeaderCell.ts @@ -42,7 +42,7 @@ export const useDataGridHeaderCell_unstable = ( return ctx.columnSizing_unstable.getTableHeaderCellProps; }); - // eslint-disable-next-line deprecation/deprecation -- prefer HTMLTableCellElement + // eslint-disable-next-line @typescript-eslint/no-deprecated -- prefer HTMLTableCellElement const onClick = useEventCallback((e: React.MouseEvent<HTMLTableHeaderCellElement>) => { if (sortable) { toggleColumnSort(e, columnId); diff --git a/packages/react-components/react-table/library/src/components/TableSelectionCell/useTableSelectionCell.tsx b/packages/react-components/react-table/library/src/components/TableSelectionCell/useTableSelectionCell.tsx index d76634b1cb03d7..3770b04f5b33f3 100644 --- a/packages/react-components/react-table/library/src/components/TableSelectionCell/useTableSelectionCell.tsx +++ b/packages/react-components/react-table/library/src/components/TableSelectionCell/useTableSelectionCell.tsx @@ -26,7 +26,7 @@ export const useTableSelectionCell_unstable = ( type = 'checkbox', checked = false, subtle = false, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated hidden = false, invisible = false, } = props; diff --git a/packages/react-components/react-tabs/library/src/components/Tab/useTabStyles.styles.ts b/packages/react-components/react-tabs/library/src/components/Tab/useTabStyles.styles.ts index c6d3116d6c22cf..7c04731829d2c7 100644 --- a/packages/react-components/react-tabs/library/src/components/Tab/useTabStyles.styles.ts +++ b/packages/react-components/react-tabs/library/src/components/Tab/useTabStyles.styles.ts @@ -717,7 +717,7 @@ export const useTabContentStyles_unstable = (state: TabState): TabState => { ); // FIXME: this is a deprecated API // should be removed in the next major version - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated state.contentReservedSpaceClassName = state.contentReservedSpace.className; } diff --git a/packages/react-components/react-tabster/src/index.ts b/packages/react-components/react-tabster/src/index.ts index 879248bc4af1e6..2b5585db39a3de 100644 --- a/packages/react-components/react-tabster/src/index.ts +++ b/packages/react-components/react-tabster/src/index.ts @@ -64,10 +64,10 @@ export { /** @deprecated (Do not use! Exposed by mistake and will be removed in the next major version.) */ TabsterTypes6_0_1_DoNotUse as TabsterTypes, /** @deprecated Use element.dispatchEvent(new GroupperMoveFocusEvent({ action: GroupperMoveFocusActions.Escape })) */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated dispatchGroupperMoveFocusEvent, /** @deprecated Use element.dispatchEvent(new MoverMoveFocusEvent({ key: MoverKeys.ArrowDown })) */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated dispatchMoverMoveFocusEvent, }; diff --git a/packages/react-components/react-tree/library/src/components/TreeItem/useTreeItemContextValues.ts b/packages/react-components/react-tree/library/src/components/TreeItem/useTreeItemContextValues.ts index ba9330ef3b28b1..fc200e42d76857 100644 --- a/packages/react-components/react-tree/library/src/components/TreeItem/useTreeItemContextValues.ts +++ b/packages/react-components/react-tree/library/src/components/TreeItem/useTreeItemContextValues.ts @@ -11,9 +11,9 @@ export function useTreeItemContextValues_unstable(state: TreeItemState): TreeIte expandIconRef, actionsRef, treeItemRef, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated isActionsVisible, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated isAsideVisible, selectionRef, checked, diff --git a/packages/react-components/react-utilities/src/compose/deprecated/getSlots.test.tsx b/packages/react-components/react-utilities/src/compose/deprecated/getSlots.test.tsx index 7ccb934d93a74b..139f83bd1b4eb9 100644 --- a/packages/react-components/react-utilities/src/compose/deprecated/getSlots.test.tsx +++ b/packages/react-components/react-utilities/src/compose/deprecated/getSlots.test.tsx @@ -9,7 +9,7 @@ describe('getSlots', () => { it('returns provided component type for root if the as prop is not provided', () => { type Slots = { root: Slot<'div'> }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(getSlots<Slots>({ root: {}, components: { root: 'div' } })).toEqual({ slots: { root: 'div' }, slotProps: { root: {} }, @@ -18,7 +18,7 @@ describe('getSlots', () => { it('returns root slot as a span with no props', () => { type Slots = { root: Slot<'div', 'span'> }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(getSlots<Slots>({ root: { as: 'span' }, components: { root: 'div' } })).toEqual({ slots: { root: 'span' }, slotProps: { root: {} }, @@ -29,7 +29,7 @@ describe('getSlots', () => { type Slots = { root: Slot<'button'> }; const invalidProp = { href: 'href' } as React.ButtonHTMLAttributes<HTMLButtonElement>; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots<Slots>({ root: { as: 'button', id: 'id', ...invalidProp }, components: { root: 'button' } }), ).toEqual({ slots: { root: 'button' }, @@ -39,7 +39,7 @@ describe('getSlots', () => { it('returns root slot as an anchor, leaving the href intact', () => { type Slots = { root: Slot<'a'> }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(getSlots<Slots>({ root: { as: 'a', id: 'id', href: 'href' }, components: { root: 'a' } })).toEqual({ slots: { root: 'a' }, slotProps: { root: { id: 'id', href: 'href' } }, @@ -52,7 +52,7 @@ describe('getSlots', () => { icon: Slot<typeof Foo>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots<Slots>({ icon: {}, components: { root: 'div', icon: Foo }, @@ -70,7 +70,7 @@ describe('getSlots', () => { icon: Slot<'button'>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots<Slots>({ components: { icon: 'button', root: 'div' }, root: { as: 'span' }, @@ -88,7 +88,7 @@ describe('getSlots', () => { icon: Slot<'a'>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots<Slots>({ root: { as: 'div' }, components: { root: 'div', icon: 'a' }, @@ -106,7 +106,7 @@ describe('getSlots', () => { icon: Slot<'a'> | Slot<typeof Foo>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots<Slots>({ components: { root: 'div', icon: Foo }, root: { as: 'div' }, @@ -124,7 +124,7 @@ describe('getSlots', () => { icon: Slot<'a'>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots<Slots>({ components: { root: 'div', icon: Foo }, root: { as: 'div' }, @@ -143,12 +143,12 @@ describe('getSlots', () => { }; const renderFunction = (C: React.ElementType, p: {}) => <C {...p} />; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots<Slots>({ components: { root: 'div', icon: Foo }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated root: resolveShorthand({ as: 'div' }, { required: true }), - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated icon: resolveShorthand({ id: 'bar', children: renderFunction }), }), ).toEqual({ @@ -164,7 +164,7 @@ describe('getSlots', () => { icon?: Slot<'a'>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots<Slots>({ root: { as: 'div' }, components: { root: 'div', input: 'input', icon: 'a' }, diff --git a/packages/react-components/react-utilities/src/compose/deprecated/getSlots.ts b/packages/react-components/react-utilities/src/compose/deprecated/getSlots.ts index 0a3c64a7bd3349..c75947a2bc85b6 100644 --- a/packages/react-components/react-utilities/src/compose/deprecated/getSlots.ts +++ b/packages/react-components/react-utilities/src/compose/deprecated/getSlots.ts @@ -59,23 +59,23 @@ export type ObjectSlotProps<S extends SlotPropsRecord> = { export function getSlots<R extends SlotPropsRecord>( state: ComponentState<R>, ): { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slots: Slots<R>; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slotProps: ObjectSlotProps<R>; } { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const slots = {} as Slots<R>; const slotProps = {} as R; const slotNames: (keyof R)[] = Object.keys(state.components); for (const slotName of slotNames) { const [slot, props] = getSlot(state, slotName); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slots[slotName] = slot as Slots<R>[typeof slotName]; slotProps[slotName] = props; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return { slots, slotProps: slotProps as unknown as ObjectSlotProps<R> }; } diff --git a/packages/react-components/react-utilities/src/compose/deprecated/getSlotsNext.test.tsx b/packages/react-components/react-utilities/src/compose/deprecated/getSlotsNext.test.tsx index 054a02b7a6d6bd..73fdf5ae2a7aeb 100644 --- a/packages/react-components/react-utilities/src/compose/deprecated/getSlotsNext.test.tsx +++ b/packages/react-components/react-utilities/src/compose/deprecated/getSlotsNext.test.tsx @@ -16,7 +16,7 @@ describe('getSlotsNext', () => { it('returns provided component type for root if the as prop is not provided', () => { type Slots = { root: Slot<'div'> }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({}), components: { root: 'div' }, @@ -30,7 +30,7 @@ describe('getSlotsNext', () => { it('returns root slot as a span with no props', () => { type Slots = { root: Slot<'div', 'span'> }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({ as: 'span' }), components: { root: 'div' }, @@ -45,7 +45,7 @@ describe('getSlotsNext', () => { type Slots = { root: Slot<'button'> }; const invalidProp = { href: 'href' } as React.ButtonHTMLAttributes<HTMLButtonElement>; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({ as: 'button', id: 'id', ...invalidProp }), components: { root: 'button' }, @@ -59,7 +59,7 @@ describe('getSlotsNext', () => { it('returns root slot as an anchor, leaving the href intact', () => { type Slots = { root: Slot<'a'> }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({ as: 'a', id: 'id', href: 'href' }), components: { root: 'a' }, @@ -76,7 +76,7 @@ describe('getSlotsNext', () => { icon: Slot<typeof Foo>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ icon: resolveShorthandMock<ExtractSlotProps<Slots['icon']>>({}), components: { root: 'div', icon: Foo }, @@ -97,7 +97,7 @@ describe('getSlotsNext', () => { icon: Slot<'button'>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ components: { icon: 'button', root: 'div' }, root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({ as: 'span' }), @@ -118,7 +118,7 @@ describe('getSlotsNext', () => { icon: Slot<'a'>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({ as: 'div' }), components: { root: 'div', icon: 'a' }, @@ -143,7 +143,7 @@ describe('getSlotsNext', () => { icon: Slot<'a'> | Slot<typeof Foo>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ components: { root: 'div', icon: Foo }, root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({ as: 'div' }), @@ -169,7 +169,7 @@ describe('getSlotsNext', () => { }; const renderIcon = (C: React.ElementType, p: {}) => <C {...p} />; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ components: { root: 'div', icon: Foo }, root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({ as: 'div' }), @@ -191,12 +191,12 @@ describe('getSlotsNext', () => { }; const renderFunction = (C: React.ElementType, p: {}) => <C {...p} />; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ components: { root: 'div', icon: Foo }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated root: resolveShorthand<ExtractSlotProps<Slots['root']>>({ as: 'div' }, { required: true }), - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated icon: resolveShorthand<ExtractSlotProps<Slots['icon']>>({ id: 'bar', children: renderFunction }), }), ).toEqual({ @@ -219,7 +219,7 @@ describe('getSlotsNext', () => { icon?: Slot<'a'>; }; expect( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext<Slots>({ root: resolveShorthandMock<ExtractSlotProps<Slots['root']>>({ as: 'div' }), components: { root: 'div', input: 'input', icon: 'a' }, diff --git a/packages/react-components/react-utilities/src/compose/deprecated/getSlotsNext.ts b/packages/react-components/react-utilities/src/compose/deprecated/getSlotsNext.ts index 0bd1a54b951cd0..9889ea0654fdf7 100644 --- a/packages/react-components/react-utilities/src/compose/deprecated/getSlotsNext.ts +++ b/packages/react-components/react-utilities/src/compose/deprecated/getSlotsNext.ts @@ -15,24 +15,24 @@ import { ObjectSlotProps, Slots } from './getSlots'; export function getSlotsNext<R extends SlotPropsRecord>( state: ComponentState<R>, ): { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slots: Slots<R>; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slotProps: ObjectSlotProps<R>; } { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const slots = {} as Slots<R>; const slotProps = {} as R; const slotNames: (keyof R)[] = Object.keys(state.components); for (const slotName of slotNames) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const [slot, props] = getSlotNext(state, slotName); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated slots[slotName] = slot as Slots<R>[typeof slotName]; slotProps[slotName] = props; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return { slots, slotProps: slotProps as unknown as ObjectSlotProps<R> }; } diff --git a/packages/react-components/react-utilities/src/compose/deprecated/resolveShorthand.test.tsx b/packages/react-components/react-utilities/src/compose/deprecated/resolveShorthand.test.tsx index 2def23a8ed38cf..ecb2332f10a71e 100644 --- a/packages/react-components/react-utilities/src/compose/deprecated/resolveShorthand.test.tsx +++ b/packages/react-components/react-utilities/src/compose/deprecated/resolveShorthand.test.tsx @@ -13,7 +13,7 @@ type TestProps = { describe('resolveShorthand', () => { it('resolves a string', () => { const props: TestProps = { slotA: 'hello' }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const resolvedProps = resolveShorthand(props.slotA); expect(resolvedProps).toEqual({ @@ -23,7 +23,7 @@ describe('resolveShorthand', () => { it('resolves a JSX element', () => { const props: TestProps = { slotA: <div>hello</div> }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const resolvedProps = resolveShorthand(props.slotA); expect(resolvedProps).toEqual({ @@ -33,7 +33,7 @@ describe('resolveShorthand', () => { it('resolves a number', () => { const props: TestProps = { slotA: 42 }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const resolvedProps = resolveShorthand(props.slotA); expect(resolvedProps).toEqual({ @@ -44,7 +44,7 @@ describe('resolveShorthand', () => { it('resolves an object as its copy', () => { const slotA = {}; const props: TestProps = { slotA }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const resolvedProps = resolveShorthand(props.slotA); expect(resolvedProps).toEqual({}); @@ -54,15 +54,15 @@ describe('resolveShorthand', () => { it('resolves "null" without creating a child element', () => { const props: TestProps = { slotA: null, slotB: null }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(resolveShorthand(props.slotA)).toEqual(undefined); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(resolveShorthand(null, { required: true })).toEqual(undefined); }); it('resolves undefined without creating a child element', () => { const props: TestProps = { slotA: undefined }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const resolvedProps = resolveShorthand(props.slotA); expect(resolvedProps).toEqual(undefined); @@ -70,7 +70,7 @@ describe('resolveShorthand', () => { it('resolves to empty object creating a child element', () => { const props: TestProps = { slotA: undefined }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const resolvedProps = resolveShorthand(props.slotA, { required: true }); expect(resolvedProps).toEqual({}); diff --git a/packages/react-components/react-utilities/src/compose/deprecated/resolveShorthand.ts b/packages/react-components/react-utilities/src/compose/deprecated/resolveShorthand.ts index d6c5063ed58b61..5ba28a48fe71c7 100644 --- a/packages/react-components/react-utilities/src/compose/deprecated/resolveShorthand.ts +++ b/packages/react-components/react-utilities/src/compose/deprecated/resolveShorthand.ts @@ -12,9 +12,9 @@ export type ResolveShorthandOptions<Props, Required extends boolean = false> = R * @deprecated use slot.always or slot.optional combined with assertSlots instead */ export type ResolveShorthandFunction<Props extends UnknownSlotProps = UnknownSlotProps> = { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <P extends Props>(value: P | SlotShorthandValue | undefined, options: ResolveShorthandOptions<P, true>): P; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <P extends Props>(value: P | SlotShorthandValue | null | undefined, options?: ResolveShorthandOptions<P, boolean>): | P | undefined; @@ -29,7 +29,7 @@ export type ResolveShorthandFunction<Props extends UnknownSlotProps = UnknownSlo * * @deprecated use slot.always or slot.optional combined with assertSlots instead */ -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export const resolveShorthand: ResolveShorthandFunction<UnknownSlotProps> = (value, options) => slot.optional<UnknownSlotProps>(value, { ...options, diff --git a/packages/react-components/react-utilities/src/compose/getIntrinsicElementProps.ts b/packages/react-components/react-utilities/src/compose/getIntrinsicElementProps.ts index 93fdc5ab0674e5..65de47f02e09c9 100644 --- a/packages/react-components/react-utilities/src/compose/getIntrinsicElementProps.ts +++ b/packages/react-components/react-utilities/src/compose/getIntrinsicElementProps.ts @@ -23,7 +23,7 @@ export const getIntrinsicElementProps = < /** List of native props to exclude from the returned value */ excludedPropNames?: ExcludedPropKeys[], ) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return getNativeElementProps< DistributiveOmit<Props, Exclude<keyof Props, keyof HTMLAttributes | keyof UnknownSlotProps> | ExcludedPropKeys> >(props.as ?? tagName, props, excludedPropNames); diff --git a/packages/react-components/react-utilities/src/compose/index.ts b/packages/react-components/react-utilities/src/compose/index.ts index 20252d1d3a38cf..fb6f26f68e14b7 100644 --- a/packages/react-components/react-utilities/src/compose/index.ts +++ b/packages/react-components/react-utilities/src/compose/index.ts @@ -26,15 +26,15 @@ export { isSlot } from './isSlot'; export { assertSlots } from './assertSlots'; export { getIntrinsicElementProps } from './getIntrinsicElementProps'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export type { ObjectSlotProps, Slots } from './deprecated/getSlots'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export { getSlots } from './deprecated/getSlots'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export type { ResolveShorthandFunction, ResolveShorthandOptions } from './deprecated/resolveShorthand'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export { resolveShorthand } from './deprecated/resolveShorthand'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export { getSlotsNext } from './deprecated/getSlotsNext'; export { slot }; diff --git a/packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts b/packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts index 1ae1f9b3e5f1bc..a5f410ec4f354d 100644 --- a/packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts +++ b/packages/react-components/react-utilities/src/hooks/useOnClickOutside.ts @@ -121,11 +121,11 @@ export const useOnClickOutside = (options: UseOnClickOrScrollOutsideOptions) => const getWindowEvent = (target: Node | Window | null | undefined): Event | undefined => { if (target) { if (typeof (target as Window).window === 'object' && (target as Window).window === target) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return target.event; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return (target as Node).ownerDocument?.defaultView?.event ?? undefined; } diff --git a/packages/react-components/react-utilities/src/index.ts b/packages/react-components/react-utilities/src/index.ts index 61a014c8ed2473..2377571564989e 100644 --- a/packages/react-components/react-utilities/src/index.ts +++ b/packages/react-components/react-utilities/src/index.ts @@ -1,12 +1,12 @@ export { slot, isSlot, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlots, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSlotsNext, assertSlots, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated resolveShorthand, isResolvedShorthand, getIntrinsicElementProps, @@ -18,12 +18,12 @@ export type { ComponentProps, ComponentState, ForwardRefComponent, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ResolveShorthandFunction, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ResolveShorthandOptions, Slot, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated Slots, SlotClassNames, SlotPropsRecord, @@ -60,7 +60,7 @@ export { canUseDOM, useIsSSR, SSRProvider } from './ssr/index'; export { clamp, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getNativeElementProps, getPartitionedNativeProps, getRTLSafeKey, diff --git a/packages/react-components/react-utilities/src/ssr/canUseDOM.ts b/packages/react-components/react-utilities/src/ssr/canUseDOM.ts index 867f967c05b549..84ce6190c2fc4c 100644 --- a/packages/react-components/react-utilities/src/ssr/canUseDOM.ts +++ b/packages/react-components/react-utilities/src/ssr/canUseDOM.ts @@ -7,7 +7,7 @@ export function canUseDOM(): boolean { typeof window !== 'undefined' && !!( window.document && - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated window.document.createElement ) /* eslint-enable @nx/workspace-no-restricted-globals */ diff --git a/packages/react-components/react-utilities/src/utils/getNativeElementProps.test.ts b/packages/react-components/react-utilities/src/utils/getNativeElementProps.test.ts index 7ba810c13f01b4..a30a5be6720e67 100644 --- a/packages/react-components/react-utilities/src/utils/getNativeElementProps.test.ts +++ b/packages/react-components/react-utilities/src/utils/getNativeElementProps.test.ts @@ -2,21 +2,21 @@ import { getNativeElementProps } from './getNativeElementProps'; describe('getNativeElementProps', () => { it('can filter native element properties', () => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(getNativeElementProps('div', { id: '123', checked: true })).toEqual({ id: '123' }); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(getNativeElementProps('input', { id: '123', checked: true })).toEqual({ id: '123', checked: true }); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(getNativeElementProps('input', { id: '123', checked: true }, ['id'])).toEqual({ checked: true }); }); it('includes `as` as a native prop', () => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(getNativeElementProps('div', { as: 'span' })).toEqual({ as: 'span' }); }); it('excludes props regardless of the allowed', () => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated expect(getNativeElementProps('div', { as: 'span' }, ['as'])).toEqual({}); }); }); diff --git a/packages/react-components/react-utilities/src/utils/getNativeElementProps.ts b/packages/react-components/react-utilities/src/utils/getNativeElementProps.ts index c6205e6ed6a528..83960f3c0f7579 100644 --- a/packages/react-components/react-utilities/src/utils/getNativeElementProps.ts +++ b/packages/react-components/react-utilities/src/utils/getNativeElementProps.ts @@ -101,7 +101,7 @@ export const getPartitionedNativeProps = < }) => { return { root: { style: props.style, className: props.className }, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated primary: getNativeElementProps<Omit<Props, ExcludedPropKeys>>(primarySlotTagName, props, [ ...(excludedPropNames || []), 'style', diff --git a/packages/react-components/react-utilities/src/utils/index.ts b/packages/react-components/react-utilities/src/utils/index.ts index 0f8340201b76ac..29a60eb017f136 100644 --- a/packages/react-components/react-utilities/src/utils/index.ts +++ b/packages/react-components/react-utilities/src/utils/index.ts @@ -1,6 +1,6 @@ export { clamp } from './clamp'; export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getNativeElementProps, getPartitionedNativeProps, } from './getNativeElementProps'; diff --git a/packages/react-conformance/src/isConformant.ts b/packages/react-conformance/src/isConformant.ts index ae8754414c1435..b7c27558ed3a8b 100644 --- a/packages/react-conformance/src/isConformant.ts +++ b/packages/react-conformance/src/isConformant.ts @@ -15,7 +15,7 @@ export function isConformant<TProps = {}>(...testInfo: Partial<IsConformantOptio disabledTests = [], extraTests, tsConfig, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated tsconfigDir, disableTypeTests, } = mergedOptions; diff --git a/packages/react-date-time/src/Calendar.ts b/packages/react-date-time/src/Calendar.ts index c324c90de538b5..ab257cb0200442 100644 --- a/packages/react-date-time/src/Calendar.ts +++ b/packages/react-date-time/src/Calendar.ts @@ -6,7 +6,7 @@ export { FirstWeekOfYear, defaultCalendarNavigationIcons, defaultCalendarStrings, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated defaultDayPickerStrings, } from '@fluentui/react/lib/Calendar'; export type { @@ -19,9 +19,9 @@ export type { ICalendarDayProps, ICalendarDayStyleProps, ICalendarDayStyles, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ICalendarFormatDateCallbacks, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ICalendarIconStrings, ICalendarMonth, ICalendarMonthProps, diff --git a/packages/react-date-time/src/DatePicker.ts b/packages/react-date-time/src/DatePicker.ts index 6fe5758c453b6e..0788eb347df958 100644 --- a/packages/react-date-time/src/DatePicker.ts +++ b/packages/react-date-time/src/DatePicker.ts @@ -6,9 +6,9 @@ export { } from '@fluentui/react/lib/DatePicker'; export type { ICalendar, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ICalendarFormatDateCallbacks, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ICalendarIconStrings, ICalendarNavigationIcons, ICalendarProps, diff --git a/packages/react-docsite-components/.eslintrc.json b/packages/react-docsite-components/.eslintrc.json index ec2a316fd41b8f..99f51edd9d841a 100644 --- a/packages/react-docsite-components/.eslintrc.json +++ b/packages/react-docsite-components/.eslintrc.json @@ -2,7 +2,15 @@ "extends": ["plugin:@fluentui/eslint-plugin/react--legacy"], "root": true, "rules": { - "deprecation/deprecation": "off", "no-restricted-globals": "off" - } + }, + "overrides": [ + { + "files": "**/*.{ts,tsx}", + "rules": { + // The components in this package are all deprecated + "@typescript-eslint/no-deprecated": "off" + } + } + ] } diff --git a/packages/react-examples/src/react-cards/Card/Card.Configure.Example.tsx b/packages/react-examples/src/react-cards/Card/Card.Configure.Example.tsx index 41d361293f475b..7b567cc65bd149 100644 --- a/packages/react-examples/src/react-cards/Card/Card.Configure.Example.tsx +++ b/packages/react-examples/src/react-cards/Card/Card.Configure.Example.tsx @@ -20,7 +20,7 @@ import { ITextStyles, } from '@fluentui/react'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ export type FilledSectionKey = '0' | '1' | '2' | '3'; diff --git a/packages/react-examples/src/react-cards/Card/Card.Horizontal.Example.tsx b/packages/react-examples/src/react-cards/Card/Card.Horizontal.Example.tsx index c6dcddeece1c83..4772ebe8231d5c 100644 --- a/packages/react-examples/src/react-cards/Card/Card.Horizontal.Example.tsx +++ b/packages/react-examples/src/react-cards/Card/Card.Horizontal.Example.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { Card, ICardTokens, ICardSectionStyles, ICardSectionTokens } from '@fluentui/react-cards'; import { FontWeights, Icon, IIconStyles, Image, Stack, IStackTokens, Text, ITextStyles } from '@fluentui/react'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ const alertClicked = (): void => { alert('Clicked'); diff --git a/packages/react-examples/src/react-cards/Card/Card.Vertical.Example.tsx b/packages/react-examples/src/react-cards/Card/Card.Vertical.Example.tsx index c6af4631cb2c6c..6b12b903ecbd88 100644 --- a/packages/react-examples/src/react-cards/Card/Card.Vertical.Example.tsx +++ b/packages/react-examples/src/react-cards/Card/Card.Vertical.Example.tsx @@ -14,7 +14,7 @@ import { ITextStyles, } from '@fluentui/react'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ const alertClicked = (): void => { alert('Clicked'); diff --git a/packages/react-examples/src/react-experiments/Chiclet/Chiclet.Footer.Example.tsx b/packages/react-examples/src/react-experiments/Chiclet/Chiclet.Footer.Example.tsx index 7e2091f14b53b8..879b2c9677a2a2 100644 --- a/packages/react-examples/src/react-experiments/Chiclet/Chiclet.Footer.Example.tsx +++ b/packages/react-examples/src/react-experiments/Chiclet/Chiclet.Footer.Example.tsx @@ -63,7 +63,7 @@ export const ChicletFooterExample: React.FunctionComponent<{}> = () => { ); }; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export interface IFooterComponent extends React.Props<FooterComponent> { buttonProps: IButtonProps[]; activities: string; diff --git a/packages/react-examples/src/react-experiments/Chiclet/Chiclet.Xsmall.Footer.Example.tsx b/packages/react-examples/src/react-experiments/Chiclet/Chiclet.Xsmall.Footer.Example.tsx index 75e67ce3d8789d..23b55119737203 100644 --- a/packages/react-examples/src/react-experiments/Chiclet/Chiclet.Xsmall.Footer.Example.tsx +++ b/packages/react-examples/src/react-experiments/Chiclet/Chiclet.Xsmall.Footer.Example.tsx @@ -65,7 +65,7 @@ class FooterComponent extends React.Component<IFooterComponent, {}> { } } -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated interface IFooterComponent extends React.Props<FooterComponent> { buttonProps: IButtonProps[]; attachProps: IIconProps; diff --git a/packages/react-examples/src/react-experiments/CollapsibleSection/CollapsibleSection.Styled.Example.tsx b/packages/react-examples/src/react-experiments/CollapsibleSection/CollapsibleSection.Styled.Example.tsx index 3dceaeca9974ff..eb0edca0abe397 100644 --- a/packages/react-examples/src/react-experiments/CollapsibleSection/CollapsibleSection.Styled.Example.tsx +++ b/packages/react-examples/src/react-experiments/CollapsibleSection/CollapsibleSection.Styled.Example.tsx @@ -12,7 +12,7 @@ import { } from '@fluentui/react-experiments/lib/CollapsibleSection'; // Workaround to prevent errors on usage of Customizer in this file, without disabling all deprecation checks -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated const Customizer = DeprecatedCustomizer; const getPropStyles: ICollapsibleSectionComponent['styles'] = (props, theme): ICollapsibleSectionStylesReturnType => ({ diff --git a/packages/react-examples/src/react-experiments/FloatingPeopleSuggestions/FloatingPeopleSuggestions.HeaderFooter.Example.tsx b/packages/react-examples/src/react-experiments/FloatingPeopleSuggestions/FloatingPeopleSuggestions.HeaderFooter.Example.tsx index 6706413884d65d..c0d5348f6b14e8 100644 --- a/packages/react-examples/src/react-experiments/FloatingPeopleSuggestions/FloatingPeopleSuggestions.HeaderFooter.Example.tsx +++ b/packages/react-examples/src/react-experiments/FloatingPeopleSuggestions/FloatingPeopleSuggestions.HeaderFooter.Example.tsx @@ -186,7 +186,7 @@ export const FloatingPeopleSuggestionsHeaderFooterExample = (): JSX.Element => { }; const _onInputKeyDown = (ev: React.KeyboardEvent<Autofill | HTMLElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const keyCode = ev.which; switch (keyCode) { case KeyCodes.enter: diff --git a/packages/react-examples/src/react-experiments/Slider/Slider.Example.tsx b/packages/react-examples/src/react-experiments/Slider/Slider.Example.tsx index c21925e3cd828f..34a0dbd5649078 100644 --- a/packages/react-examples/src/react-experiments/Slider/Slider.Example.tsx +++ b/packages/react-examples/src/react-experiments/Slider/Slider.Example.tsx @@ -3,7 +3,7 @@ import { Slider as DeprecatedSlider } from '@fluentui/react-experiments'; import { IStackTokens, Stack } from '@fluentui/react'; // Workaround to prevent errors on usage of Slider, without disabling all deprecation checks -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated const Slider = DeprecatedSlider; export interface ISliderBasicExampleState { diff --git a/packages/react-examples/src/react-experiments/Slider/Slider.Vertical.Example.tsx b/packages/react-examples/src/react-experiments/Slider/Slider.Vertical.Example.tsx index 0bad5853589d4d..55b8ad528e4536 100644 --- a/packages/react-examples/src/react-experiments/Slider/Slider.Vertical.Example.tsx +++ b/packages/react-examples/src/react-experiments/Slider/Slider.Vertical.Example.tsx @@ -3,7 +3,7 @@ import { Slider as DeprecatedSlider } from '@fluentui/react-experiments'; import { IStackTokens, Stack } from '@fluentui/react/lib/Stack'; // Workaround to prevent errors on usage of Slider, without disabling all deprecation checks -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated const Slider = DeprecatedSlider; export interface ISliderVerticalExampleState { diff --git a/packages/react-examples/src/react-experiments/Theming/Theming.Schemes.Custom.Example.tsx b/packages/react-examples/src/react-experiments/Theming/Theming.Schemes.Custom.Example.tsx index 841b24ed2754e1..20fc4b40d5b335 100644 --- a/packages/react-examples/src/react-experiments/Theming/Theming.Schemes.Custom.Example.tsx +++ b/packages/react-examples/src/react-experiments/Theming/Theming.Schemes.Custom.Example.tsx @@ -26,7 +26,7 @@ import { CollapsibleSectionRecursiveExample } from '@fluentui/react-examples/lib import { ThemeProvider as DeprecatedThemeProvider } from '@fluentui/foundation-legacy'; // Workaround to prevent errors on usage of ThemeProvider, without disabling all deprecation checks -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated const ThemeProvider = DeprecatedThemeProvider; const regionStyles: IStackComponent['styles'] = (props, theme): IStackStylesReturnType => ({ @@ -186,7 +186,7 @@ export class ThemingSchemesCustomExample extends React.Component<{}, IThemingExa }; public render(): JSX.Element { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return <Customizer settings={{ theme: schemeThemeCustom }}>{this._renderSchemedComponents()}</Customizer>; } @@ -270,7 +270,7 @@ export class ThemingSchemesCustomExample extends React.Component<{}, IThemingExa }; } -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated const onCommandClick = (ev: any, item?: ICommandBarItemProps) => console.log(item && (item.text || item.name)); const items: ICommandBarItemProps[] = [ { diff --git a/packages/react-examples/src/react-experiments/Theming/Theming.Schemes.Variant.Example.tsx b/packages/react-examples/src/react-experiments/Theming/Theming.Schemes.Variant.Example.tsx index bb9dff394be382..10b3cd60487376 100644 --- a/packages/react-examples/src/react-experiments/Theming/Theming.Schemes.Variant.Example.tsx +++ b/packages/react-examples/src/react-experiments/Theming/Theming.Schemes.Variant.Example.tsx @@ -25,7 +25,7 @@ import { CollapsibleSectionRecursiveExample } from '@fluentui/react-examples/lib import { ThemeProvider as DeprecatedThemeProvider } from '@fluentui/foundation-legacy'; // Workaround to prevent errors on usage of ThemeProvider, without disabling all deprecation checks -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated const ThemeProvider = DeprecatedThemeProvider; const regionStyles: IStackComponent['styles'] = (props, theme): IStackStylesReturnType => ({ @@ -65,7 +65,7 @@ export class ThemingSchemesVariantExample extends React.Component<{}, IThemingEx }; public render(): JSX.Element { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return <Customizer settings={{ theme: schemeThemeVariants }}>{this._renderSchemedComponents()}</Customizer>; } @@ -149,7 +149,7 @@ export class ThemingSchemesVariantExample extends React.Component<{}, IThemingEx }; } -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated const onCommandClick = (ev: any, item?: ICommandBarItemProps) => console.log(item && (item.text || item.name)); const items: ICommandBarItemProps[] = [ { diff --git a/packages/react-examples/src/react-experiments/UnifiedPeoplePicker/UnifiedPeoplePicker.WithEdit.Example.tsx b/packages/react-examples/src/react-experiments/UnifiedPeoplePicker/UnifiedPeoplePicker.WithEdit.Example.tsx index c7222cbccc2ab8..ac6d30760a83b2 100644 --- a/packages/react-examples/src/react-experiments/UnifiedPeoplePicker/UnifiedPeoplePicker.WithEdit.Example.tsx +++ b/packages/react-examples/src/react-experiments/UnifiedPeoplePicker/UnifiedPeoplePicker.WithEdit.Example.tsx @@ -339,7 +339,7 @@ export const UnifiedPeoplePickerWithEditExample = (): JSX.Element => { const _onKeyDown = React.useCallback( (ev: React.KeyboardEvent<HTMLDivElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.ctrlKey && ev.which === KeyCodes.k) { ev.preventDefault(); // If the input has text, resolve that diff --git a/packages/react-examples/src/react-focus/FocusZone/FocusZone.List.Example.tsx b/packages/react-examples/src/react-focus/FocusZone/FocusZone.List.Example.tsx index 9db97e849c0e36..c427bac6bb8fcb 100644 --- a/packages/react-examples/src/react-focus/FocusZone/FocusZone.List.Example.tsx +++ b/packages/react-examples/src/react-focus/FocusZone/FocusZone.List.Example.tsx @@ -75,6 +75,6 @@ export const FocusZoneListExample: React.FunctionComponent = () => { }; function _shouldEnterInnerZone(ev: React.KeyboardEvent<HTMLElement>): boolean { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return ev.which === getRTLSafeKeyCode(KeyCodes.right); } diff --git a/packages/react-examples/src/react/Layer/Layer.Customized.Example.tsx b/packages/react-examples/src/react/Layer/Layer.Customized.Example.tsx index bb5bbf2982854b..2d45414d553559 100644 --- a/packages/react-examples/src/react/Layer/Layer.Customized.Example.tsx +++ b/packages/react-examples/src/react/Layer/Layer.Customized.Example.tsx @@ -25,7 +25,7 @@ export const LayerCustomizedExample: React.FunctionComponent = () => { </p> <Toggle label="Show panel" inlineLabel checked={isPanelOpen} onChange={isPanelOpen ? dismissPanel : showPanel} /> <Toggle label="Trap panel" inlineLabel checked={trapPanel} onChange={toggleTrapPanel} /> - {/* eslint-disable-next-line deprecation/deprecation */} + {/* eslint-disable-next-line @typescript-eslint/no-deprecated */} <Customizer scopedSettings={scopedSettings}> {isPanelOpen && ( <Panel diff --git a/packages/react-examples/src/react/Modal/Modal.Basic.Example.tsx b/packages/react-examples/src/react/Modal/Modal.Basic.Example.tsx index 39987fa4b2a44d..1a50f77aede05a 100644 --- a/packages/react-examples/src/react/Modal/Modal.Basic.Example.tsx +++ b/packages/react-examples/src/react/Modal/Modal.Basic.Example.tsx @@ -124,7 +124,7 @@ const contentStyles = mergeStyleSets({ alignItems: 'stretch', }, header: [ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated theme.fonts.xLargePlus, { flex: '1 1 auto', diff --git a/packages/react-examples/src/react/Modal/Modal.Modeless.Example.tsx b/packages/react-examples/src/react/Modal/Modal.Modeless.Example.tsx index 81063cc7214eb3..503d3d1f23bef6 100644 --- a/packages/react-examples/src/react/Modal/Modal.Modeless.Example.tsx +++ b/packages/react-examples/src/react/Modal/Modal.Modeless.Example.tsx @@ -84,7 +84,7 @@ const contentStyles = mergeStyleSets({ alignItems: 'stretch', }, header: [ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated theme.fonts.xLargePlus, { flex: '1 1 auto', diff --git a/packages/react-examples/src/react/Panel/Panel.HandleDismissTarget.Example.tsx b/packages/react-examples/src/react/Panel/Panel.HandleDismissTarget.Example.tsx index c831c39c66c85e..caffe1aa46267d 100644 --- a/packages/react-examples/src/react/Panel/Panel.HandleDismissTarget.Example.tsx +++ b/packages/react-examples/src/react/Panel/Panel.HandleDismissTarget.Example.tsx @@ -19,7 +19,7 @@ export const PanelHandleDismissTargetExample: React.FunctionComponent = () => { // Demonstrates how to do different things depending on how which element dismissed the panel console.log('Close button clicked or light dismissed.'); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const srcElement = ev.nativeEvent.srcElement as Element | null; if (srcElement && srcElement.className.indexOf('ms-Button-icon') !== -1) { console.log('Close button clicked.'); diff --git a/packages/react-examples/src/react/PeoplePicker/examples/PeoplePickerExampleData.ts b/packages/react-examples/src/react/PeoplePicker/examples/PeoplePickerExampleData.ts index 26dd8d3a774818..2aaf840c3b4151 100644 --- a/packages/react-examples/src/react/PeoplePicker/examples/PeoplePickerExampleData.ts +++ b/packages/react-examples/src/react/PeoplePicker/examples/PeoplePickerExampleData.ts @@ -1,7 +1,7 @@ import { IPersonaProps, PersonaPresence } from '@fluentui/react/lib/Persona'; import { TestImages } from '@fluentui/example-data'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ /** @deprecated Use the version from `@fluentui/example-data` instead. */ export const people: (IPersonaProps & { key: string | number })[] = [ diff --git a/packages/react-examples/src/react/Pivot/Pivot.OverflowMenu.Example.tsx b/packages/react-examples/src/react/Pivot/Pivot.OverflowMenu.Example.tsx index a770f91e5c8001..006b89f2bd3e7e 100644 --- a/packages/react-examples/src/react/Pivot/Pivot.OverflowMenu.Example.tsx +++ b/packages/react-examples/src/react/Pivot/Pivot.OverflowMenu.Example.tsx @@ -14,7 +14,7 @@ export const PivotOverflowMenuExample: React.FunctionComponent = () => { <Toggle label="linkFormat" offText="links" onText="tabs" checked={tabs} onChange={toggleTabs} /> <Toggle label="direction" offText="ltr" onText="rtl" checked={rtl} onChange={toggleRtl} /> </div> - {/* eslint-disable-next-line deprecation/deprecation */} + {/* eslint-disable-next-line @typescript-eslint/no-deprecated */} <Fabric dir={rtl ? 'rtl' : 'ltr'}> <Pivot aria-label="Pivot Overflow Menu Example" diff --git a/packages/react-examples/src/react/ThemeGenerator/ThemeGenerator.doc.tsx b/packages/react-examples/src/react/ThemeGenerator/ThemeGenerator.doc.tsx index 62102345cddb76..dbe8101b6923c7 100644 --- a/packages/react-examples/src/react/ThemeGenerator/ThemeGenerator.doc.tsx +++ b/packages/react-examples/src/react/ThemeGenerator/ThemeGenerator.doc.tsx @@ -289,7 +289,7 @@ export class ThemeGeneratorPage extends React.Component<{}, IThemeGeneratorPageS const contrastRatio = getContrastRatio(bgc, fgc); let contrastRatioString = String(contrastRatio); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated contrastRatioString = contrastRatioString.substr(0, contrastRatioString.indexOf('.') + 3); if (contrastRatio < 4.5) { contrastRatioString = '**' + contrastRatioString + '**'; diff --git a/packages/react-experiments/src/Foundation.ts b/packages/react-experiments/src/Foundation.ts index dfe2afe37e74a7..9bf082389c5d77 100644 --- a/packages/react-experiments/src/Foundation.ts +++ b/packages/react-experiments/src/Foundation.ts @@ -1,5 +1,5 @@ export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ThemeProvider, createComponent, createFactory, @@ -22,7 +22,7 @@ export type { IHTMLElementSlot, IHTMLSlot, IProcessedSlotProps, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated IPropsWithChildren, ISlot, ISlotCreator, diff --git a/packages/react-experiments/src/Styling.ts b/packages/react-experiments/src/Styling.ts index 31e6ed2005a051..563a5a90452e3b 100644 --- a/packages/react-experiments/src/Styling.ts +++ b/packages/react-experiments/src/Styling.ts @@ -6,7 +6,7 @@ export { DefaultEffects, DefaultFontStyles, DefaultPalette, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated EdgeChromiumHighContrastSelector, FontClassNames, FontSizes, @@ -39,11 +39,11 @@ export { createTheme, focusClear, fontFace, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getEdgeChromiumNoHighContrastAdjustSelector, getFadedOverflowStyle, getFocusOutlineStyle, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getFocusStyle, getGlobalClassNames, getHighContrastNoAdjustStyle, diff --git a/packages/react-experiments/src/Utilities.ts b/packages/react-experiments/src/Utilities.ts index 0850eaa19b0634..82dae884afcb13 100644 --- a/packages/react-experiments/src/Utilities.ts +++ b/packages/react-experiments/src/Utilities.ts @@ -1,10 +1,8 @@ export { Async, AutoScroll, - // eslint-disable-next-line deprecation/deprecation BaseComponent, Customizations, - // eslint-disable-next-line deprecation/deprecation Customizer, CustomizerContext, DATA_IS_SCROLLABLE_ATTRIBUTE, @@ -87,7 +85,6 @@ export { getRTL, getRTLSafeKeyCode, getRect, - // eslint-disable-next-line deprecation/deprecation getResourceUrl, getScrollbarWidth, getVirtualParent, @@ -99,11 +96,9 @@ export { hoistStatics, htmlElementProperties, iframeProperties, - // eslint-disable-next-line deprecation/deprecation imageProperties, imgProperties, initializeComponentRef, - // eslint-disable-next-line deprecation/deprecation initializeFocusRects, inputProperties, isControlled, @@ -135,7 +130,6 @@ export { optionProperties, portalContainsElement, precisionRound, - // eslint-disable-next-line deprecation/deprecation raiseClick, removeIndex, replaceElement, @@ -145,15 +139,12 @@ export { safeRequestAnimationFrame, safeSetTimeout, selectProperties, - // eslint-disable-next-line deprecation/deprecation setBaseUrl, setFocusVisibility, - // eslint-disable-next-line deprecation/deprecation setLanguage, setMemoizeWeakMap, setPortalAttribute, setRTL, - // eslint-disable-next-line deprecation/deprecation setSSR, setVirtualParent, setWarningCallback, @@ -184,7 +175,6 @@ export type { ICancelable, IChangeDescription, IChangeEventCallback, - // eslint-disable-next-line deprecation/deprecation IClassNames, IClassNamesFunctionOptions, IComponentAs, @@ -207,7 +197,6 @@ export type { IPerfData, IPerfMeasurement, IPerfSummary, - // eslint-disable-next-line deprecation/deprecation IPoint, IPropsWithStyles, IRectangle, @@ -226,13 +215,10 @@ export type { IStyleFunctionOrObject, IVirtualElement, IWarnControlledUsageParams, - // eslint-disable-next-line deprecation/deprecation Omit, Point, RefObject, - // eslint-disable-next-line deprecation/deprecation Settings, - // eslint-disable-next-line deprecation/deprecation SettingsFunction, StyleFunction, } from '@fluentui/react/lib/Utilities'; diff --git a/packages/react-experiments/src/components/BAFAccordion/Accordion.tsx b/packages/react-experiments/src/components/BAFAccordion/Accordion.tsx index 5b06a20205cf0b..e5255d8906397f 100644 --- a/packages/react-experiments/src/components/BAFAccordion/Accordion.tsx +++ b/packages/react-experiments/src/components/BAFAccordion/Accordion.tsx @@ -33,7 +33,7 @@ export class Accordion extends React.Component<IAccordionProps, IAccordionState> } public render(): JSX.Element { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { onRenderMenu, className, buttonAs, onClick, ...other } = this.props; let { menuIconProps } = this.props; diff --git a/packages/react-experiments/src/components/CollapsibleSection/CollapsibleSection.state.tsx b/packages/react-experiments/src/components/CollapsibleSection/CollapsibleSection.state.tsx index f15391003754a6..2bf28ff5450275 100644 --- a/packages/react-experiments/src/components/CollapsibleSection/CollapsibleSection.state.tsx +++ b/packages/react-experiments/src/components/CollapsibleSection/CollapsibleSection.state.tsx @@ -37,12 +37,12 @@ export const useCollapsibleSectionState: ICollapsibleSectionComponent['state'] = const collapseKey = getRTL() ? KeyCodes.right : KeyCodes.left; const expandKey = getRTL() ? KeyCodes.left : KeyCodes.right; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === collapseKey && !collapsed) { setCollapsed(true); ev.preventDefault(); ev.stopPropagation(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } else if (ev.which === expandKey && collapsed) { setCollapsed(false); ev.preventDefault(); @@ -58,7 +58,7 @@ export const useCollapsibleSectionState: ICollapsibleSectionComponent['state'] = // If left/right keypress originates from text input or text area inside collapsible section, // ignore the event. if ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.which === rootKey && ev.target !== titleElementRef.current && titleElementRef.current && diff --git a/packages/react-experiments/src/components/FloatingSuggestions/FloatingSuggestions.tsx b/packages/react-experiments/src/components/FloatingSuggestions/FloatingSuggestions.tsx index 2f9ff8c273ef55..da5d15c9d3a223 100644 --- a/packages/react-experiments/src/components/FloatingSuggestions/FloatingSuggestions.tsx +++ b/packages/react-experiments/src/components/FloatingSuggestions/FloatingSuggestions.tsx @@ -250,7 +250,7 @@ export class FloatingSuggestions<TItem extends {}> ) { return; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const keyCode = ev.which; switch (keyCode) { case KeyCodes.escape: diff --git a/packages/react-experiments/src/components/FolderCover/FolderCover.types.ts b/packages/react-experiments/src/components/FolderCover/FolderCover.types.ts index a93109a9ccf976..15272a3f247347 100644 --- a/packages/react-experiments/src/components/FolderCover/FolderCover.types.ts +++ b/packages/react-experiments/src/components/FolderCover/FolderCover.types.ts @@ -38,6 +38,6 @@ export interface IFolderCoverProps extends IBaseProps, React.HTMLAttributes<HTML /** * The children to pass into the content area of the folder cover. */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated children?: React.Props<{}>['children'] | ((childrenProps: IFolderCoverChildrenProps) => JSX.Element | null); } diff --git a/packages/react-experiments/src/components/SelectedItemsList/Items/CopyableItem.tsx b/packages/react-experiments/src/components/SelectedItemsList/Items/CopyableItem.tsx index 8b5f20ec850154..119fedcd7636e9 100644 --- a/packages/react-experiments/src/components/SelectedItemsList/Items/CopyableItem.tsx +++ b/packages/react-experiments/src/components/SelectedItemsList/Items/CopyableItem.tsx @@ -26,7 +26,7 @@ export const CopyableItem = <T extends any>( // Try to copy the text directly to the clipboard copyInput.value = copyText; copyInput.select(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (!document.execCommand('copy')) { // The command failed. Fallback to the method below. throw new Error(); diff --git a/packages/react-experiments/src/components/SelectedItemsList/Items/subcomponents/DefaultEditingItem.tsx b/packages/react-experiments/src/components/SelectedItemsList/Items/subcomponents/DefaultEditingItem.tsx index d63f095f6f7084..664dee16f9b0e2 100644 --- a/packages/react-experiments/src/components/SelectedItemsList/Items/subcomponents/DefaultEditingItem.tsx +++ b/packages/react-experiments/src/components/SelectedItemsList/Items/subcomponents/DefaultEditingItem.tsx @@ -195,7 +195,7 @@ export const DefaultEditingItemInner = <TItem extends any>( const _onInputKeyDown = React.useCallback( (ev: React.KeyboardEvent<HTMLInputElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const keyCode = ev.which; switch (keyCode) { case KeyCodes.backspace: diff --git a/packages/react-experiments/src/components/Sidebar/Sidebar.tsx b/packages/react-experiments/src/components/Sidebar/Sidebar.tsx index 8fc07723bb21bf..73cf681c0e082c 100644 --- a/packages/react-experiments/src/components/Sidebar/Sidebar.tsx +++ b/packages/react-experiments/src/components/Sidebar/Sidebar.tsx @@ -154,7 +154,7 @@ export class Sidebar extends React.Component<ISidebarProps, ISidebarState> imple } const ButtonAs = this._getButtonAs(item); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const name = item.text || item.name; return ( @@ -204,7 +204,7 @@ export class Sidebar extends React.Component<ISidebarProps, ISidebarState> imple } const ButtonAs = this._getButtonAs(item); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const name = item.text || item.name; return ( @@ -268,7 +268,7 @@ export class Sidebar extends React.Component<ISidebarProps, ISidebarState> imple return child; }); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const name = item.text || item.name; if (name) { diff --git a/packages/react-experiments/src/components/Slider/Slider.base.tsx b/packages/react-experiments/src/components/Slider/Slider.base.tsx index 6da62030cbce49..d2b0ecf25ffbee 100644 --- a/packages/react-experiments/src/components/Slider/Slider.base.tsx +++ b/packages/react-experiments/src/components/Slider/Slider.base.tsx @@ -15,7 +15,7 @@ import { DirectionalHint } from '@fluentui/react/lib/Callout'; import { Async, EventGroup, FocusRects } from '@fluentui/utilities'; import type { ISliderProps, ISlider, ISliderStyleProps, ISliderStyles, ISliderMarks } from './Slider.types'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ /** @deprecated */ export interface ISliderState { diff --git a/packages/react-experiments/src/components/Slider/Slider.styles.tsx b/packages/react-experiments/src/components/Slider/Slider.styles.tsx index ce9ba0f30375a6..aaa839bebfa53e 100644 --- a/packages/react-experiments/src/components/Slider/Slider.styles.tsx +++ b/packages/react-experiments/src/components/Slider/Slider.styles.tsx @@ -3,7 +3,7 @@ import { getRTL } from '@fluentui/utilities'; import type { ISliderStyleProps, ISliderStyles } from './Slider.types'; import type { IRawStyle } from '../../Styling'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ const tickLabelSpacing = 13; diff --git a/packages/react-experiments/src/components/Slider/Slider.test.tsx b/packages/react-experiments/src/components/Slider/Slider.test.tsx index 8a19df4636b969..3b545995fcc0f1 100644 --- a/packages/react-experiments/src/components/Slider/Slider.test.tsx +++ b/packages/react-experiments/src/components/Slider/Slider.test.tsx @@ -9,7 +9,7 @@ import { ONKEYDOWN_TIMEOUT_DURATION } from './Slider.base'; import { KeyCodes } from '../../Utilities'; import type { ISlider } from './Slider.types'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ describe('Slider', () => { it('renders correctly', () => { diff --git a/packages/react-experiments/src/components/Slider/Slider.tsx b/packages/react-experiments/src/components/Slider/Slider.tsx index a4294f8fc02bfc..9742c6b25fa0c5 100644 --- a/packages/react-experiments/src/components/Slider/Slider.tsx +++ b/packages/react-experiments/src/components/Slider/Slider.tsx @@ -4,7 +4,7 @@ import { SliderBase } from './Slider.base'; import { getStyles } from './Slider.styles'; import type { ISliderProps, ISliderStyleProps, ISliderStyles } from './Slider.types'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ /** * @deprecated This component was experimental and is not longer being developed on, nor will it be supported in the diff --git a/packages/react-experiments/src/components/Slider/Slider.types.ts b/packages/react-experiments/src/components/Slider/Slider.types.ts index 01d2cdbd705902..483058e5becf3d 100644 --- a/packages/react-experiments/src/components/Slider/Slider.types.ts +++ b/packages/react-experiments/src/components/Slider/Slider.types.ts @@ -3,7 +3,7 @@ import { SliderBase } from './Slider.base'; import type { IStyle, ITheme } from '../../Styling'; import type { IStyleFunctionOrObject, IRefObject } from '../../Utilities'; -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ /** * @deprecated diff --git a/packages/react-experiments/src/components/TilesList/TilesList.types.ts b/packages/react-experiments/src/components/TilesList/TilesList.types.ts index 3d34844e09c8ff..0e51d4bcd60745 100644 --- a/packages/react-experiments/src/components/TilesList/TilesList.types.ts +++ b/packages/react-experiments/src/components/TilesList/TilesList.types.ts @@ -135,7 +135,7 @@ export interface ITilesGridSegment<TItem> { export interface ITilesListProps<TItem> extends IBaseProps, - React.Props<TilesList<TItem>>, // eslint-disable-line deprecation/deprecation + React.Props<TilesList<TItem>>, // eslint-disable-line @typescript-eslint/no-deprecated React.HTMLAttributes<HTMLDivElement> { /** * An array of items to assign to the list. diff --git a/packages/react-experiments/src/components/UnifiedPicker/UnifiedPicker.tsx b/packages/react-experiments/src/components/UnifiedPicker/UnifiedPicker.tsx index 383ffa43be53cd..3f844b461e1903 100644 --- a/packages/react-experiments/src/components/UnifiedPicker/UnifiedPicker.tsx +++ b/packages/react-experiments/src/components/UnifiedPicker/UnifiedPicker.tsx @@ -332,19 +332,19 @@ export const UnifiedPicker = <T extends {}>(props: IUnifiedPickerProps<T>): JSX. // Allow the caller to handle the key down onKeyDown?.(ev); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.ctrlKey && ev.which === KeyCodes.a) { selectAll(); } // This is a temporary work around, it has localization issues // we plan on rewriting how this works in the future - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ const isDel = ev.which === KeyCodes.del; const isCut = (ev.shiftKey && isDel) || (ev.ctrlKey && ev.which === KeyCodes.x); const isBackspace = ev.which === KeyCodes.backspace; const isCopy = ev.ctrlKey && ev.which === KeyCodes.c; - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ const needToCopy = isCut || isCopy; const needToDelete = (isBackspace && selectedItems.length > 0) || ((isCut || isDel) && focusedItemIndices.length > 0); @@ -421,7 +421,7 @@ export const UnifiedPicker = <T extends {}>(props: IUnifiedPickerProps<T>): JSX. const _onInputKeyDown = React.useCallback( (ev: React.KeyboardEvent<Autofill | HTMLElement>) => { if (isSuggestionsShown) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const keyCode = ev.which; switch (keyCode) { case KeyCodes.escape: diff --git a/packages/react-focus/src/components/FocusZone/FocusZone.tsx b/packages/react-focus/src/components/FocusZone/FocusZone.tsx index de7e797019cab6..7d83edd178e8d9 100644 --- a/packages/react-focus/src/components/FocusZone/FocusZone.tsx +++ b/packages/react-focus/src/components/FocusZone/FocusZone.tsx @@ -62,7 +62,7 @@ function raiseClickFromKeyboardEvent(target: Element, ev?: React.KeyboardEvent<H } else { // eslint-disable-next-line no-restricted-globals event = document.createEvent('MouseEvents'); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated event.initMouseEvent( 'click', ev ? ev.bubbles : false, @@ -172,7 +172,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu * for ref counting to work correctly! */ private static _onKeyDownCapture(ev: KeyboardEvent): void { - // eslint-disable-next-line deprecation/deprecation, @fluentui/deprecated-keyboard-event-props + // eslint-disable-next-line @typescript-eslint/no-deprecated, @fluentui/deprecated-keyboard-event-props if (ev.which === KeyCodes.tab) { _outerZones.forEach((zone: FocusZone) => zone._updateTabIndexes()); } @@ -238,9 +238,9 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu if (this.props.defaultTabbableElement && typeof this.props.defaultTabbableElement === 'string') { this._activeElement = this._getDocument().querySelector(this.props.defaultTabbableElement) as HTMLElement; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } else if (this.props.defaultActiveElement) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated this._activeElement = this._getDocument().querySelector(this.props.defaultActiveElement) as HTMLElement; } @@ -306,7 +306,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu } public render(): React.ReactNode { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { as: tag, elementType, rootProps, ariaDescribedBy, ariaLabelledBy, className } = this.props; const divProps = getNativeProps(this.props, htmlElementProperties); @@ -338,7 +338,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu // be replaced so that className is passed to getRootClass and is included there so // the class names will always be in the same order. className={css(getRootClass(), className)} - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ref={this._mergedRef(this.props.elementRef, this._root)} data-focuszone-id={this._id} // eslint-disable-next-line react/jsx-no-bind @@ -427,7 +427,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu * @returns True if focus could be set to an active element, false if no operation was taken. */ public focusElement(element: HTMLElement, forceAlignment?: boolean): boolean { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { onBeforeFocus, shouldReceiveFocus } = this.props; if ((shouldReceiveFocus && !shouldReceiveFocus(element)) || (onBeforeFocus && !onBeforeFocus(element))) { @@ -487,10 +487,10 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu const { onActiveElementChanged, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated doNotAllowFocusEventToPropagate, stopFocusPropagation, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onFocusNotification, onFocus, shouldFocusInnerElementWhenReceivedFocus, @@ -671,7 +671,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu return; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { direction, disabled, isInnerZoneKeystroke, pagingSupportDisabled, shouldEnterInnerZone } = this.props; if (disabled) { @@ -722,7 +722,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu } else if (ev.altKey) { return; } else { - // eslint-disable-next-line @fluentui/deprecated-keyboard-event-props, deprecation/deprecation + // eslint-disable-next-line @fluentui/deprecated-keyboard-event-props, @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.space: if (this._shouldRaiseClicksOnSpace && this._tryInvokeClickForFocusable(ev.target as HTMLElement, ev)) { @@ -778,7 +778,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu case KeyCodes.tab: if ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated this.props.allowTabKey || this.props.handleTabKey === FocusZoneTabbableElements.all || (this.props.handleTabKey === FocusZoneTabbableElements.inputOnly && @@ -924,7 +924,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu private _moveFocus( isForward: boolean, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getDistanceFromCenter: (activeRect: ClientRect, targetRect: ClientRect) => number, ev?: Event, useDefaultWrap: boolean = true, @@ -955,7 +955,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu if (isBidirectional) { if (element) { const targetRect = element.getBoundingClientRect(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const elementDistance = getDistanceFromCenter(activeRect as ClientRect, targetRect); if (elementDistance === -1 && candidateDistance === -1) { @@ -1005,11 +1005,11 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu private _moveFocusDown(): boolean { let targetTop = -1; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0; if ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated this._moveFocus(true, (activeRect: ClientRect, targetRect: ClientRect) => { let distance = -1; // ClientRect values can be floats that differ by very small fractions of a decimal. @@ -1048,11 +1048,11 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu private _moveFocusUp(): boolean { let targetTop = -1; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0; if ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated this._moveFocus(false, (activeRect: ClientRect, targetRect: ClientRect) => { let distance = -1; // ClientRect values can be floats that differ by very small fractions of a decimal. @@ -1094,7 +1094,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu if ( this._moveFocus( getRTL(theme), - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (activeRect: ClientRect, targetRect: ClientRect) => { let distance = -1; let topBottomComparison; @@ -1137,7 +1137,7 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu if ( this._moveFocus( !getRTL(theme), - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (activeRect: ClientRect, targetRect: ClientRect) => { let distance = -1; let topBottomComparison; @@ -1177,12 +1177,12 @@ export class FocusZone extends React.Component<IFocusZoneProps> implements IFocu private _getHorizontalDistanceFromCenter = ( isForward: boolean, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated activeRect: ClientRect, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated targetRect: ClientRect, ): number => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const leftAlignment = this._focusAlignment.left || this._focusAlignment.x || 0; // ClientRect values can be floats that differ by very small fractions of a decimal. // If the difference between top and bottom are within a pixel then we should treat diff --git a/packages/react-hooks/src/useConstCallback.test.tsx b/packages/react-hooks/src/useConstCallback.test.tsx index 0e7df950273550..aea43bcac40b3e 100644 --- a/packages/react-hooks/src/useConstCallback.test.tsx +++ b/packages/react-hooks/src/useConstCallback.test.tsx @@ -1,4 +1,4 @@ -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ import * as React from 'react'; import { mount } from 'enzyme'; import { useConstCallback } from './useConstCallback'; diff --git a/packages/react-hooks/src/useMountSync.test.tsx b/packages/react-hooks/src/useMountSync.test.tsx index 8cd46d1b4cff90..08722c994e177a 100644 --- a/packages/react-hooks/src/useMountSync.test.tsx +++ b/packages/react-hooks/src/useMountSync.test.tsx @@ -7,7 +7,7 @@ describe('useMountSync', () => { const onMount = jest.fn(); const TestComponent: React.FunctionComponent = () => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated useMountSync(() => { onMount(); }); diff --git a/packages/react-monaco-editor/src/utilities/getQueryParam.ts b/packages/react-monaco-editor/src/utilities/getQueryParam.ts index 028858691935f5..0837e5ef2833ed 100644 --- a/packages/react-monaco-editor/src/utilities/getQueryParam.ts +++ b/packages/react-monaco-editor/src/utilities/getQueryParam.ts @@ -10,7 +10,7 @@ export function getQueryParam(name: string, url?: string): string | null { url = url || (win ? win.location.href : ''); // Manually get the query string in case it's after the hash (possible with hash routing) const queryIndex = url.indexOf('?'); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const query = queryIndex !== -1 ? url.substr(queryIndex) : ''; const regex = new RegExp(`[?&]${name}(=([^&#]*)|&|#|$)`); diff --git a/packages/react/src/Icons.ts b/packages/react/src/Icons.ts index 599092ba2b673d..03d3957842437a 100644 --- a/packages/react/src/Icons.ts +++ b/packages/react/src/Icons.ts @@ -1,6 +1,3 @@ export { initializeIcons } from '@fluentui/font-icons-mdl2'; -export type { - // eslint-disable-next-line deprecation/deprecation - IconNames, -} from '@fluentui/font-icons-mdl2'; +export type { IconNames } from '@fluentui/font-icons-mdl2'; diff --git a/packages/react/src/Styling.ts b/packages/react/src/Styling.ts index 4dd00c1d37dee2..70fd768411455e 100644 --- a/packages/react/src/Styling.ts +++ b/packages/react/src/Styling.ts @@ -7,7 +7,6 @@ export { DefaultEffects, DefaultFontStyles, DefaultPalette, - // eslint-disable-next-line deprecation/deprecation EdgeChromiumHighContrastSelector, FontClassNames, FontSizes, @@ -39,11 +38,9 @@ export { createFontStyles, focusClear, fontFace, - // eslint-disable-next-line deprecation/deprecation getEdgeChromiumNoHighContrastAdjustSelector, getFadedOverflowStyle, getFocusOutlineStyle, - // eslint-disable-next-line deprecation/deprecation getFocusStyle, getGlobalClassNames, getHighContrastNoAdjustStyle, diff --git a/packages/react/src/Utilities.ts b/packages/react/src/Utilities.ts index b01024409bbe23..d7dd63e523e347 100644 --- a/packages/react/src/Utilities.ts +++ b/packages/react/src/Utilities.ts @@ -2,10 +2,8 @@ import './version'; export { Async, AutoScroll, - // eslint-disable-next-line deprecation/deprecation BaseComponent, Customizations, - // eslint-disable-next-line deprecation/deprecation Customizer, CustomizerContext, DATA_IS_SCROLLABLE_ATTRIBUTE, @@ -92,7 +90,6 @@ export { getRTL, getRTLSafeKeyCode, getRect, - // eslint-disable-next-line deprecation/deprecation getResourceUrl, getScrollbarWidth, getVirtualParent, @@ -104,11 +101,9 @@ export { hoistStatics, htmlElementProperties, iframeProperties, - // eslint-disable-next-line deprecation/deprecation imageProperties, imgProperties, initializeComponentRef, - // eslint-disable-next-line deprecation/deprecation initializeFocusRects, inputProperties, isControlled, @@ -142,7 +137,6 @@ export { optionProperties, portalContainsElement, precisionRound, - // eslint-disable-next-line deprecation/deprecation raiseClick, removeDirectionalKeyCode, removeIndex, @@ -153,15 +147,12 @@ export { safeRequestAnimationFrame, safeSetTimeout, selectProperties, - // eslint-disable-next-line deprecation/deprecation setBaseUrl, setFocusVisibility, - // eslint-disable-next-line deprecation/deprecation setLanguage, setMemoizeWeakMap, setPortalAttribute, setRTL, - // eslint-disable-next-line deprecation/deprecation setSSR, setVirtualParent, setWarningCallback, @@ -203,7 +194,6 @@ export type { ICancelable, IChangeDescription, IChangeEventCallback, - // eslint-disable-next-line deprecation/deprecation IClassNames, IClassNamesFunctionOptions, IComponentAs, @@ -227,7 +217,6 @@ export type { IPerfData, IPerfMeasurement, IPerfSummary, - // eslint-disable-next-line deprecation/deprecation IPoint, IPropsWithStyles, IReactProps, @@ -247,13 +236,10 @@ export type { IStyleFunctionOrObject, IVirtualElement, IWarnControlledUsageParams, - // eslint-disable-next-line deprecation/deprecation Omit, Point, RefObject, - // eslint-disable-next-line deprecation/deprecation Settings, - // eslint-disable-next-line deprecation/deprecation SettingsFunction, ShadowConfigHook, StyleFunction, diff --git a/packages/react/src/components/ActivityItem/ActivityItem.tsx b/packages/react/src/components/ActivityItem/ActivityItem.tsx index be14dc32000938..09bffc407073da 100644 --- a/packages/react/src/components/ActivityItem/ActivityItem.tsx +++ b/packages/react/src/components/ActivityItem/ActivityItem.tsx @@ -57,7 +57,7 @@ export class ActivityItem extends React.Component<IActivityItemProps, {}> { private _onRenderActivityDescription = (props: IActivityItemProps): JSX.Element | null => { const classNames = this._getClassNames(props); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const activityDescription = props.activityDescription || props.activityDescriptionText; if (activityDescription) { @@ -70,7 +70,7 @@ export class ActivityItem extends React.Component<IActivityItemProps, {}> { private _onRenderComments = (props: IActivityItemProps): JSX.Element | null => { const classNames = this._getClassNames(props); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const comments = props.comments || props.commentText; if (!props.isCompact && comments) { @@ -117,7 +117,7 @@ export class ActivityItem extends React.Component<IActivityItemProps, {}> { {...person} key={person.key || index} className={classNames.activityPersona} - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated size={showSize16Personas ? PersonaSize.size16 : PersonaSize.size32} style={style} />, diff --git a/packages/react/src/components/Autofill/Autofill.tsx b/packages/react/src/components/Autofill/Autofill.tsx index 5b5ebb4a3635fd..903d5625301414 100644 --- a/packages/react/src/components/Autofill/Autofill.tsx +++ b/packages/react/src/components/Autofill/Autofill.tsx @@ -40,9 +40,9 @@ export class Autofill extends React.Component<IAutofillProps, IAutofillState> im private _async: Async; public static getDerivedStateFromProps(props: IAutofillProps, state: IAutofillState): IAutofillState | null { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (props.updateValueInWillReceiveProps) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const updatedInputValue = props.updateValueInWillReceiveProps(); // Don't update if we have a null value or the value isn't changing // the value should still update if an empty string is passed in @@ -247,7 +247,7 @@ export class Autofill extends React.Component<IAutofillProps, IAutofillState> im // Right now typing does not have isComposing, once that has been fixed any should be removed. if (!(ev.nativeEvent as any).isComposing) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.backspace: this._autoFillEnabled = false; @@ -263,7 +263,7 @@ export class Autofill extends React.Component<IAutofillProps, IAutofillState> im break; default: if (!this._autoFillEnabled) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (this.props.enableAutofillOnKeyPress!.indexOf(ev.which) !== -1) { this._autoFillEnabled = true; } @@ -339,7 +339,7 @@ export class Autofill extends React.Component<IAutofillProps, IAutofillState> im return; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { onInputChange, onInputValueChange } = this.props; if (onInputChange) { newValue = onInputChange?.(newValue, composing) || ''; diff --git a/packages/react/src/components/Button/BaseButton.tsx b/packages/react/src/components/Button/BaseButton.tsx index 94d0917462d5d7..478609d9822197 100644 --- a/packages/react/src/components/Button/BaseButton.tsx +++ b/packages/react/src/components/Button/BaseButton.tsx @@ -127,7 +127,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta disabled, allowDisabledFocus, primaryDisabled, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated secondaryText = this.props.description, href, iconProps, @@ -181,7 +181,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta const tag = renderAsAnchor ? 'a' : 'button'; const nativeProps = getNativeProps( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated assign(renderAsAnchor ? {} : { type: 'button' }, this.props.rootProps, this.props), renderAsAnchor ? anchorProperties : buttonProperties, [ @@ -230,7 +230,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta const buttonProps = assign(nativeProps, { className: this._classNames.root, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ref: this._mergedRef(this.props.elementRef, this._buttonElement), disabled: isPrimaryButtonDisabled && !allowDisabledFocus, onKeyDown: this._onKeyDown, @@ -320,7 +320,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta onRenderIcon = this._onRenderIcon, onRenderAriaDescription = this._onRenderAriaDescription, onRenderChildren = this._onRenderChildren, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onRenderMenu = this._onRenderMenu, onRenderMenuIcon = this._onRenderMenuIcon, disabled, @@ -385,7 +385,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta */ private _shouldRenderMenu() { const { menuHidden } = this.state; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { persistMenu, renderPersistedMenuHiddenOnMount } = this.props; if (!menuHidden) { @@ -428,7 +428,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta const { text, children, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated secondaryText = this.props.description, onRenderText = this._onRenderText, onRenderDescription = this._onRenderDescription, @@ -486,7 +486,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta }; private _onRenderDescription = (props: IButtonProps) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { secondaryText = this.props.description } = props; // ms-Button-description is only shown when the button type is compound. @@ -741,7 +741,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta private _onKeyDown = (ev: React.KeyboardEvent<HTMLDivElement | HTMLAnchorElement | HTMLButtonElement>) => { // explicity cancelling event so click won't fire after this - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (this.props.disabled && (ev.which === KeyCodes.enter || ev.which === KeyCodes.space)) { ev.preventDefault(); ev.stopPropagation(); @@ -765,9 +765,9 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta private _onKeyPress = ( ev: React.KeyboardEvent<HTMLDivElement | HTMLAnchorElement | HTMLButtonElement | HTMLSpanElement>, ) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (!this.props.disabled && this.props.onKeyPress !== undefined) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated this.props.onKeyPress(ev); // not cancelling event because it's not disabled } }; @@ -801,7 +801,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta }; private _onSplitButtonContainerKeyDown = (ev: React.KeyboardEvent<HTMLDivElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) { if (this._buttonElement.current) { this._buttonElement.current.click(); @@ -822,9 +822,9 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta this.props.onKeyDown(ev); } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const isUp = ev.which === KeyCodes.up; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const isDown = ev.which === KeyCodes.down; if (!ev.defaultPrevented && this._isValidMenuOpenKey(ev)) { @@ -838,7 +838,7 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta ev.stopPropagation(); } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) { // We manually set the focus visibility to true if opening via Enter or Space to account for the scenario where // a user clicks on the button, closes the menu and then opens it via keyboard. In this scenario our default logic @@ -923,10 +923,10 @@ export class BaseButton extends React.Component<IBaseButtonProps, IBaseButtonSta ev: React.KeyboardEvent<HTMLDivElement | HTMLAnchorElement | HTMLButtonElement>, ): boolean { if (this.props.menuTriggerKeyCode) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return ev.which === this.props.menuTriggerKeyCode; } else if (this.props.menuProps) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return ev.which === KeyCodes.down && (ev.altKey || ev.metaKey); } diff --git a/packages/react/src/components/Button/Button.tsx b/packages/react/src/components/Button/Button.tsx index 0d5d40b7e22f46..1116ee9954380a 100644 --- a/packages/react/src/components/Button/Button.tsx +++ b/packages/react/src/components/Button/Button.tsx @@ -27,7 +27,7 @@ export class Button extends React.Component<IButtonProps, {}> { public render(): JSX.Element { const props = this.props; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (props.buttonType) { case ButtonType.command: return <ActionButton {...props} />; diff --git a/packages/react/src/components/Button/Button.types.ts b/packages/react/src/components/Button/Button.types.ts index 99831ea88ca2ac..98c852b824789d 100644 --- a/packages/react/src/components/Button/Button.types.ts +++ b/packages/react/src/components/Button/Button.types.ts @@ -42,12 +42,12 @@ export interface IButton { /** * {@docCategory Button} */ -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ export interface IButtonProps extends React.AllHTMLAttributes< HTMLAnchorElement | HTMLButtonElement | HTMLDivElement | BaseButton | Button | HTMLSpanElement > { - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ /** * Optional callback to access the `IButton` interface. Use this instead of `ref` for accessing * the public methods and properties of the component. diff --git a/packages/react/src/components/Calendar/Calendar.base.tsx b/packages/react/src/components/Calendar/Calendar.base.tsx index 7063088c48fe72..8fbb84984bd1be 100644 --- a/packages/react/src/components/Calendar/Calendar.base.tsx +++ b/packages/react/src/components/Calendar/Calendar.base.tsx @@ -228,7 +228,7 @@ export const CalendarBase: React.FunctionComponent<ICalendarProps> = React.forwa const onButtonKeyDown = (callback: () => void): ((ev: React.KeyboardEvent<HTMLButtonElement>) => void) => { return (ev: React.KeyboardEvent<HTMLButtonElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: case KeyCodes.space: @@ -239,7 +239,7 @@ export const CalendarBase: React.FunctionComponent<ICalendarProps> = React.forwa }; const onDatePickerPopupKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: ev.preventDefault(); diff --git a/packages/react/src/components/Calendar/CalendarDay/CalendarDay.base.tsx b/packages/react/src/components/Calendar/CalendarDay/CalendarDay.base.tsx index 6d3d8d20887dc5..617a9c1e5d0f02 100644 --- a/packages/react/src/components/Calendar/CalendarDay/CalendarDay.base.tsx +++ b/packages/react/src/components/Calendar/CalendarDay/CalendarDay.base.tsx @@ -184,7 +184,7 @@ CalendarDayNavigationButtons.displayName = 'CalendarDayNavigationButtons'; const onButtonKeyDown = (callback?: () => void): ((ev: React.KeyboardEvent<HTMLButtonElement | HTMLDivElement>) => void) => (ev: React.KeyboardEvent<HTMLButtonElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: callback?.(); diff --git a/packages/react/src/components/Calendar/CalendarMonth/CalendarMonth.base.tsx b/packages/react/src/components/Calendar/CalendarMonth/CalendarMonth.base.tsx index beec6b01e027cc..c4ba11411400fb 100644 --- a/packages/react/src/components/Calendar/CalendarMonth/CalendarMonth.base.tsx +++ b/packages/react/src/components/Calendar/CalendarMonth/CalendarMonth.base.tsx @@ -347,7 +347,7 @@ function isCurrentMonth(month: number, year: number, today: Date): boolean { function onButtonKeyDown(callback: () => void): (ev: React.KeyboardEvent<HTMLButtonElement>) => void { return (ev: React.KeyboardEvent<HTMLButtonElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: callback(); diff --git a/packages/react/src/components/Calendar/CalendarYear/CalendarYear.base.tsx b/packages/react/src/components/Calendar/CalendarYear/CalendarYear.base.tsx index f571407ed56c62..fc919642228fb7 100644 --- a/packages/react/src/components/Calendar/CalendarYear/CalendarYear.base.tsx +++ b/packages/react/src/components/Calendar/CalendarYear/CalendarYear.base.tsx @@ -78,7 +78,7 @@ const CalendarYearGridCell: React.FunctionComponent<ICalendarYearGridCellProps> }; const onKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { onSelectYear?.(year); } @@ -246,7 +246,7 @@ const CalendarYearNavArrow: React.FunctionComponent<ICalendarYearNavArrowProps> }; const onKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { onNavigate(); } @@ -308,7 +308,7 @@ const CalendarYearTitle: React.FunctionComponent<ICalendarYearHeaderProps> = pro }; const onHeaderKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) { onHeaderSelect(); } diff --git a/packages/react/src/components/CalendarDayGrid/CalendarGridDayCell.tsx b/packages/react/src/components/CalendarDayGrid/CalendarGridDayCell.tsx index 34ba32188bf104..2cc7ec9f334f50 100644 --- a/packages/react/src/components/CalendarDayGrid/CalendarGridDayCell.tsx +++ b/packages/react/src/components/CalendarDayGrid/CalendarGridDayCell.tsx @@ -44,18 +44,18 @@ export const CalendarGridDayCell: React.FunctionComponent<ICalendarGridDayCellPr let targetDate: Date | undefined = undefined; let direction = 1; // by default search forward - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.up) { targetDate = addWeeks(date, -1); direction = -1; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } else if (ev.which === KeyCodes.down) { targetDate = addWeeks(date, 1); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } else if (ev.which === getRTLSafeKeyCode(KeyCodes.left)) { targetDate = addDays(date, -1); direction = -1; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } else if (ev.which === getRTLSafeKeyCode(KeyCodes.right)) { targetDate = addDays(date, 1); } @@ -193,7 +193,7 @@ export const CalendarGridDayCell: React.FunctionComponent<ICalendarGridDayCellPr }; const onDayKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { onSelectDate?.(day.originalDate); } else { diff --git a/packages/react/src/components/Callout/CalloutContent.base.tsx b/packages/react/src/components/Callout/CalloutContent.base.tsx index 9355bc972c5159..89550932965a2f 100644 --- a/packages/react/src/components/Callout/CalloutContent.base.tsx +++ b/packages/react/src/components/Callout/CalloutContent.base.tsx @@ -492,7 +492,7 @@ export const CalloutContentBase: React.FunctionComponent<ICalloutProps> = React. backgroundColor, calloutMaxHeight, onScroll, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated shouldRestoreFocus = true, target, hidden, diff --git a/packages/react/src/components/Check/Check.styles.ts b/packages/react/src/components/Check/Check.styles.ts index c721df0c45a9f5..96f5e3ffea913d 100644 --- a/packages/react/src/components/Check/Check.styles.ts +++ b/packages/react/src/components/Check/Check.styles.ts @@ -12,7 +12,7 @@ export const CheckGlobalClassNames = { }; export const getStyles = (props: ICheckStyleProps): ICheckStyles => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { height = props.checkBoxHeight || '18px', checked, className, theme } = props; const { palette, semanticColors, fonts } = theme; diff --git a/packages/react/src/components/Coachmark/Coachmark.base.tsx b/packages/react/src/components/Coachmark/Coachmark.base.tsx index b9baad61890973..a6b2a25b62c6e1 100644 --- a/packages/react/src/components/Coachmark/Coachmark.base.tsx +++ b/packages/react/src/components/Coachmark/Coachmark.base.tsx @@ -215,9 +215,9 @@ function useListeners( (e: KeyboardEvent) => { // Open coachmark if user presses ALT + C (arbitrary keypress for now) if ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (e.altKey && e.which === KeyCodes.c) || - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (e.which === KeyCodes.enter && translateAnimationContainer.current?.contains?.(e.target as Node)) ) { openCoachmark(); @@ -582,7 +582,7 @@ function getBounds( } function isInsideElement( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated targetElementRect: ClientRect, mouseX: number, mouseY: number, diff --git a/packages/react/src/components/ColorPicker/ColorPicker.base.tsx b/packages/react/src/components/ColorPicker/ColorPicker.base.tsx index 689124806e30dc..fbcff3c608998d 100644 --- a/packages/react/src/components/ColorPicker/ColorPicker.base.tsx +++ b/packages/react/src/components/ColorPicker/ColorPicker.base.tsx @@ -120,7 +120,7 @@ export class ColorPickerBase extends React.Component<IColorPickerProps, IColorPi alphaSliderHidden: 'alphaType', }); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (strings.hue) { // warnDeprecations can't handle nested deprecated props warn("ColorPicker property 'strings.hue' was used but has been deprecated. Use 'strings.hueAriaLabel' instead."); @@ -138,14 +138,14 @@ export class ColorPickerBase extends React.Component<IColorPickerProps, IColorPi const defaultStrings = ColorPickerBase.defaultProps.strings as Required<IColorPickerStrings>; this._textLabels = { - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ r: props.redLabel || strings.red || defaultStrings.red, g: props.greenLabel || strings.green || defaultStrings.green, b: props.blueLabel || strings.blue || defaultStrings.blue, a: props.alphaLabel || strings.alpha || defaultStrings.alpha, hex: props.hexLabel || strings.hex || defaultStrings.hex, t: strings.transparency || defaultStrings.transparency, - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ }; this._strings = { @@ -180,7 +180,7 @@ export class ColorPickerBase extends React.Component<IColorPickerProps, IColorPi className, styles, alphaType, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated alphaSliderHidden = alphaType === 'none', tooltipProps, } = props; @@ -218,7 +218,7 @@ export class ColorPickerBase extends React.Component<IColorPickerProps, IColorPi <ColorSlider className="is-hue" type="hue" - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ariaLabel={strings.hue || strings.hueAriaLabel} value={color.h} onChange={this._onHChanged} @@ -347,7 +347,7 @@ export class ColorPickerBase extends React.Component<IColorPickerProps, IColorPi const isHex = component === 'hex'; const isAlpha = component === 'a'; const isTransparency = component === 't'; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated newValue = (newValue || '').substr(0, isHex ? MAX_HEX_LENGTH : MAX_RGBA_LENGTH); // Ignore what the user typed if it contains invalid characters diff --git a/packages/react/src/components/ColorPicker/ColorRectangle/ColorRectangle.base.tsx b/packages/react/src/components/ColorPicker/ColorRectangle/ColorRectangle.base.tsx index d8ef8bbed0d9c0..001274abfe37a4 100644 --- a/packages/react/src/components/ColorPicker/ColorRectangle/ColorRectangle.base.tsx +++ b/packages/react/src/components/ColorPicker/ColorRectangle/ColorRectangle.base.tsx @@ -135,7 +135,7 @@ export class ColorRectangleBase // Intentionally DO NOT flip the color picker in RTL: its orientation is not very meaningful, // and getting all the math and styles flipped correctly is tricky - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.up: { this._isAdjustingSaturation = false; diff --git a/packages/react/src/components/ColorPicker/ColorSlider/ColorSlider.base.tsx b/packages/react/src/components/ColorPicker/ColorSlider/ColorSlider.base.tsx index b107f7974bf355..986b5c76283817 100644 --- a/packages/react/src/components/ColorPicker/ColorSlider/ColorSlider.base.tsx +++ b/packages/react/src/components/ColorPicker/ColorSlider/ColorSlider.base.tsx @@ -41,7 +41,7 @@ export class ColorSliderBase extends React.Component<IColorSliderProps, IColorSl maxValue: 'type', minValue: 'type', }); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (this._type !== 'hue' && !(props.overlayColor || props.overlayStyle)) { warn(`ColorSlider: 'overlayColor' is required when 'type' is "alpha" or "transparency"`); } @@ -83,7 +83,7 @@ export class ColorSliderBase extends React.Component<IColorSliderProps, IColorSl const type = this._type; const maxValue = this._maxValue; const { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated overlayStyle, overlayColor, theme, @@ -139,7 +139,7 @@ export class ColorSliderBase extends React.Component<IColorSliderProps, IColorSl } private get _type(): IColorSliderProps['type'] { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { isAlpha, type = isAlpha ? 'alpha' : 'hue' } = this.props; return type; } @@ -155,7 +155,7 @@ export class ColorSliderBase extends React.Component<IColorSliderProps, IColorSl // Intentionally DO NOT flip the color picker in RTL: its orientation is not very meaningful, // and getting all the math and styles flipped correctly is tricky - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.left: { currentValue -= increment; diff --git a/packages/react/src/components/ColorPicker/ColorSlider/ColorSlider.styles.ts b/packages/react/src/components/ColorPicker/ColorSlider/ColorSlider.styles.ts index 01d3da0548c9e5..00f9ed6d3d1e35 100644 --- a/packages/react/src/components/ColorPicker/ColorSlider/ColorSlider.styles.ts +++ b/packages/react/src/components/ColorPicker/ColorSlider/ColorSlider.styles.ts @@ -25,7 +25,7 @@ const alphaStyle = { }; export const getStyles = (props: IColorSliderStyleProps): IColorSliderStyles => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { theme, className, type = 'hue', isAlpha: useAlphaBackground = type !== 'hue' } = props; const { palette, effects } = theme; diff --git a/packages/react/src/components/ComboBox/ComboBox.tsx b/packages/react/src/components/ComboBox/ComboBox.tsx index e342c4b6798a35..9b6823d72a6d7d 100644 --- a/packages/react/src/components/ComboBox/ComboBox.tsx +++ b/packages/react/src/components/ComboBox/ComboBox.tsx @@ -1233,7 +1233,7 @@ class ComboBoxInternal extends React.Component<IComboBoxInternalProps, IComboBox * OnBlur handler. Set the focused state to false * and submit any pending value */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated private _onBlur = (event: React.FocusEvent<HTMLElement | Autofill | BaseButton | Button>): void => { const doc = getDocumentEx(this.context); // Do nothing if the blur is coming from something @@ -2108,7 +2108,7 @@ class ComboBoxInternal extends React.Component<IComboBoxInternalProps, IComboBox let index = this._getPendingSelectedIndex(false /* includeCurrentPendingValue */); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: if (this._autofill.current && this._autofill.current.inputElement) { @@ -2231,7 +2231,7 @@ class ComboBoxInternal extends React.Component<IComboBoxInternalProps, IComboBox // If end, update the values to respond to END // which goes to the last selectable option - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.end) { index = currentOptions.length; directionToSearch = SearchDirection.backward; @@ -2250,19 +2250,19 @@ class ComboBoxInternal extends React.Component<IComboBoxInternalProps, IComboBox default: /* eslint-enable no-fallthrough */ // are we processing a function key? if so bail out - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which >= 112 /* F1 */ && ev.which <= 123 /* F12 */) { return; } // If we get here and we got either and ALT key // or meta key, let the event propagate - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.keyCode === KeyCodes.alt || ev.key === 'Meta' /* && isOpen */) { return; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (allowParentArrowNavigation && (ev.keyCode === KeyCodes.left || ev.keyCode === KeyCodes.right)) { return; } @@ -2306,7 +2306,7 @@ class ComboBoxInternal extends React.Component<IComboBoxInternalProps, IComboBox return; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.space: // If we are not allowing freeform or free input, and autoComplete is off @@ -2389,11 +2389,11 @@ class ComboBoxInternal extends React.Component<IComboBoxInternalProps, IComboBox // of the event unless we have a tab, escape, or function key if ( ev !== null && - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.which !== KeyCodes.tab && - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.which !== KeyCodes.escape && - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (ev.which < 112 /* F1 */ || ev.which > 123) /* F12 */ ) { ev.stopPropagation(); @@ -2618,6 +2618,6 @@ function getPreviewText(item: IComboBoxOption): string { * Returns true if the key for the event is alt (Mac option) or meta (Mac command). */ function isAltOrMeta(ev: React.KeyboardEvent<HTMLElement | Autofill>): boolean { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return ev.which === KeyCodes.alt || ev.key === 'Meta'; } diff --git a/packages/react/src/components/CommandBar/CommandBar.base.tsx b/packages/react/src/components/CommandBar/CommandBar.base.tsx index eaee893cf0d677..42b273d37e153b 100644 --- a/packages/react/src/components/CommandBar/CommandBar.base.tsx +++ b/packages/react/src/components/CommandBar/CommandBar.base.tsx @@ -166,7 +166,7 @@ export class CommandBarBase extends React.Component<ICommandBarProps, {}> implem return item.onRender(item, () => undefined); } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const itemText = item.text || item.name; const commandButtonProps: ICommandBarItemProps = { allowDisabledFocus: true, @@ -213,7 +213,7 @@ export class CommandBarBase extends React.Component<ICommandBarProps, {}> implem private _onButtonClick(item: ICommandBarItemProps): (ev: React.MouseEvent<HTMLButtonElement>) => void { return ev => { // inactive is deprecated. remove check in 7.0 - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (item.inactive) { return; } diff --git a/packages/react/src/components/ContextualMenu/ContextualMenu.base.tsx b/packages/react/src/components/ContextualMenu/ContextualMenu.base.tsx index c457e42be1a7fd..d29bbe64054d87 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenu.base.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenu.base.tsx @@ -98,7 +98,7 @@ export function getSubmenuItems( ): IContextualMenuItem[] | undefined { const target = options?.target; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const items = item.subMenuProps ? item.subMenuProps.items : item.items; if (items) { @@ -356,7 +356,7 @@ function useKeyHandlers( const shouldCloseSubMenu = (ev: React.KeyboardEvent<HTMLElement>): boolean => { const submenuCloseKey = getRTL(theme) ? KeyCodes.right : KeyCodes.left; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which !== submenuCloseKey || !isSubMenu) { return false; } @@ -369,10 +369,10 @@ function useKeyHandlers( const shouldHandleKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => { return ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.which === KeyCodes.escape || shouldCloseSubMenu(ev) || - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (ev.which === KeyCodes.up && (ev.altKey || ev.metaKey)) ); }; @@ -383,7 +383,7 @@ function useKeyHandlers( lastKeyDownWasAltOrMeta.current = isAltOrMeta(ev); // On Mac, pressing escape dismisses all levels of native context menus - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const dismissAllMenus = ev.which === KeyCodes.escape && (isMac() || isIOS()); return keyHandler(ev, shouldHandleKeyDown, dismissAllMenus); @@ -421,9 +421,9 @@ function useKeyHandlers( // If we have a modifier key being pressed, we do not want to move focus. // Otherwise, handle up and down keys. const hasModifier = !!(ev.altKey || ev.metaKey); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const isUp = ev.which === KeyCodes.up; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const isDown = ev.which === KeyCodes.down; if (!hasModifier && (isUp || isDown)) { const elementToFocus = isUp @@ -443,7 +443,7 @@ function useKeyHandlers( if ( !item.disabled && - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (ev.which === openKey || ev.which === KeyCodes.enter || (ev.which === KeyCodes.down && (ev.altKey || ev.metaKey))) ) { openSubMenu(item, ev.currentTarget as HTMLElement); @@ -780,7 +780,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const onDefaultRenderMenuList = ( menuListProps: IContextualMenuListProps, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated menuClassNames: IProcessedStyleSet<IContextualMenuStyles> | IContextualMenuClassNames, defaultRender?: IRenderFunction<IContextualMenuListProps>, ): JSX.Element => { @@ -825,13 +825,13 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = totalItemCount: number, hasCheckmarks: boolean, hasIcons: boolean, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated menuClassNames: IProcessedStyleSet<IContextualMenuStyles> | IContextualMenuClassNames, ): JSX.Element => { const renderedItems: React.ReactNode[] = []; const iconProps = item.iconProps || { iconName: 'None' }; const { - getItemClassNames, // eslint-disable-line deprecation/deprecation + getItemClassNames, // eslint-disable-line @typescript-eslint/no-deprecated itemProps, } = item; const styles = itemProps ? itemProps.styles : undefined; @@ -841,7 +841,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const dividerClassName = item.itemType === ContextualMenuItemType.Divider ? item.className : undefined; const subMenuIconClassName = item.submenuIconProps ? item.submenuIconProps.className : ''; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let itemClassNames: IMenuItemClassNames; // IContextualMenuItem#getItemClassNames for backwards compatibility @@ -883,7 +883,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = ); } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (item.text === '-' || item.name === '-') { item.itemType = ContextualMenuItemType.Divider; } @@ -925,7 +925,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const defaultMenuItemRenderer = ( item: IContextualMenuItemRenderProps, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated menuClassNames: IProcessedStyleSet<IContextualMenuStyles> | IContextualMenuClassNames, ): React.ReactNode => { const { index, focusableElementIndex, totalItemCount, hasCheckmarks, hasIcons } = item; @@ -942,9 +942,9 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const renderSectionItem = ( sectionItem: IContextualMenuItem, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated itemClassNames: IMenuItemClassNames, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated menuClassNames: IProcessedStyleSet<IContextualMenuStyles> | IContextualMenuClassNames, index: number, hasCheckmarks: boolean, @@ -1033,7 +1033,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const renderListItem = ( content: React.ReactNode, key: string | number, - classNames: IMenuItemClassNames, // eslint-disable-line deprecation/deprecation + classNames: IMenuItemClassNames, // eslint-disable-line @typescript-eslint/no-deprecated title?: string, ) => { return ( @@ -1045,7 +1045,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const renderSeparator = ( index: number, - classNames: IMenuItemClassNames, // eslint-disable-line deprecation/deprecation + classNames: IMenuItemClassNames, // eslint-disable-line @typescript-eslint/no-deprecated top?: boolean, fromSection?: boolean, ): React.ReactNode => { @@ -1064,7 +1064,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const renderNormalItem = ( item: IContextualMenuItem, - classNames: IMenuItemClassNames, // eslint-disable-line deprecation/deprecation + classNames: IMenuItemClassNames, // eslint-disable-line @typescript-eslint/no-deprecated index: number, focusableElementIndex: number, totalItemCount: number, @@ -1142,9 +1142,9 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const renderHeaderMenuItem = ( item: IContextualMenuItem, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated itemClassNames: IMenuItemClassNames, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated menuClassNames: IProcessedStyleSet<IContextualMenuStyles> | IContextualMenuClassNames, index: number, hasCheckmarks: boolean, @@ -1164,7 +1164,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = const divHtmlProperties = itemProps && getNativeProps<React.HTMLAttributes<HTMLDivElement>>(itemProps, divProperties); return ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <div id={id} className={menuClassNames.header} {...divHtmlProperties} style={item.style}> <ChildrenRenderer item={item} @@ -1212,7 +1212,7 @@ export const ContextualMenuBase: React.FunctionComponent<IContextualMenuProps> = defaultRender?: IRenderFunction<IContextualMenuListProps>, ) => onDefaultRenderMenuList(menuListProps, classNames, defaultRender), focusZoneProps, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getMenuClassNames, } = props; @@ -1374,7 +1374,7 @@ ContextualMenuBase.displayName = 'ContextualMenuBase'; * Returns true if the key for the event is alt (Mac option) or meta (Mac command). */ function isAltOrMeta(ev: React.KeyboardEvent<HTMLElement>): boolean { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return ev.which === KeyCodes.alt || ev.key === 'Meta'; } diff --git a/packages/react/src/components/ContextualMenu/ContextualMenu.classNames.ts b/packages/react/src/components/ContextualMenu/ContextualMenu.classNames.ts index 5f7fc8247bebe6..8e06f9b6710854 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenu.classNames.ts +++ b/packages/react/src/components/ContextualMenu/ContextualMenu.classNames.ts @@ -50,10 +50,10 @@ const CONTEXTUAL_SPLIT_MENU_MINWIDTH = '28px'; const MediumScreenSelector = getScreenSelector(0, ScreenWidthMaxMedium); export const getSplitButtonVerticalDividerClassNames = memoizeFunction( - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ (theme: ITheme): IVerticalDividerClassNames => { return mergeStyleSets(getDividerClassNames(theme), { - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ wrapper: { position: 'absolute', right: 28, // width of the splitMenu based on the padding plus icon fontSize @@ -267,7 +267,7 @@ export const getItemStyles = (props: IContextualMenuItemStyleProps): IContextual className, } = props; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return getItemClassNames( theme, disabled, diff --git a/packages/react/src/components/ContextualMenu/ContextualMenu.types.ts b/packages/react/src/components/ContextualMenu/ContextualMenu.types.ts index d4daf4a6ff9ea3..90d202fb5d2ac1 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenu.types.ts +++ b/packages/react/src/components/ContextualMenu/ContextualMenu.types.ts @@ -50,7 +50,7 @@ export interface IContextualMenu {} export interface IContextualMenuProps extends IBaseProps<IContextualMenu>, React.RefAttributes<HTMLDivElement>, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated IWithResponsiveModeState { /** * Optional callback to access the IContextualMenu interface. Use this instead of ref for accessing @@ -232,7 +232,7 @@ export interface IContextualMenuProps * Method to provide the classnames to style the contextual menu. * @deprecated Use `styles` instead to leverage mergeStyles API. */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getMenuClassNames?: (theme: ITheme, className?: string) => IContextualMenuClassNames; /** Custom render function for a submenu. */ @@ -466,7 +466,7 @@ export interface IContextualMenuItem { iconClassName?: string, subMenuClassName?: string, primaryDisabled?: boolean, - ) => // eslint-disable-next-line deprecation/deprecation + ) => // eslint-disable-next-line @typescript-eslint/no-deprecated IMenuItemClassNames; /** @@ -479,7 +479,7 @@ export interface IContextualMenuItem { * Default value is the `getSplitButtonVerticalDividerClassNames` func defined in `ContextualMenu.classnames.ts`. * @defaultvalue getSplitButtonVerticalDividerClassNames */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getSplitButtonVerticalDividerClassNames?: (theme: ITheme) => IVerticalDividerClassNames; /** diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItem.base.tsx b/packages/react/src/components/ContextualMenu/ContextualMenuItem.base.tsx index bc1d1e70003d46..12512ae28e9f99 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItem.base.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItem.base.tsx @@ -42,11 +42,11 @@ const renderCheckMarkIcon = ({ onCheckmarkClick, item, classNames }: IContextual }; const renderItemName = ({ item, classNames }: IContextualMenuItemProps) => { - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ if (item.text || item.name) { return <span className={classNames.label}>{item.text || item.name}</span>; } - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ return null; }; diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItem.test.tsx b/packages/react/src/components/ContextualMenu/ContextualMenuItem.test.tsx index 96e327c93c5314..ae509c0a94decc 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItem.test.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItem.test.tsx @@ -12,7 +12,7 @@ describe('ContextMenuItemChildren', () => { describe('when a checkmark icon', () => { let onCheckmarkClick: jest.Mock; let menuItem: IContextualMenuItem; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let menuClassNames: IMenuItemClassNames; let wrapper: ShallowWrapper<IContextualMenuItemProps, {}>; @@ -52,7 +52,7 @@ describe('ContextMenuItemChildren', () => { describe('when hide checkmark icon for toggle command', () => { let onCheckmarkClick: jest.Mock; let menuItem: IContextualMenuItem; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let menuClassNames: IMenuItemClassNames; let wrapper: ShallowWrapper<IContextualMenuItemProps, {}>; @@ -96,7 +96,7 @@ describe('ContextMenuItemChildren', () => { describe('when it has icons', () => { describe('when it has iconProps', () => { let menuItem: IContextualMenuItem; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let menuClassNames: IMenuItemClassNames; let wrapper: ShallowWrapper<IContextualMenuItemProps, {}>; @@ -116,7 +116,7 @@ describe('ContextMenuItemChildren', () => { describe('when it doesnt have iconProps', () => { let menuItem: IContextualMenuItem; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let menuClassNames: IMenuItemClassNames; let wrapper: ShallowWrapper<IContextualMenuItemProps, {}>; @@ -137,7 +137,7 @@ describe('ContextMenuItemChildren', () => { describe('when it has a sub menu', () => { let menuItem: IContextualMenuItem; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let menuClassNames: IMenuItemClassNames; let wrapper: ShallowWrapper<IContextualMenuItemProps, {}>; @@ -157,7 +157,7 @@ describe('ContextMenuItemChildren', () => { }); }); -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated function getMenuItemClassNames(): IMenuItemClassNames { return { item: 'item', diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItem.types.ts b/packages/react/src/components/ContextualMenu/ContextualMenuItem.types.ts index 7a282139185ef2..87717484ba4bdb 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItem.types.ts +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItem.types.ts @@ -59,7 +59,7 @@ export interface IContextualMenuItemProps extends React.HTMLAttributes<IContextu /** * Classnames for different aspects of a menu item */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated classNames: IMenuItemClassNames; /** diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuAnchor.test.tsx b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuAnchor.test.tsx index f7c040ac89bd3c..df9e586cbfdade 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuAnchor.test.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuAnchor.test.tsx @@ -8,7 +8,7 @@ import type { IMenuItemClassNames } from '../ContextualMenu.classNames'; describe('ContextualMenuButton', () => { describe('creates a normal button', () => { let menuItem: IContextualMenuItem; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let menuClassNames: IMenuItemClassNames; beforeEach(() => { @@ -77,7 +77,7 @@ describe('ContextualMenuButton', () => { }); }); -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated function getMenuItemClassNames(): IMenuItemClassNames { return { item: 'item', diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuAnchor.tsx b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuAnchor.tsx index 1332938bf43c39..0229de4526a7ba 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuAnchor.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuAnchor.tsx @@ -102,7 +102,7 @@ export class ContextualMenuAnchor extends ContextualMenuItemWrapper { aria-posinset={focusableElementIndex + 1} aria-setsize={totalItemCount} aria-disabled={isItemDisabled(item)} - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated style={item.style} onClick={this._onItemClick} onMouseEnter={this._onItemMouseEnter} diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuButton.test.tsx b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuButton.test.tsx index 0d7dd4aa6a0ec9..d7af3d0b3944ea 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuButton.test.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuButton.test.tsx @@ -8,7 +8,7 @@ import type { IMenuItemClassNames } from '../ContextualMenu.classNames'; describe('ContextualMenuButton', () => { describe('creates a normal button', () => { let menuItem: IContextualMenuItem; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let menuClassNames: IMenuItemClassNames; beforeEach(() => { @@ -108,7 +108,7 @@ describe('ContextualMenuButton', () => { }); }); -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated function getMenuItemClassNames(): IMenuItemClassNames { return { item: 'item', diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuButton.tsx b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuButton.tsx index 2e0110c0294b9c..deb0f288f57adb 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuButton.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuButton.tsx @@ -103,7 +103,7 @@ export class ContextualMenuButton extends ContextualMenuItemWrapper { (itemRole === 'menuitemcheckbox' || itemRole === 'menuitemradio') && canCheck ? !!isChecked : undefined, 'aria-selected': itemRole === 'menuitem' && canCheck ? !!isChecked : undefined, role: itemRole, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated style: item.style, }; diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuItemWrapper.types.ts b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuItemWrapper.types.ts index ded2c689bd511f..4f396f47e4c98c 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuItemWrapper.types.ts +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuItemWrapper.types.ts @@ -19,7 +19,7 @@ export interface IContextualMenuItemWrapperProps extends React.ClassAttributes<I /** * CSS class to apply to the context menu. */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated classNames: IMenuItemClassNames; /** diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuSplitButton.test.tsx b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuSplitButton.test.tsx index ea0abb5a5675fb..4974f5e1a67012 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuSplitButton.test.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuSplitButton.test.tsx @@ -8,7 +8,7 @@ import type { IMenuItemClassNames } from '../ContextualMenu.classNames'; describe('ContextualMenuSplitButton', () => { describe('creates a normal split button', () => { let menuItem: IContextualMenuItem; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated let menuClassNames: IMenuItemClassNames; beforeEach(() => { @@ -53,7 +53,7 @@ describe('ContextualMenuSplitButton', () => { }); }); -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated function getMenuItemClassNames(): IMenuItemClassNames { return { item: 'item', diff --git a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuSplitButton.tsx b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuSplitButton.tsx index cc31624a6acadb..451765bcf0b6cf 100644 --- a/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuSplitButton.tsx +++ b/packages/react/src/components/ContextualMenu/ContextualMenuItemWrapper/ContextualMenuSplitButton.tsx @@ -136,7 +136,7 @@ export class ContextualMenuSplitButton extends ContextualMenuItemWrapper { protected _onItemKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { const { item, onItemKeyDown } = this.props; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { this._executeItemClick(ev); ev.preventDefault(); @@ -161,7 +161,7 @@ export class ContextualMenuSplitButton extends ContextualMenuItemWrapper { private _renderSplitPrimaryButton( item: IContextualMenuItem, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated classNames: IMenuItemClassNames, index: number, hasCheckmarks: boolean, @@ -172,11 +172,11 @@ export class ContextualMenuSplitButton extends ContextualMenuItemWrapper { const itemProps: IContextualMenuItem = { key: item.key, disabled: isItemDisabled(item) || item.primaryDisabled, - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ name: item.name, text: item.text || item.name, secondaryText: item.secondaryText, - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ className: classNames.splitPrimary, canCheck: item.canCheck, isChecked: item.isChecked, @@ -214,7 +214,7 @@ export class ContextualMenuSplitButton extends ContextualMenuItemWrapper { private _renderSplitIconButton( item: IContextualMenuItem, - classNames: IMenuItemClassNames, // eslint-disable-line deprecation/deprecation + classNames: IMenuItemClassNames, // eslint-disable-line @typescript-eslint/no-deprecated index: number, keytipAttributes: any, ) { diff --git a/packages/react/src/components/ContextualMenu/index.ts b/packages/react/src/components/ContextualMenu/index.ts index 8af110d1a174a0..3271595d5d54f5 100644 --- a/packages/react/src/components/ContextualMenu/index.ts +++ b/packages/react/src/components/ContextualMenu/index.ts @@ -6,9 +6,8 @@ export * from './ContextualMenuItem.base'; export * from './ContextualMenuItem.types'; export { getMenuItemStyles } from './ContextualMenu.cnstyles'; export { - // eslint-disable-next-line deprecation/deprecation getItemClassNames as getContextualMenuItemClassNames, getItemStyles as getContextualMenuItemStyles, } from './ContextualMenu.classNames'; -// eslint-disable-next-line deprecation/deprecation + export type { IContextualMenuClassNames, IMenuItemClassNames } from './ContextualMenu.classNames'; diff --git a/packages/react/src/components/DatePicker/DatePicker.base.tsx b/packages/react/src/components/DatePicker/DatePicker.base.tsx index 57412493d53eb0..17e37f7ffee89b 100644 --- a/packages/react/src/components/DatePicker/DatePicker.base.tsx +++ b/packages/react/src/components/DatePicker/DatePicker.base.tsx @@ -344,7 +344,7 @@ export const DatePickerBase: React.FunctionComponent<IDatePickerProps> = React.f }; const onTextFieldKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: ev.preventDefault(); diff --git a/packages/react/src/components/DetailsList/DetailsColumn.base.tsx b/packages/react/src/components/DetailsList/DetailsColumn.base.tsx index 2fdd35162ea6f1..813de6d01e08b5 100644 --- a/packages/react/src/components/DetailsList/DetailsColumn.base.tsx +++ b/packages/react/src/components/DetailsList/DetailsColumn.base.tsx @@ -371,11 +371,11 @@ export class DetailsColumnBase extends React.Component<IDetailsColumnProps> { }; private _updateHeaderDragInfo = (itemIndex: number, event?: MouseEvent) => { - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ if (this.props.setDraggedItemIndex) { this.props.setDraggedItemIndex(itemIndex); } - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ if (this.props.updateDragInfo) { this.props.updateDragInfo({ itemIndex }, event); } diff --git a/packages/react/src/components/DetailsList/DetailsHeader.base.tsx b/packages/react/src/components/DetailsList/DetailsHeader.base.tsx index d53de17bcfe6ab..7d96fc6898d74f 100644 --- a/packages/react/src/components/DetailsList/DetailsHeader.base.tsx +++ b/packages/react/src/components/DetailsList/DetailsHeader.base.tsx @@ -413,10 +413,10 @@ export class DetailsHeaderBase targetIndex, }; columnReorderProps.onColumnDrop(dragDropDetails); - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ } else if (columnReorderProps.handleColumnReorder) { columnReorderProps.handleColumnReorder(this._draggedColumnIndex, targetIndex); - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ } } } @@ -773,7 +773,7 @@ export class DetailsHeaderBase const columnIndex = Number(columnIndexAttr); if (!columnResizeDetails) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { this.setState({ columnResizeDetails: { @@ -788,7 +788,7 @@ export class DetailsHeaderBase } else { let increment: number | undefined; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { this.setState({ columnResizeDetails: undefined, @@ -796,10 +796,10 @@ export class DetailsHeaderBase ev.preventDefault(); ev.stopPropagation(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } else if (ev.which === KeyCodes.left) { increment = getRTL(this.props.theme) ? 1 : -1; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } else if (ev.which === KeyCodes.right) { increment = getRTL(this.props.theme) ? -1 : 1; } diff --git a/packages/react/src/components/DetailsList/DetailsList.base.tsx b/packages/react/src/components/DetailsList/DetailsList.base.tsx index 3102537a9234b6..ddf29a64d3d212 100644 --- a/packages/react/src/components/DetailsList/DetailsList.base.tsx +++ b/packages/react/src/components/DetailsList/DetailsList.base.tsx @@ -141,11 +141,11 @@ const DetailsListInner: React.ComponentType<IDetailsListInnerProps> = ( selectionMode = selection.mode, selectionPreservedOnEmptyClick, selectionZoneProps, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ariaLabel, ariaLabelForGrid, rowElementEventMap, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated shouldApplyApplicationRole = false, getKey, listProps, @@ -593,7 +593,7 @@ const DetailsListInner: React.ComponentType<IDetailsListInnerProps> = ( const isRightArrow = React.useCallback( (event: React.KeyboardEvent<HTMLElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return event.which === getRTLSafeKeyCode(KeyCodes.right, theme); }, [theme], @@ -657,7 +657,7 @@ const DetailsListInner: React.ComponentType<IDetailsListInnerProps> = ( const onHeaderKeyDown = React.useCallback( (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.down) { if (focusZoneRef.current && focusZoneRef.current.focus()) { // select the first item in list after down arrow key event @@ -676,7 +676,7 @@ const DetailsListInner: React.ComponentType<IDetailsListInnerProps> = ( const onContentKeyDown = React.useCallback( (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.up && !ev.altKey) { if (headerRef.current && headerRef.current.focus()) { ev.preventDefault(); @@ -918,10 +918,10 @@ export class DetailsListBase extends React.Component<IDetailsListProps, IDetails targetIndex, }; columnReorderOptions.onColumnDrop(dragDropDetails); - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ } else if (columnReorderOptions.handleColumnReorder) { columnReorderOptions.handleColumnReorder(draggedIndex, targetIndex); - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ } } } @@ -1345,7 +1345,7 @@ export class DetailsListBase extends React.Component<IDetailsListProps, IDetails ...this._columnOverrides[column.key], }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (!(baseColumn.isCollapsible || baseColumn.isCollapsable)) { minimumWidth += getPaddedWidth(baseColumn, props); } @@ -1368,7 +1368,7 @@ export class DetailsListBase extends React.Component<IDetailsListProps, IDetails const minWidth = column.minWidth || MIN_COLUMN_WIDTH; const overflowWidth = totalWidth - availableWidth; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (column.calculatedWidth! - minWidth >= overflowWidth || !(column.isCollapsible || column.isCollapsable)) { const originalWidth = column.calculatedWidth!; if (minimumWidth < availableWidth) { diff --git a/packages/react/src/components/DetailsList/DetailsRowCheck.tsx b/packages/react/src/components/DetailsList/DetailsRowCheck.tsx index 67c404e0f9c6f4..1fc85ff4bc6cd4 100644 --- a/packages/react/src/components/DetailsList/DetailsRowCheck.tsx +++ b/packages/react/src/components/DetailsList/DetailsRowCheck.tsx @@ -60,7 +60,7 @@ const DetailsRowCheckBase: React.FunctionComponent<IDetailsRowCheckProps> = prop <div {...buttonProps} role={checkRole} - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated className={css(classNames.root, classNames.check)} aria-checked={selected} data-selection-toggle={true} @@ -70,7 +70,7 @@ const DetailsRowCheckBase: React.FunctionComponent<IDetailsRowCheckProps> = prop {onRenderCheckbox(detailsCheckboxProps)} </div> ) : ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <div {...divProps} className={css(classNames.root, classNames.check)} /> ); }; diff --git a/packages/react/src/components/Dialog/Dialog.base.tsx b/packages/react/src/components/Dialog/Dialog.base.tsx index 16856684294365..34f7185188ad3b 100644 --- a/packages/react/src/components/Dialog/Dialog.base.tsx +++ b/packages/react/src/components/Dialog/Dialog.base.tsx @@ -27,7 +27,7 @@ const DefaultDialogContentProps: IDialogContentProps = { topButtonsProps: [], }; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated @withResponsiveMode export class DialogBase extends React.Component<IDialogProps, {}> { public static defaultProps: IDialogProps = { @@ -67,7 +67,7 @@ export class DialogBase extends React.Component<IDialogProps, {}> { public render(): JSX.Element { const props = this.props; const { - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ className, containerClassName, contentClassName, @@ -90,7 +90,7 @@ export class DialogBase extends React.Component<IDialogProps, {}> { title, topButtonsProps, type, - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ minWidth, maxWidth, modalProps, @@ -142,7 +142,7 @@ export class DialogBase extends React.Component<IDialogProps, {}> { ...props.dialogContentProps, draggableHeaderClassName: dialogDraggableClassName, titleProps: { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated id: props.dialogContentProps?.titleId || this._defaultTitleTextId, ...props.dialogContentProps?.titleProps, }, @@ -179,7 +179,7 @@ export class DialogBase extends React.Component<IDialogProps, {}> { } private _getSubTextId = (): string | undefined => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { ariaDescribedById, modalProps, dialogContentProps, subText } = this.props; let id = (modalProps && modalProps.subtitleAriaId) || ariaDescribedById; @@ -191,7 +191,7 @@ export class DialogBase extends React.Component<IDialogProps, {}> { }; private _getTitleTextId = (): string | undefined => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { ariaLabelledById, modalProps, dialogContentProps, title } = this.props; let id = (modalProps && modalProps.titleAriaId) || ariaLabelledById; diff --git a/packages/react/src/components/Dialog/Dialog.styles.ts b/packages/react/src/components/Dialog/Dialog.styles.ts index 0870266ded3697..8e46df0c425ff7 100644 --- a/packages/react/src/components/Dialog/Dialog.styles.ts +++ b/packages/react/src/components/Dialog/Dialog.styles.ts @@ -8,7 +8,7 @@ const GlobalClassNames = { export const getStyles = (props: IDialogStyleProps): IDialogStyles => { const { className, - containerClassName, // eslint-disable-line deprecation/deprecation + containerClassName, // eslint-disable-line @typescript-eslint/no-deprecated dialogDefaultMinWidth = '288px', dialogDefaultMaxWidth = '340px', hidden, diff --git a/packages/react/src/components/Dialog/Dialog.types.ts b/packages/react/src/components/Dialog/Dialog.types.ts index f3544a5c0d5995..7936c9f13a7e49 100644 --- a/packages/react/src/components/Dialog/Dialog.types.ts +++ b/packages/react/src/components/Dialog/Dialog.types.ts @@ -20,7 +20,7 @@ export interface IDialog {} */ export interface IDialogProps extends React.ClassAttributes<DialogBase>, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated IWithResponsiveModeState, IAccessiblePopupProps { children?: React.ReactNode; diff --git a/packages/react/src/components/Dialog/DialogContent.base.tsx b/packages/react/src/components/Dialog/DialogContent.base.tsx index 4f3eabbe3f9066..9db6078f82c21d 100644 --- a/packages/react/src/components/Dialog/DialogContent.base.tsx +++ b/packages/react/src/components/Dialog/DialogContent.base.tsx @@ -13,7 +13,7 @@ const DialogFooterType = ((<DialogFooter />) as React.ReactElement<IDialogFooter const COMPONENT_NAME = 'DialogContent'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated @withResponsiveMode export class DialogContentBase extends React.Component<IDialogContentProps, {}> { public static defaultProps: IDialogContentProps = { @@ -41,7 +41,7 @@ export class DialogContentBase extends React.Component<IDialogContentProps, {}> subTextId, subText, titleProps = {}, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated titleId, title, type, diff --git a/packages/react/src/components/Divider/VerticalDivider.base.tsx b/packages/react/src/components/Divider/VerticalDivider.base.tsx index 16d14aa3d9d19c..cac56ddde068e0 100644 --- a/packages/react/src/components/Divider/VerticalDivider.base.tsx +++ b/packages/react/src/components/Divider/VerticalDivider.base.tsx @@ -12,7 +12,7 @@ export const VerticalDividerBase: React.FunctionComponent<IVerticalDividerProps> HTMLDivElement, IVerticalDividerProps >((props, ref) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { styles, theme, getClassNames: deprecatedGetClassNames, className } = props; const classNames = getClassNames(styles, { theme, getClassNames: deprecatedGetClassNames, className }); return ( diff --git a/packages/react/src/components/Divider/VerticalDivider.classNames.ts b/packages/react/src/components/Divider/VerticalDivider.classNames.ts index 03e0b7eb32193d..961511a8a75674 100644 --- a/packages/react/src/components/Divider/VerticalDivider.classNames.ts +++ b/packages/react/src/components/Divider/VerticalDivider.classNames.ts @@ -7,7 +7,7 @@ import type { IVerticalDividerClassNames } from './VerticalDivider.types'; * @deprecated use getStyles exported from VerticalDivider.styles.ts */ export const getDividerClassNames = memoizeFunction( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (theme: ITheme): IVerticalDividerClassNames => { return mergeStyleSets({ wrapper: { diff --git a/packages/react/src/components/Divider/VerticalDivider.styles.ts b/packages/react/src/components/Divider/VerticalDivider.styles.ts index 166a0fa3a97cd8..8f86e4d5456181 100644 --- a/packages/react/src/components/Divider/VerticalDivider.styles.ts +++ b/packages/react/src/components/Divider/VerticalDivider.styles.ts @@ -4,7 +4,7 @@ import type { IStyleFunction } from '../../Utilities'; export const getStyles: IStyleFunction<IVerticalDividerPropsStyles, IVerticalDividerStyles> = ( props: IVerticalDividerPropsStyles, ): IVerticalDividerStyles => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { theme, getClassNames, className } = props; if (!theme) { diff --git a/packages/react/src/components/Divider/VerticalDivider.types.ts b/packages/react/src/components/Divider/VerticalDivider.types.ts index 44ea500f5c450b..388f106d72d554 100644 --- a/packages/react/src/components/Divider/VerticalDivider.types.ts +++ b/packages/react/src/components/Divider/VerticalDivider.types.ts @@ -11,7 +11,7 @@ export interface IVerticalDividerProps extends React.HTMLAttributes<HTMLElement> * Optional function to generate the class names for the divider for custom styling * @deprecated Use `styles` instead. */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getClassNames?: (theme: ITheme) => IVerticalDividerClassNames; /** * The theme that should be used to render the vertical divider. diff --git a/packages/react/src/components/DocumentCard/DocumentCard.base.tsx b/packages/react/src/components/DocumentCard/DocumentCard.base.tsx index 78bbf79439ba1e..3f6ce4bb9f67e1 100644 --- a/packages/react/src/components/DocumentCard/DocumentCard.base.tsx +++ b/packages/react/src/components/DocumentCard/DocumentCard.base.tsx @@ -48,7 +48,7 @@ export class DocumentCardBase extends React.Component<IDocumentCardProps, any> i } public render(): JSX.Element { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { onClick, onClickHref, children, type, accentColor, styles, theme, className } = this.props; const nativeProps = getNativeProps<React.HTMLAttributes<HTMLDivElement>>(this.props, divProperties, [ 'className', @@ -104,7 +104,7 @@ export class DocumentCardBase extends React.Component<IDocumentCardProps, any> i }; private _onKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) { this._onAction(ev); } diff --git a/packages/react/src/components/DocumentCard/DocumentCardLogo.styles.ts b/packages/react/src/components/DocumentCard/DocumentCardLogo.styles.ts index 68e00221a5f5e4..b6beaba76e5984 100644 --- a/packages/react/src/components/DocumentCard/DocumentCardLogo.styles.ts +++ b/packages/react/src/components/DocumentCard/DocumentCardLogo.styles.ts @@ -15,7 +15,7 @@ export const getStyles = (props: IDocumentCardLogoStyleProps): IDocumentCardLogo root: [ classNames.root, { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated fontSize: fonts.xxLargePlus.fontSize, color: palette.themePrimary, display: 'block', diff --git a/packages/react/src/components/DocumentCard/DocumentCardPreview.base.tsx b/packages/react/src/components/DocumentCard/DocumentCardPreview.base.tsx index 8fbaa6c86ae175..a3ca9f83a62f6c 100644 --- a/packages/react/src/components/DocumentCard/DocumentCardPreview.base.tsx +++ b/packages/react/src/components/DocumentCard/DocumentCardPreview.base.tsx @@ -46,13 +46,13 @@ export class DocumentCardPreviewBase extends React.Component<IDocumentCardPrevie preview = this._renderPreviewImage(previewImages[0]); // Override the border color if an accent color was provided - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ if (previewImages[0].accentColor) { style = { borderBottomColor: previewImages[0].accentColor, }; } - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ } return ( @@ -127,7 +127,7 @@ export class DocumentCardPreviewBase extends React.Component<IDocumentCardPrevie /> <Link className={this._classNames.fileListLink} - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated href={file.url} {...file.linkProps} > diff --git a/packages/react/src/components/Dropdown/Dropdown.base.tsx b/packages/react/src/components/Dropdown/Dropdown.base.tsx index 70498f5ac23212..574a5bd22d686b 100644 --- a/packages/react/src/components/Dropdown/Dropdown.base.tsx +++ b/packages/react/src/components/Dropdown/Dropdown.base.tsx @@ -57,7 +57,7 @@ const COMPONENT_NAME = 'Dropdown'; const getClassNames = classNamesFunction<IDropdownStyleProps, IDropdownStyles>(); /** Internal only props interface to support mixing in responsive mode */ -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated interface IDropdownInternalProps extends Omit<IDropdownProps, 'ref'>, IWithResponsiveModeState { hoisted: { rootRef: React.RefObject<HTMLDivElement>; @@ -146,7 +146,7 @@ function useSelectedItemsState({ if (searchKey != null) { return option.key === searchKey; } else { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return !!option.selected || !!option.isSelected; } }); @@ -324,7 +324,7 @@ class DropdownInternal extends React.Component<IDropdownInternalProps, IDropdown hoisted: { selectedIndices }, } = props; const { isOpen, calloutRenderEdge, hasFocus } = this.state; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const onRenderPlaceholder = props.onRenderPlaceholder || props.onRenderPlaceHolder || this._getPlaceholder; // If our cached options are out of date update our cache @@ -492,7 +492,7 @@ class DropdownInternal extends React.Component<IDropdownInternalProps, IDropdown checked?: boolean, multiSelect?: boolean, ) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { onChange, onChanged } = this.props; if (onChange || onChanged) { // for single-select, option passed in will always be selected. @@ -506,7 +506,7 @@ class DropdownInternal extends React.Component<IDropdownInternalProps, IDropdown /** Get either props.placeholder (new name) or props.placeHolder (old name) */ private _getPlaceholder = (): string | undefined => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return this.props.placeholder || this.props.placeHolder; }; @@ -1048,7 +1048,7 @@ class DropdownInternal extends React.Component<IDropdownInternalProps, IDropdown const containsExpandCollapseModifier = ev.altKey || ev.metaKey; const isOpen = this.state.isOpen; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: this.setState({ @@ -1136,7 +1136,7 @@ class DropdownInternal extends React.Component<IDropdownInternalProps, IDropdown return; } } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.space: this.setState({ @@ -1159,7 +1159,7 @@ class DropdownInternal extends React.Component<IDropdownInternalProps, IDropdown * Returns true if the key for the event is alt (Mac option) or meta (Mac command). */ private _isAltOrMeta(ev: React.KeyboardEvent<HTMLElement>): boolean { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return ev.which === KeyCodes.alt || ev.key === 'Meta'; } @@ -1187,7 +1187,7 @@ class DropdownInternal extends React.Component<IDropdownInternalProps, IDropdown this._lastKeyDownWasAltOrMeta = this._isAltOrMeta(ev); const containsExpandCollapseModifier = ev.altKey || ev.metaKey; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.up: if (containsExpandCollapseModifier) { @@ -1298,7 +1298,7 @@ class DropdownInternal extends React.Component<IDropdownInternalProps, IDropdown */ private _isDisabled: () => boolean | undefined = () => { let { disabled } = this.props; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { isDisabled } = this.props; // Remove this deprecation workaround at 1.0.0 diff --git a/packages/react/src/components/ExtendedPicker/BaseExtendedPicker.tsx b/packages/react/src/components/ExtendedPicker/BaseExtendedPicker.tsx index 557be878741ecc..5807f75fcbb5f9 100644 --- a/packages/react/src/components/ExtendedPicker/BaseExtendedPicker.tsx +++ b/packages/react/src/components/ExtendedPicker/BaseExtendedPicker.tsx @@ -193,7 +193,7 @@ export class BaseExtendedPicker<T extends {}, P extends IBaseExtendedPickerProps // This is protected because we may expect the backspace key to work differently in a different kind of picker. // This lets the subclass override it and provide it's own onBackspace. For an example see the BasePickerListBelow protected onBackspace = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which !== KeyCodes.backspace) { return; } diff --git a/packages/react/src/components/Fabric/Fabric.base.tsx b/packages/react/src/components/Fabric/Fabric.base.tsx index 9d42d03677541e..5ede2ddd12d90b 100644 --- a/packages/react/src/components/Fabric/Fabric.base.tsx +++ b/packages/react/src/components/Fabric/Fabric.base.tsx @@ -72,7 +72,7 @@ function useRenderedContent( if (needsTheme) { // Disabling ThemeProvider here because theme doesn't need to be re-provided by ThemeProvider if dir has changed. renderedContent = ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <Customizer settings={{ theme: getFabricTheme(theme, dir === 'rtl') }}>{renderedContent}</Customizer> ); } diff --git a/packages/react/src/components/Fabric/Fabric.test.tsx b/packages/react/src/components/Fabric/Fabric.test.tsx index 8b428b5c6eecb8..8f2c71837058e2 100644 --- a/packages/react/src/components/Fabric/Fabric.test.tsx +++ b/packages/react/src/components/Fabric/Fabric.test.tsx @@ -1,4 +1,4 @@ -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ import * as React from 'react'; import { create } from '@fluentui/test-utilities'; //import { Customizer } from '@fluentui/utilities'; diff --git a/packages/react/src/components/Facepile/Facepile.base.tsx b/packages/react/src/components/Facepile/Facepile.base.tsx index bb412e7c22bba2..a082851ab6fe6a 100644 --- a/packages/react/src/components/Facepile/Facepile.base.tsx +++ b/packages/react/src/components/Facepile/Facepile.base.tsx @@ -40,7 +40,7 @@ export class FacepileBase extends React.Component<IFacepileProps, {}> { public render(): JSX.Element { let { overflowButtonProps } = this.props; const { - chevronButtonProps, // eslint-disable-line deprecation/deprecation + chevronButtonProps, // eslint-disable-line @typescript-eslint/no-deprecated maxDisplayablePersonas, personas, overflowPersonas, diff --git a/packages/react/src/components/FloatingPicker/BaseFloatingPicker.tsx b/packages/react/src/components/FloatingPicker/BaseFloatingPicker.tsx index 1e15c290f237d9..4738d7d5a967c7 100644 --- a/packages/react/src/components/FloatingPicker/BaseFloatingPicker.tsx +++ b/packages/react/src/components/FloatingPicker/BaseFloatingPicker.tsx @@ -253,7 +253,7 @@ export class BaseFloatingPicker<T extends {}, P extends IBaseFloatingPickerProps ) { return; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const keyCode = ev.which; switch (keyCode) { case KeyCodes.escape: diff --git a/packages/react/src/components/FloatingPicker/PeoplePicker/PeoplePickerItems/SelectedItemDefault.tsx b/packages/react/src/components/FloatingPicker/PeoplePicker/PeoplePickerItems/SelectedItemDefault.tsx index 7941c82a0c237e..4a7d441ff24df8 100644 --- a/packages/react/src/components/FloatingPicker/PeoplePicker/PeoplePickerItems/SelectedItemDefault.tsx +++ b/packages/react/src/components/FloatingPicker/PeoplePicker/PeoplePickerItems/SelectedItemDefault.tsx @@ -39,7 +39,7 @@ export const SelectedItemDefault: (props: IPeoplePickerItemProps) => JSX.Element <Persona {...item} presence={item.presence !== undefined ? item.presence : PersonaPresence.none} - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated size={PersonaSize.size28} /> </div> diff --git a/packages/react/src/components/FloatingPicker/Suggestions/SuggestionsStore.ts b/packages/react/src/components/FloatingPicker/Suggestions/SuggestionsStore.ts index 893ced2fa91f77..972f279e6da5dd 100644 --- a/packages/react/src/components/FloatingPicker/Suggestions/SuggestionsStore.ts +++ b/packages/react/src/components/FloatingPicker/Suggestions/SuggestionsStore.ts @@ -54,7 +54,7 @@ export class SuggestionsStore<T> { ? this.getAriaLabel(suggestion) : (suggestion as any as ITag).name || (<IPersonaProps>suggestion).text || - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (<IPersonaProps>suggestion).primaryText, }; } diff --git a/packages/react/src/components/FocusTrapZone/FocusTrapZone.tsx b/packages/react/src/components/FocusTrapZone/FocusTrapZone.tsx index 8fa3eabcd97117..e99993f9249e4c 100644 --- a/packages/react/src/components/FocusTrapZone/FocusTrapZone.tsx +++ b/packages/react/src/components/FocusTrapZone/FocusTrapZone.tsx @@ -87,10 +87,10 @@ export const FocusTrapZone: React.FunctionComponent<IFocusTrapZoneProps> & { disableFirstFocus, forceFocusInsideTrap, focusPreviouslyFocusedInnerElement, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated firstFocusableSelector, firstFocusableTarget, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated disableRestoreFocus = props.ignoreExternalFocusing, isClickableOutsideFocusTrap, enableAriaHiddenSiblings, diff --git a/packages/react/src/components/GroupedList/GroupHeader.base.tsx b/packages/react/src/components/GroupedList/GroupHeader.base.tsx index c519260c424ae2..9dbec7301ebc7b 100644 --- a/packages/react/src/components/GroupedList/GroupHeader.base.tsx +++ b/packages/react/src/components/GroupedList/GroupHeader.base.tsx @@ -66,12 +66,13 @@ export class GroupHeaderBase extends React.Component<IGroupHeaderProps, IGroupHe viewport, selectionMode, loadingText, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated isSelected = false, selected = false, indentWidth, onRenderGroupHeaderCheckbox, isCollapsedGroupSelectVisible = true, + // eslint-disable-next-line @typescript-eslint/no-deprecated expandButtonProps, expandButtonIcon, selectAllButtonProps, @@ -210,9 +211,9 @@ export class GroupHeaderBase extends React.Component<IGroupHeaderProps, IGroupHe } if (!ev.defaultPrevented) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const shouldOpen = this.state.isCollapsed && ev.which === getRTLSafeKeyCode(KeyCodes.right, this.props.theme); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const shouldClose = !this.state.isCollapsed && ev.which === getRTLSafeKeyCode(KeyCodes.left, this.props.theme); if (shouldClose || shouldOpen) { this._toggleCollapse(); diff --git a/packages/react/src/components/GroupedList/GroupSpacer.types.ts b/packages/react/src/components/GroupedList/GroupSpacer.types.ts index c8ee753815cf59..09e60e70898b43 100644 --- a/packages/react/src/components/GroupedList/GroupSpacer.types.ts +++ b/packages/react/src/components/GroupedList/GroupSpacer.types.ts @@ -13,7 +13,7 @@ export interface IGroupSpacerProps { /** * @deprecated Unused. Will be removed in \>= 7.0 */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated styles?: IStyleFunctionOrObject<IGroupSpacerStyleProps, IGroupSpacerStyles>; /** Count of spacer(s) */ diff --git a/packages/react/src/components/GroupedList/GroupedList.base.tsx b/packages/react/src/components/GroupedList/GroupedList.base.tsx index 557c8bb695377a..ccc831276d1085 100644 --- a/packages/react/src/components/GroupedList/GroupedList.base.tsx +++ b/packages/react/src/components/GroupedList/GroupedList.base.tsx @@ -356,7 +356,7 @@ export class GroupedListBase extends React.Component<IGroupedListProps, IGrouped }; private _isInnerZoneKeystroke = (ev: React.KeyboardEvent<HTMLElement>): boolean => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return ev.which === getRTLSafeKeyCode(KeyCodes.right); }; diff --git a/packages/react/src/components/GroupedList/GroupedListV2.base.tsx b/packages/react/src/components/GroupedList/GroupedListV2.base.tsx index c146f58278cd67..6ee3a2e130ca76 100644 --- a/packages/react/src/components/GroupedList/GroupedListV2.base.tsx +++ b/packages/react/src/components/GroupedList/GroupedListV2.base.tsx @@ -199,7 +199,7 @@ const setGroupsCollapsedState = (groups: IGroup[] | undefined, isCollapsed: bool }; const isInnerZoneKeystroke = (ev: React.KeyboardEvent<HTMLElement>): boolean => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return ev.which === getRTLSafeKeyCode(KeyCodes.right); }; @@ -285,7 +285,6 @@ export const GroupedListV2FC: React.FC<IGroupedListV2Props> = props => { const [version, setVersion] = React.useState({}); const [toggleVersion, setToggleVersion] = React.useState({}); - // eslint-disable-next-line deprecation/deprecation const { shouldEnterInnerZone = isInnerZoneKeystroke } = focusZoneProps; const listView = React.useMemo(() => { diff --git a/packages/react/src/components/HoverCard/ExpandingCard.base.tsx b/packages/react/src/components/HoverCard/ExpandingCard.base.tsx index b199cb0361d295..3e8ec1a8c373a7 100644 --- a/packages/react/src/components/HoverCard/ExpandingCard.base.tsx +++ b/packages/react/src/components/HoverCard/ExpandingCard.base.tsx @@ -70,7 +70,7 @@ export class ExpandingCardBase extends React.Component<IExpandingCardProps, IExp } private _onKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.escape) { this.props.onLeave && this.props.onLeave(ev); } diff --git a/packages/react/src/components/HoverCard/HoverCard.base.tsx b/packages/react/src/components/HoverCard/HoverCard.base.tsx index 7f93ef0c5283ec..fb059fd0223086 100644 --- a/packages/react/src/components/HoverCard/HoverCard.base.tsx +++ b/packages/react/src/components/HoverCard/HoverCard.base.tsx @@ -193,7 +193,7 @@ export class HoverCardBase extends React.Component<IHoverCardProps, IHoverCardSt // Show HoverCard private _cardOpen = (ev: MouseEvent): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (this._shouldBlockHoverCard() || (ev.type === 'keydown' && !(ev.which === this.props.openHotKey))) { return; } @@ -239,13 +239,13 @@ export class HoverCardBase extends React.Component<IHoverCardProps, IHoverCardSt return; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.type === 'keydown' && ev.which !== KeyCodes.escape) { return; } // Dismiss if not sticky and currentTarget is the same element that mouse last entered - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (!this.props.sticky && (this._currentMouseTarget === ev.currentTarget || ev.which === KeyCodes.escape)) { this.dismiss(true); } diff --git a/packages/react/src/components/HoverCard/PlainCard/PlainCard.base.tsx b/packages/react/src/components/HoverCard/PlainCard/PlainCard.base.tsx index d45d7e4a40205e..3b4e8a1326e88d 100644 --- a/packages/react/src/components/HoverCard/PlainCard/PlainCard.base.tsx +++ b/packages/react/src/components/HoverCard/PlainCard/PlainCard.base.tsx @@ -33,7 +33,7 @@ export class PlainCardBase extends React.Component<IPlainCardProps, {}> { } private _onKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.escape) { this.props.onLeave && this.props.onLeave(ev); } diff --git a/packages/react/src/components/Icon/Icon.base.tsx b/packages/react/src/components/Icon/Icon.base.tsx index 2010c045978299..5e4505ecec16ab 100644 --- a/packages/react/src/components/Icon/Icon.base.tsx +++ b/packages/react/src/components/Icon/Icon.base.tsx @@ -31,7 +31,7 @@ export class IconBase extends React.Component<IIconProps, IIconState> { const { children, className, styles, iconName, imageErrorAs, theme } = this.props; const isPlaceholder = typeof iconName === 'string' && iconName.length === 0; const isImage = - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated !!this.props.imageProps || this.props.iconType === IconType.image || this.props.iconType === IconType.Image; const iconContent = getIconContent(iconName) || {}; const { iconClassName, children: iconContentChildren, mergeImageProps } = iconContent; @@ -55,7 +55,7 @@ export class IconBase extends React.Component<IIconProps, IIconState> { }; const ImageType = (imageLoadError && imageErrorAs) || Image; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const ariaLabel = this.props['aria-label'] || this.props.ariaLabel; const accessibleName = imageProps.alt || ariaLabel || this.props.title; const hasName = !!( diff --git a/packages/react/src/components/Icon/Icon.styles.ts b/packages/react/src/components/Icon/Icon.styles.ts index d7c6c5a4b285e6..f683a57403007b 100644 --- a/packages/react/src/components/Icon/Icon.styles.ts +++ b/packages/react/src/components/Icon/Icon.styles.ts @@ -34,7 +34,7 @@ export const getStyles = (props: IIconStyleProps): IIconStyles => { iconClassName, className, styles && styles.root, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated styles && styles.imageContainer, ], }; diff --git a/packages/react/src/components/Icon/Icon.types.ts b/packages/react/src/components/Icon/Icon.types.ts index c06b7133f2019d..0f6ed6ef687259 100644 --- a/packages/react/src/components/Icon/Icon.types.ts +++ b/packages/react/src/components/Icon/Icon.types.ts @@ -51,7 +51,7 @@ export interface IIconProps extends IBaseProps, React.HTMLAttributes<HTMLElement * The type of icon to render (image or icon font). * @deprecated Inferred based on the presence of `imageProps` */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated iconType?: IconType; /** diff --git a/packages/react/src/components/Keytip/Keytip.styles.ts b/packages/react/src/components/Keytip/Keytip.styles.ts index 1fa198cb8d5912..949f48cd1d020f 100644 --- a/packages/react/src/components/Keytip/Keytip.styles.ts +++ b/packages/react/src/components/Keytip/Keytip.styles.ts @@ -69,9 +69,9 @@ export const getCalloutOffsetStyles = ( return mergeStyleSets(getCalloutStyles(props), { root: [ { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated marginLeft: offset.left || offset.x, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated marginTop: offset.top || offset.y, }, ], diff --git a/packages/react/src/components/Layer/Layer.base.tsx b/packages/react/src/components/Layer/Layer.base.tsx index bb27be81db9ea2..497e29148870c0 100644 --- a/packages/react/src/components/Layer/Layer.base.tsx +++ b/packages/react/src/components/Layer/Layer.base.tsx @@ -79,7 +79,7 @@ export const LayerBase: React.FunctionComponent<ILayerProps> = React.forwardRef< hostId, insertFirst, onLayerDidMount = () => undefined, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onLayerMounted = () => undefined, onLayerWillUnmount, styles, @@ -216,7 +216,7 @@ export const LayerBase: React.FunctionComponent<ILayerProps> = React.forwardRef< {layerRef.current && ReactDOM.createPortal( <FocusRectsProvider layerRoot providerRef={fabricRef}> - {/* eslint-disable deprecation/deprecation */} + {/* eslint-disable @typescript-eslint/no-deprecated */} <Fabric {...(!eventBubblingEnabled && getFilteredEvents())} {...fabricProps} @@ -225,7 +225,7 @@ export const LayerBase: React.FunctionComponent<ILayerProps> = React.forwardRef< > {children} </Fabric> - {/* eslint-enable deprecation/deprecation */} + {/* eslint-enable @typescript-eslint/no-deprecated */} </FocusRectsProvider>, layerRef.current, )} diff --git a/packages/react/src/components/Link/Link.test.tsx b/packages/react/src/components/Link/Link.test.tsx index 853e913af8a7c7..91439b8b7eb3ac 100644 --- a/packages/react/src/components/Link/Link.test.tsx +++ b/packages/react/src/components/Link/Link.test.tsx @@ -96,7 +96,7 @@ describe('Link', () => { expect( /ms-Link($| )/.test( ReactDOM.renderToStaticMarkup( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <Customizer settings={{ theme: NoClassNamesTheme }}> <Link href="helloworld.html">My Link</Link> </Customizer>, diff --git a/packages/react/src/components/MessageBar/MessageBar.base.tsx b/packages/react/src/components/MessageBar/MessageBar.base.tsx index 708771114cce56..e8e6d8731dca75 100644 --- a/packages/react/src/components/MessageBar/MessageBar.base.tsx +++ b/packages/react/src/components/MessageBar/MessageBar.base.tsx @@ -50,7 +50,7 @@ export const MessageBarBase: React.FunctionComponent<IMessageBarProps> = React.f actions, className, children, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated overflowButtonAriaLabel, dismissIconProps, styles, diff --git a/packages/react/src/components/MessageBar/MessageBar.types.ts b/packages/react/src/components/MessageBar/MessageBar.types.ts index 46ca8f89d30b7a..e41a2ed4d72f31 100644 --- a/packages/react/src/components/MessageBar/MessageBar.types.ts +++ b/packages/react/src/components/MessageBar/MessageBar.types.ts @@ -41,7 +41,7 @@ export interface IMessageBarProps extends React.HTMLAttributes<HTMLElement>, Rea * If null, we don't show a dismiss button. * @defaultvalue null */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onDismiss?: (ev?: React.MouseEvent<HTMLElement | BaseButton | Button>) => any; /** diff --git a/packages/react/src/components/Modal/Modal.base.tsx b/packages/react/src/components/Modal/Modal.base.tsx index 627d401fc44e1e..795344ab95720c 100644 --- a/packages/react/src/components/Modal/Modal.base.tsx +++ b/packages/react/src/components/Modal/Modal.base.tsx @@ -105,7 +105,7 @@ export const ModalBase: React.FunctionComponent<IModalProps> = React.forwardRef< firstFocusableSelector, focusTrapZoneProps, forceFocusInsideTrap, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated disableRestoreFocus = props.ignoreExternalFocusing, isBlocking, isAlert, @@ -121,12 +121,12 @@ export const ModalBase: React.FunctionComponent<IModalProps> = React.forwardRef< theme, topOffsetFixed, responsiveMode, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onLayerDidMount, isModeless, dragOptions, onDismissed, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated enableAriaHiddenSiblings, popupProps, } = props; @@ -278,7 +278,7 @@ export const ModalBase: React.FunctionComponent<IModalProps> = React.forwardRef< // We need a global handleKeyDown event when we are in the move mode so that we can // handle the key presses and the components inside the modal do not get the events const handleKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.altKey && ev.ctrlKey && ev.keyCode === KeyCodes.space) { // CTRL + ALT + SPACE is handled during keyUp ev.preventDefault(); @@ -286,13 +286,13 @@ export const ModalBase: React.FunctionComponent<IModalProps> = React.forwardRef< return; } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const newLocal = ev.altKey || ev.keyCode === KeyCodes.escape; if (isModalMenuOpen && newLocal) { setModalMenuClose(); } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (internalState.isInKeyboardMoveMode && (ev.keyCode === KeyCodes.escape || ev.keyCode === KeyCodes.enter)) { internalState.isInKeyboardMoveMode = false; ev.preventDefault(); @@ -303,7 +303,7 @@ export const ModalBase: React.FunctionComponent<IModalProps> = React.forwardRef< let handledEvent = true; const delta = getMoveDelta(ev); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.keyCode) { /* eslint-disable no-fallthrough */ case KeyCodes.escape: @@ -364,7 +364,7 @@ export const ModalBase: React.FunctionComponent<IModalProps> = React.forwardRef< const handleKeyUp = (ev: React.KeyboardEvent<HTMLElement>): void => { // Needs to handle the CTRL + ALT + SPACE key during keyup due to FireFox bug: // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143 - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.altKey && ev.ctrlKey && ev.keyCode === KeyCodes.space) { if (elementContains(internalState.scrollableContent, ev.target as HTMLElement)) { toggleModalMenuOpen(); @@ -433,7 +433,7 @@ export const ModalBase: React.FunctionComponent<IModalProps> = React.forwardRef< } disableRestoreFocus={focusTrapZoneProps?.disableRestoreFocus ?? disableRestoreFocus} forceFocusInsideTrap={(focusTrapZoneProps?.forceFocusInsideTrap ?? forceFocusInsideTrap) && !isModeless} - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated firstFocusableSelector={focusTrapZoneProps?.firstFocusableSelector || firstFocusableSelector} focusPreviouslyFocusedInnerElement={focusTrapZoneProps?.focusPreviouslyFocusedInnerElement ?? true} onBlur={internalState.isInKeyboardMoveMode ? handleExitKeyboardMoveMode : undefined} diff --git a/packages/react/src/components/Modal/Modal.styles.ts b/packages/react/src/components/Modal/Modal.styles.ts index 574c85d2202d07..6094cd02d63c16 100644 --- a/packages/react/src/components/Modal/Modal.styles.ts +++ b/packages/react/src/components/Modal/Modal.styles.ts @@ -116,7 +116,7 @@ export const getStyles = (props: IModalStyleProps): IModalStyles => { padding: '3px 0px', }, keyboardMoveIcon: { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated fontSize: fonts.xLargePlus.fontSize, width: '24px', }, diff --git a/packages/react/src/components/Nav/Nav.base.tsx b/packages/react/src/components/Nav/Nav.base.tsx index 189df5ae062ec9..1eff274bd87165 100644 --- a/packages/react/src/components/Nav/Nav.base.tsx +++ b/packages/react/src/components/Nav/Nav.base.tsx @@ -148,7 +148,7 @@ export class NavBase extends React.Component<INavProps, INavState> implements IN private _renderCompositeLink(link: INavLink, linkIndex: number, nestingLevel: number): React.ReactElement<{}> { const divProps: React.HTMLProps<HTMLDivElement> = { ...getNativeProps(link, divProperties, ['onClick']) }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { expandButtonAriaLabel, styles, groups, theme } = this.props; const classNames = getClassNames(styles!, { theme: theme!, @@ -254,7 +254,7 @@ export class NavBase extends React.Component<INavProps, INavState> implements IN }; private _renderGroupHeader = (group: IRenderGroupHeaderProps): React.ReactElement<{}> => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { styles, groups, theme, expandButtonAriaLabel } = this.props; const { isExpanded } = group; @@ -267,7 +267,7 @@ export class NavBase extends React.Component<INavProps, INavState> implements IN }); // respect deprecated collapseAriaLabel, but default to expandAriaLabel for both states - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const collapseAriaLabel = group.collapseAriaLabel ?? group.expandAriaLabel; const label = (isExpanded ? collapseAriaLabel : group.expandAriaLabel) || expandButtonAriaLabel; diff --git a/packages/react/src/components/Panel/Panel.base.tsx b/packages/react/src/components/Panel/Panel.base.tsx index cf1ab7e072740f..527285aa738ab5 100644 --- a/packages/react/src/components/Panel/Panel.base.tsx +++ b/packages/react/src/components/Panel/Panel.base.tsx @@ -157,7 +157,7 @@ export class PanelBase extends React.Component<IPanelProps, IPanelState> impleme const { className = '', elementToFocusOnDismiss, - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ firstFocusableSelector, focusTrapZoneProps, forceFocusInsideTrap, diff --git a/packages/react/src/components/Persona/Persona.base.tsx b/packages/react/src/components/Persona/Persona.base.tsx index 92bf285c051bfb..9a5086b9935328 100644 --- a/packages/react/src/components/Persona/Persona.base.tsx +++ b/packages/react/src/components/Persona/Persona.base.tsx @@ -44,7 +44,7 @@ export const PersonaBase: React.FunctionComponent<IPersonaProps> = React.forward * Deprecation helper for getting text. */ const getText = (): string => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return props.text || props.primaryText || ''; }; @@ -130,7 +130,7 @@ export const PersonaBase: React.FunctionComponent<IPersonaProps> = React.forward initialsTextColor, isOutOfOffice, onPhotoLoadingStateChange, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onRenderCoin, onRenderInitials, presence, @@ -192,14 +192,14 @@ export const PersonaBase: React.FunctionComponent<IPersonaProps> = React.forward > {onRenderPersonaCoin(personaCoinProps, onRenderPersonaCoin)} { - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ (!hidePersonaDetails || size === PersonaSize.size8 || size === PersonaSize.size10 || size === PersonaSize.tiny) && personaDetails - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ } </div> ); diff --git a/packages/react/src/components/Persona/PersonaCoin/PersonaCoin.base.tsx b/packages/react/src/components/Persona/PersonaCoin/PersonaCoin.base.tsx index d9444f3443acc5..5fdd51988bed2d 100644 --- a/packages/react/src/components/Persona/PersonaCoin/PersonaCoin.base.tsx +++ b/packages/react/src/components/Persona/PersonaCoin/PersonaCoin.base.tsx @@ -106,15 +106,15 @@ export const PersonaCoinBase: React.FunctionComponent<IPersonaCoinProps> = React initialsColor, initialsTextColor, isOutOfOffice, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onRenderCoin = renderCoin, - // eslint-disable-next-line deprecation/deprecation + onRenderPersonaCoin = onRenderCoin, onRenderInitials = renderPersonaCoinInitials, presence, presenceTitle, presenceColors, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated primaryText, showInitialsUntilImageLoads, text, @@ -155,7 +155,7 @@ export const PersonaCoinBase: React.FunctionComponent<IPersonaCoinProps> = React <div role="presentation" {...divProps} className={classNames.coin} ref={forwardedRef}> { // Render PersonaCoin if size is not size8. size10 and tiny need to removed after a deprecation cleanup. - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated size !== PersonaSize.size8 && size !== PersonaSize.size10 && size !== PersonaSize.tiny ? ( <div role="presentation" {...divCoinProps} className={classNames.imageArea} style={coinSizeStyle}> {shouldRenderInitials && ( @@ -234,7 +234,7 @@ const renderPersonaCoinInitials = ({ allowPhoneInitials, showUnknownPersonaCoin, text, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated primaryText, theme, }: IPersonaCoinProps): JSX.Element => { diff --git a/packages/react/src/components/Persona/PersonaConsts.tsx b/packages/react/src/components/Persona/PersonaConsts.tsx index 325fc33468c915..6376682b9e9615 100644 --- a/packages/react/src/components/Persona/PersonaConsts.tsx +++ b/packages/react/src/components/Persona/PersonaConsts.tsx @@ -38,7 +38,7 @@ export namespace personaPresenceSize { // TODO: remove the deprecated parts in a future major release. export const sizeBoolean = (size: PersonaSize) => ({ isSize8: size === PersonaSize.size8, - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ isSize10: size === PersonaSize.size10 || size === PersonaSize.tiny, isSize16: size === PersonaSize.size16, isSize24: size === PersonaSize.size24 || size === PersonaSize.extraExtraSmall, @@ -67,7 +67,7 @@ export const sizeToPixels: { [key: number]: number } = { [PersonaSize.size16]: 16, // TODO: deprecated (not in the design specs) [PersonaSize.size24]: 24, [PersonaSize.size28]: 28, // TODO: deprecated (not in the design specs) - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ [PersonaSize.size32]: 32, [PersonaSize.size40]: 40, [PersonaSize.size48]: 48, diff --git a/packages/react/src/components/Persona/PersonaInitialsColor.ts b/packages/react/src/components/Persona/PersonaInitialsColor.ts index f5fe9c45f87656..c16169c8497995 100644 --- a/packages/react/src/components/Persona/PersonaInitialsColor.ts +++ b/packages/react/src/components/Persona/PersonaInitialsColor.ts @@ -77,7 +77,7 @@ function personaInitialsColorToHexCode(personaInitialsColor: PersonaInitialsColo return '#5C2E91'; case PersonaInitialsColor.orange: return '#CA5010'; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated case PersonaInitialsColor.red: return '#EE1111'; case PersonaInitialsColor.lightRed: @@ -100,7 +100,7 @@ function personaInitialsColorToHexCode(personaInitialsColor: PersonaInitialsColo return '#8E562E'; case PersonaInitialsColor.coolGray: return '#69797E'; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated case PersonaInitialsColor.black: return '#1D1D1D'; case PersonaInitialsColor.gray: @@ -120,7 +120,7 @@ export function initialsColorPropToColorCode(props: IPersonaProps): string { * @returns Hex color string prefixed with # */ export function getPersonaInitialsColor(props: Pick<IPersonaProps, 'primaryText' | 'text' | 'initialsColor'>): string { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { primaryText, text } = props; let { initialsColor } = props; let initialsColorCode: string; diff --git a/packages/react/src/components/Pivot/Pivot.base.tsx b/packages/react/src/components/Pivot/Pivot.base.tsx index 9f62ca73599905..70d18af3bc30aa 100644 --- a/packages/react/src/components/Pivot/Pivot.base.tsx +++ b/packages/react/src/components/Pivot/Pivot.base.tsx @@ -41,7 +41,7 @@ const getLinkItems = (props: IPivotProps, pivotId: string): PivotLinkCollection React.Children.forEach(React.Children.toArray(props.children), (child: React.ReactNode, index: number) => { if (isPivotItem(child)) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { linkText, ...pivotItemProps } = child.props; const itemKey = child.props.itemKey || index.toString(); result.links.push({ @@ -177,7 +177,7 @@ export const PivotBase: React.FunctionComponent<IPivotProps> = React.forwardRef< }; const onKeyDown = (itemKey: string, ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { ev.preventDefault(); updateSelectedItem(itemKey); diff --git a/packages/react/src/components/Popup/Popup.tsx b/packages/react/src/components/Popup/Popup.tsx index a55f2e0ab4de38..6d035cb80aecff 100644 --- a/packages/react/src/components/Popup/Popup.tsx +++ b/packages/react/src/components/Popup/Popup.tsx @@ -123,7 +123,7 @@ function useRestoreFocus(props: IPopupProps, root: React.RefObject<HTMLDivElemen } function useHideSiblingNodes(props: IPopupProps, root: React.RefObject<HTMLDivElement | undefined>) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const shouldHideSiblings = String(props['aria-modal']).toLowerCase() === 'true' && props.enableAriaHiddenSiblings; React.useEffect(() => { @@ -157,7 +157,7 @@ export const Popup: React.FunctionComponent<IPopupProps> = React.forwardRef<HTML const onKeyDown = React.useCallback( (ev: React.KeyboardEvent<HTMLElement> | KeyboardEvent): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.escape: if (onDismiss) { diff --git a/packages/react/src/components/ProgressIndicator/ProgressIndicator.base.tsx b/packages/react/src/components/ProgressIndicator/ProgressIndicator.base.tsx index fe8573e7780827..1e38e297b1471e 100644 --- a/packages/react/src/components/ProgressIndicator/ProgressIndicator.base.tsx +++ b/packages/react/src/components/ProgressIndicator/ProgressIndicator.base.tsx @@ -38,7 +38,7 @@ export class ProgressIndicatorBase extends React.Component<IProgressIndicatorPro const { barHeight, className, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated label = this.props.title, // Fall back to deprecated value. description, styles, @@ -91,7 +91,7 @@ export class ProgressIndicatorBase extends React.Component<IProgressIndicatorPro barHeight, className, description, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated label = this.props.title, styles, theme, diff --git a/packages/react/src/components/Rating/Rating.base.tsx b/packages/react/src/components/Rating/Rating.base.tsx index 09f69fba190e00..a1c2573c007ee6 100644 --- a/packages/react/src/components/Rating/Rating.base.tsx +++ b/packages/react/src/components/Rating/Rating.base.tsx @@ -92,7 +92,7 @@ export const RatingBase: React.FunctionComponent<IRatingProps> = React.forwardRe disabled, getAriaLabel, styles, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated min: minFromProps = props.allowZeroStars ? 0 : 1, max = 5, readOnly, @@ -146,7 +146,7 @@ export const RatingBase: React.FunctionComponent<IRatingProps> = React.forwardRe }; const onStarKeyDown = (event: React.KeyboardEvent<HTMLButtonElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { which } = event; let newRating = starNum; switch (which) { diff --git a/packages/react/src/components/SearchBox/SearchBox.base.tsx b/packages/react/src/components/SearchBox/SearchBox.base.tsx index 6113e66fde8a0e..6a7cb27d61ca6e 100644 --- a/packages/react/src/components/SearchBox/SearchBox.base.tsx +++ b/packages/react/src/components/SearchBox/SearchBox.base.tsx @@ -41,9 +41,9 @@ export const SearchBoxBase: React.FunctionComponent<ISearchBoxProps> = React.for disabled, underlined, styles, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated labelText, - // eslint-disable-next-line deprecation/deprecation + placeholder = labelText, theme, clearButtonProps = defaultClearButtonProps, @@ -57,7 +57,7 @@ export const SearchBoxBase: React.FunctionComponent<ISearchBoxProps> = React.for iconProps, role, onChange, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onChanged, } = props; @@ -156,7 +156,7 @@ export const SearchBoxBase: React.FunctionComponent<ISearchBoxProps> = React.for }; const onKeyDown = (ev: React.KeyboardEvent<HTMLInputElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.escape: customOnEscape?.(ev); diff --git a/packages/react/src/components/SelectedItemsList/BaseSelectedItemsList.tsx b/packages/react/src/components/SelectedItemsList/BaseSelectedItemsList.tsx index 45391a414cc160..bd5e3dc7a13838 100644 --- a/packages/react/src/components/SelectedItemsList/BaseSelectedItemsList.tsx +++ b/packages/react/src/components/SelectedItemsList/BaseSelectedItemsList.tsx @@ -225,7 +225,7 @@ export class BaseSelectedItemsList<T extends {}, P extends IBaseSelectedItemsLis // Try to copy the text directly to the clipboard copyInput.value = copyText; copyInput.select(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (!doc.execCommand('copy')) { // The command failed. Fallback to the method below. throw new Error(); diff --git a/packages/react/src/components/SelectedItemsList/SelectedPeopleList/Items/EditingItem.tsx b/packages/react/src/components/SelectedItemsList/SelectedPeopleList/Items/EditingItem.tsx index a2d4b68ae27a03..837bbdfc24ec3b 100644 --- a/packages/react/src/components/SelectedItemsList/SelectedPeopleList/Items/EditingItem.tsx +++ b/packages/react/src/components/SelectedItemsList/SelectedPeopleList/Items/EditingItem.tsx @@ -116,7 +116,7 @@ export class EditingItem extends React.Component<IEditingSelectedPeopleItemProps }; private _onInputKeyDown(ev: React.KeyboardEvent<HTMLInputElement>): void { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.backspace || ev.which === KeyCodes.del) { ev.stopPropagation(); } diff --git a/packages/react/src/components/Shimmer/ShimmerCircle/ShimmerCircle.base.tsx b/packages/react/src/components/Shimmer/ShimmerCircle/ShimmerCircle.base.tsx index 1c0185c4bd4438..f47d36a9ad13e5 100644 --- a/packages/react/src/components/Shimmer/ShimmerCircle/ShimmerCircle.base.tsx +++ b/packages/react/src/components/Shimmer/ShimmerCircle/ShimmerCircle.base.tsx @@ -5,7 +5,7 @@ import type { IShimmerCircleProps, IShimmerCircleStyleProps, IShimmerCircleStyle const getClassNames = classNamesFunction<IShimmerCircleStyleProps, IShimmerCircleStyles>(); export const ShimmerCircleBase: React.FunctionComponent<IShimmerCircleProps> = props => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { height, styles, borderStyle, theme } = props; const classNames = getClassNames(styles!, { theme: theme!, diff --git a/packages/react/src/components/Shimmer/ShimmerCircle/ShimmerCircle.styles.ts b/packages/react/src/components/Shimmer/ShimmerCircle/ShimmerCircle.styles.ts index 590bbfc3e61ef7..f8fe47cfe5a5ee 100644 --- a/packages/react/src/components/Shimmer/ShimmerCircle/ShimmerCircle.styles.ts +++ b/packages/react/src/components/Shimmer/ShimmerCircle/ShimmerCircle.styles.ts @@ -8,7 +8,7 @@ const GlobalClassNames = { }; export function getStyles(props: IShimmerCircleStyleProps): IShimmerCircleStyles { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { height, borderStyle, theme } = props; const { semanticColors } = theme; diff --git a/packages/react/src/components/Shimmer/ShimmerGap/ShimmerGap.base.tsx b/packages/react/src/components/Shimmer/ShimmerGap/ShimmerGap.base.tsx index 08b0b83fa88e0f..2d75b1da5c8d4f 100644 --- a/packages/react/src/components/Shimmer/ShimmerGap/ShimmerGap.base.tsx +++ b/packages/react/src/components/Shimmer/ShimmerGap/ShimmerGap.base.tsx @@ -8,7 +8,7 @@ const getClassNames = classNamesFunction<IShimmerGapStyleProps, IShimmerGapStyle * {@docCategory Shimmer} */ export const ShimmerGapBase: React.FunctionComponent<IShimmerGapProps> = props => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { height, styles, width = '10px', borderStyle, theme } = props; const classNames = getClassNames(styles!, { diff --git a/packages/react/src/components/Shimmer/ShimmerGap/ShimmerGap.styles.ts b/packages/react/src/components/Shimmer/ShimmerGap/ShimmerGap.styles.ts index d9d1ae91ff1a19..cf8dbddba30dd0 100644 --- a/packages/react/src/components/Shimmer/ShimmerGap/ShimmerGap.styles.ts +++ b/packages/react/src/components/Shimmer/ShimmerGap/ShimmerGap.styles.ts @@ -7,7 +7,7 @@ const GlobalClassNames = { }; export function getStyles(props: IShimmerGapStyleProps): IShimmerGapStyles { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { height, borderStyle, theme } = props; const { semanticColors } = theme; diff --git a/packages/react/src/components/Shimmer/ShimmerLine/ShimmerLine.base.tsx b/packages/react/src/components/Shimmer/ShimmerLine/ShimmerLine.base.tsx index 511e6c8634cc16..2d3e1bd6285058 100644 --- a/packages/react/src/components/Shimmer/ShimmerLine/ShimmerLine.base.tsx +++ b/packages/react/src/components/Shimmer/ShimmerLine/ShimmerLine.base.tsx @@ -8,7 +8,7 @@ const getClassNames = classNamesFunction<IShimmerLineStyleProps, IShimmerLineSty * {@docCategory Shimmer} */ export const ShimmerLineBase: React.FunctionComponent<IShimmerLineProps> = props => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { height, styles, width = '100%', borderStyle, theme } = props; const classNames = getClassNames(styles!, { diff --git a/packages/react/src/components/Shimmer/ShimmerLine/ShimmerLine.styles.ts b/packages/react/src/components/Shimmer/ShimmerLine/ShimmerLine.styles.ts index e4096b4831f661..aab86f77cb1686 100644 --- a/packages/react/src/components/Shimmer/ShimmerLine/ShimmerLine.styles.ts +++ b/packages/react/src/components/Shimmer/ShimmerLine/ShimmerLine.styles.ts @@ -11,7 +11,7 @@ const GlobalClassNames = { }; export function getStyles(props: IShimmerLineStyleProps): IShimmerLineStyles { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { height, borderStyle, theme } = props; const { semanticColors } = theme; diff --git a/packages/react/src/components/Slider/useSlider.ts b/packages/react/src/components/Slider/useSlider.ts index bdb30715087204..e72d0f4eaa5af6 100644 --- a/packages/react/src/components/Slider/useSlider.ts +++ b/packages/react/src/components/Slider/useSlider.ts @@ -216,7 +216,7 @@ export const useSlider = (props: ISliderProps, ref: React.ForwardedRef<HTMLDivEl ? internalState.latestLowerValue : internalState.latestValue; let diff = 0; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (event.which) { case getRTLSafeKeyCode(KeyCodes.left, props.theme): case KeyCodes.down: @@ -266,7 +266,7 @@ export const useSlider = (props: ISliderProps, ref: React.ForwardedRef<HTMLDivEl }; const calculateCurrentSteps = (event: DragChangeEvent) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const sliderPositionRect: ClientRect = sliderLine.current!.getBoundingClientRect(); const sliderLength: number = !props.vertical ? sliderPositionRect.width : sliderPositionRect.height; const stepLength: number = sliderLength / steps; diff --git a/packages/react/src/components/SpinButton/SpinButton.base.tsx b/packages/react/src/components/SpinButton/SpinButton.base.tsx index 5fc5c254c85b73..816d0a275931d5 100644 --- a/packages/react/src/components/SpinButton/SpinButton.base.tsx +++ b/packages/react/src/components/SpinButton/SpinButton.base.tsx @@ -345,7 +345,7 @@ export const SpinButtonBase: React.FunctionComponent<ISpinButtonProps> = React.f const handleKeyDown = (ev: React.KeyboardEvent<HTMLInputElement>): void => { // eat the up and down arrow keys to keep focus in the spinButton // (especially when a spinButton is inside of a FocusZone) - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.up || ev.which === KeyCodes.down || ev.which === KeyCodes.enter) { ev.preventDefault(); ev.stopPropagation(); @@ -357,7 +357,7 @@ export const SpinButtonBase: React.FunctionComponent<ISpinButtonProps> = React.f let spinDirection = KeyboardSpinDirection.notSpinning; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.up: spinDirection = KeyboardSpinDirection.up; @@ -386,7 +386,7 @@ export const SpinButtonBase: React.FunctionComponent<ISpinButtonProps> = React.f /** Stop spinning on keyUp if the up or down arrow key fired this event */ const handleKeyUp = React.useCallback( (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (disabled || ev.which === KeyCodes.up || ev.which === KeyCodes.down) { stop(); return; diff --git a/packages/react/src/components/SpinButton/SpinButton.test.tsx b/packages/react/src/components/SpinButton/SpinButton.test.tsx index 2c2f3023494586..1715d792d89359 100644 --- a/packages/react/src/components/SpinButton/SpinButton.test.tsx +++ b/packages/react/src/components/SpinButton/SpinButton.test.tsx @@ -696,7 +696,7 @@ describe('SpinButton', () => { const onChange = jest.fn(); let keyCode: number | undefined; const onValidate = jest.fn((value: string, event?: React.SyntheticEvent) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated keyCode = (event as React.KeyboardEvent).which; return value; }); diff --git a/packages/react/src/components/Spinner/Spinner.base.tsx b/packages/react/src/components/Spinner/Spinner.base.tsx index 710ddf11a44794..81ba20450cff1c 100644 --- a/packages/react/src/components/Spinner/Spinner.base.tsx +++ b/packages/react/src/components/Spinner/Spinner.base.tsx @@ -13,7 +13,7 @@ export class SpinnerBase extends React.Component<ISpinnerProps, any> { }; public render() { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { type, size, ariaLabel, ariaLive, styles, label, theme, className, labelPosition } = this.props; const statusMessage = ariaLabel; const nativeProps = getNativeProps<React.HTMLAttributes<HTMLDivElement>>(this.props, divProperties, ['size']); @@ -23,7 +23,7 @@ export class SpinnerBase extends React.Component<ISpinnerProps, any> { // finally goes away we should delete this. let styleSize = size; if (styleSize === undefined && type !== undefined) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated styleSize = type === SpinnerType.large ? SpinnerSize.large : SpinnerSize.medium; } diff --git a/packages/react/src/components/Spinner/Spinner.types.ts b/packages/react/src/components/Spinner/Spinner.types.ts index 14800c32c87b6f..eb7e36666ff8fa 100644 --- a/packages/react/src/components/Spinner/Spinner.types.ts +++ b/packages/react/src/components/Spinner/Spinner.types.ts @@ -21,7 +21,7 @@ export interface ISpinnerProps extends React.HTMLAttributes<HTMLElement> { /** * @deprecated Use `size` instead. Will be removed at \>= 2.0.0. */ - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated type?: SpinnerType; /** diff --git a/packages/react/src/components/Stack/Stack.styles.ts b/packages/react/src/components/Stack/Stack.styles.ts index 0a2c8b5d9fe298..ee2346a6fcd44a 100644 --- a/packages/react/src/components/Stack/Stack.styles.ts +++ b/packages/react/src/components/Stack/Stack.styles.ts @@ -30,12 +30,12 @@ export const styles: IStackComponent['styles'] = (props, theme, tokens): IStackS const classNames = getGlobalClassNames(GlobalClassNames, theme); - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ const childrenGap = tokens && tokens.childrenGap ? tokens.childrenGap : props.gap; const maxHeight = tokens && tokens.maxHeight ? tokens.maxHeight : props.maxHeight; const maxWidth = tokens && tokens.maxWidth ? tokens.maxWidth : props.maxWidth; const padding = tokens && tokens.padding ? tokens.padding : props.padding; - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ const { rowGap, columnGap } = parseGap(childrenGap, theme); diff --git a/packages/react/src/components/Stack/Stack.test.tsx b/packages/react/src/components/Stack/Stack.test.tsx index e18f76beda414f..998dd3d46b6536 100644 --- a/packages/react/src/components/Stack/Stack.test.tsx +++ b/packages/react/src/components/Stack/Stack.test.tsx @@ -202,7 +202,7 @@ describe('Stack', () => { it('renders horizontal Stack with a gap in rtl context correctly', () => { const component = renderer.create( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <Fabric dir="rtl"> <Stack horizontal tokens={{ childrenGap: 10 }}> <Stack.Item>Item 1</Stack.Item> diff --git a/packages/react/src/components/Stack/Stack.tsx b/packages/react/src/components/Stack/Stack.tsx index 259f45c7a26fce..30cf4eaea89e5f 100644 --- a/packages/react/src/components/Stack/Stack.tsx +++ b/packages/react/src/components/Stack/Stack.tsx @@ -13,7 +13,7 @@ const StackView: IStackComponent['view'] = props => { const { as: RootType = 'div', disableShrink = false, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated doNotRenderFalsyValues = false, enableScopedSelectors = false, wrap, diff --git a/packages/react/src/components/SwatchColorPicker/ColorPickerGridCell.base.tsx b/packages/react/src/components/SwatchColorPicker/ColorPickerGridCell.base.tsx index 1b7f5b957e787e..5c023c190d3de8 100644 --- a/packages/react/src/components/SwatchColorPicker/ColorPickerGridCell.base.tsx +++ b/packages/react/src/components/SwatchColorPicker/ColorPickerGridCell.base.tsx @@ -67,7 +67,7 @@ const getColorPickerGridCellButtonClassNames = memoizeFunction( export const ColorPickerGridCellBase: React.FunctionComponent<IColorPickerGridCellProps> = props => { const { item, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated idPrefix = props.id, isRadio, selected = false, diff --git a/packages/react/src/components/SwatchColorPicker/SwatchColorPicker.base.tsx b/packages/react/src/components/SwatchColorPicker/SwatchColorPicker.base.tsx index d2aaaa6ba45532..8aba7a3b805877 100644 --- a/packages/react/src/components/SwatchColorPicker/SwatchColorPicker.base.tsx +++ b/packages/react/src/components/SwatchColorPicker/SwatchColorPicker.base.tsx @@ -68,7 +68,7 @@ export const SwatchColorPickerBase: React.FunctionComponent<ISwatchColorPickerPr focusOnHover, mouseLeaveParentSelector, onChange, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onColorChanged, onCellHovered, onCellFocused, @@ -285,13 +285,13 @@ export const SwatchColorPickerBase: React.FunctionComponent<ISwatchColorPickerPr const onKeyDown = React.useCallback( (ev: React.KeyboardEvent<HTMLButtonElement>): void => { if ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.which === KeyCodes.up || - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.which === KeyCodes.down || - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.which === KeyCodes.left || - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.which === KeyCodes.right ) { setNavigationTimeout(); diff --git a/packages/react/src/components/TeachingBubble/TeachingBubble.base.tsx b/packages/react/src/components/TeachingBubble/TeachingBubble.base.tsx index f50adf04ac1978..a3105f614d053f 100644 --- a/packages/react/src/components/TeachingBubble/TeachingBubble.base.tsx +++ b/packages/react/src/components/TeachingBubble/TeachingBubble.base.tsx @@ -44,10 +44,10 @@ export const TeachingBubbleBase: React.FunctionComponent<ITeachingBubbleProps> = const mergedRootRef = useMergedRefs(rootElementRef, forwardedRef); const { calloutProps: setCalloutProps, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated targetElement, onDismiss, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated hasCloseButton = props.hasCloseIcon, isWide, styles, diff --git a/packages/react/src/components/TeachingBubble/TeachingBubbleContent.base.tsx b/packages/react/src/components/TeachingBubble/TeachingBubbleContent.base.tsx index e25d246f429de3..b30cb0ca199ead 100644 --- a/packages/react/src/components/TeachingBubble/TeachingBubbleContent.base.tsx +++ b/packages/react/src/components/TeachingBubble/TeachingBubbleContent.base.tsx @@ -48,7 +48,7 @@ export const TeachingBubbleContentBase: React.FunctionComponent<ITeachingBubbleP secondaryButtonProps, headline, hasCondensedHeadline, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated hasCloseButton = props.hasCloseIcon, onDismiss, closeButtonAriaLabel, @@ -74,7 +74,7 @@ export const TeachingBubbleContentBase: React.FunctionComponent<ITeachingBubbleP const onKeyDown = React.useCallback( (ev: React.KeyboardEvent<HTMLElement> | KeyboardEvent): void => { if (onDismiss) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.escape) { onDismiss(ev); } diff --git a/packages/react/src/components/TextField/MaskedTextField/MaskedTextField.tsx b/packages/react/src/components/TextField/MaskedTextField/MaskedTextField.tsx index d9108ab0c4c9e9..d978282b2177b4 100644 --- a/packages/react/src/components/TextField/MaskedTextField/MaskedTextField.tsx +++ b/packages/react/src/components/TextField/MaskedTextField/MaskedTextField.tsx @@ -221,7 +221,7 @@ export const MaskedTextField: React.FunctionComponent<IMaskedTextFieldProps> = R const charsSelected = selectionEnd - selectionStart; const charCount = inputValue.length + charsSelected - displayValue.length; const startPos = selectionStart; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const pastedString = inputValue.substr(startPos, charCount); // Clear any selected characters @@ -252,7 +252,7 @@ export const MaskedTextField: React.FunctionComponent<IMaskedTextFieldProps> = R // This case is if the user added characters const charCount = inputValue.length - displayValue.length; const startPos = selectionEnd - charCount; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const enteredString = inputValue.substr(startPos, charCount); cursorPos = insertString(internalState.maskCharData, startPos, enteredString); @@ -264,7 +264,7 @@ export const MaskedTextField: React.FunctionComponent<IMaskedTextFieldProps> = R const charCount = 1; const selectCount = displayValue.length + charCount - inputValue.length; const startPos = selectionEnd - charCount; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const enteredString = inputValue.substr(startPos, charCount); // Clear the selected range @@ -292,7 +292,7 @@ export const MaskedTextField: React.FunctionComponent<IMaskedTextFieldProps> = R internalState.changeSelectionData = null; if (textField.current && textField.current.value) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const { keyCode, ctrlKey, metaKey } = ev; // Ignore ctrl and meta keydown diff --git a/packages/react/src/components/TextField/TextField.base.tsx b/packages/react/src/components/TextField/TextField.base.tsx index 36395f784bd3ae..5b7625ce812c43 100644 --- a/packages/react/src/components/TextField/TextField.base.tsx +++ b/packages/react/src/components/TextField/TextField.base.tsx @@ -246,7 +246,7 @@ export class TextFieldBase })); return ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <div ref={this.props.elementRef} className={classNames.root}> <div className={classNames.wrapper}> {onRenderLabel(this.props, this._onRenderLabel)} diff --git a/packages/react/src/components/TimePicker/TimePicker.tsx b/packages/react/src/components/TimePicker/TimePicker.tsx index aafe9edf8f7eba..473d207f1ea8ce 100644 --- a/packages/react/src/components/TimePicker/TimePicker.tsx +++ b/packages/react/src/components/TimePicker/TimePicker.tsx @@ -191,7 +191,7 @@ export const TimePicker: React.FunctionComponent<ITimePickerProps> = ({ ); const evaluatePressedKey = (event: React.KeyboardEvent<IComboBox>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const charCode = event.charCode; if ( !onFormatDate && diff --git a/packages/react/src/components/Toggle/Toggle.base.tsx b/packages/react/src/components/Toggle/Toggle.base.tsx index c5413d9f06e138..1d0ed33e5b9d0e 100644 --- a/packages/react/src/components/Toggle/Toggle.base.tsx +++ b/packages/react/src/components/Toggle/Toggle.base.tsx @@ -19,13 +19,13 @@ export const ToggleBase: React.FunctionComponent<IToggleProps> = React.forwardRe disabled, inlineLabel, label, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated offAriaLabel, offText, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onAriaLabel, onChange, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated onChanged, onClick: onToggleClick, onText, diff --git a/packages/react/src/components/Tooltip/TooltipHost.base.tsx b/packages/react/src/components/Tooltip/TooltipHost.base.tsx index b769ccafd20edd..966fc56845d877 100644 --- a/packages/react/src/components/Tooltip/TooltipHost.base.tsx +++ b/packages/react/src/components/Tooltip/TooltipHost.base.tsx @@ -67,7 +67,7 @@ export class TooltipHostBase extends React.Component<ITooltipHostProps, ITooltip directionalHintForRTL, hostClassName: className, id, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated setAriaDescribedBy = true, tooltipProps, styles, @@ -261,7 +261,7 @@ export class TooltipHostBase extends React.Component<ITooltipHostProps, ITooltip }; private _onTooltipKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if ((ev.which === KeyCodes.escape || ev.ctrlKey) && this.state.isTooltipVisible) { this._hideTooltip(); ev.stopPropagation(); diff --git a/packages/react/src/components/WeeklyDayPicker/WeeklyDayPicker.base.tsx b/packages/react/src/components/WeeklyDayPicker/WeeklyDayPicker.base.tsx index 59379d5241fccf..986fc13dfd078c 100644 --- a/packages/react/src/components/WeeklyDayPicker/WeeklyDayPicker.base.tsx +++ b/packages/react/src/components/WeeklyDayPicker/WeeklyDayPicker.base.tsx @@ -280,7 +280,7 @@ export class WeeklyDayPickerBase extends React.Component<IWeeklyDayPickerProps, }; private _onWrapperKeyDown = (ev: React.KeyboardEvent<HTMLElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: ev.preventDefault(); @@ -297,7 +297,7 @@ export class WeeklyDayPickerBase extends React.Component<IWeeklyDayPickerProps, private _onButtonKeyDown = (callback: () => void): ((ev: React.KeyboardEvent<HTMLButtonElement>) => void) => { return (ev: React.KeyboardEvent<HTMLButtonElement>) => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.enter: callback(); diff --git a/packages/react/src/components/pickers/BasePicker.tsx b/packages/react/src/components/pickers/BasePicker.tsx index 2bf94ebfddb693..f9a15be205724e 100644 --- a/packages/react/src/components/pickers/BasePicker.tsx +++ b/packages/react/src/components/pickers/BasePicker.tsx @@ -119,7 +119,7 @@ export class BasePicker<T extends {}, P extends IBasePickerProps<T>> protected SuggestionOfProperType = Suggestions as new (props: ISuggestionsProps<T>) => Suggestions<T>; protected currentPromise: PromiseLike<any> | undefined; protected _ariaMap: IPickerAriaIds; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated private _styledSuggestions = getStyledSuggestions(this.SuggestionOfProperType); private _id: string; private _async: Async; @@ -527,7 +527,7 @@ export class BasePicker<T extends {}, P extends IBasePickerProps<T>> protected onEmptyInputFocus() { const emptyResolveSuggestions = this.props.onEmptyResolveSuggestions ? this.props.onEmptyResolveSuggestions - : // eslint-disable-next-line deprecation/deprecation + : // eslint-disable-next-line @typescript-eslint/no-deprecated this.props.onEmptyInputFocus; // Only attempt to resolve suggestions if it exists @@ -706,7 +706,7 @@ export class BasePicker<T extends {}, P extends IBasePickerProps<T>> }; protected onKeyDown = (ev: React.KeyboardEvent<HTMLElement>): void => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const keyCode = ev.which; switch (keyCode) { case KeyCodes.escape: @@ -954,7 +954,7 @@ export class BasePicker<T extends {}, P extends IBasePickerProps<T>> protected _shouldFocusZoneEnterInnerZone = (ev: React.KeyboardEvent<HTMLElement>): boolean => { // If suggestions are shown const up/down keys control them, otherwise allow them through to control the focusZone. if (this.state.suggestionsVisible) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated switch (ev.which) { case KeyCodes.up: case KeyCodes.down: @@ -962,7 +962,7 @@ export class BasePicker<T extends {}, P extends IBasePickerProps<T>> } } - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { return true; } @@ -1023,7 +1023,7 @@ export class BasePicker<T extends {}, P extends IBasePickerProps<T>> return ( <div className={alertClassName} id={this._ariaMap.selectedSuggestionAlert} aria-live="assertive"> { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated this.getSuggestionsAlert(alertClassName) } {removedItemText} diff --git a/packages/react/src/components/pickers/PeoplePicker/PeoplePickerItems/PeoplePickerItem.types.ts b/packages/react/src/components/pickers/PeoplePicker/PeoplePickerItems/PeoplePickerItem.types.ts index ef05058274fd0f..ba9d4f61182d1c 100644 --- a/packages/react/src/components/pickers/PeoplePicker/PeoplePickerItems/PeoplePickerItem.types.ts +++ b/packages/react/src/components/pickers/PeoplePicker/PeoplePickerItems/PeoplePickerItem.types.ts @@ -118,7 +118,7 @@ export interface IPeoplePickerItemSuggestionStyles { * PeoplePickerItemWithMenu props interface. * @deprecated Do not use. Will be removed in \>= 7.0 */ -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export interface IPeoplePickerItemWithMenuProps extends IPickerItemProps<IPersonaWithMenu> {} /** diff --git a/packages/react/src/components/pickers/PeoplePicker/PeoplePickerItems/SelectedItemDefault.tsx b/packages/react/src/components/pickers/PeoplePicker/PeoplePickerItems/SelectedItemDefault.tsx index 6d842d969844e9..675e786142ef69 100644 --- a/packages/react/src/components/pickers/PeoplePicker/PeoplePickerItems/SelectedItemDefault.tsx +++ b/packages/react/src/components/pickers/PeoplePicker/PeoplePickerItems/SelectedItemDefault.tsx @@ -45,7 +45,7 @@ export const SelectedItemDefault: (props: IPeoplePickerItemSelectedProps) => JSX <Persona {...item} presence={item.presence !== undefined ? item.presence : PersonaPresence.none} - size={PersonaSize.size28} // eslint-disable-line deprecation/deprecation + size={PersonaSize.size28} // eslint-disable-line @typescript-eslint/no-deprecated /> </div> <IconButton diff --git a/packages/react/src/index.ts b/packages/react/src/index.ts index e930a8da1676cb..470021f579e42f 100644 --- a/packages/react/src/index.ts +++ b/packages/react/src/index.ts @@ -6,7 +6,6 @@ export { Announced, AnnouncedBase } from './Announced'; export type { IAnnouncedProps, IAnnouncedStyleProps, IAnnouncedStyles } from './Announced'; export { Breadcrumb, BreadcrumbBase } from './Breadcrumb'; export type { - // eslint-disable-next-line deprecation/deprecation IBreadCrumbData, IBreadcrumb, IBreadcrumbData, @@ -19,7 +18,6 @@ export type { export { ActionButton, BaseButton, - // eslint-disable-next-line deprecation/deprecation Button, ButtonGlobalClassNames, ButtonType, @@ -58,7 +56,6 @@ export { FirstWeekOfYear, defaultCalendarNavigationIcons, defaultCalendarStrings, - // eslint-disable-next-line deprecation/deprecation defaultDayPickerStrings, } from './Calendar'; export type { @@ -71,9 +68,7 @@ export type { ICalendarDayProps, ICalendarDayStyleProps, ICalendarDayStyles, - // eslint-disable-next-line deprecation/deprecation ICalendarFormatDateCallbacks, - // eslint-disable-next-line deprecation/deprecation ICalendarIconStrings, ICalendarMonth, ICalendarMonthProps, @@ -126,7 +121,6 @@ export type { ICoachmarkProps, ICoachmarkStyleProps, ICoachmarkStyles, - // eslint-disable-next-line deprecation/deprecation ICoachmarkTypes, IEntityRect, } from './Coachmark'; @@ -135,7 +129,6 @@ export { MAX_COLOR_ALPHA, MAX_COLOR_HUE, MAX_COLOR_RGB, - // eslint-disable-next-line deprecation/deprecation MAX_COLOR_RGBA, MAX_COLOR_SATURATION, MAX_COLOR_VALUE, @@ -218,7 +211,6 @@ export { ContextualMenuItemBase, ContextualMenuItemType, canAnyMenuItemsCheck, - // eslint-disable-next-line deprecation/deprecation getContextualMenuItemClassNames, getContextualMenuItemStyles, getMenuItemStyles, @@ -226,7 +218,6 @@ export { } from './ContextualMenu'; export type { IContextualMenu, - // eslint-disable-next-line deprecation/deprecation IContextualMenuClassNames, IContextualMenuItem, IContextualMenuItemProps, @@ -241,7 +232,6 @@ export type { IContextualMenuStyleProps, IContextualMenuStyles, IContextualMenuSubComponentStyles, - // eslint-disable-next-line deprecation/deprecation IMenuItemClassNames, IMenuItemStyles, } from './ContextualMenu'; @@ -401,7 +391,6 @@ export type { } from './Dialog'; export { VerticalDivider } from './Divider'; export type { - // eslint-disable-next-line deprecation/deprecation IVerticalDividerClassNames, IVerticalDividerProps, IVerticalDividerPropsStyles, @@ -484,11 +473,7 @@ export type { IExtendedPeoplePickerProps, IPeoplePickerItemProps, } from './ExtendedPicker'; -export { - // eslint-disable-next-line deprecation/deprecation - Fabric, - FabricBase, -} from './Fabric'; +export { Fabric, FabricBase } from './Fabric'; export type { IFabricProps, IFabricStyleProps, IFabricStyles } from './Fabric'; export { Facepile, FacepileBase, OverflowButtonType } from './Facepile'; export type { IFacepile, IFacepilePersona, IFacepileProps, IFacepileStyleProps, IFacepileStyles } from './Facepile'; @@ -543,9 +528,7 @@ export type { IGroupShowAllStyleProps, IGroupShowAllStyles, IGroupSpacerProps, - // eslint-disable-next-line deprecation/deprecation IGroupSpacerStyleProps, - // eslint-disable-next-line deprecation/deprecation IGroupSpacerStyles, IGroupedListSectionProps, IGroupedListSectionState, @@ -586,16 +569,7 @@ export type { IPlainCardStyleProps, IPlainCardStyles, } from './HoverCard'; -export { - FontIcon, - Icon, - IconBase, - // eslint-disable-next-line deprecation/deprecation - IconType, - ImageIcon, - getFontIcon, - getIconContent, -} from './Icon'; +export { FontIcon, Icon, IconBase, IconType, ImageIcon, getFontIcon, getIconContent } from './Icon'; export type { IFontIconProps, IIconContent, @@ -606,10 +580,7 @@ export type { IImageIconProps, } from './Icon'; export { initializeIcons } from './Icons'; -export type { - // eslint-disable-next-line deprecation/deprecation - IconNames, -} from './Icons'; +export type { IconNames } from './Icons'; export { Image, ImageBase, ImageCoverStyle, ImageFit, ImageLoadState } from './Image'; export type { IImage, IImageProps, IImageState, IImageStyleProps, IImageStyles } from './Image'; export { @@ -677,14 +648,7 @@ export { } from './Layer'; export type { ILayer, ILayerHost, ILayerHostProps, ILayerProps, ILayerStyleProps, ILayerStyles } from './Layer'; export { Link, LinkBase } from './Link'; -export type { - ILink, - // eslint-disable-next-line deprecation/deprecation - ILinkHTMLAttributes, - ILinkProps, - ILinkStyleProps, - ILinkStyles, -} from './Link'; +export type { ILink, ILinkHTMLAttributes, ILinkProps, ILinkStyleProps, ILinkStyles } from './Link'; export { List, ScrollToMode } from './List'; export type { IList, @@ -818,10 +782,8 @@ export type { IPeoplePickerItemSuggestionProps, IPeoplePickerItemSuggestionStyleProps, IPeoplePickerItemSuggestionStyles, - // eslint-disable-next-line deprecation/deprecation IPeoplePickerItemWithMenuProps, IPeoplePickerProps, - // eslint-disable-next-line deprecation/deprecation IPersonaWithMenu, IPickerAriaIds, IPickerItem, @@ -847,15 +809,7 @@ export type { ITagItemRemoveButtonProps, ITagPickerProps, } from './Pickers'; -export { - Pivot, - PivotBase, - PivotItem, - // eslint-disable-next-line deprecation/deprecation - PivotLinkFormat, - // eslint-disable-next-line deprecation/deprecation - PivotLinkSize, -} from './Pivot'; +export { Pivot, PivotBase, PivotItem, PivotLinkFormat, PivotLinkSize } from './Pivot'; export type { IPivot, IPivotItemProps, @@ -883,7 +837,6 @@ export type { ICalloutPositionedInfo, IElementPosition, IElementPositionInfo, - // eslint-disable-next-line deprecation/deprecation IPoint, IPosition, IPositionDirectionalHintData, @@ -897,7 +850,6 @@ export { PositioningContainer, useHeightOffset } from './PositioningContainer'; export type { IPositioningContainer, IPositioningContainerProps, - // eslint-disable-next-line deprecation/deprecation IPositioningContainerTypes, } from './PositioningContainer'; export { ProgressIndicator, ProgressIndicatorBase } from './ProgressIndicator'; @@ -930,13 +882,9 @@ export { initializeResponsiveMode, setResponsiveMode, useResponsiveMode, - // eslint-disable-next-line deprecation/deprecation withResponsiveMode, } from './ResponsiveMode'; -export type { - // eslint-disable-next-line deprecation/deprecation - IWithResponsiveModeState, -} from './ResponsiveMode'; +export type { IWithResponsiveModeState } from './ResponsiveMode'; export { ScrollablePane, ScrollablePaneBase, ScrollablePaneContext, ScrollbarVisibility } from './ScrollablePane'; export type { IScrollablePane, @@ -1021,13 +969,7 @@ export { Slider, SliderBase } from './Slider'; export type { ISlider, ISliderProps, ISliderStyleProps, ISliderStyles } from './Slider'; export { KeyboardSpinDirection, SpinButton } from './SpinButton'; export type { ISpinButton, ISpinButtonProps, ISpinButtonStyleProps, ISpinButtonStyles } from './SpinButton'; -export { - Spinner, - SpinnerBase, - SpinnerSize, - // eslint-disable-next-line deprecation/deprecation - SpinnerType, -} from './Spinner'; +export { Spinner, SpinnerBase, SpinnerSize, SpinnerType } from './Spinner'; export type { ISpinner, ISpinnerProps, ISpinnerStyleProps, ISpinnerStyles, SpinnerLabelPosition } from './Spinner'; export { Stack, StackItem } from './Stack'; export type { @@ -1059,7 +1001,6 @@ export { DefaultEffects, DefaultFontStyles, DefaultPalette, - // eslint-disable-next-line deprecation/deprecation EdgeChromiumHighContrastSelector, FontClassNames, FontSizes, @@ -1092,11 +1033,9 @@ export { createTheme, focusClear, fontFace, - // eslint-disable-next-line deprecation/deprecation getEdgeChromiumNoHighContrastAdjustSelector, getFadedOverflowStyle, getFocusOutlineStyle, - // eslint-disable-next-line deprecation/deprecation getFocusStyle, getGlobalClassNames, getHighContrastNoAdjustStyle, @@ -1224,10 +1163,8 @@ export type { export { Async, AutoScroll, - // eslint-disable-next-line deprecation/deprecation BaseComponent, Customizations, - // eslint-disable-next-line deprecation/deprecation Customizer, CustomizerContext, DATA_IS_SCROLLABLE_ATTRIBUTE, @@ -1308,7 +1245,6 @@ export { getRTL, getRTLSafeKeyCode, getRect, - // eslint-disable-next-line deprecation/deprecation getResourceUrl, getScrollbarWidth, getVirtualParent, @@ -1320,11 +1256,9 @@ export { hoistStatics, htmlElementProperties, iframeProperties, - // eslint-disable-next-line deprecation/deprecation imageProperties, imgProperties, initializeComponentRef, - // eslint-disable-next-line deprecation/deprecation initializeFocusRects, inputProperties, isControlled, @@ -1358,7 +1292,6 @@ export { optionProperties, portalContainsElement, precisionRound, - // eslint-disable-next-line deprecation/deprecation raiseClick, removeDirectionalKeyCode, removeIndex, @@ -1369,15 +1302,12 @@ export { safeRequestAnimationFrame, safeSetTimeout, selectProperties, - // eslint-disable-next-line deprecation/deprecation setBaseUrl, setFocusVisibility, - // eslint-disable-next-line deprecation/deprecation setLanguage, setMemoizeWeakMap, setPortalAttribute, setRTL, - // eslint-disable-next-line deprecation/deprecation setSSR, setVirtualParent, setWarningCallback, @@ -1416,7 +1346,6 @@ export type { ICancelable, IChangeDescription, IChangeEventCallback, - // eslint-disable-next-line deprecation/deprecation IClassNames, IClassNamesFunctionOptions, IComponentAs, @@ -1454,12 +1383,9 @@ export type { IStyleFunctionOrObject, IVirtualElement, IWarnControlledUsageParams, - // eslint-disable-next-line deprecation/deprecation Omit, RefObject, - // eslint-disable-next-line deprecation/deprecation Settings, - // eslint-disable-next-line deprecation/deprecation SettingsFunction, StyleFunction, } from './Utilities'; @@ -1485,19 +1411,8 @@ export type { WindowProviderProps } from './WindowProvider'; * Styles and Theme both exported the same names which causes conflicting * star exports with webpack5. See here: https://github.com/microsoft/fluentui/issues/21601. */ -export { - ThemeContext, - ThemeProvider, - // eslint-disable-next-line deprecation/deprecation - makeStyles, - useTheme, -} from './utilities/ThemeProvider/index'; -export type { - StylesClassMapping, - ThemeProviderProps, - // eslint-disable-next-line deprecation/deprecation - UseStylesOptions, -} from './utilities/ThemeProvider/index'; +export { ThemeContext, ThemeProvider, makeStyles, useTheme } from './utilities/ThemeProvider/index'; +export type { StylesClassMapping, ThemeProviderProps, UseStylesOptions } from './utilities/ThemeProvider/index'; export { CommunicationColors, DefaultSpacing, diff --git a/packages/react/src/utilities/ButtonGrid/ButtonGrid.base.tsx b/packages/react/src/utilities/ButtonGrid/ButtonGrid.base.tsx index 287fb5a42a45e4..13216ef3c370aa 100644 --- a/packages/react/src/utilities/ButtonGrid/ButtonGrid.base.tsx +++ b/packages/react/src/utilities/ButtonGrid/ButtonGrid.base.tsx @@ -17,9 +17,9 @@ export const ButtonGridBase: React.FunctionComponent<IButtonGridProps> = React.f columnCount, onRenderItem, isSemanticRadio, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ariaPosInSet = props.positionInSet, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ariaSetSize = props.setSize, styles, doNotContainWithinFocusZone, diff --git a/packages/react/src/utilities/DraggableZone/DraggableZone.tsx b/packages/react/src/utilities/DraggableZone/DraggableZone.tsx index 760e2612fa684e..0a69e4deca5e4a 100644 --- a/packages/react/src/utilities/DraggableZone/DraggableZone.tsx +++ b/packages/react/src/utilities/DraggableZone/DraggableZone.tsx @@ -269,7 +269,7 @@ export class DraggableZone extends React.Component<IDraggableZoneProps, IDraggab } const matchesSelectorFn: Function = - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated element.matches || element.webkitMatchesSelector || (element as any).msMatchesSelector; /* for IE */ if (!matchesSelectorFn) { diff --git a/packages/react/src/utilities/ThemeProvider/makeStyles.test.tsx b/packages/react/src/utilities/ThemeProvider/makeStyles.test.tsx index 1635057f9ed3c3..8cc981a8f0e5d4 100644 --- a/packages/react/src/utilities/ThemeProvider/makeStyles.test.tsx +++ b/packages/react/src/utilities/ThemeProvider/makeStyles.test.tsx @@ -12,7 +12,7 @@ import { ThemeProvider } from './ThemeProvider'; describe('makeStyles', () => { const stylesheet: Stylesheet = Stylesheet.getInstance(); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const useThemedStyles = makeStyles(theme => ({ root: { background: theme.palette.themePrimary, @@ -27,7 +27,7 @@ describe('makeStyles', () => { const ThemeStyledComponent = () => <ThemeStyledComponentInner />; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const useStaticStyles = makeStyles({ root: { background: 'yellow', @@ -48,7 +48,7 @@ describe('makeStyles', () => { }); it('can create basic styles as an object (no type errors)', () => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated makeStyles({ root: { alignItems: 'center', @@ -57,7 +57,7 @@ describe('makeStyles', () => { }); it('can create style functions (no type errors)', () => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated makeStyles(() => ({ root: { alignItems: 'center', @@ -78,7 +78,7 @@ describe('makeStyles', () => { }); safeMount( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated <Customizer settings={{ theme: customTheme }}> <ThemeStyledComponent /> </Customizer>, diff --git a/packages/react/src/utilities/ThemeProvider/makeStyles.ts b/packages/react/src/utilities/ThemeProvider/makeStyles.ts index 8e2609c53e8c31..a635e88fec1d1c 100644 --- a/packages/react/src/utilities/ThemeProvider/makeStyles.ts +++ b/packages/react/src/utilities/ThemeProvider/makeStyles.ts @@ -94,7 +94,7 @@ type WindowWithId = Window & { */ export function makeStyles<TStyleSet extends { [key in keyof TStyleSet]: IStyle } = { [key: string]: IStyle }>( styleOrFunction: TStyleSet | ((theme: Theme) => TStyleSet), - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ): (options?: UseStylesOptions) => StylesClassMapping<TStyleSet> { // Create graph of inputs to map to output. const graph: Graph<TStyleSet> = new Map(); @@ -113,7 +113,7 @@ export function makeStyles<TStyleSet extends { [key in keyof TStyleSet]: IStyle allWindows.delete(winId); }; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return (options: UseStylesOptions = {}): StylesClassMapping<TStyleSet> => { let { theme } = options; let winId: string | undefined; diff --git a/packages/react/src/utilities/ThemeProvider/useThemeProviderClasses.tsx b/packages/react/src/utilities/ThemeProvider/useThemeProviderClasses.tsx index ae44f3a63b55a3..4b45e44480cf43 100644 --- a/packages/react/src/utilities/ThemeProvider/useThemeProviderClasses.tsx +++ b/packages/react/src/utilities/ThemeProvider/useThemeProviderClasses.tsx @@ -5,7 +5,7 @@ import { makeStyles } from './makeStyles'; import type { ThemeProviderState } from './ThemeProvider.types'; import type { Theme } from '@fluentui/theme'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated const useThemeProviderStyles = makeStyles((theme: Theme) => { const { semanticColors, fonts } = theme; diff --git a/packages/react/src/utilities/contextualMenu/contextualMenuUtility.ts b/packages/react/src/utilities/contextualMenu/contextualMenuUtility.ts index 018e3051df284e..eb142245b0c83f 100644 --- a/packages/react/src/utilities/contextualMenu/contextualMenuUtility.ts +++ b/packages/react/src/utilities/contextualMenu/contextualMenuUtility.ts @@ -26,7 +26,7 @@ export function getIsChecked(item: IContextualMenuItem): boolean | null { } export function hasSubmenu(item: IContextualMenuItem): boolean { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return !!(item.subMenuProps || item.items); } diff --git a/packages/react/src/utilities/decorators/withResponsiveMode.test.tsx b/packages/react/src/utilities/decorators/withResponsiveMode.test.tsx index 4e177ced66e7d4..19452ecd98d5d6 100644 --- a/packages/react/src/utilities/decorators/withResponsiveMode.test.tsx +++ b/packages/react/src/utilities/decorators/withResponsiveMode.test.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import * as ReactTestUtils from 'react-dom/test-utils'; import { setResponsiveMode, withResponsiveMode, ResponsiveMode } from './withResponsiveMode'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated @withResponsiveMode class Example extends React.Component<any, any> { public render(): JSX.Element { diff --git a/packages/react/src/utilities/decorators/withResponsiveMode.tsx b/packages/react/src/utilities/decorators/withResponsiveMode.tsx index fdc6df0303db26..fd60358a59f2a1 100644 --- a/packages/react/src/utilities/decorators/withResponsiveMode.tsx +++ b/packages/react/src/utilities/decorators/withResponsiveMode.tsx @@ -74,7 +74,7 @@ export function getInitialResponsiveMode(): ResponsiveMode { export function withResponsiveMode<TProps extends { responsiveMode?: ResponsiveMode }, TState>( ComposedComponent: new (props: TProps, ...args: any[]) => React.Component<TProps, TState>, ): any { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const resultClass = class WithResponsiveMode extends BaseDecorator<TProps, IWithResponsiveModeState> { public static contextType = WindowContext; public context: React.ContextType<typeof WindowContext>; diff --git a/packages/react/src/utilities/positioning/positioning.ts b/packages/react/src/utilities/positioning/positioning.ts index 3a68ce3f882701..9949978414b5fa 100644 --- a/packages/react/src/utilities/positioning/positioning.ts +++ b/packages/react/src/utilities/positioning/positioning.ts @@ -779,7 +779,7 @@ function _positionBeak(beakWidth: number, elementPosition: IElementPositionInfo) } function _getRectangleFromElement(element: Element): Rectangle { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const clientRect: ClientRect = element.getBoundingClientRect(); return new Rectangle(clientRect.left, clientRect.right, clientRect.top, clientRect.bottom); @@ -802,9 +802,9 @@ function _getTargetRect(bounds: Rectangle, target: Element | MouseEvent | Point // HTMLImgElements can have x and y values. The check for it being a point must go last. } else { const rectOrPoint: Point & Rectangle = target as Point & Rectangle; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const left = rectOrPoint.left || rectOrPoint.x; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const top = rectOrPoint.top || rectOrPoint.y; const right = rectOrPoint.right || left; const bottom = rectOrPoint.bottom || top; @@ -993,9 +993,9 @@ function _getRectangleFromTarget(target: Element | MouseEvent | Point | Rectangl const rectOrPointTarget: Point & Rectangle = target as Point & Rectangle; let targetRect: Rectangle; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const left = rectOrPointTarget.left ?? rectOrPointTarget.x; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const top = rectOrPointTarget.top ?? rectOrPointTarget.y; const right = rectOrPointTarget.right ?? left; const bottom = rectOrPointTarget.bottom ?? top; @@ -1132,9 +1132,9 @@ function _getBoundsFromTargetWindow( } // If the target is not null get x-axis and y-axis coordinates directly. else if (target !== null) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated x = (target as Point).left || (target as MouseEvent | Point).x; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated y = (target as Point).top || (target as MouseEvent | Point).y; } diff --git a/packages/react/src/utilities/positioning/positioning.types.ts b/packages/react/src/utilities/positioning/positioning.types.ts index 4810db92f5a9d6..6f1c32a4c1ddc9 100644 --- a/packages/react/src/utilities/positioning/positioning.types.ts +++ b/packages/react/src/utilities/positioning/positioning.types.ts @@ -123,5 +123,4 @@ export interface IRelativePositions { submenuDirection: DirectionalHint; } -// eslint-disable-next-line deprecation/deprecation export type { Point, IPoint } from '../../Utilities'; diff --git a/packages/react/src/utilities/selection/SelectionZone.tsx b/packages/react/src/utilities/selection/SelectionZone.tsx index 82ed097d3b7271..ecf1a4d35c7e26 100644 --- a/packages/react/src/utilities/selection/SelectionZone.tsx +++ b/packages/react/src/utilities/selection/SelectionZone.tsx @@ -522,9 +522,9 @@ export class SelectionZone extends React.Component<ISelectionZoneProps, ISelecti const isSelectionDisabled = this._isSelectionDisabled(target); const { selection, selectionClearedOnEscapePress } = this.props; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const isSelectAllKey = ev.which === KeyCodes.a && (this._isCtrlPressed || this._isMetaPressed); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const isClearSelectionKey = ev.which === KeyCodes.escape; // Ignore key downs from input elements. @@ -576,7 +576,7 @@ export class SelectionZone extends React.Component<ISelectionZoneProps, ISelecti } break; } else if ( - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated (ev.which === KeyCodes.enter || ev.which === KeyCodes.space) && (target.tagName === 'BUTTON' || target.tagName === 'A' || @@ -585,7 +585,7 @@ export class SelectionZone extends React.Component<ISelectionZoneProps, ISelecti ) { return false; } else if (target === itemRoot) { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (ev.which === KeyCodes.enter) { if (span === undefined) { // Items should be invokable even if selection is disabled. @@ -593,7 +593,7 @@ export class SelectionZone extends React.Component<ISelectionZoneProps, ISelecti ev.preventDefault(); } return; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated } else if (ev.which === KeyCodes.space) { if (!isSelectionDisabled) { this._onToggleClick(ev, index, span); @@ -794,7 +794,7 @@ export class SelectionZone extends React.Component<ISelectionZoneProps, ISelecti this._isCtrlPressed = ev.ctrlKey; this._isMetaPressed = ev.metaKey; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const keyCode = (ev as React.KeyboardEvent<HTMLElement>).keyCode; this._isTabPressed = keyCode ? keyCode === KeyCodes.tab : false; } diff --git a/packages/set-version/.eslintrc.json b/packages/set-version/.eslintrc.json index 1aa83ab0565376..905bf718151d3a 100644 --- a/packages/set-version/.eslintrc.json +++ b/packages/set-version/.eslintrc.json @@ -2,8 +2,15 @@ "extends": ["plugin:@fluentui/eslint-plugin/react--legacy"], "root": true, "rules": { - "deprecation/deprecation": "off", "prefer-const": "off", "no-restricted-globals": "off" - } + }, + "overrides": [ + { + "files": ["**/*.{ts,tsx}"], + "rules": { + "@typescript-eslint/no-deprecated": "off" + } + } + ] } diff --git a/packages/style-utilities/src/index.ts b/packages/style-utilities/src/index.ts index 207578d211c502..ee8546ea409e9a 100644 --- a/packages/style-utilities/src/index.ts +++ b/packages/style-utilities/src/index.ts @@ -14,7 +14,7 @@ export { hiddenContentStyle, PulsingBeaconAnimationStyles, getGlobalClassNames, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getFocusStyle, getFocusOutlineStyle, getInputFocusStyle, @@ -29,7 +29,7 @@ export { HighContrastSelector, HighContrastSelectorWhite, HighContrastSelectorBlack, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated EdgeChromiumHighContrastSelector, ScreenWidthMinSmall, ScreenWidthMinMedium, @@ -45,7 +45,7 @@ export { ScreenWidthMinUhfMobile, getScreenSelector, getHighContrastNoAdjustStyle, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getEdgeChromiumNoHighContrastAdjustSelector, normalize, noWrap, diff --git a/packages/style-utilities/src/styles/CommonStyles.ts b/packages/style-utilities/src/styles/CommonStyles.ts index d584824e241b1f..b805a1bdeb2893 100644 --- a/packages/style-utilities/src/styles/CommonStyles.ts +++ b/packages/style-utilities/src/styles/CommonStyles.ts @@ -47,10 +47,10 @@ export function getHighContrastNoAdjustStyle(): IRawStyle { * The style which turns off high contrast adjustment in (only) Edge Chromium browser. * @deprecated Use `getHighContrastNoAdjustStyle` */ -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export function getEdgeChromiumNoHighContrastAdjustSelector(): { [EdgeChromiumHighContrastSelector]: IRawStyle } { return { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated [EdgeChromiumHighContrastSelector]: { forcedColorAdjust: 'none', MsHighContrastAdjust: 'none', diff --git a/packages/style-utilities/src/utilities/icons.ts b/packages/style-utilities/src/utilities/icons.ts index 9c454f89215a39..56d11d014dc5e2 100644 --- a/packages/style-utilities/src/utilities/icons.ts +++ b/packages/style-utilities/src/utilities/icons.ts @@ -194,7 +194,7 @@ export function getIcon(name?: string): IIconRecord | undefined { } } } else { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (!options.disableWarnings && options.warnOnMissingIcons) { warn( `The icon "${name}" was used but not registered. See https://github.com/microsoft/fluentui/wiki/Using-icons for more information.`, diff --git a/packages/theme/src/utilities/makeSemanticColors.ts b/packages/theme/src/utilities/makeSemanticColors.ts index b9924ec0d7afad..f4d9f57d45c782 100644 --- a/packages/theme/src/utilities/makeSemanticColors.ts +++ b/packages/theme/src/utilities/makeSemanticColors.ts @@ -132,7 +132,7 @@ export function getSemanticColors<TResult = Partial<ISemanticColors>>( result.listItemBackgroundChecked = neutralLight; result.listHeaderBackgroundPressed = neutralLight; result.menuItemBackgroundPressed = neutralLight; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated result.menuItemBackgroundChecked = neutralLight; } if (neutralLighter) { @@ -227,12 +227,12 @@ function _fixDeprecatedSlots(s: ISemanticColors, depComments: boolean): ISemanti dep = ' /* @deprecated */'; } - /* eslint-disable deprecation/deprecation */ + /* eslint-disable @typescript-eslint/no-deprecated */ s.listTextColor = s.listText + dep; s.menuItemBackgroundChecked += dep; s.warningHighlight += dep; s.warningText = s.messageText + dep; s.successText += dep; - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ return s; } diff --git a/packages/utilities/src/BaseComponent.test.tsx b/packages/utilities/src/BaseComponent.test.tsx index 3849bdbabc2cdd..8a3a69903db364 100644 --- a/packages/utilities/src/BaseComponent.test.tsx +++ b/packages/utilities/src/BaseComponent.test.tsx @@ -5,12 +5,12 @@ import { BaseComponent } from './BaseComponent'; describe('BaseComponent', () => { it('can resolve refs', () => { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated class Foo extends BaseComponent<{}, {}> { public root!: HTMLElement; public render(): JSX.Element { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated return <div ref={this._resolveRef('root')} />; } } diff --git a/packages/utilities/src/BaseComponent.ts b/packages/utilities/src/BaseComponent.ts index fe3cc82b45ac72..2788bf3977e872 100644 --- a/packages/utilities/src/BaseComponent.ts +++ b/packages/utilities/src/BaseComponent.ts @@ -49,7 +49,7 @@ export class BaseComponent<TProps extends IBaseProps = {}, TState extends {} = { constructor(props: TProps, context?: any) { super(props, context); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated _makeAllSafe(this, BaseComponent.prototype, [ 'componentDidMount', 'shouldComponentUpdate', @@ -235,14 +235,14 @@ export class BaseComponent<TProps extends IBaseProps = {}, TState extends {} = { * ensures that the BaseComponent's methods are called before the subclass's. This ensures that * componentWillUnmount in the base is called and that things in the _disposables array are disposed. */ -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated function _makeAllSafe(obj: BaseComponent<{}, {}>, prototype: Object, methodNames: string[]): void { for (let i = 0, len = methodNames.length; i < len; i++) { _makeSafe(obj, prototype, methodNames[i]); } } -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated function _makeSafe(obj: BaseComponent<{}, {}>, prototype: Object, methodName: string): void { /* eslint-disable @typescript-eslint/no-explicit-any */ let classMethod = (obj as any)[methodName]; diff --git a/packages/utilities/src/EventGroup.test.ts b/packages/utilities/src/EventGroup.test.ts index 69fbe727767cbc..3c6638edf1ce34 100644 --- a/packages/utilities/src/EventGroup.test.ts +++ b/packages/utilities/src/EventGroup.test.ts @@ -13,7 +13,7 @@ describe('EventGroup', () => { let ev = document.createEvent('HTMLEvents'); eg.on(sourceButton, 'click', parent.cb); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.initEvent('click', true, true); sourceButton.dispatchEvent(ev); @@ -150,7 +150,7 @@ describe('EventGroup', () => { try { let ev = document.createEvent('HTMLEvents'); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.initEvent('click', true, true); grandChildButton.dispatchEvent(ev); diff --git a/packages/utilities/src/EventGroup.ts b/packages/utilities/src/EventGroup.ts index 3ea6e16961a466..528307a3cba0db 100644 --- a/packages/utilities/src/EventGroup.ts +++ b/packages/utilities/src/EventGroup.ts @@ -76,7 +76,7 @@ export class EventGroup { if (typeof theDoc !== 'undefined' && theDoc.createEvent) { let ev = theDoc.createEvent('HTMLEvents'); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated ev.initEvent(eventName, bubbleEvent || false, true); assign(ev, eventArgs); diff --git a/packages/utilities/src/customizations/Customizer.test.tsx b/packages/utilities/src/customizations/Customizer.test.tsx index 2c2415f50aeef6..7e6c25d3d4258b 100644 --- a/packages/utilities/src/customizations/Customizer.test.tsx +++ b/packages/utilities/src/customizations/Customizer.test.tsx @@ -1,4 +1,4 @@ -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ import * as React from 'react'; import { customizable } from './customizable'; import { Customizer } from './Customizer'; diff --git a/packages/utilities/src/customizations/customizable.test.tsx b/packages/utilities/src/customizations/customizable.test.tsx index 684f74ef09c837..56993647461b57 100644 --- a/packages/utilities/src/customizations/customizable.test.tsx +++ b/packages/utilities/src/customizations/customizable.test.tsx @@ -1,4 +1,4 @@ -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ import * as React from 'react'; import * as ReactDOM from 'react-dom/server'; import { mount } from 'enzyme'; diff --git a/packages/utilities/src/dom.ts b/packages/utilities/src/dom.ts index 8738039b4d6ff5..8dd977bc331fa2 100644 --- a/packages/utilities/src/dom.ts +++ b/packages/utilities/src/dom.ts @@ -15,7 +15,7 @@ export { isVirtualElement } from './dom/isVirtualElement'; export { on } from './dom/on'; export { portalContainsElement } from './dom/portalContainsElement'; export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated raiseClick, } from './dom/raiseClick'; export { DATA_PORTAL_ATTRIBUTE, setPortalAttribute } from './dom/setPortalAttribute'; diff --git a/packages/utilities/src/dom/canUseDOM.ts b/packages/utilities/src/dom/canUseDOM.ts index e7289568b5a152..2481a308eccb07 100644 --- a/packages/utilities/src/dom/canUseDOM.ts +++ b/packages/utilities/src/dom/canUseDOM.ts @@ -6,7 +6,7 @@ export function canUseDOM(): boolean { // eslint-disable-next-line no-restricted-globals typeof window !== 'undefined' && !!( - // eslint-disable-next-line no-restricted-globals, deprecation/deprecation + // eslint-disable-next-line no-restricted-globals, @typescript-eslint/no-deprecated (window.document && window.document.createElement) ) ); diff --git a/packages/utilities/src/dom/raiseClick.ts b/packages/utilities/src/dom/raiseClick.ts index fecf98ccca3b71..f9452a88f4e9f3 100644 --- a/packages/utilities/src/dom/raiseClick.ts +++ b/packages/utilities/src/dom/raiseClick.ts @@ -6,7 +6,7 @@ import { getDocument } from './getDocument'; export function raiseClick(target: Element, doc?: Document): void { const theDoc = doc ?? getDocument()!; const event = createNewEvent('MouseEvents', theDoc); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated event.initEvent('click', true, true); target.dispatchEvent(event); } @@ -19,7 +19,7 @@ function createNewEvent(eventName: string, doc: Document): Event { } else { // IE event = doc.createEvent('Event'); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated event.initEvent(eventName, true, true); } return event; diff --git a/packages/utilities/src/index.ts b/packages/utilities/src/index.ts index bc7e47059ddb0c..6e99fd0ab3c63f 100644 --- a/packages/utilities/src/index.ts +++ b/packages/utilities/src/index.ts @@ -2,7 +2,7 @@ export { Async } from './Async'; export type { ICancelable } from './Async'; export { AutoScroll } from './AutoScroll'; export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated BaseComponent, nullRender, } from './BaseComponent'; @@ -17,13 +17,13 @@ export type { IPerfData, IPerfMeasurement, IPerfSummary } from './FabricPerforma export { GlobalSettings } from './GlobalSettings'; export type { IChangeDescription, IChangeEventCallback } from './GlobalSettings'; export type { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated IClassNames, } from './IClassNames'; export type { IComponentAs, IComponentAsProps } from './IComponentAs'; export type { IDisposable } from './IDisposable'; export type { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated IPoint, Point, } from './Point'; @@ -62,13 +62,13 @@ export type { ICustomizations, ISettings, ISettingsFunction, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated Settings, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated SettingsFunction, } from './customizations/Customizations'; export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated Customizer, } from './customizations/Customizer'; export type { ICustomizerProps } from './customizations/Customizer.types'; @@ -95,7 +95,7 @@ export { isVirtualElement, on, portalContainsElement, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated raiseClick, setPortalAttribute, setVirtualParent, @@ -127,7 +127,7 @@ export { hoistMethods, unhoistMethods } from './hoist'; export { hoistStatics } from './hoistStatics'; export { initializeComponentRef } from './initializeComponentRef'; export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated initializeFocusRects, } from './initializeFocusRects'; export { FocusRectsProvider } from './FocusRectsProvider'; @@ -138,7 +138,7 @@ export { getInitials } from './initials'; export { addDirectionalKeyCode, isDirectionalKeyCode, removeDirectionalKeyCode } from './keyboard'; export { getLanguage, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated setLanguage, } from './language'; export { calculatePrecision, fitContentToBounds, getDistanceBetweenPoints, precisionRound } from './math'; @@ -163,7 +163,7 @@ export { getNativeProps, htmlElementProperties, iframeProperties, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated imageProperties, imgProperties, inputProperties, @@ -181,9 +181,9 @@ export { } from './properties'; export { composeRenderFunction } from './renderFunction/composeRenderFunction'; export { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated getResourceUrl, - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated setBaseUrl, } from './resources'; export { getRTL, getRTLSafeKeyCode, setRTL } from './rtl'; @@ -228,14 +228,14 @@ export { isIE11 } from './ie11Detector'; export { getPropsWithDefaults } from './getPropsWithDefaults'; export { setFocusVisibility, IsFocusVisibleClassName } from './setFocusVisibility'; export { canUseDOM } from './dom/canUseDOM'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export { setSSR } from './dom/setSSR'; export { createMergedRef } from './createMergedRef'; export { useIsomorphicLayoutEffect } from './useIsomorphicLayoutEffect'; import './version'; -// eslint-disable-next-line deprecation/deprecation +// eslint-disable-next-line @typescript-eslint/no-deprecated export type { IStyleFunctionOrObject, Omit } from '@fluentui/merge-styles'; export { diff --git a/packages/utilities/src/initializeFocusRects.test.ts b/packages/utilities/src/initializeFocusRects.test.ts index 42969ad28137ce..9f1fdab3b09ffc 100644 --- a/packages/utilities/src/initializeFocusRects.test.ts +++ b/packages/utilities/src/initializeFocusRects.test.ts @@ -38,7 +38,7 @@ describe('initializeFocusRects', () => { beforeEach(() => { classNames = []; - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated initializeFocusRects(mockWindow as Window); }); diff --git a/packages/utilities/src/initializeFocusRects.ts b/packages/utilities/src/initializeFocusRects.ts index 30f4075886f52b..4fe8c9de82f587 100644 --- a/packages/utilities/src/initializeFocusRects.ts +++ b/packages/utilities/src/initializeFocusRects.ts @@ -50,6 +50,6 @@ function _onPointerDown(ev: PointerEvent): void { } function _onKeyDown(ev: KeyboardEvent): void { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated isDirectionalKeyCode(ev.which) && setFocusVisibility(true, ev.target as Element); } diff --git a/packages/utilities/src/math.ts b/packages/utilities/src/math.ts index ef34f23734b395..576c53474cfce8 100644 --- a/packages/utilities/src/math.ts +++ b/packages/utilities/src/math.ts @@ -6,13 +6,13 @@ import type { ISize } from './ISize'; * * @public */ -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ export function getDistanceBetweenPoints(point1: Point, point2: Point): number { const left1 = point1.left || point1.x || 0; const top1 = point1.top || point1.y || 0; const left2 = point2.left || point2.x || 0; const top2 = point2.top || point2.y || 0; - /* eslint-enable deprecation/deprecation */ + /* eslint-enable @typescript-eslint/no-deprecated */ let distance = Math.sqrt(Math.pow(left1 - left2, 2) + Math.pow(top1 - top2, 2)); diff --git a/packages/utilities/src/styled.test.tsx b/packages/utilities/src/styled.test.tsx index 5c6464ba1c8f74..699438500d6b38 100644 --- a/packages/utilities/src/styled.test.tsx +++ b/packages/utilities/src/styled.test.tsx @@ -1,4 +1,4 @@ -/* eslint-disable deprecation/deprecation */ +/* eslint-disable @typescript-eslint/no-deprecated */ import * as React from 'react'; import * as ReactTestUtils from 'react-dom/test-utils'; import { styled } from './styled'; diff --git a/packages/utilities/src/useFocusRects.ts b/packages/utilities/src/useFocusRects.ts index e1fad6a9a085fb..b302c3e032cb86 100644 --- a/packages/utilities/src/useFocusRects.ts +++ b/packages/utilities/src/useFocusRects.ts @@ -180,14 +180,14 @@ function _onPointerDown(ev: PointerEvent, registeredProviders?: React.RefObject< // This works because `classList.add` is smart and will not duplicate a classname that already exists on the classList // when focus visibility is turned on. function _onKeyDown(ev: KeyboardEvent, registeredProviders?: React.RefObject<HTMLElement>[]): void { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (isDirectionalKeyCode(ev.which)) { setFocusVisibility(true, ev.target as Element, registeredProviders); } } function _onKeyUp(ev: KeyboardEvent, registeredProviders?: React.RefObject<HTMLElement>[]): void { - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated if (isDirectionalKeyCode(ev.which)) { setFocusVisibility(true, ev.target as Element, registeredProviders); } diff --git a/packages/webpack-utilities/.eslintrc.json b/packages/webpack-utilities/.eslintrc.json index 9f62e5a326378a..a563e7abd8369c 100644 --- a/packages/webpack-utilities/.eslintrc.json +++ b/packages/webpack-utilities/.eslintrc.json @@ -3,7 +3,14 @@ "root": true, "rules": { "@typescript-eslint/no-explicit-any": "off", - "deprecation/deprecation": "off", "prefer-arrow-callback": "off" - } + }, + "overrides": [ + { + "files": ["**/*.{ts,tsx}"], + "rules": { + "@typescript-eslint/no-deprecated": "off" + } + } + ] } diff --git a/scripts/executors/src/generate-ui.ts b/scripts/executors/src/generate-ui.ts index d33049b7943ea6..f5edaf8adb0488 100644 --- a/scripts/executors/src/generate-ui.ts +++ b/scripts/executors/src/generate-ui.ts @@ -29,7 +29,7 @@ main() async function main() { const graph = await createProjectGraphAsync(); const projects = readProjectsConfigurationFromProjectGraph(graph); - // eslint-disable-next-line deprecation/deprecation + // eslint-disable-next-line @typescript-eslint/no-deprecated const nxJson = readNxJson(); if (!nxJson) { throw new Error('nx.json not found'); diff --git a/scripts/tasks/src/index.ts b/scripts/tasks/src/index.ts index b8525731e60e8a..51f89644e2127a 100644 --- a/scripts/tasks/src/index.ts +++ b/scripts/tasks/src/index.ts @@ -9,13 +9,11 @@ export { basicWebpackConfig, basicWebpackServeConfig, chain, - // eslint-disable-next-line deprecation/deprecation cleanTask, clearCache, condition, copyInstructions, copyInstructionsTask, - // eslint-disable-next-line deprecation/deprecation copyTask, createStylesOverlay, createTarTask, @@ -36,11 +34,8 @@ export { prettierCheckTask, prettierTask, resetResolvePaths, - // eslint-disable-next-line deprecation/deprecation resolve, - // eslint-disable-next-line deprecation/deprecation resolveCwd, - // eslint-disable-next-line deprecation/deprecation sassTask, series, spawn, diff --git a/syncpack.config.js b/syncpack.config.js index 4618b062fcb92e..0e3e0b1fcdc4a4 100644 --- a/syncpack.config.js +++ b/syncpack.config.js @@ -47,7 +47,6 @@ const config = { 'eslint-config-airbnb', 'eslint-config-prettier', 'eslint-import-resolver-typescript', - 'eslint-plugin-deprecation', 'eslint-plugin-import', 'eslint-plugin-jest', 'eslint-plugin-jsx-a11y', diff --git a/yarn.lock b/yarn.lock index e52755aa7c44f5..ccea6816c1add4 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6188,7 +6188,7 @@ "@typescript-eslint/types" "8.8.1" "@typescript-eslint/typescript-estree" "8.8.1" -"@typescript-eslint/utils@^7.0.0", "@typescript-eslint/utils@^7.9.0": +"@typescript-eslint/utils@^7.9.0": version "7.18.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f" integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw== @@ -10886,15 +10886,6 @@ eslint-module-utils@^2.7.4, eslint-module-utils@^2.8.0: dependencies: debug "^3.2.7" -eslint-plugin-deprecation@3.0.0, eslint-plugin-deprecation@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-deprecation/-/eslint-plugin-deprecation-3.0.0.tgz#c0b6bce543c2a01f231d39a1c54fdfebf3560d48" - integrity sha512-JuVLdNg/uf0Adjg2tpTyYoYaMbwQNn/c78P1HcccokvhtRphgnRjZDKmhlxbxYptppex03zO76f97DD/yQHv7A== - dependencies: - "@typescript-eslint/utils" "^7.0.0" - ts-api-utils "^1.3.0" - tslib "^2.3.1" - eslint-plugin-es@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz#f0822f0c18a535a97c3e714e89f88586a7641ec9" From 556fc8e7b9a921cedbb07c2f0670dfabcf8ec0ed Mon Sep 17 00:00:00 2001 From: srmukher <120183316+srmukher@users.noreply.github.com> Date: Fri, 17 Jan 2025 21:02:05 +0530 Subject: [PATCH 60/78] Enable 'tozeroy' mode for Area Charts (#33581) --- ...-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json | 7 + .../react-charting/etc/react-charting.api.md | 1 + .../components/AreaChart/AreaChart.base.tsx | 91 +- .../components/AreaChart/AreaChart.types.ts | 6 + .../AreaChart/AreaChartRTL.test.tsx | 10 + .../__snapshots__/AreaChartRTL.test.tsx.snap | 1142 +++++++++++++++++ .../DeclarativeChart/PlotlySchemaAdapter.ts | 3 + .../PlotlySchemaAdapterUT.test.tsx.snap | 2 + .../AreaChart/AreaChart.Basic.Example.tsx | 19 +- 9 files changed, 1245 insertions(+), 36 deletions(-) create mode 100644 change/@fluentui-react-charting-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json diff --git a/change/@fluentui-react-charting-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json b/change/@fluentui-react-charting-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json new file mode 100644 index 00000000000000..c5392850b45987 --- /dev/null +++ b/change/@fluentui-react-charting-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Support tozeroy mode for Area Charts", + "packageName": "@fluentui/react-charting", + "email": "120183316+srmukher@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/react-charting/etc/react-charting.api.md b/packages/charts/react-charting/etc/react-charting.api.md index 3d1c49be07983f..207610b95c35a0 100644 --- a/packages/charts/react-charting/etc/react-charting.api.md +++ b/packages/charts/react-charting/etc/react-charting.api.md @@ -200,6 +200,7 @@ export interface IAreaChartProps extends ICartesianChartProps { data: IChartProps; enableGradient?: boolean; enablePerfOptimization?: boolean; + mode?: 'tozeroy' | 'tonexty'; onRenderCalloutPerDataPoint?: IRenderFunction<ICustomizedCalloutData>; onRenderCalloutPerStack?: IRenderFunction<ICustomizedCalloutData>; // (undocumented) diff --git a/packages/charts/react-charting/src/components/AreaChart/AreaChart.base.tsx b/packages/charts/react-charting/src/components/AreaChart/AreaChart.base.tsx index 02933ecb66672e..d4411e51c3d674 100644 --- a/packages/charts/react-charting/src/components/AreaChart/AreaChart.base.tsx +++ b/packages/charts/react-charting/src/components/AreaChart/AreaChart.base.tsx @@ -64,7 +64,7 @@ export interface IAreaChartAreaPoint { values: IAreaChartDataSetPoint; } export interface IAreaChartDataSetPoint { - [key: string]: number | string; + [key: string]: number | string | number[]; } export interface IDPointType { values: { 0: number; 1: number; data: {} }; @@ -102,7 +102,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt colors: string[]; opacity: number[]; // eslint-disable-next-line @typescript-eslint/no-explicit-any - stackedInfo: any; + data: any; // eslint-disable-next-line @typescript-eslint/no-explicit-any calloutPoints: any; }; @@ -113,7 +113,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt private _circleId: string; private _uniqueCallOutID: string; // eslint-disable-next-line @typescript-eslint/no-explicit-any - private _stackedData: any; + private _data: any; private _chart: JSX.Element[]; private margins: IMargins; private _rectId: string; @@ -184,12 +184,12 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt if (!this._isChartEmpty()) { const { lineChartData } = this.props.data; const points = this._addDefaultColors(lineChartData); - const { colors, opacity, stackedInfo, calloutPoints } = this._createSet(points); + const { colors, opacity, data, calloutPoints } = this._createSet(points); this._calloutPoints = calloutPoints; const isXAxisDateType = getXAxisType(points); this._colors = colors; this._opacity = opacity; - this._stackedData = stackedInfo.stackedData; + this._data = data.renderData; const legends: JSX.Element = this._getLegendData(points); const tickParams = { @@ -223,7 +223,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt isCalloutForStack xAxisType={isXAxisDateType ? XAxisTypes.DateAxis : XAxisTypes.NumericAxis} tickParams={tickParams} - maxOfYVal={stackedInfo.maxOfYVal} + maxOfYVal={data.maxOfYVal} getGraphData={this._getGraphData} getDomainNRangeValues={this._getDomainNRangeValues} createStringYAxis={createStringYAxis} @@ -434,27 +434,47 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt }; // eslint-disable-next-line @typescript-eslint/no-explicit-any - private _getStackedData = (keys: string[], dataSet: any) => { - const stackedValues = d3Stack().keys(keys)(dataSet); - const maxOfYVal = d3Max(stackedValues[stackedValues.length - 1], dp => dp[1])!; - const stackedData: Array<IAreaChartDataSetPoint[]> = []; - // eslint-disable-next-line @typescript-eslint/no-explicit-any - stackedValues.forEach((layer: any) => { - const currentStack: IAreaChartDataSetPoint[] = []; + private _getDataPoints = (keys: string[], dataSet: any) => { + const renderPoints: Array<IAreaChartDataSetPoint[]> = []; + let maxOfYVal = 0; + + if (this.props.mode === 'tozeroy') { + keys.forEach((key, index) => { + const currentLayer: IAreaChartDataSetPoint[] = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + dataSet.forEach((d: any) => { + currentLayer.push({ + values: [0, d[key]], // Start from zero for "tozeroy" mode + xVal: d.xVal, + }); + if (d[key] > maxOfYVal) { + maxOfYVal = d[key]; + } + }); + renderPoints.push(currentLayer); + }); + } else { + const dataValues = d3Stack().keys(keys)(dataSet); + maxOfYVal = d3Max(dataValues[dataValues.length - 1], dp => dp[1])!; // eslint-disable-next-line @typescript-eslint/no-explicit-any - layer.forEach((d: any) => { - currentStack.push({ - values: d, - xVal: d.data.xVal, + dataValues.forEach((layer: any) => { + const currentLayer: IAreaChartDataSetPoint[] = []; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + layer.forEach((d: any) => { + currentLayer.push({ + values: d, + xVal: d.data.xVal, + }); }); + renderPoints.push(currentLayer); }); - stackedData.push(currentStack); - }); + } + this._isMultiStackChart = !!(this.props.legendProps?.selectedLegends - ? stackedData?.length >= 1 - : stackedData?.length > 1); + ? renderPoints?.length >= 1 + : renderPoints?.length > 1); return { - stackedData, + renderData: renderPoints, maxOfYVal, }; }; @@ -498,7 +518,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt dataSet.push(singleDataset); }); - // get keys from dataset, used to create stacked data + // get keys from dataset, used to render data const keysLength: number = dataSet && Object.keys(dataSet[0])!.length; const keys: string[] = []; for (let i = 0; i < keysLength - 1; i++) { @@ -506,14 +526,14 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt keys.push(keyVal); } - // Stacked Info used to draw graph - const stackedInfo = this._getStackedData(keys, dataSet); + // Data used to draw graph + const data = this._getDataPoints(keys, dataSet); return { colors, opacity, keys, - stackedInfo, + data, calloutPoints, }; } else { @@ -559,14 +579,14 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt keys.push(keyVal); } - // Stacked Info used to draw graph - const stackedInfo = this._getStackedData(keys, dataSet); + // Data used to draw graph + const data = this._getDataPoints(keys, dataSet); return { colors, opacity, keys, - stackedInfo, + data, calloutPoints, }; } @@ -723,7 +743,8 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt const graph: JSX.Element[] = []; let lineColor: string; // eslint-disable-next-line @typescript-eslint/no-explicit-any - this._stackedData.forEach((singleStackedData: Array<any>, index: number) => { + this._data.forEach((singleStackedData: Array<any>, index: number) => { + const layerOpacity = this.props.mode === 'tozeroy' ? 0.8 : this._opacity[index]; graph.push( <React.Fragment key={`${index}-graph-${this._uniqueIdForGraph}`}> {this.props.enableGradient && ( @@ -757,7 +778,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt stroke={this._colors[index]} strokeWidth={3} fill={this._colors[index]} - opacity={this._opacity[index]} + opacity={layerOpacity} fillOpacity={this._getOpacity(points[index]!.legend)} onMouseMove={this._onRectMouseMove} onMouseOut={this._onRectMouseOut} @@ -768,7 +789,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt id={`${index}-graph-${this._uniqueIdForGraph}`} d={area(singleStackedData)!} fill={this.props.enableGradient ? `url(#gradient_${index})` : this._colors[index]} - opacity={this._opacity[index]} + opacity={layerOpacity} fillOpacity={this._getOpacity(points[index]!.legend)} onMouseMove={this._onRectMouseMove} onMouseOut={this._onRectMouseOut} @@ -788,7 +809,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt const circleRadius = pointOptions && pointOptions.r ? Number(pointOptions.r) : 8; // eslint-disable-next-line @typescript-eslint/no-explicit-any - this._stackedData.forEach((singleStackedData: Array<any>, index: number) => { + this._data.forEach((singleStackedData: Array<any>, index: number) => { if (points.length === index) { return; } @@ -806,7 +827,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt } data points.`} > {singleStackedData.map((singlePoint: IDPointType, pointIndex: number) => { - const circleId = `${this._circleId}_${index * this._stackedData[0].length + pointIndex}`; + const circleId = `${this._circleId}_${index * this._data[0].length + pointIndex}`; const xDataPoint = singlePoint.xVal instanceof Date ? singlePoint.xVal.getTime() : singlePoint.xVal; lineColor = points[index]!.color!; const legend = points[index]!.legend; @@ -839,7 +860,7 @@ export class AreaChartBase extends React.Component<IAreaChartProps, IAreaChartSt singleStackedData.forEach((singlePoint: IDPointType, pointIndex: number) => { const xDataPoint = singlePoint.xVal instanceof Date ? singlePoint.xVal.getTime() : singlePoint.xVal; if (this.state.nearestCircleToHighlight === xDataPoint) { - const circleId = `${this._circleId}_${index * this._stackedData[0].length + pointIndex}`; + const circleId = `${this._circleId}_${index * this._data[0].length + pointIndex}`; lineColor = points[index]!.color!; const legend = points[index]!.legend; graph.push( diff --git a/packages/charts/react-charting/src/components/AreaChart/AreaChart.types.ts b/packages/charts/react-charting/src/components/AreaChart/AreaChart.types.ts index f0aa8a6e77eaf9..b0ff53bf52f3c5 100644 --- a/packages/charts/react-charting/src/components/AreaChart/AreaChart.types.ts +++ b/packages/charts/react-charting/src/components/AreaChart/AreaChart.types.ts @@ -70,6 +70,12 @@ export interface IAreaChartProps extends ICartesianChartProps { * The prop used to enable gradient fill color for the chart. */ enableGradient?: boolean; + + /** + * @default tonexty + * The prop used to define the Y axis mode (tonexty or tozeroy) + */ + mode?: 'tozeroy' | 'tonexty'; } /** diff --git a/packages/charts/react-charting/src/components/AreaChart/AreaChartRTL.test.tsx b/packages/charts/react-charting/src/components/AreaChart/AreaChartRTL.test.tsx index f054dd4a1ceb71..12977fac2432d6 100644 --- a/packages/charts/react-charting/src/components/AreaChart/AreaChartRTL.test.tsx +++ b/packages/charts/react-charting/src/components/AreaChart/AreaChartRTL.test.tsx @@ -512,6 +512,16 @@ describe('Area chart rendering', () => { expect(container).toMatchSnapshot(); }, ); + + testWithoutWait( + 'Should render the Area Chart with tozeroy mode', + AreaChart, + { data: chartData, mode: 'tozeroy' }, + container => { + //Asset + expect(container).toMatchSnapshot(); + }, + ); }); describe('Area chart - Subcomponent Area', () => { diff --git a/packages/charts/react-charting/src/components/AreaChart/__snapshots__/AreaChartRTL.test.tsx.snap b/packages/charts/react-charting/src/components/AreaChart/__snapshots__/AreaChartRTL.test.tsx.snap index 83e1e7b66fa1e9..d151a2c1ec4583 100644 --- a/packages/charts/react-charting/src/components/AreaChart/__snapshots__/AreaChartRTL.test.tsx.snap +++ b/packages/charts/react-charting/src/components/AreaChart/__snapshots__/AreaChartRTL.test.tsx.snap @@ -1142,6 +1142,1148 @@ exports[`Area chart rendering Should render the Area Chart with negative y value </div> `; +exports[`Area chart rendering Should render the Area Chart with tozeroy mode 1`] = ` +<div> + <div + class= + + { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + display: flex; + flex-direction: column; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 14px; + font-weight: 400; + height: 100%; + overflow: hidden; + width: 100%; + } + id="chart_6" + > + <div + id="defaultTabbableElement_7" + /> + <div + class= + ms-FocusZone + &:focus { + outline: none; + } + { + overflow: auto; + } + data-focuszone-id="FocusZone8" + data-tabster="{\\"uncontrolled\\": {}}" + > + <svg + aria-label="Area chart multiple example. Area chart with 3 data series. The X axis displays values. The Y axis displays values. " + focusable="false" + height="292" + role="region" + style="display: block;" + width="650" + > + <g + class= + + & text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + fill: #323130; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 10px; + font-weight: 600; + } + @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& text { + fill: rgb(179, 179, 179); + } + & line { + opacity: 0.2; + stroke: #323130; + width: 1px; + } + @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& line { + opacity: 0.1; + stroke: rgb(179, 179, 179); + } + & path { + display: none; + } + fill="none" + font-family="sans-serif" + font-size="10" + id="xAxisGElementchart_6" + text-anchor="middle" + transform="translate(0, 257)" + > + <path + class="domain" + d="M40.5,6V0.5H630.5V6" + stroke="currentColor" + /> + <g + class="tick" + opacity="1" + transform="translate(40.5,0)" + > + <line + stroke="currentColor" + y2="6" + /> + <text + aria-hidden="true" + dy="0.71em" + fill="currentColor" + y="16" + > + 20 + </text> + </g> + <g + class="tick" + opacity="1" + transform="translate(171.61111111111111,0)" + > + <line + stroke="currentColor" + y2="6" + /> + <text + aria-hidden="true" + dy="0.71em" + fill="currentColor" + y="16" + > + 30 + </text> + </g> + <g + class="tick" + opacity="1" + transform="translate(302.72222222222223,0)" + > + <line + stroke="currentColor" + y2="6" + /> + <text + aria-hidden="true" + dy="0.71em" + fill="currentColor" + y="16" + > + 40 + </text> + </g> + <g + class="tick" + opacity="1" + transform="translate(433.8333333333333,0)" + > + <line + stroke="currentColor" + y2="6" + /> + <text + aria-hidden="true" + dy="0.71em" + fill="currentColor" + y="16" + > + 50 + </text> + </g> + <g + class="tick" + opacity="1" + transform="translate(564.9444444444445,0)" + > + <line + stroke="currentColor" + y2="6" + /> + <text + aria-hidden="true" + dy="0.71em" + fill="currentColor" + y="16" + > + 60 + </text> + </g> + </g> + <g + class= + + & text { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + fill: #323130; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 10px; + font-weight: 600; + } + @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& text { + fill: rgb(179, 179, 179); + } + & path { + display: none; + } + & line { + opacity: 0.2; + stroke: #323130; + } + @media screen and (-ms-high-contrast: white-on-black), screen and (forced-colors: active) and (prefers-color-scheme: dark){& line { + opacity: 0.1; + stroke: rgb(179, 179, 179); + } + fill="none" + font-family="sans-serif" + font-size="10" + id="yAxisGElementchart_6" + text-anchor="end" + transform="translate(40, 0)" + > + <path + class="domain" + d="M-6,257.5H0.5V20.5H-6" + stroke="currentColor" + /> + <g + class="tick" + opacity="1" + transform="translate(0,257.5)" + > + <line + stroke="currentColor" + x2="590" + /> + <text + aria-hidden="true" + dy="0.32em" + fill="currentColor" + x="-10" + > + 0 + </text> + </g> + <g + class="tick" + opacity="1" + transform="translate(0,198.25)" + > + <line + stroke="currentColor" + x2="590" + /> + <text + aria-hidden="true" + dy="0.32em" + fill="currentColor" + x="-10" + > + 15 + </text> + </g> + <g + class="tick" + opacity="1" + transform="translate(0,139)" + > + <line + stroke="currentColor" + x2="590" + /> + <text + aria-hidden="true" + dy="0.32em" + fill="currentColor" + x="-10" + > + 30 + </text> + </g> + <g + class="tick" + opacity="1" + transform="translate(0,79.75)" + > + <line + stroke="currentColor" + x2="590" + /> + <text + aria-hidden="true" + dy="0.32em" + fill="currentColor" + x="-10" + > + 45 + </text> + </g> + <g + class="tick" + opacity="1" + transform="translate(0,20.5)" + > + <line + stroke="currentColor" + x2="590" + /> + <text + aria-hidden="true" + dy="0.32em" + fill="currentColor" + x="-10" + > + 60 + </text> + </g> + </g> + <g> + <rect + fill="transparent" + height="272" + id="rectangle3" + width="630" + /> + </g> + <g> + <path + d="M40,221.45C61.852,211.575,83.704,201.7,105.556,201.7C127.407,201.7,149.259,201.7,171.111,201.7C192.963,201.7,214.815,166.15,236.667,166.15C258.519,166.15,280.37,178,302.222,178C324.074,178,345.926,134.55,367.778,134.55C389.63,134.55,411.481,139.817,433.333,142.45C455.185,145.083,477.037,150.35,498.889,150.35C520.741,150.35,542.593,126.65,564.444,110.85C586.296,95.05,608.148,75.3,630,55.55" + fill="transparent" + id="0-line-areaChart_0" + opacity="0.3" + stroke="green" + stroke-width="3" + /> + <path + d="M40,221.45C61.852,211.575,83.704,201.7,105.556,201.7C127.407,201.7,149.259,201.7,171.111,201.7C192.963,201.7,214.815,166.15,236.667,166.15C258.519,166.15,280.37,178,302.222,178C324.074,178,345.926,134.55,367.778,134.55C389.63,134.55,411.481,139.817,433.333,142.45C455.185,145.083,477.037,150.35,498.889,150.35C520.741,150.35,542.593,126.65,564.444,110.85C586.296,95.05,608.148,75.3,630,55.55L630,257C608.148,257,586.296,257,564.444,257C542.593,257,520.741,257,498.889,257C477.037,257,455.185,257,433.333,257C411.481,257,389.63,257,367.778,257C345.926,257,324.074,257,302.222,257C280.37,257,258.519,257,236.667,257C214.815,257,192.963,257,171.111,257C149.259,257,127.407,257,105.556,257C83.704,257,61.852,257,40,257Z" + fill="green" + fill-opacity="0.7" + id="0-graph-areaChart_0" + opacity="0.8" + /> + <path + d="M40,174.05C61.852,166.15,83.704,158.25,105.556,158.25C127.407,158.25,149.259,217.5,171.111,217.5C192.963,217.5,214.815,217.5,236.667,217.5C258.519,217.5,280.37,206.967,302.222,201.7C324.074,196.433,345.926,185.9,367.778,185.9C389.63,185.9,411.481,221.45,433.333,221.45C455.185,221.45,477.037,166.15,498.889,166.15C520.741,166.15,542.593,229.35,564.444,229.35C586.296,229.35,608.148,134.55,630,39.75" + fill="transparent" + id="1-line-areaChart_0" + opacity="0.3" + stroke="yellow" + stroke-width="3" + /> + <path + d="M40,174.05C61.852,166.15,83.704,158.25,105.556,158.25C127.407,158.25,149.259,217.5,171.111,217.5C192.963,217.5,214.815,217.5,236.667,217.5C258.519,217.5,280.37,206.967,302.222,201.7C324.074,196.433,345.926,185.9,367.778,185.9C389.63,185.9,411.481,221.45,433.333,221.45C455.185,221.45,477.037,166.15,498.889,166.15C520.741,166.15,542.593,229.35,564.444,229.35C586.296,229.35,608.148,134.55,630,39.75L630,257C608.148,257,586.296,257,564.444,257C542.593,257,520.741,257,498.889,257C477.037,257,455.185,257,433.333,257C411.481,257,389.63,257,367.778,257C345.926,257,324.074,257,302.222,257C280.37,257,258.519,257,236.667,257C214.815,257,192.963,257,171.111,257C149.259,257,127.407,257,105.556,257C83.704,257,61.852,257,40,257Z" + fill="yellow" + fill-opacity="0.7" + id="1-graph-areaChart_0" + opacity="0.8" + /> + <path + d="M40,138.5C61.852,128.625,83.704,118.75,105.556,118.75C127.407,118.75,149.259,126.65,171.111,126.65C192.963,126.65,214.815,99,236.667,99C258.519,99,280.37,217.5,302.222,217.5C324.074,217.5,345.926,99,367.778,99C389.63,99,411.481,122.7,433.333,122.7C455.185,122.7,477.037,114.8,498.889,99C520.741,83.2,542.593,20,564.444,20C586.296,20,608.148,59.5,630,99" + fill="transparent" + id="2-line-areaChart_0" + opacity="0.3" + stroke="blue" + stroke-width="3" + /> + <path + d="M40,138.5C61.852,128.625,83.704,118.75,105.556,118.75C127.407,118.75,149.259,126.65,171.111,126.65C192.963,126.65,214.815,99,236.667,99C258.519,99,280.37,217.5,302.222,217.5C324.074,217.5,345.926,99,367.778,99C389.63,99,411.481,122.7,433.333,122.7C455.185,122.7,477.037,114.8,498.889,99C520.741,83.2,542.593,20,564.444,20C586.296,20,608.148,59.5,630,99L630,257C608.148,257,586.296,257,564.444,257C542.593,257,520.741,257,498.889,257C477.037,257,455.185,257,433.333,257C411.481,257,389.63,257,367.778,257C345.926,257,324.074,257,302.222,257C280.37,257,258.519,257,236.667,257C214.815,257,192.963,257,171.111,257C149.259,257,127.407,257,105.556,257C83.704,257,61.852,257,40,257Z" + fill="blue" + fill-opacity="0.7" + id="2-graph-areaChart_0" + opacity="0.8" + /> + <g + aria-label="legend1, series 1 of 3 with 10 data points." + clip-path="url(#clip)" + d="M40,221.45C61.852,211.575,83.704,201.7,105.556,201.7C127.407,201.7,149.259,201.7,171.111,201.7C192.963,201.7,214.815,166.15,236.667,166.15C258.519,166.15,280.37,178,302.222,178C324.074,178,345.926,134.55,367.778,134.55C389.63,134.55,411.481,139.817,433.333,142.45C455.185,145.083,477.037,150.35,498.889,150.35C520.741,150.35,542.593,126.65,564.444,110.85C586.296,95.05,608.148,75.3,630,55.55L630,257C608.148,257,586.296,257,564.444,257C542.593,257,520.741,257,498.889,257C477.037,257,455.185,257,433.333,257C411.481,257,389.63,257,367.778,257C345.926,257,324.074,257,302.222,257C280.37,257,258.519,257,236.667,257C214.815,257,192.963,257,171.111,257C149.259,257,127.407,257,105.556,257C83.704,257,61.852,257,40,257Z" + role="region" + > + <circle + aria-label="20. legend1, 9." + cx="40" + cy="221.45" + data-is-focusable="true" + fill="green" + id="circle2_0" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="0" + /> + <circle + aria-label="25. legend1, 14." + cx="105.55555555555556" + cy="201.7" + data-is-focusable="true" + fill="green" + id="circle2_1" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="30. legend1, 14." + cx="171.11111111111111" + cy="201.7" + data-is-focusable="true" + fill="green" + id="circle2_2" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="35. legend1, 23." + cx="236.66666666666669" + cy="166.15" + data-is-focusable="true" + fill="green" + id="circle2_3" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="40. legend1, 20." + cx="302.22222222222223" + cy="178" + data-is-focusable="true" + fill="green" + id="circle2_4" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="45. legend1, 31." + cx="367.77777777777777" + cy="134.54999999999998" + data-is-focusable="true" + fill="green" + id="circle2_5" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="50. legend1, 29." + cx="433.3333333333333" + cy="142.45" + data-is-focusable="true" + fill="green" + id="circle2_6" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="55. legend1, 27." + cx="498.8888888888889" + cy="150.35000000000002" + data-is-focusable="true" + fill="green" + id="circle2_7" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="60. legend1, 37." + cx="564.4444444444445" + cy="110.85" + data-is-focusable="true" + fill="green" + id="circle2_8" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="65. legend1, 51." + cx="630" + cy="55.550000000000004" + data-is-focusable="true" + fill="green" + id="circle2_9" + r="0" + role="img" + stroke="green" + stroke-width="3" + tabindex="-1" + /> + </g> + <g + aria-label="legend2, series 2 of 3 with 10 data points." + clip-path="url(#clip)" + d="M40,174.05C61.852,166.15,83.704,158.25,105.556,158.25C127.407,158.25,149.259,217.5,171.111,217.5C192.963,217.5,214.815,217.5,236.667,217.5C258.519,217.5,280.37,206.967,302.222,201.7C324.074,196.433,345.926,185.9,367.778,185.9C389.63,185.9,411.481,221.45,433.333,221.45C455.185,221.45,477.037,166.15,498.889,166.15C520.741,166.15,542.593,229.35,564.444,229.35C586.296,229.35,608.148,134.55,630,39.75L630,257C608.148,257,586.296,257,564.444,257C542.593,257,520.741,257,498.889,257C477.037,257,455.185,257,433.333,257C411.481,257,389.63,257,367.778,257C345.926,257,324.074,257,302.222,257C280.37,257,258.519,257,236.667,257C214.815,257,192.963,257,171.111,257C149.259,257,127.407,257,105.556,257C83.704,257,61.852,257,40,257Z" + role="region" + > + <circle + aria-label="20. legend2, 21." + cx="40" + cy="174.05" + data-is-focusable="true" + fill="yellow" + id="circle2_10" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="25. legend2, 25." + cx="105.55555555555556" + cy="158.25" + data-is-focusable="true" + fill="yellow" + id="circle2_11" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="30. legend2, 10." + cx="171.11111111111111" + cy="217.50000000000003" + data-is-focusable="true" + fill="yellow" + id="circle2_12" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="35. legend2, 10." + cx="236.66666666666669" + cy="217.50000000000003" + data-is-focusable="true" + fill="yellow" + id="circle2_13" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="40. legend2, 14." + cx="302.22222222222223" + cy="201.7" + data-is-focusable="true" + fill="yellow" + id="circle2_14" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="45. legend2, 18." + cx="367.77777777777777" + cy="185.89999999999998" + data-is-focusable="true" + fill="yellow" + id="circle2_15" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="50. legend2, 9." + cx="433.3333333333333" + cy="221.45" + data-is-focusable="true" + fill="yellow" + id="circle2_16" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="55. legend2, 23." + cx="498.8888888888889" + cy="166.15" + data-is-focusable="true" + fill="yellow" + id="circle2_17" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="60. legend2, 7." + cx="564.4444444444445" + cy="229.35" + data-is-focusable="true" + fill="yellow" + id="circle2_18" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="65. legend2, 55." + cx="630" + cy="39.75000000000001" + data-is-focusable="true" + fill="yellow" + id="circle2_19" + r="0" + role="img" + stroke="yellow" + stroke-width="3" + tabindex="-1" + /> + </g> + <g + aria-label="legend3, series 3 of 3 with 10 data points." + clip-path="url(#clip)" + d="M40,138.5C61.852,128.625,83.704,118.75,105.556,118.75C127.407,118.75,149.259,126.65,171.111,126.65C192.963,126.65,214.815,99,236.667,99C258.519,99,280.37,217.5,302.222,217.5C324.074,217.5,345.926,99,367.778,99C389.63,99,411.481,122.7,433.333,122.7C455.185,122.7,477.037,114.8,498.889,99C520.741,83.2,542.593,20,564.444,20C586.296,20,608.148,59.5,630,99L630,257C608.148,257,586.296,257,564.444,257C542.593,257,520.741,257,498.889,257C477.037,257,455.185,257,433.333,257C411.481,257,389.63,257,367.778,257C345.926,257,324.074,257,302.222,257C280.37,257,258.519,257,236.667,257C214.815,257,192.963,257,171.111,257C149.259,257,127.407,257,105.556,257C83.704,257,61.852,257,40,257Z" + role="region" + > + <circle + aria-label="20. legend3, 30." + cx="40" + cy="138.5" + data-is-focusable="true" + fill="blue" + id="circle2_20" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="25. legend3, 35." + cx="105.55555555555556" + cy="118.75" + data-is-focusable="true" + fill="blue" + id="circle2_21" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="30. legend3, 33." + cx="171.11111111111111" + cy="126.64999999999999" + data-is-focusable="true" + fill="blue" + id="circle2_22" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="35. legend3, 40." + cx="236.66666666666669" + cy="99" + data-is-focusable="true" + fill="blue" + id="circle2_23" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="40. legend3, 10." + cx="302.22222222222223" + cy="217.50000000000003" + data-is-focusable="true" + fill="blue" + id="circle2_24" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="45. legend3, 40." + cx="367.77777777777777" + cy="99" + data-is-focusable="true" + fill="blue" + id="circle2_25" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="50. legend3, 34." + cx="433.3333333333333" + cy="122.7" + data-is-focusable="true" + fill="blue" + id="circle2_26" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="55. legend3, 40." + cx="498.8888888888889" + cy="99" + data-is-focusable="true" + fill="blue" + id="circle2_27" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="60. legend3, 60." + cx="564.4444444444445" + cy="20" + data-is-focusable="true" + fill="blue" + id="circle2_28" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + <circle + aria-label="65. legend3, 40." + cx="630" + cy="99" + data-is-focusable="true" + fill="blue" + id="circle2_29" + r="0" + role="img" + stroke="blue" + stroke-width="3" + tabindex="-1" + /> + </g> + <line + id="verticalLine_1" + opacity="0.5" + stroke="blue" + stroke-dasharray="5.5" + stroke-width="1" + visibility="hidden" + x1="0" + x2="0" + y1="0" + y2="292" + /> + </g> + </svg> + </div> + <div + class= + + { + margin-left: 20px; + margin-top: 8px; + } + > + <div + class= + + { + align-items: center; + margin-bottom: 0; + margin-left: -8px; + margin-right: 0; + margin-top: -8px; + white-space: nowrap; + width: 100%; + } + > + <div> + <div + style="position: relative;" + > + <div + data-automation-id="visibleContent" + style="" + > + <div + aria-label="Legends" + aria-multiselectable="false" + class= + ms-FocusZone + &:focus { + outline: none; + } + data-focuszone-id="FocusZone9" + data-tabster="{\\"uncontrolled\\": {}}" + role="listbox" + > + <div + class= + ms-OverflowSet + { + display: flex; + flex-wrap: wrap; + justify-content: unset; + position: relative; + } + role="group" + > + <div + class= + ms-OverflowSet-item + { + display: inherit; + flex-shrink: 0; + } + role="none" + > + <button + aria-label="legend1" + aria-posinset="1" + aria-selected="false" + aria-setsize="3" + class= + + { + align-items: center; + background: none; + border: none; + cursor: pointer; + display: flex; + outline: transparent; + padding-bottom: 8px; + padding-left: 8px; + padding-right: 8px; + padding-top: 8px; + position: relative; + text-transform: capitalize; + } + &::-moz-focus-inner { + border: 0; + } + .ms-Fabric--isFocusVisible &:focus:after { + border: 1px solid transparent; + bottom: 1px; + content: ""; + left: 1px; + outline: 1px solid #605e5c; + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){.ms-Fabric--isFocusVisible &:focus:after { + outline-color: #605e5c; + } + :host(.ms-Fabric--isFocusVisible) &:focus:after { + border: 1px solid transparent; + bottom: 1px; + content: ""; + left: 1px; + outline: 1px solid #605e5c; + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){:host(.ms-Fabric--isFocusVisible) &:focus:after { + outline-color: #605e5c; + } + data-is-focusable="true" + role="option" + tabindex="0" + > + <div + class= + + { + background-color: green; + border-color: green; + border: 1px solid; + content: ; + height: 12px; + margin-right: 8px; + width: 12px; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){& { + content: linear-gradient(to right, green, green); + opacity: ; + } + /> + <div + class= + + { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + color: #323130; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 12px; + font-weight: 400; + line-height: 16px; + opacity: ; + } + > + legend1 + </div> + </button> + </div> + <div + class= + ms-OverflowSet-item + { + display: inherit; + flex-shrink: 0; + } + role="none" + > + <button + aria-label="legend2" + aria-posinset="2" + aria-selected="false" + aria-setsize="3" + class= + + { + align-items: center; + background: none; + border: none; + cursor: pointer; + display: flex; + outline: transparent; + padding-bottom: 8px; + padding-left: 8px; + padding-right: 8px; + padding-top: 8px; + position: relative; + text-transform: capitalize; + } + &::-moz-focus-inner { + border: 0; + } + .ms-Fabric--isFocusVisible &:focus:after { + border: 1px solid transparent; + bottom: 1px; + content: ""; + left: 1px; + outline: 1px solid #605e5c; + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){.ms-Fabric--isFocusVisible &:focus:after { + outline-color: #605e5c; + } + :host(.ms-Fabric--isFocusVisible) &:focus:after { + border: 1px solid transparent; + bottom: 1px; + content: ""; + left: 1px; + outline: 1px solid #605e5c; + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){:host(.ms-Fabric--isFocusVisible) &:focus:after { + outline-color: #605e5c; + } + data-is-focusable="true" + role="option" + tabindex="-1" + > + <div + class= + + { + background-color: yellow; + border-color: yellow; + border: 1px solid; + content: ; + height: 12px; + margin-right: 8px; + width: 12px; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){& { + content: linear-gradient(to right, yellow, yellow); + opacity: ; + } + /> + <div + class= + + { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + color: #323130; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 12px; + font-weight: 400; + line-height: 16px; + opacity: ; + } + > + legend2 + </div> + </button> + </div> + <div + class= + ms-OverflowSet-item + { + display: inherit; + flex-shrink: 0; + } + role="none" + > + <button + aria-label="legend3" + aria-posinset="3" + aria-selected="false" + aria-setsize="3" + class= + + { + align-items: center; + background: none; + border: none; + cursor: pointer; + display: flex; + outline: transparent; + padding-bottom: 8px; + padding-left: 8px; + padding-right: 8px; + padding-top: 8px; + position: relative; + text-transform: capitalize; + } + &::-moz-focus-inner { + border: 0; + } + .ms-Fabric--isFocusVisible &:focus:after { + border: 1px solid transparent; + bottom: 1px; + content: ""; + left: 1px; + outline: 1px solid #605e5c; + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){.ms-Fabric--isFocusVisible &:focus:after { + outline-color: #605e5c; + } + :host(.ms-Fabric--isFocusVisible) &:focus:after { + border: 1px solid transparent; + bottom: 1px; + content: ""; + left: 1px; + outline: 1px solid #605e5c; + position: absolute; + right: 1px; + top: 1px; + z-index: 1; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){:host(.ms-Fabric--isFocusVisible) &:focus:after { + outline-color: #605e5c; + } + data-is-focusable="true" + role="option" + tabindex="-1" + > + <div + class= + + { + background-color: blue; + border-color: blue; + border: 1px solid; + content: ; + height: 12px; + margin-right: 8px; + width: 12px; + } + @media screen and (-ms-high-contrast: active), screen and (forced-colors: active){& { + content: linear-gradient(to right, blue, blue); + opacity: ; + } + /> + <div + class= + + { + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + color: #323130; + font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; + font-size: 12px; + font-weight: 400; + line-height: 16px; + opacity: ; + } + > + legend3 + </div> + </button> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> + </div> +</div> +`; + exports[`Area chart rendering Should render the Area chart with date x-axis data when tick Values given and tick format is %d 1`] = ` <div> <div diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts index bfdc4419d3ca55..be544d55d72cc8 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts @@ -344,6 +344,7 @@ export const transformPlotlyJsonToScatterChartProps = ( isDarkTheme?: boolean, ): ILineChartProps | IAreaChartProps => { const { data, layout } = jsonObj; + let mode: string = 'tonexty'; const chartData: ILineChartPoints[] = data.map((series: any, index: number) => { const xValues = series.x; @@ -352,6 +353,7 @@ export const transformPlotlyJsonToScatterChartProps = ( const isXNumber = isNumberArray(xValues); const legend: string = series.name || `Series ${index + 1}`; const lineColor = getColor(legend, colorMap, isDarkTheme); + mode = series.fill === 'tozeroy' ? 'tozeroy' : 'tonexty'; return { legend, @@ -376,6 +378,7 @@ export const transformPlotlyJsonToScatterChartProps = ( supportNegativeData: true, xAxisTitle, yAxisTitle, + mode, } as IAreaChartProps; } else { return { diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap index 8966e3f55d1b98..85baf67c9f3528 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap @@ -3324,6 +3324,7 @@ Object { }, ], }, + "mode": "tonexty", "supportNegativeData": true, "xAxisTitle": "", "yAxisTitle": "", @@ -4555,6 +4556,7 @@ Object { }, ], }, + "mode": "tonexty", "supportNegativeData": true, "xAxisTitle": "", "yAxisTitle": "", diff --git a/packages/react-examples/src/react-charting/AreaChart/AreaChart.Basic.Example.tsx b/packages/react-examples/src/react-charting/AreaChart/AreaChart.Basic.Example.tsx index 387535181da0e8..1c65e5376cb2a5 100644 --- a/packages/react-examples/src/react-charting/AreaChart/AreaChart.Basic.Example.tsx +++ b/packages/react-examples/src/react-charting/AreaChart/AreaChart.Basic.Example.tsx @@ -10,6 +10,7 @@ interface IAreaChartBasicState { isCalloutselected: boolean; showAxisTitles: boolean; legendMultiSelect: boolean; + changeChartMode: boolean; } const options: IChoiceGroupOption[] = [ @@ -26,6 +27,7 @@ export class AreaChartBasicExample extends React.Component<{}, IAreaChartBasicSt isCalloutselected: false, showAxisTitles: true, legendMultiSelect: false, + changeChartMode: false, }; } public componentDidMount(): void { @@ -75,6 +77,11 @@ export class AreaChartBasicExample extends React.Component<{}, IAreaChartBasicSt this.setState({ legendMultiSelect: checked }); }; + private _onToggleChartMode = (ev: React.MouseEvent<HTMLElement>, checked: boolean) => { + this.forceUpdate(); + this.setState({ changeChartMode: checked }); + }; + private _basicExample(): JSX.Element { const chart1Points = [ { @@ -181,7 +188,7 @@ export class AreaChartBasicExample extends React.Component<{}, IAreaChartBasicSt const chart3Points = chart1Points.map((point, index) => { return { x: point.x, - y: point.y - 5000, + y: point.y + 7000, xAxisCalloutData: point.xAxisCalloutData, yAxisCalloutData: point.yAxisCalloutData, }; @@ -249,6 +256,14 @@ export class AreaChartBasicExample extends React.Component<{}, IAreaChartBasicSt onChange={this._onToggleLegendMultiSelect} styles={{ root: { marginTop: '10px' } }} /> + <Toggle + label="Change chart mode to toZeroY" + onText="ON" + offText="OFF" + checked={this.state.changeChartMode} + onChange={this._onToggleChartMode} + styles={{ root: { marginTop: '10px' } }} + /> {this.state.showAxisTitles && ( <div style={rootStyle}> <AreaChart @@ -274,6 +289,7 @@ export class AreaChartBasicExample extends React.Component<{}, IAreaChartBasicSt legendProps={{ canSelectMultipleLegends: this.state.legendMultiSelect, }} + mode={this.state.changeChartMode ? 'tozeroy' : 'tonexty'} /> </div> )} @@ -300,6 +316,7 @@ export class AreaChartBasicExample extends React.Component<{}, IAreaChartBasicSt legendProps={{ canSelectMultipleLegends: this.state.legendMultiSelect, }} + mode={this.state.changeChartMode ? 'tozeroy' : 'tonexty'} /> </div> )} From cc1756e0cb08f40d5c356166b0d9abe9beb80b5b Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Mon, 20 Jan 2025 07:22:04 +0000 Subject: [PATCH 61/78] release: applying package updates - react v8 --- ...-af108562-5adb-43f5-b0f2-06358f95ab65.json | 7 ----- ...-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json | 7 ----- ...-05901292-a3b8-4d34-834a-8f5d74736e99.json | 7 ----- ...-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json | 7 ----- ...-f28e7eb2-d3a4-4060-95af-0c74756f900d.json | 7 ----- ...-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json | 7 ----- ...-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json | 7 ----- ...-4aabb452-e7e3-47e3-9964-7a7c4814e759.json | 7 ----- ...-aa5b0252-40de-497c-88f5-377ada948719.json | 7 ----- ...-14e136f0-eeb5-4113-8921-e732772e0a04.json | 7 ----- ...-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json | 7 ----- ...-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json | 7 ----- ...-946876fa-b8f4-4e15-bf15-54f86a508654.json | 7 ----- ...-1e695416-a364-41c7-98b1-5cc336ce40ed.json | 7 ----- ...-9d03e3c6-0e57-491d-bbb2-ff84af746057.json | 7 ----- ...-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json | 7 ----- packages/charts/react-charting/CHANGELOG.json | 29 +++++++++++++++++++ packages/charts/react-charting/CHANGELOG.md | 12 +++++++- packages/charts/react-charting/package.json | 2 +- packages/codemods/CHANGELOG.json | 15 ++++++++++ packages/font-icons-mdl2/CHANGELOG.json | 15 ++++++++++ packages/foundation-legacy/CHANGELOG.json | 15 ++++++++++ packages/keyboard-key/CHANGELOG.json | 15 ++++++++++ packages/merge-styles/CHANGELOG.json | 15 ++++++++++ packages/react-date-time/CHANGELOG.json | 15 ++++++++++ .../react-docsite-components/CHANGELOG.json | 15 ++++++++++ .../react-docsite-components/CHANGELOG.md | 11 ++++++- .../react-docsite-components/package.json | 4 +-- packages/react-examples/package.json | 4 +-- packages/react-experiments/CHANGELOG.json | 15 ++++++++++ packages/react-focus/CHANGELOG.json | 15 ++++++++++ packages/react-monaco-editor/CHANGELOG.json | 23 +++++++++++++++ packages/react-monaco-editor/CHANGELOG.md | 11 ++++++- packages/react-monaco-editor/package.json | 4 +-- packages/react/CHANGELOG.json | 15 ++++++++++ packages/style-utilities/CHANGELOG.json | 15 ++++++++++ packages/theme/CHANGELOG.json | 15 ++++++++++ packages/utilities/CHANGELOG.json | 15 ++++++++++ 38 files changed, 285 insertions(+), 122 deletions(-) delete mode 100644 change/@fluentui-codemods-af108562-5adb-43f5-b0f2-06358f95ab65.json delete mode 100644 change/@fluentui-font-icons-mdl2-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json delete mode 100644 change/@fluentui-foundation-legacy-05901292-a3b8-4d34-834a-8f5d74736e99.json delete mode 100644 change/@fluentui-keyboard-key-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json delete mode 100644 change/@fluentui-merge-styles-f28e7eb2-d3a4-4060-95af-0c74756f900d.json delete mode 100644 change/@fluentui-react-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json delete mode 100644 change/@fluentui-react-charting-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json delete mode 100644 change/@fluentui-react-charting-4aabb452-e7e3-47e3-9964-7a7c4814e759.json delete mode 100644 change/@fluentui-react-charting-aa5b0252-40de-497c-88f5-377ada948719.json delete mode 100644 change/@fluentui-react-date-time-14e136f0-eeb5-4113-8921-e732772e0a04.json delete mode 100644 change/@fluentui-react-experiments-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json delete mode 100644 change/@fluentui-react-focus-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json delete mode 100644 change/@fluentui-react-monaco-editor-946876fa-b8f4-4e15-bf15-54f86a508654.json delete mode 100644 change/@fluentui-style-utilities-1e695416-a364-41c7-98b1-5cc336ce40ed.json delete mode 100644 change/@fluentui-theme-9d03e3c6-0e57-491d-bbb2-ff84af746057.json delete mode 100644 change/@fluentui-utilities-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json diff --git a/change/@fluentui-codemods-af108562-5adb-43f5-b0f2-06358f95ab65.json b/change/@fluentui-codemods-af108562-5adb-43f5-b0f2-06358f95ab65.json deleted file mode 100644 index e59c56d1811400..00000000000000 --- a/change/@fluentui-codemods-af108562-5adb-43f5-b0f2-06358f95ab65.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/codemods", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-font-icons-mdl2-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json b/change/@fluentui-font-icons-mdl2-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json deleted file mode 100644 index 6ac801eaac0088..00000000000000 --- a/change/@fluentui-font-icons-mdl2-db6b5e91-90e1-4d29-8a79-ac0f0c0ee232.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/font-icons-mdl2", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-foundation-legacy-05901292-a3b8-4d34-834a-8f5d74736e99.json b/change/@fluentui-foundation-legacy-05901292-a3b8-4d34-834a-8f5d74736e99.json deleted file mode 100644 index b7ada786f9ef0a..00000000000000 --- a/change/@fluentui-foundation-legacy-05901292-a3b8-4d34-834a-8f5d74736e99.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/foundation-legacy", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-keyboard-key-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json b/change/@fluentui-keyboard-key-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json deleted file mode 100644 index 34089c5205b9cf..00000000000000 --- a/change/@fluentui-keyboard-key-def9b0a9-f2af-4ae3-aaaf-210eb1cc7663.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/keyboard-key", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-merge-styles-f28e7eb2-d3a4-4060-95af-0c74756f900d.json b/change/@fluentui-merge-styles-f28e7eb2-d3a4-4060-95af-0c74756f900d.json deleted file mode 100644 index 252227e0745e4d..00000000000000 --- a/change/@fluentui-merge-styles-f28e7eb2-d3a4-4060-95af-0c74756f900d.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/merge-styles", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json b/change/@fluentui-react-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json deleted file mode 100644 index 31063dd50b8723..00000000000000 --- a/change/@fluentui-react-8e31bacb-5949-4ddf-a561-b2e8eb9365b9.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-charting-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json b/change/@fluentui-react-charting-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json deleted file mode 100644 index c5392850b45987..00000000000000 --- a/change/@fluentui-react-charting-34dd50d3-d7cd-4354-9e9b-b8eeb44d4e19.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Support tozeroy mode for Area Charts", - "packageName": "@fluentui/react-charting", - "email": "120183316+srmukher@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-charting-4aabb452-e7e3-47e3-9964-7a7c4814e759.json b/change/@fluentui-react-charting-4aabb452-e7e3-47e3-9964-7a7c4814e759.json deleted file mode 100644 index 157b74502e849c..00000000000000 --- a/change/@fluentui-react-charting-4aabb452-e7e3-47e3-9964-7a7c4814e759.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Declarative chart bug fixes", - "packageName": "@fluentui/react-charting", - "email": "74965306+Anush2303@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-charting-aa5b0252-40de-497c-88f5-377ada948719.json b/change/@fluentui-react-charting-aa5b0252-40de-497c-88f5-377ada948719.json deleted file mode 100644 index cb303b57fb9e0b..00000000000000 --- a/change/@fluentui-react-charting-aa5b0252-40de-497c-88f5-377ada948719.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-charting", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-date-time-14e136f0-eeb5-4113-8921-e732772e0a04.json b/change/@fluentui-react-date-time-14e136f0-eeb5-4113-8921-e732772e0a04.json deleted file mode 100644 index 62abe8ca9a7ab9..00000000000000 --- a/change/@fluentui-react-date-time-14e136f0-eeb5-4113-8921-e732772e0a04.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-date-time", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-experiments-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json b/change/@fluentui-react-experiments-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json deleted file mode 100644 index 74c5f58ffe8cf0..00000000000000 --- a/change/@fluentui-react-experiments-4f3c4b24-6a77-45ac-b7f8-fb04d982fd7b.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-experiments", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-focus-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json b/change/@fluentui-react-focus-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json deleted file mode 100644 index 2961f1f4a9d0ae..00000000000000 --- a/change/@fluentui-react-focus-5e8ead15-c118-4dec-84e8-744d6bf63fcb.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-focus", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-monaco-editor-946876fa-b8f4-4e15-bf15-54f86a508654.json b/change/@fluentui-react-monaco-editor-946876fa-b8f4-4e15-bf15-54f86a508654.json deleted file mode 100644 index cce342d863249c..00000000000000 --- a/change/@fluentui-react-monaco-editor-946876fa-b8f4-4e15-bf15-54f86a508654.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-monaco-editor", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-style-utilities-1e695416-a364-41c7-98b1-5cc336ce40ed.json b/change/@fluentui-style-utilities-1e695416-a364-41c7-98b1-5cc336ce40ed.json deleted file mode 100644 index 56b5682720cded..00000000000000 --- a/change/@fluentui-style-utilities-1e695416-a364-41c7-98b1-5cc336ce40ed.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/style-utilities", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-theme-9d03e3c6-0e57-491d-bbb2-ff84af746057.json b/change/@fluentui-theme-9d03e3c6-0e57-491d-bbb2-ff84af746057.json deleted file mode 100644 index 1afa956ec2955e..00000000000000 --- a/change/@fluentui-theme-9d03e3c6-0e57-491d-bbb2-ff84af746057.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/theme", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-utilities-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json b/change/@fluentui-utilities-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json deleted file mode 100644 index 463e5c9a6e8735..00000000000000 --- a/change/@fluentui-utilities-e4d8572c-17af-41f6-8d5c-e84d6038d6bd.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/utilities", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/packages/charts/react-charting/CHANGELOG.json b/packages/charts/react-charting/CHANGELOG.json index 3865d8a3ef769e..f6da08d1e22a0c 100644 --- a/packages/charts/react-charting/CHANGELOG.json +++ b/packages/charts/react-charting/CHANGELOG.json @@ -1,6 +1,35 @@ { "name": "@fluentui/react-charting", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:43 GMT", + "tag": "@fluentui/react-charting_v5.23.42", + "version": "5.23.42", + "comments": { + "patch": [ + { + "author": "120183316+srmukher@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "556fc8e7b9a921cedbb07c2f0670dfabcf8ec0ed", + "comment": "Support tozeroy mode for Area Charts" + }, + { + "author": "74965306+Anush2303@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "dc365b11fcca7eb0077460510eb78d93d3315ecd", + "comment": "Declarative chart bug fixes" + } + ], + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-charting", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-charting_v5.23.41", diff --git a/packages/charts/react-charting/CHANGELOG.md b/packages/charts/react-charting/CHANGELOG.md index b3da0add0090fb..ead744ab3ae8e3 100644 --- a/packages/charts/react-charting/CHANGELOG.md +++ b/packages/charts/react-charting/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-charting -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Mon, 20 Jan 2025 07:21:43 GMT and should not be manually modified. <!-- Start content --> +## [5.23.42](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.42) + +Mon, 20 Jan 2025 07:21:43 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charting_v5.23.41..@fluentui/react-charting_v5.23.42) + +### Patches + +- Support tozeroy mode for Area Charts ([PR #33581](https://github.com/microsoft/fluentui/pull/33581) by 120183316+srmukher@users.noreply.github.com) +- Declarative chart bug fixes ([PR #33567](https://github.com/microsoft/fluentui/pull/33567) by 74965306+Anush2303@users.noreply.github.com) + ## [5.23.41](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.41) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/charts/react-charting/package.json b/packages/charts/react-charting/package.json index 808b802f2c80ab..71f2748e09d90f 100644 --- a/packages/charts/react-charting/package.json +++ b/packages/charts/react-charting/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-charting", - "version": "5.23.41", + "version": "5.23.42", "description": "React web charting controls for Microsoft fluentui system.", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/codemods/CHANGELOG.json b/packages/codemods/CHANGELOG.json index 2056607f1acf2e..9b2d21d8a738fb 100644 --- a/packages/codemods/CHANGELOG.json +++ b/packages/codemods/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/codemods", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:45 GMT", + "tag": "@fluentui/codemods_v8.4.27", + "version": "8.4.27", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/codemods", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Mon, 23 Dec 2024 07:22:57 GMT", "tag": "@fluentui/codemods_v8.4.27", diff --git a/packages/font-icons-mdl2/CHANGELOG.json b/packages/font-icons-mdl2/CHANGELOG.json index cda94a3050c548..d74062a138bc77 100644 --- a/packages/font-icons-mdl2/CHANGELOG.json +++ b/packages/font-icons-mdl2/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/font-icons-mdl2", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:45 GMT", + "tag": "@fluentui/font-icons-mdl2_v8.5.57", + "version": "8.5.57", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/font-icons-mdl2", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Mon, 23 Dec 2024 07:22:58 GMT", "tag": "@fluentui/font-icons-mdl2_v8.5.57", diff --git a/packages/foundation-legacy/CHANGELOG.json b/packages/foundation-legacy/CHANGELOG.json index d7708bd4ff75aa..0e62c7992c91d7 100644 --- a/packages/foundation-legacy/CHANGELOG.json +++ b/packages/foundation-legacy/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/foundation-legacy", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:46 GMT", + "tag": "@fluentui/foundation-legacy_v8.4.23", + "version": "8.4.23", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/foundation-legacy", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Mon, 23 Dec 2024 07:22:58 GMT", "tag": "@fluentui/foundation-legacy_v8.4.23", diff --git a/packages/keyboard-key/CHANGELOG.json b/packages/keyboard-key/CHANGELOG.json index d07257fdba6618..eb90eae00e4eb3 100644 --- a/packages/keyboard-key/CHANGELOG.json +++ b/packages/keyboard-key/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/keyboard-key", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:46 GMT", + "tag": "@fluentui/keyboard-key_v0.4.23", + "version": "0.4.23", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/keyboard-key", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Thu, 01 Aug 2024 07:24:44 GMT", "tag": "@fluentui/keyboard-key_v0.4.23", diff --git a/packages/merge-styles/CHANGELOG.json b/packages/merge-styles/CHANGELOG.json index eed97b22305b13..d9254e59cb9873 100644 --- a/packages/merge-styles/CHANGELOG.json +++ b/packages/merge-styles/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/merge-styles", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:46 GMT", + "tag": "@fluentui/merge-styles_v8.6.13", + "version": "8.6.13", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/merge-styles", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Thu, 08 Aug 2024 07:24:14 GMT", "tag": "@fluentui/merge-styles_v8.6.13", diff --git a/packages/react-date-time/CHANGELOG.json b/packages/react-date-time/CHANGELOG.json index 13d1d5535aa14a..75114f82fe8458 100644 --- a/packages/react-date-time/CHANGELOG.json +++ b/packages/react-date-time/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-date-time", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:44 GMT", + "tag": "@fluentui/react-date-time_v8.7.196", + "version": "8.7.196", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-date-time", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-date-time_v8.7.196", diff --git a/packages/react-docsite-components/CHANGELOG.json b/packages/react-docsite-components/CHANGELOG.json index 25c7b12d0ca2af..a5a561b8dc8503 100644 --- a/packages/react-docsite-components/CHANGELOG.json +++ b/packages/react-docsite-components/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-docsite-components", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:47 GMT", + "tag": "@fluentui/react-docsite-components_v8.13.162", + "version": "8.13.162", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react-monaco-editor to v1.7.280", + "commit": "556fc8e7b9a921cedbb07c2f0670dfabcf8ec0ed" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-docsite-components_v8.13.161", diff --git a/packages/react-docsite-components/CHANGELOG.md b/packages/react-docsite-components/CHANGELOG.md index 0bcbda66e29a6b..f2e9af5b8bbb09 100644 --- a/packages/react-docsite-components/CHANGELOG.md +++ b/packages/react-docsite-components/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-docsite-components -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Mon, 20 Jan 2025 07:21:47 GMT and should not be manually modified. <!-- Start content --> +## [8.13.162](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.162) + +Mon, 20 Jan 2025 07:21:47 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-docsite-components_v8.13.161..@fluentui/react-docsite-components_v8.13.162) + +### Patches + +- Bump @fluentui/react-monaco-editor to v1.7.280 ([PR #33581](https://github.com/microsoft/fluentui/pull/33581) by beachball) + ## [8.13.161](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.161) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/react-docsite-components/package.json b/packages/react-docsite-components/package.json index 846e8494ce15e2..1299b7f308c8a2 100644 --- a/packages/react-docsite-components/package.json +++ b/packages/react-docsite-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-docsite-components", - "version": "8.13.161", + "version": "8.13.162", "description": "Fluent UI React components for building documentation sites.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -42,7 +42,7 @@ "@fluentui/public-docsite-setup": "^0.3.34", "@fluentui/react-hooks": "^8.8.16", "@fluentui/set-version": "^8.2.23", - "@fluentui/react-monaco-editor": "^1.7.279", + "@fluentui/react-monaco-editor": "^1.7.280", "color-check": "0.0.2", "markdown-to-jsx": "^7.0.0", "office-ui-fabric-core": "^11.0.0", diff --git a/packages/react-examples/package.json b/packages/react-examples/package.json index 52d192909d0151..42e68cdf6178e1 100644 --- a/packages/react-examples/package.json +++ b/packages/react-examples/package.json @@ -36,8 +36,8 @@ "@fluentui/merge-styles": "^8.6.13", "@fluentui/react": "^8.122.7", "@fluentui/react-cards": "^0.205.196", - "@fluentui/react-charting": "^5.23.41", - "@fluentui/react-docsite-components": "^8.13.161", + "@fluentui/react-charting": "^5.23.42", + "@fluentui/react-docsite-components": "^8.13.162", "@fluentui/react-experiments": "^8.14.193", "@fluentui/react-file-type-icons": "^8.12.7", "@fluentui/react-focus": "^8.9.20", diff --git a/packages/react-experiments/CHANGELOG.json b/packages/react-experiments/CHANGELOG.json index 25d945574899a8..213ae0a64004fe 100644 --- a/packages/react-experiments/CHANGELOG.json +++ b/packages/react-experiments/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-experiments", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:44 GMT", + "tag": "@fluentui/react-experiments_v8.14.193", + "version": "8.14.193", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-experiments", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-experiments_v8.14.193", diff --git a/packages/react-focus/CHANGELOG.json b/packages/react-focus/CHANGELOG.json index 151892d1415cdb..fad38847b86b52 100644 --- a/packages/react-focus/CHANGELOG.json +++ b/packages/react-focus/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-focus", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:44 GMT", + "tag": "@fluentui/react-focus_v8.9.20", + "version": "8.9.20", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-focus", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Mon, 23 Dec 2024 07:22:58 GMT", "tag": "@fluentui/react-focus_v8.9.20", diff --git a/packages/react-monaco-editor/CHANGELOG.json b/packages/react-monaco-editor/CHANGELOG.json index 3bc576576e9b58..532a1478e0b13e 100644 --- a/packages/react-monaco-editor/CHANGELOG.json +++ b/packages/react-monaco-editor/CHANGELOG.json @@ -1,6 +1,29 @@ { "name": "@fluentui/react-monaco-editor", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:45 GMT", + "tag": "@fluentui/react-monaco-editor_v1.7.280", + "version": "1.7.280", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-monaco-editor", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react-charting to v5.23.42", + "commit": "556fc8e7b9a921cedbb07c2f0670dfabcf8ec0ed" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-monaco-editor_v1.7.279", diff --git a/packages/react-monaco-editor/CHANGELOG.md b/packages/react-monaco-editor/CHANGELOG.md index c29dc163f96936..824f64d4196921 100644 --- a/packages/react-monaco-editor/CHANGELOG.md +++ b/packages/react-monaco-editor/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-monaco-editor -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Mon, 20 Jan 2025 07:21:45 GMT and should not be manually modified. <!-- Start content --> +## [1.7.280](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.280) + +Mon, 20 Jan 2025 07:21:45 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-monaco-editor_v1.7.279..@fluentui/react-monaco-editor_v1.7.280) + +### Patches + +- Bump @fluentui/react-charting to v5.23.42 ([PR #33581](https://github.com/microsoft/fluentui/pull/33581) by beachball) + ## [1.7.279](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.279) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/react-monaco-editor/package.json b/packages/react-monaco-editor/package.json index 92edf729901440..5a39e456a2918d 100644 --- a/packages/react-monaco-editor/package.json +++ b/packages/react-monaco-editor/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-monaco-editor", - "version": "1.7.279", + "version": "1.7.280", "description": "Live React example editing using monaco", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -34,7 +34,7 @@ "@fluentui/example-data": "^8.4.25", "@fluentui/monaco-editor": "^1.3.24", "@fluentui/react-hooks": "^8.8.16", - "@fluentui/react-charting": "^5.23.41", + "@fluentui/react-charting": "^5.23.42", "raw-loader": "4.0.2", "react-syntax-highlighter": "^10.1.3", "tslib": "^2.1.0" diff --git a/packages/react/CHANGELOG.json b/packages/react/CHANGELOG.json index eb7da96614886e..59b59940d8660f 100644 --- a/packages/react/CHANGELOG.json +++ b/packages/react/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:47 GMT", + "tag": "@fluentui/react_v8.122.7", + "version": "8.122.7", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:31 GMT", "tag": "@fluentui/react_v8.122.7", diff --git a/packages/style-utilities/CHANGELOG.json b/packages/style-utilities/CHANGELOG.json index bd87297069b25f..ff9f099dfb596f 100644 --- a/packages/style-utilities/CHANGELOG.json +++ b/packages/style-utilities/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/style-utilities", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:45 GMT", + "tag": "@fluentui/style-utilities_v8.11.6", + "version": "8.11.6", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/style-utilities", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Mon, 23 Dec 2024 07:22:58 GMT", "tag": "@fluentui/style-utilities_v8.11.6", diff --git a/packages/theme/CHANGELOG.json b/packages/theme/CHANGELOG.json index 383c73f51fa8f5..7ad68d2ddd2291 100644 --- a/packages/theme/CHANGELOG.json +++ b/packages/theme/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/theme", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:42 GMT", + "tag": "@fluentui/theme_v2.6.64", + "version": "2.6.64", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/theme", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Mon, 23 Dec 2024 07:22:58 GMT", "tag": "@fluentui/theme_v2.6.64", diff --git a/packages/utilities/CHANGELOG.json b/packages/utilities/CHANGELOG.json index 638164dc2d94ee..4660d6bc592fac 100644 --- a/packages/utilities/CHANGELOG.json +++ b/packages/utilities/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/utilities", "entries": [ + { + "date": "Mon, 20 Jan 2025 07:21:43 GMT", + "tag": "@fluentui/utilities_v8.15.19", + "version": "8.15.19", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/utilities", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Fri, 11 Oct 2024 16:51:54 GMT", "tag": "@fluentui/utilities_v8.15.19", From b929a867df391be107630afe2de281c5d06594e7 Mon Sep 17 00:00:00 2001 From: "Atishay Jain (atisjai)" <98592573+AtishayMsft@users.noreply.github.com> Date: Mon, 20 Jan 2025 18:06:42 +0530 Subject: [PATCH 62/78] feat(react-charting): strongly type plotly schema and bug fixes (#33621) Co-authored-by: Anush Gupta <74965306+Anush2303@users.noreply.github.com> Co-authored-by: srmukher <120183316+srmukher@users.noreply.github.com> Co-authored-by: krkshitij <110246001+krkshitij@users.noreply.github.com> Co-authored-by: Atishay Jain (from Dev Box) <atisjai@microsoft.com> --- ...-17bc0f58-a206-47b6-b5dc-6bf008820978.json | 7 + ...-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json | 7 + ...-b50824ac-5ec3-43fe-af53-76307680fb75.json | 7 + ...-be791d81-9cfb-4576-961c-03c4f6eb85c0.json | 7 + .../bundle-size/DeclarativeChart.fixture.js | 7 + .../DeclarativeChart/DeclarativeChart.tsx | 214 +- .../DeclarativeChart/PlotlySchema.ts | 1937 +++++++++++++++++ .../DeclarativeChart/PlotlySchemaAdapter.ts | 375 ++-- .../DeclarativeChartRTL.test.tsx.snap | 800 +++---- .../PlotlySchemaAdapterUT.test.tsx.snap | 10 +- .../HorizontalBarChartWithAxis.base.tsx | 4 +- .../VerticalBarChartRTL.test.tsx.snap | 4 +- .../VerticalStackedBarChart.base.tsx | 2 +- .../react-charting/src/utilities/utilities.ts | 11 +- 14 files changed, 2740 insertions(+), 652 deletions(-) create mode 100644 change/@fluentui-react-charting-17bc0f58-a206-47b6-b5dc-6bf008820978.json create mode 100644 change/@fluentui-react-charting-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json create mode 100644 change/@fluentui-react-charting-b50824ac-5ec3-43fe-af53-76307680fb75.json create mode 100644 change/@fluentui-react-charting-be791d81-9cfb-4576-961c-03c4f6eb85c0.json create mode 100644 packages/charts/react-charting/bundle-size/DeclarativeChart.fixture.js create mode 100644 packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchema.ts diff --git a/change/@fluentui-react-charting-17bc0f58-a206-47b6-b5dc-6bf008820978.json b/change/@fluentui-react-charting-17bc0f58-a206-47b6-b5dc-6bf008820978.json new file mode 100644 index 00000000000000..1026025406a1b3 --- /dev/null +++ b/change/@fluentui-react-charting-17bc0f58-a206-47b6-b5dc-6bf008820978.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Adding fallback and fixes for test app crashes for 12 schema data ", + "packageName": "@fluentui/react-charting", + "email": "120183316+srmukher@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-charting-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json b/change/@fluentui-react-charting-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json new file mode 100644 index 00000000000000..fef536a369732e --- /dev/null +++ b/change/@fluentui-react-charting-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Use strongly typed interfaces for plotly schema", + "packageName": "@fluentui/react-charting", + "email": "98592573+AtishayMsft@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-charting-b50824ac-5ec3-43fe-af53-76307680fb75.json b/change/@fluentui-react-charting-b50824ac-5ec3-43fe-af53-76307680fb75.json new file mode 100644 index 00000000000000..e18e77a6242e66 --- /dev/null +++ b/change/@fluentui-react-charting-b50824ac-5ec3-43fe-af53-76307680fb75.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: resolve bugs in declarative chart", + "packageName": "@fluentui/react-charting", + "email": "110246001+krkshitij@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-charting-be791d81-9cfb-4576-961c-03c4f6eb85c0.json b/change/@fluentui-react-charting-be791d81-9cfb-4576-961c-03c4f6eb85c0.json new file mode 100644 index 00000000000000..b3c031f141fdbb --- /dev/null +++ b/change/@fluentui-react-charting-be791d81-9cfb-4576-961c-03c4f6eb85c0.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "StronglyType plotly schema bug fix", + "packageName": "@fluentui/react-charting", + "email": "74965306+Anush2303@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/react-charting/bundle-size/DeclarativeChart.fixture.js b/packages/charts/react-charting/bundle-size/DeclarativeChart.fixture.js new file mode 100644 index 00000000000000..ce50de1aed3848 --- /dev/null +++ b/packages/charts/react-charting/bundle-size/DeclarativeChart.fixture.js @@ -0,0 +1,7 @@ +import { DeclarativeChart } from '@fluentui/react-charting'; + +console.log(DeclarativeChart); + +export default { + name: 'DeclarativeChart', +}; diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx b/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx index 63f472a281be77..728f5ddfbbf797 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx +++ b/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx @@ -1,10 +1,11 @@ /* eslint-disable @typescript-eslint/naming-convention */ -/* eslint-disable @typescript-eslint/no-explicit-any */ import * as React from 'react'; import { useTheme } from '@fluentui/react'; import { IRefObject } from '@fluentui/react/lib/Utilities'; import { DonutChart } from '../DonutChart/index'; import { VerticalStackedBarChart } from '../VerticalStackedBarChart/index'; +import { PlotData, PlotlySchema } from './PlotlySchema'; +//import type { Data, Layout } from './PlotlySchema'; import { isArrayOrTypedArray, isDateArray, @@ -21,10 +22,11 @@ import { transformPlotlyJsonToGaugeProps, transformPlotlyJsonToGVBCProps, transformPlotlyJsonToVBCProps, + isLineData, } from './PlotlySchemaAdapter'; -import { LineChart } from '../LineChart/index'; +import { LineChart, ILineChartProps } from '../LineChart/index'; import { HorizontalBarChartWithAxis } from '../HorizontalBarChartWithAxis/index'; -import { AreaChart } from '../AreaChart/index'; +import { AreaChart, IAreaChartProps } from '../AreaChart/index'; import { HeatMapChart } from '../HeatMapChart/index'; import { SankeyChart } from '../SankeyChart/SankeyChart'; import { GaugeChart } from '../GaugeChart/index'; @@ -41,6 +43,7 @@ export interface Schema { /** * Plotly schema represented as JSON object */ + // eslint-disable-next-line @typescript-eslint/no-explicit-any plotlySchema: any; } @@ -87,12 +90,8 @@ export const DeclarativeChart: React.FunctionComponent<DeclarativeChartProps> = DeclarativeChartProps >((props, forwardedRef) => { const { plotlySchema } = sanitizeJson(props.chartSchema); - const { data, layout } = plotlySchema; + const plotlyInput = plotlySchema as PlotlySchema; let { selectedLegends } = plotlySchema; - const xValues = data[0].x; - const isXDate = isDateArray(xValues); - const isXNumber = isNumberArray(xValues); - const isXMonth = isMonthArray(xValues); const colorMap = useColorMapping(); const theme = useTheme(); const isDarkTheme = theme?.isInverted ?? false; @@ -106,7 +105,7 @@ export const DeclarativeChart: React.FunctionComponent<DeclarativeChartProps> = const onActiveLegendsChange = (keys: string[]) => { setActiveLegends(keys); if (props.onSchemaChange) { - props.onSchemaChange({ plotlySchema: { data, layout, selectedLegends: keys } }); + props.onSchemaChange({ plotlySchema: { plotlyInput, selectedLegends: keys } }); } }; @@ -118,16 +117,69 @@ export const DeclarativeChart: React.FunctionComponent<DeclarativeChartProps> = setActiveLegends(selectedLegends ?? []); }, [props.chartSchema]); - const legendProps = { - canSelectMultipleLegends: false, + const multiSelectLegendProps = { + canSelectMultipleLegends: true, onChange: onActiveLegendsChange, - selectedLegend: activeLegends.slice(0, 1)[0], + selectedLegends: activeLegends, + }; + + const commonProps = { + legendProps: multiSelectLegendProps, + componentRef: chartRef, + calloutProps: { layerProps: { eventBubblingEnabled: true } }, + }; + + const checkAndRenderChart = ( + renderChartJsx: (chartProps: ILineChartProps | IAreaChartProps) => JSX.Element, + isAreaChart: boolean = false, + ) => { + let fallbackVSBC = false; + const xValues = (plotlyInput.data[0] as PlotData).x; + const isXDate = isDateArray(xValues); + const isXNumber = isNumberArray(xValues); + const isXMonth = isMonthArray(xValues); + if (isXDate || isXNumber) { + const chartProps: ILineChartProps | IAreaChartProps = { + ...transformPlotlyJsonToScatterChartProps( + { data: plotlyInput.data, layout: plotlyInput.layout }, + isAreaChart, + colorMap, + isDarkTheme, + ), + ...commonProps, + }; + return renderChartJsx(chartProps); + } else if (isXMonth) { + const updatedData = plotlyInput.data.map((dataPoint: PlotData) => ({ + ...dataPoint, + x: updateXValues(dataPoint.x), + })); + const chartProps: ILineChartProps | IAreaChartProps = { + ...transformPlotlyJsonToScatterChartProps( + { data: updatedData, layout: plotlyInput.layout }, + isAreaChart, + colorMap, + isDarkTheme, + ), + ...commonProps, + }; + return renderChartJsx(chartProps); + } + // Unsupported schema, render as VerticalStackedBarChart + fallbackVSBC = true; + return ( + <VerticalStackedBarChart + {...transformPlotlyJsonToVSBCProps(plotlySchema, colorMap, isDarkTheme, fallbackVSBC)} + {...commonProps} + /> + ); }; const exportAsImage = React.useCallback( (opts?: IImageExportOptions) => { return toImage(chartRef.current?.chartContainer, { background: theme.semanticColors.bodyBackground, + scale: 3, ...opts, }); }, @@ -142,146 +194,78 @@ export const DeclarativeChart: React.FunctionComponent<DeclarativeChartProps> = [exportAsImage], ); - const multiSelectLegendProps = { - ...legendProps, - canSelectMultipleLegends: true, - selectedLegends: activeLegends, - }; - - switch (data[0].type) { + switch (plotlyInput.data[0].type) { case 'pie': - return ( - <DonutChart - {...transformPlotlyJsonToDonutProps(plotlySchema, colorMap, isDarkTheme)} - legendProps={multiSelectLegendProps} - componentRef={chartRef} - // Bubble event to prevent right click to open menu on the callout - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} - /> - ); + return <DonutChart {...transformPlotlyJsonToDonutProps(plotlySchema, colorMap, isDarkTheme)} {...commonProps} />; case 'bar': - const orientation = data[0].orientation; + const orientation = plotlyInput.data[0].orientation; if (orientation === 'h') { return ( <HorizontalBarChartWithAxis {...transformPlotlyJsonToHorizontalBarWithAxisProps(plotlySchema, colorMap, isDarkTheme)} - legendProps={multiSelectLegendProps} - componentRef={chartRef} - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} + {...commonProps} /> ); } else { - if (['group', 'overlay'].includes(plotlySchema?.layout?.barmode)) { + const containsLines = plotlyInput.data.some( + series => series.type === 'scatter' || isLineData(series as Partial<PlotData>), + ); + if (['group', 'overlay'].includes(plotlySchema?.layout?.barmode) && !containsLines) { return ( <GroupedVerticalBarChart {...transformPlotlyJsonToGVBCProps(plotlySchema, colorMap, isDarkTheme)} - legendProps={multiSelectLegendProps} - componentRef={chartRef} - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} + {...commonProps} /> ); } return ( <VerticalStackedBarChart {...transformPlotlyJsonToVSBCProps(plotlySchema, colorMap, isDarkTheme)} - legendProps={multiSelectLegendProps} - componentRef={chartRef} - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} + {...commonProps} /> ); } case 'scatter': - const isAreaChart = data.some((series: any) => series.fill === 'tonexty' || series.fill === 'tozeroy'); - const renderChart = (chartProps: any) => { + if (plotlyInput.data[0].mode === 'markers') { + throw new Error(`Unsupported chart - type :${plotlyInput.data[0]?.type}, mode: ${plotlyInput.data[0]?.mode}`); + } + const isAreaChart = plotlyInput.data.some( + (series: PlotData) => series.fill === 'tonexty' || series.fill === 'tozeroy', + ); + const renderChartJsx = (chartProps: ILineChartProps | IAreaChartProps) => { if (isAreaChart) { - return ( - <AreaChart - {...chartProps} - legendProps={{ ...legendProps, canSelectMultipleLegends: true, selectedLegends: activeLegends }} - /> - ); + return <AreaChart {...chartProps} />; } - return ( - <LineChart - {...{ - ...chartProps, - legendProps: { - onChange: onActiveLegendsChange, - canSelectMultipleLegends: true, - selectedLegends: activeLegends, - }, - }} - /> - ); + return <LineChart {...chartProps} />; }; - if (isXDate || isXNumber) { - const chartProps = { - ...transformPlotlyJsonToScatterChartProps({ data, layout }, isAreaChart, colorMap, isDarkTheme), - legendProps, - componentRef: chartRef, - calloutProps: { layerProps: { eventBubblingEnabled: true } }, - }; - return renderChart(chartProps); - } else if (isXMonth) { - const updatedData = data.map((dataPoint: any) => ({ - ...dataPoint, - x: updateXValues(dataPoint.x), - })); - const chartProps = { - ...transformPlotlyJsonToScatterChartProps({ data: updatedData, layout }, isAreaChart, colorMap, isDarkTheme), - legendProps, - componentRef: chartRef, - calloutProps: { layerProps: { eventBubblingEnabled: true } }, - }; - return renderChart(chartProps); - } - return ( - <VerticalStackedBarChart - {...transformPlotlyJsonToVSBCProps(plotlySchema, colorMap, isDarkTheme)} - legendProps={multiSelectLegendProps} - componentRef={chartRef} - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} - /> - ); + return checkAndRenderChart(renderChartJsx, isAreaChart); case 'heatmap': - return ( - <HeatMapChart - {...transformPlotlyJsonToHeatmapProps(plotlySchema)} - componentRef={chartRef} - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} - /> - ); + return <HeatMapChart {...transformPlotlyJsonToHeatmapProps(plotlySchema)} {...commonProps} legendProps={{}} />; case 'sankey': return ( - <SankeyChart - {...transformPlotlyJsonToSankeyProps(plotlySchema, colorMap, isDarkTheme)} - componentRef={chartRef} - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} - /> + <SankeyChart {...transformPlotlyJsonToSankeyProps(plotlySchema, colorMap, isDarkTheme)} {...commonProps} /> ); case 'indicator': - if (data?.[0]?.mode?.includes('gauge')) { + if (plotlyInput.data?.[0]?.mode?.includes('gauge')) { return ( - <GaugeChart - {...transformPlotlyJsonToGaugeProps(plotlySchema, colorMap, isDarkTheme)} - legendProps={multiSelectLegendProps} - componentRef={chartRef} - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} - /> + <GaugeChart {...transformPlotlyJsonToGaugeProps(plotlySchema, colorMap, isDarkTheme)} {...commonProps} /> ); } - return <div>Unsupported Schema</div>; + throw new Error(`Unsupported chart - type: ${plotlyInput.data[0]?.type}, mode: ${plotlyInput.data[0]?.mode}`); case 'histogram': return ( - <VerticalBarChart - {...transformPlotlyJsonToVBCProps(plotlySchema, colorMap, isDarkTheme)} - legendProps={multiSelectLegendProps} - componentRef={chartRef} - calloutProps={{ layerProps: { eventBubblingEnabled: true } }} - /> + <VerticalBarChart {...transformPlotlyJsonToVBCProps(plotlySchema, colorMap, isDarkTheme)} {...commonProps} /> ); default: - throw new Error('Unsupported chart schema'); + const xValues = (plotlyInput.data[0] as PlotData).x; + const yValues = (plotlyInput.data[0] as PlotData).y; + if (xValues && yValues && xValues.length > 0 && yValues.length > 0) { + const renderLineChartJsx = (chartProps: ILineChartProps) => { + return <LineChart {...chartProps} />; + }; + return checkAndRenderChart(renderLineChartJsx); + } + throw new Error(`Unsupported chart type :${plotlyInput.data[0]?.type}`); } }); DeclarativeChart.displayName = 'DeclarativeChart'; diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchema.ts b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchema.ts new file mode 100644 index 00000000000000..e1ac07356818d2 --- /dev/null +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchema.ts @@ -0,0 +1,1937 @@ +/* eslint-disable @typescript-eslint/naming-convention */ +/* eslint-disable @typescript-eslint/no-explicit-any */ + +/** + * This interface is extracted from Plotly.js typescript definitions. + * All the unsupported types are removed to align with fluent charts. + * https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/plotly.js/index.d.ts + */ + +export type PieColor = string | number; +export type PieColors = Array<PieColor | null | undefined>; + +export interface PieFont { + family: string | string[]; + size: number | number[]; + color: PieColor | PieColors; +} + +export interface PieDataTitle extends Pick<DataTitle, 'text' | 'position'> { + font: Partial<PieFont>; +} + +export type PieTextPosition = 'inside' | 'outside' | 'auto' | 'none'; + +export type PieHoverInfo = + | 'all' + | 'none' + | 'skip' + | 'label' + | 'text' + | 'value' + | 'percent' + | 'name' + | 'label+text' + | 'label+value' + | 'label+percent' + | 'label+name' + | 'text+value' + | 'text+percent' + | 'text+name' + | 'value+percent' + | 'value+name' + | 'percent+name' + | 'label+text+value' + | 'label+text+percent' + | 'label+text+name' + | 'label+value+percent' + | 'label+value+name' + | 'label+percent+name' + | 'text+value+percent' + | 'text+value+name' + | 'text+percent+name' + | 'value+percent+name' + | 'label+text+value+percent' + | 'label+text+value+name' + | 'label+text+percent+name' + | 'label+value+percent+name' + | 'text+value+percent+name'; + +export interface PieDomain { + x: number[]; + y: number[]; + row: number; + column: number; +} + +export interface PieLine { + color: PieColor | PieColors; + width: number | number[]; +} + +export interface PieMarker { + colors: PieColors; + line: Partial<PieLine>; +} + +export interface PieHoverLabel { + bgcolor: PieColor | PieColors; + bordercolor: PieColor | PieColors; + font: PieFont; + align: HoverLabel['align'] | Array<HoverLabel['align']>; + namelength: number | number[]; +} + +export type PieInsideTextOrientation = 'horizontal' | 'radial' | 'tangential' | 'auto'; + +export interface PieData + extends Pick< + PlotData, + | 'name' + | 'visible' + | 'showlegend' + | 'legendgroup' + | 'opacity' + | 'ids' + | 'labels' + | 'hovertext' + | 'automargin' + | 'textinfo' + | 'direction' + | 'hole' + | 'rotation' + > { + type: 'pie'; + title: Partial<PieDataTitle>; + values: Array<number | string>; + dlabel: number; + label0: number; + pull: number | number[]; + text: Datum | Datum[]; + textposition: PieTextPosition | PieTextPosition[]; + texttemplate: string | string[]; + hoverinfo: PieHoverInfo; + hovertemplate: string | string[]; + meta: number | string; + customdata: Datum[]; + domain: Partial<PieDomain>; + marker: Partial<PieMarker>; + textfont: PieFont; + hoverlabel: Partial<PieHoverLabel>; + insidetextfont: PieFont; + insidetextorientation: PieInsideTextOrientation; + outsidetextfont: PieFont; + scalegroup: string; + sort: boolean; + uirevision: number | string; +} + +export type SankeyColor = string | number; +export type SankeyColors = Array<SankeyColor | null | undefined>; + +export interface SankeyFont { + family: string | string[]; + size: number | number[]; + color: SankeyColor | SankeyColors; +} + +export interface SankeyDataTitle { + font: Partial<SankeyFont>; + title: string; +} + +export type SankeyOrientation = 'v' | 'h'; + +export interface SankeyHoverLabel { + bgcolor: SankeyColor | SankeyColors; + bordercolor: SankeyColor | SankeyColors; + font: SankeyFont; + align: HoverLabel['align'] | Array<HoverLabel['align']>; + namelength: number | number[]; +} + +export interface SankeyDomain { + row: number; + column: number; + x: number[]; + y: number[]; +} + +export interface SankeyNode { + color: SankeyColor[]; + customdata: Datum[]; + groups: SankeyNode[]; + hoverinfo: 'all' | 'none' | 'skip'; + hoverlabel: Partial<SankeyHoverLabel>; + hovertemplate: string | string[]; + label: Datum[]; + line: Partial<{ + color: SankeyColor; + width: number; + }>; + pad: number; + thickness: number; + x: number[]; + y: number[]; +} + +export interface SankeyColorscale { + cmax: number; + cmin: number; + colorscale: Array<[number, string]>; + label: string; + name: string; + templateitemname: string; +} + +export interface SankeyLink { + arrowlen: number; + color: SankeyColor | SankeyColor[]; + colorscale: Partial<SankeyColorscale>; + customdata: Datum[]; + hoverinfo: 'all' | 'none' | 'skip'; + hoverlabel: Partial<SankeyHoverLabel>; + hovertemplate: string | string[]; + hovercolor: SankeyColor | SankeyColor[]; + label: Datum[]; + line: Partial<{ + color: SankeyColor; + width: number; + }>; + source: number[]; + target: number[]; + value: number[]; +} + +export interface SankeyData { + type: 'sankey'; + name: string; + orientation: SankeyOrientation; + visible: boolean | 'legendonly'; + legend: string; + legendrank: number; + legendgrouptitle: Partial<SankeyDataTitle>; + legendwidth: number; + ids: string[]; + hoverinfo: string; + meta: number | string; + customdata: Datum[]; + domain: Partial<SankeyDomain>; + node: Partial<SankeyNode>; + link: Partial<SankeyLink>; + textfont: Partial<SankeyFont>; + selectpoints: string | number; + arrangement: 'snap' | 'perpendicular' | 'freeform' | 'fixed'; + hoverlabel: Partial<SankeyHoverLabel>; + valueformat: string; + valuesuffix: string; + uirevision: string | number; +} + +export interface Point { + x: number; + y: number; + z: number; +} + +export interface PlotScatterDataPoint { + curveNumber: number; + data: PlotData; + pointIndex: number; + pointNumber: number; + x: number; + xaxis: LayoutAxis; + y: number; + yaxis: LayoutAxis; +} + +export interface PlotDatum { + curveNumber: number; + data: PlotData; + customdata: Datum; + pointIndex: number; + pointNumber: number; + x: Datum; + xaxis: LayoutAxis; + y: Datum; + yaxis: LayoutAxis; + text: string; +} + +export interface PlotCoordinate { + x: number; + y: number; + pointNumber: number; +} + +export interface SelectionRange { + x: number[]; + y: number[]; +} + +export type PlotSelectedData = Partial<PlotDatum>; + +export interface PlotScene { + center: Point; + eye: Point; + up: Point; +} + +export interface PolarLayout { + domain: Partial<Domain>; + sector: number[]; + hole: number; + bgcolor: Color; + radialaxis: Partial<LayoutAxis>; + angularaxis: Partial<LayoutAxis>; + gridshape: 'circular' | 'linear'; + uirevision: string | number; + uid: string; +} + +export interface PlotlySchema { + data: Data[]; + layout?: Partial<Layout>; + config?: Partial<Config>; +} + +// Layout +export interface Layout { + colorway: string[]; + title: + | string + | Partial<{ + text: string; + font: Partial<Font>; + xref: 'container' | 'paper'; + yref: 'container' | 'paper'; + x: number; + y: number; + xanchor: 'auto' | 'left' | 'center' | 'right'; + yanchor: 'auto' | 'top' | 'middle' | 'bottom'; + pad: Partial<Padding>; + }>; + titlefont: Partial<Font>; + autosize: boolean; + showlegend: boolean; + paper_bgcolor: Color; + plot_bgcolor: Color; + separators: string; + hidesources: boolean; + xaxis: Partial<LayoutAxis>; + xaxis2: Partial<LayoutAxis>; + xaxis3: Partial<LayoutAxis>; + xaxis4: Partial<LayoutAxis>; + xaxis5: Partial<LayoutAxis>; + xaxis6: Partial<LayoutAxis>; + xaxis7: Partial<LayoutAxis>; + xaxis8: Partial<LayoutAxis>; + xaxis9: Partial<LayoutAxis>; + yaxis: Partial<LayoutAxis>; + yaxis2: Partial<LayoutAxis>; + yaxis3: Partial<LayoutAxis>; + yaxis4: Partial<LayoutAxis>; + yaxis5: Partial<LayoutAxis>; + yaxis6: Partial<LayoutAxis>; + yaxis7: Partial<LayoutAxis>; + yaxis8: Partial<LayoutAxis>; + yaxis9: Partial<LayoutAxis>; + margin: Partial<Margin>; + height: number; + width: number; + hovermode: 'closest' | 'x' | 'y' | 'x unified' | 'y unified' | false; + hoverdistance: number; + hoverlabel: Partial<HoverLabel>; + calendar: Calendar; + 'xaxis.range': [Datum, Datum]; + 'xaxis.range[0]': Datum; + 'xaxis.range[1]': Datum; + 'yaxis.range': [Datum, Datum]; + 'yaxis.range[0]': Datum; + 'yaxis.range[1]': Datum; + 'yaxis.type': AxisType; + 'xaxis.type': AxisType; + 'xaxis.autorange': boolean; + 'yaxis.autorange': boolean; + 'xaxis.title': string; + 'yaxis.title': string; + ternary: any; + geo: any; + mapbox: any; + subplot: string; + radialaxis: Partial<Axis>; + angularaxis: {}; + dragmode: + | 'zoom' + | 'pan' + | 'select' + | 'lasso' + | 'drawclosedpath' + | 'drawopenpath' + | 'drawline' + | 'drawrect' + | 'drawcircle' + | 'orbit' + | 'turntable' + | false; + orientation: number; + annotations: Array<Partial<Annotations>>; + shapes: Array<Partial<Shape>>; + legend: Partial<Legend>; + font: Partial<Font>; + barmode: 'stack' | 'group' | 'overlay' | 'relative'; + barnorm: '' | 'fraction' | 'percent'; + bargap: number; + bargroupgap: number; + boxmode: 'group' | 'overlay'; + selectdirection: 'h' | 'v' | 'd' | 'any'; + hiddenlabels: string[]; + grid: Partial<{ + rows: number; + roworder: 'top to bottom' | 'bottom to top'; + columns: number; + subplots: string[]; + xaxes: string[]; + yaxes: string[]; + pattern: 'independent' | 'coupled'; + xgap: number; + ygap: number; + domain: Partial<{ + x: number[]; + y: number[]; + }>; + xside: 'bottom' | 'bottom plot' | 'top plot' | 'top'; + yside: 'left' | 'left plot' | 'right plot' | 'right'; + }>; + polar: Partial<PolarLayout>; + polar2: Partial<PolarLayout>; + polar3: Partial<PolarLayout>; + polar4: Partial<PolarLayout>; + polar5: Partial<PolarLayout>; + polar6: Partial<PolarLayout>; + polar7: Partial<PolarLayout>; + polar8: Partial<PolarLayout>; + polar9: Partial<PolarLayout>; + template: Template; + clickmode: 'event' | 'select' | 'event+select' | 'none'; + uirevision: number | string; + uid: string; + datarevision: number | string; + editrevision: number | string; + selectionrevision: number | string; +} + +export interface Legend extends Label { + borderwidth: number; + groupclick: 'toggleitem' | 'togglegroup'; + grouptitlefont: Partial<Font>; + itemclick: 'toggle' | 'toggleothers' | false; + itemdoubleclick: 'toggle' | 'toggleothers' | false; + itemsizing: 'trace' | 'constant'; + itemwidth: number; + orientation: 'v' | 'h'; + title: Partial<LegendTitle>; + tracegroupgap: number; + traceorder: 'grouped' | 'normal' | 'reversed' | 'reversed+grouped'; + uirevision: number | string; + uid: string; + valign: 'top' | 'middle' | 'bottom'; + x: number; + xanchor: 'auto' | 'left' | 'center' | 'right'; + xref: 'container' | 'paper'; + y: number; + yanchor: 'auto' | 'top' | 'middle' | 'bottom'; + yref: 'container' | 'paper'; +} + +export type AxisType = '-' | 'linear' | 'log' | 'date' | 'category' | 'multicategory'; + +export type DTickValue = number | string; + +export interface TickFormatStop { + /** + * Determines whether or not this stop is used. If `false`, + * this stop is ignored even within its `dtickrange`. + */ + enabled: boolean; + /** + * Range [`min`, `max`], where `min`, `max` - dtick values + * which describe some zoom level, it is possible to omit `min` or `max` + * value by passing `null` + */ + dtickrange: [DTickValue | null, DTickValue | null]; + /** + * dtickformat for described zoom level, the same as `tickformat` + */ + value: string; + /** + * When used in a template, named items are created in the output figure + * in addition to any items the figure already has in this array. + * You can modify these items in the output figure by making + * your own item with `templateitemname` matching this `name` + * alongside your modifications (including `visible: false` or `enabled: false` to hide it). + * Has no effect outside of a template. + */ + name: string; + /** + * Used to refer to a named item in this array in the template. + * Named items from the template will be created even without + * a matching item in the input figure, but you can modify one by + * making an item with `templateitemname` matching its `name`, + * alongside your modifications (including `visible: false` or `enabled: false` to hide it). + * If there is no template or no matching item, this item will be hidden + * unless you explicitly show it with `visible: true`. + */ + templateitemname: string; +} + +export interface AutoRangeOptions { + clipmax: DTickValue; + clipmin: DTickValue; + include: DTickValue; + maxallowed: DTickValue; + minallowed: DTickValue; +} + +export interface MinorAxisLayout { + dtick: DTickValue; + gridcolor: Color; + griddash: Dash; + gridwidth: number; + nticks: number; + showgrid: boolean; + tick0: DTickValue; + tickcolor: Color; + ticklen: number; + tickmode: 'auto' | 'linear' | 'array'; + ticks: 'outside' | 'inside' | ''; + tickvals: any[]; + tickwidth: number; +} + +export interface RangeBreak { + bounds: any[]; + dvalue: number; + enabled: boolean; + name: string; + pattern: 'day of week' | 'hour' | ''; + templateitemname: string; + values: any[]; +} + +export interface Axis { + /** + * A single toggle to hide the axis while preserving interaction like dragging. + * Default is true when a cheater plot is present on the axis, otherwise + * false + */ + visible: boolean; + /** + * Sets default for all colors associated with this axis + * all at once: line, font, tick, and grid colors. + * Grid color is lightened by blending this with the plot background + * Individual pieces can override this. + */ + color: Color; + title: string | Partial<DataTitle>; + /** + * Former `titlefont` is now the sub-attribute `font` of `title`. + * To customize title font properties, please use `title.font` now. + */ + titlefont: Partial<Font>; + type: AxisType; + autorange: true | false | 'reversed' | 'min reversed' | 'max reversed' | 'min' | 'max'; + autorangeoptions: Partial<AutoRangeOptions>; + /** + * 'If *normal*, the range is computed in relation to the extrema + * of the input data. + * If *tozero*`, the range extends to 0, + * regardless of the input data + * If *nonnegative*, the range is non-negative, + * regardless of the input data. + * Applies only to linear axes. + */ + rangemode: 'normal' | 'tozero' | 'nonnegative'; + range: any[]; + /** + * Determines whether or not this axis is zoom-able. + * If true, then zoom is disabled. + */ + fixedrange: boolean; + + /** + * Ticks + */ + tickmode: 'auto' | 'linear' | 'array'; + nticks: number; + tick0: number | string; + dtick: DTickValue; + tickvals: any[]; + ticktext: string[]; + ticks: 'outside' | 'inside' | ''; + mirror: true | 'ticks' | false | 'all' | 'allticks'; + ticklen: number; + tickwidth: number; + tickcolor: Color; + showticklabels: boolean; + showspikes: boolean; + spikecolor: Color; + spikethickness: number; + /** + * Specifies the ordering logic for the case of categorical variables. + * By default, plotly uses *trace*, which specifies the order that is present in the data supplied. + * Set `categoryorder` to *category ascending* or *category descending* if order should be determined by + * the alphanumerical order of the category names. + * Set `categoryorder` to *array* to derive the ordering from the attribute `categoryarray`. If a category + * is not found in the `categoryarray` array, the sorting behavior for that attribute will be identical to + * the *trace* mode. The unspecified categories will follow the categories in `categoryarray`. + * Set `categoryorder` to *total ascending* or *total descending* if order should be determined by the + * numerical order of the values. + * Similarly, the order can be determined by the min, max, sum, mean or median of all the values. + */ + categoryorder: + | 'trace' + | 'category ascending' + | 'category descending' + | 'array' + | 'total ascending' + | 'total descending' + | 'min ascending' + | 'min descending' + | 'max ascending' + | 'max descending' + | 'sum ascending' + | 'sum descending' + | 'mean ascending' + | 'mean descending' + | 'median ascending' + | 'median descending'; + categoryarray: any[]; + tickfont: Partial<Font>; + tickangle: 'auto' | number; + tickprefix: string; + /** + * If `all`, all tick labels are displayed with a prefix. + * If `first`, only the first tick is displayed with a prefix. + * If `last`, only the last tick is displayed with a suffix. + * If `none`, tick prefixes are hidden. + */ + showtickprefix: 'all' | 'first' | 'last' | 'none'; + /** + * Sets a tick label suffix. + */ + ticksuffix: string; + /** + * Same as `showtickprefix` but for tick suffixes. + */ + showticksuffix: 'all' | 'first' | 'last' | 'none'; + /** + * If `all`, all exponents are shown besides their significands. + * If `first`, only the exponent of the first tick is shown. + * If `last`, only the exponent of the last tick is shown. + * If `none`, no exponents appear. + */ + showexponent: 'all' | 'first' | 'last' | 'none'; + /** + * Determines a formatting rule for the tick exponents. + * For example, consider the number 1,000,000,000. + * If `none`, it appears as *1,000,000,000*. + * If `e`, *1e+9*. + * If `E`, *1E+9*. + * If `power`, *1x10^9* (with 9 in a super script). + * If `SI`, *1G*. + * If `B`, *1B*. + */ + exponentformat: 'none' | 'e' | 'E' | 'power' | 'SI' | 'B'; + /** + * Hide SI prefix for 10^n if |n| is below this number. This only has an effect when `tickformat` is "SI" or "B". + */ + minexponent: number; + /** + * 'If `true`, even 4-digit integers are separated + */ + separatethousands: boolean; + /** + * Sets the tick label formatting rule using d3 formatting mini-languages + * which are very similar to those in Python. + * For numbers, see: https://github.com/d3/d3-3.x-api-reference/blob/master/Formatting.md#d3_format + * And for dates see: https://github.com/d3/d3-3.x-api-reference/blob/master/Time-Formatting.md#format + * We add one item to d3's date formatter: `%{n}f` for fractional seconds with n digits. + * For example, `"2016-10-13 09:15:23.456"` with tickformat `"%H~%M~%S.%2f"` would display `"09~15~23.46"` + */ + tickformat: string; + /** + * Sets the hover text formatting rule using d3 formatting mini-languages + * which are very similar to those in Python. + * For numbers, see: https://github.com/d3/d3-3.x-api-reference/blob/master/Formatting.md#d3_format + * And for dates see: https://github.com/d3/d3-3.x-api-reference/blob/master/Time-Formatting.md#format + * We add one item to d3's date formatter: `%{n}f` for fractional seconds with n digits. + * For example, `"2016-10-13 09:15:23.456"` with tickformat `"%H~%M~%S.%2f"` would display "09~15~23.46" + */ + hoverformat: string; + calendar: Calendar; + /** + * Array of `Partial<TickFormatStop>` objects. + */ + tickformatstops: Array<Partial<TickFormatStop>>; + spikedash: string; + /** + * Determines the drawing mode for the spike line. + * If `toaxis`, the line is drawn from the data point to the axis the + * series is plotted on. + * If `across`, the line is drawn across the entire plot area, and + * supercedes *toaxis*. + * If `marker`, then a marker dot is drawn on the axis the series is + * plotted on + */ + spikemode: + | 'toaxis' + | 'across' + | 'marker' + | 'toaxis+across' + | 'toaxis+across+marker' + | 'across+marker' + | 'toaxis+marker'; + /** + * Determines whether spikelines are stuck to the cursor or to the closest datapoints. + */ + spikesnap: 'data' | 'cursor' | 'hovered data'; + + /** + * Lines and Grids + */ + + /** + * Determines whether or not a line bounding this axis is drawn. + */ + showline: boolean; + /** + * Sets the axis line color + */ + linecolor: Color; + /** + * Sets the width (in px) of the axis line. + */ + linewidth: number; + /** + * Determines whether or not grid lines are drawn. + * If `true`, the grid lines are drawn at every tick mark. + */ + showgrid: boolean; + /** + * Sets the color of the grid lines. + */ + gridcolor: Color; + /** + * Sets the width (in px) of the grid lines. + */ + gridwidth: number; + /** + * Determines whether or not a line is drawn at along the 0 value + * of this axis. + * If `true`, the zero line is drawn on top of the grid lines. + */ + zeroline: boolean; + /** + * Sets the line color of the zero line. + */ + zerolinecolor: Color; + /** + * Sets the width (in px) of the zero line. + */ + zerolinewidth: number; + /** + * Determines whether or not a dividers are drawn + * between the category levels of this axis. + * Only has an effect on *multicategory* axes. + */ + showdividers: boolean; + /** + * Sets the color of the dividers + * Only has an effect on *multicategory* axes. + */ + dividercolor: Color; + /** + * Sets the width (in px) of the dividers + * Only has an effect on *multicategory* axes. + */ + dividerwidth: number; + + autotypenumbers: 'convert types' | 'strict'; + labelalias: DTickValue; + maxallowed: DTickValue; + minallowed: DTickValue; +} + +export type Calendar = + | 'gregorian' + | 'chinese' + | 'coptic' + | 'discworld' + | 'ethiopian' + | 'hebrew' + | 'islamic' + | 'julian' + | 'mayan' + | 'nanakshahi' + | 'nepali' + | 'persian' + | 'jalali' + | 'taiwan' + | 'thai' + | 'ummalqura'; + +// regex from documentation: "/^x([2-9]|[1-9][0-9]+)?( domain)?$/" | "/^y([2-9]|[1-9][0-9]+)?( domain)?$/" +// regex allows for an unlimited amount of digits for the 'axis number', +// but the following typescript definition is limited to two digits +type xYAxisNames = `${ + | '' + | `${2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}` + | `${1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}${0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9}`}${'' | ' domain'}`; + +export type XAxisName = `x${xYAxisNames}`; +export type YAxisName = `y${xYAxisNames}`; + +export type AxisName = XAxisName | YAxisName; + +export interface LayoutAxis extends Axis { + fixedrange: boolean; + scaleanchor: AxisName; + scaleratio: number; + constrain: 'range' | 'domain'; + constraintoward: 'left' | 'center' | 'right' | 'top' | 'middle' | 'bottom'; + anchor: 'free' | AxisName; + side: 'top' | 'bottom' | 'left' | 'right' | 'clockwise' | 'counterclockwise'; + overlaying: 'free' | AxisName; + layer: 'above traces' | 'below traces'; + domain: number[]; + position: number; + rotation: number; + direction: 'counterclockwise' | 'clockwise'; + rangeslider: Partial<RangeSlider>; + rangeselector: Partial<RangeSelector>; + automargin: boolean; + autotick: boolean; + angle: any; + griddash: Dash; + l2p: (v: Datum) => number; + + autotickangles: number[]; + insiderange: any[]; + matches: AxisName; + minor: Partial<MinorAxisLayout>; + rangebreaks: Array<Partial<RangeBreak>>; + ticklabelmode: 'instant' | 'period'; + ticklabeloverflow: 'allow' | 'hide past div' | 'hide past domain'; + ticklabelposition: + | 'outside' + | 'inside' + | 'outside top' + | 'inside top' + | 'outside left' + | 'inside left' + | 'outside right' + | 'inside right' + | 'outside bottom' + | 'inside bottom'; + ticklabelstep: number; + tickson: 'labels' | 'boundaries'; + uirevision: DTickValue; +} + +export interface SceneAxis extends Axis { + spikesides: boolean; + showbackground: boolean; + backgroundcolor: Color; + showaxeslabels: boolean; +} + +export interface ShapeLine { + color: string; + width: number; + dash: Dash; +} + +export interface ShapeLabel { + font: Partial<Font>; + padding: number; + text: string; + textangle: 'auto' | number; + textposition: + | 'top left' + | 'top center' + | 'top right' + | 'middle left' + | 'middle center' + | 'middle right' + | 'bottom left' + | 'bottom center' + | 'bottom right' + | 'start' + | 'middle' + | 'end'; + texttemplate: string; + xanchor: 'auto' | 'left' | 'center' | 'right'; + yanchor: 'top' | 'middle' | 'bottom'; +} + +export interface Shape { + visible: boolean | 'legendonly'; + layer: 'below' | 'above'; + type: 'rect' | 'circle' | 'line' | 'path'; + path: string; + xref: 'paper' | XAxisName; + xsizemode: 'scaled' | 'pixel'; + xanchor: number | string; + yref: 'paper' | YAxisName; + ysizemode: 'scaled' | 'pixel'; + yanchor: number | string; + x0: Datum; + y0: Datum; + x1: Datum; + y1: Datum; + fillcolor: string; + name: string; + templateitemname: string; + opacity: number; + line: Partial<ShapeLine>; + label: Partial<ShapeLabel>; + showlegend: boolean; + legendgroup: string; + legendgrouptitle: { + text: string; + font?: Partial<Font>; + }; + legendrank: number; +} + +export interface Margin { + t: number; + b: number; + l: number; + r: number; + pad: number; +} + +export interface Icon { + height?: number | undefined; + width?: number | undefined; + ascent?: number | undefined; + descent?: number | undefined; + name?: string | undefined; + path?: string | undefined; + svg?: string | undefined; + transform?: string | undefined; +} + +export interface GaugeLine { + color: Color; + width: number; +} +export interface Threshold { + line: Partial<GaugeLine>; + value: number; + thickness: number; +} + +export interface GaugeBar { + color: Color; + line: Partial<GaugeLine>; + thickness: number; +} +export interface Gauge { + shape: 'angular' | 'bullet'; + bar: Partial<GaugeBar>; + bgcolor: Color; + bordercolor: Color; + borderwidth: number; + axis: Partial<Axis>; + steps: Array<{ range: number[]; color: Color }>; + threshold: Partial<Threshold>; +} + +export interface Delta { + reference: number; + position: 'top' | 'bottom' | 'left' | 'right'; + relative: boolean; + valueformat: string; + increasing: { + symbol: string; + color: Color; + }; + decreasing: { + symbol: string; + color: Color; + }; +} + +export interface DataTitle { + text: string; + font: Partial<Font>; + standoff: number; + position: + | 'top left' + | 'top center' + | 'top right' + | 'middle center' + | 'bottom left' + | 'bottom center' + | 'bottom right'; +} + +export interface PlotNumber { + valueformat: string; + font: Partial<Font>; + prefix: string; + suffix: string; +} + +export interface Template { + data?: { [type in PlotType]?: Array<Partial<PlotData>> } | undefined; + layout?: Partial<Layout> | undefined; +} + +// Data + +export type Datum = string | number | Date | null; +export type TypedArray = + | Int8Array + | Uint8Array + | Int16Array + | Uint16Array + | Int32Array + | Uint32Array + | Uint8ClampedArray + | Float32Array + | Float64Array; + +export interface ErrorOptions { + visible: boolean; + symmetric: boolean; + color: Color; + thickness: number; + width: number; + opacity: number; +} + +export type ErrorBar = Partial<ErrorOptions> & + ( + | { + type: 'constant' | 'percent'; + value: number; + valueminus?: number | undefined; + } + | { + type: 'data'; + array: Datum[]; + arrayminus?: Datum[] | undefined; + } + ); + +export type Dash = 'solid' | 'dot' | 'dash' | 'longdash' | 'dashdot' | 'longdashdot'; +export type PlotType = + | 'bar' + | 'barpolar' + | 'box' + | 'candlestick' + | 'carpet' + | 'choropleth' + | 'choroplethmapbox' + | 'cone' + | 'contour' + | 'contourcarpet' + | 'densitymapbox' + | 'funnel' + | 'funnelarea' + | 'heatmap' + | 'heatmapgl' + | 'histogram' + | 'histogram2d' + | 'histogram2dcontour' + | 'image' + | 'indicator' + | 'isosurface' + | 'mesh3d' + | 'ohlc' + | 'parcats' + | 'parcoords' + | 'pie' + | 'pointcloud' + | 'sankey' + | 'scatter' + | 'scatter3d' + | 'scattercarpet' + | 'scattergeo' + | 'scattergl' + | 'scattermapbox' + | 'scatterpolar' + | 'scatterpolargl' + | 'scatterternary' + | 'splom' + | 'streamtube' + | 'sunburst' + | 'surface' + | 'table' + | 'treemap' + | 'violin' + | 'volume' + | 'waterfall'; + +export type Data = Partial<PlotData> | Partial<PieData> | Partial<SankeyData>; + +export type Color = + | string + | number + | Array<string | number | undefined | null> + | Array<Array<string | number | undefined | null>>; +export type ColorScale = string | string[] | Array<[number, string]>; +export type DataTransform = Partial<Transform>; +export type ScatterData = PlotData; + +// Bar Scatter +export interface PlotData { + type: PlotType; + x: Datum[] | Datum[][] | TypedArray; + y: Datum[] | Datum[][] | TypedArray; + z: Datum[] | Datum[][] | Datum[][][] | TypedArray; + i: TypedArray; + j: TypedArray; + k: TypedArray; + xy: Float32Array; + error_x: ErrorBar; + error_y: ErrorBar; + xaxis: string; + yaxis: string; + text: string | string[]; + lat: Datum[]; + lon: Datum[]; + line: Partial<ScatterLine>; + 'line.color': Color; + 'line.width': number; + 'line.dash': Dash; + 'line.shape': 'linear' | 'spline' | 'hv' | 'vh' | 'hvh' | 'vhv'; + 'line.smoothing': number; + 'line.simplify': boolean; + marker: Partial<PlotMarker>; + 'marker.symbol': MarkerSymbol | MarkerSymbol[]; + 'marker.color': Color; + 'marker.colorscale': ColorScale | ColorScale[]; + 'marker.opacity': number | number[]; + 'marker.size': number | number[] | number[][]; + 'marker.maxdisplayed': number; + 'marker.sizeref': number; + 'marker.sizemax': number; + 'marker.sizemin': number; + 'marker.sizemode': 'diameter' | 'area'; + 'marker.showscale': boolean; + 'marker.line': Partial<ScatterMarkerLine>; + 'marker.line.color': Color; + 'marker.line.colorscale': ColorScale | ColorScale[]; + 'marker.colorbar': {}; // TODO + 'marker.pad.t': number; + 'marker.pad.b': number; + 'marker.pad.l': number; + 'marker.pad.r': number; + mode: + | 'lines' + | 'markers' + | 'text' + | 'lines+markers' + | 'text+markers' + | 'text+lines' + | 'text+lines+markers' + | 'none' + | 'gauge' + | 'number' + | 'delta' + | 'number+delta' + | 'gauge+number' + | 'gauge+number+delta' + | 'gauge+delta'; + histfunc: 'count' | 'sum' | 'avg' | 'min' | 'max'; + histnorm: '' | 'percent' | 'probability' | 'density' | 'probability density'; + hoveron: 'points' | 'fills'; + hoverinfo: + | 'all' + | 'name' + | 'none' + | 'skip' + | 'text' + | 'x' + | 'x+text' + | 'x+name' + | 'x+y' + | 'x+y+text' + | 'x+y+name' + | 'x+y+z' + | 'x+y+z+text' + | 'x+y+z+name' + | 'y' + | 'y+name' + | 'y+x' + | 'y+text' + | 'y+x+text' + | 'y+x+name' + | 'y+z' + | 'y+z+text' + | 'y+z+name' + | 'y+x+z' + | 'y+x+z+text' + | 'y+x+z+name' + | 'z' + | 'z+x' + | 'z+x+text' + | 'z+x+name' + | 'z+y+x' + | 'z+y+x+text' + | 'z+y+x+name' + | 'z+x+y' + | 'z+x+y+text' + | 'z+x+y+name'; + hoverlabel: Partial<HoverLabel>; + hovertemplate: string | string[]; + hovertext: string | string[]; + hoverongaps: boolean; + xhoverformat: string; + yhoverformat: string; + zhoverformat: string; + texttemplate: string | string[]; + textinfo: + | 'label' + | 'label+text' + | 'label+value' + | 'label+percent' + | 'label+text+value' + | 'label+text+percent' + | 'label+value+percent' + | 'text' + | 'text+value' + | 'text+percent' + | 'text+value+percent' + | 'value' + | 'value+percent' + | 'percent' + | 'none'; + textposition: + | 'top left' + | 'top center' + | 'top right' + | 'middle left' + | 'middle center' + | 'middle right' + | 'bottom left' + | 'bottom center' + | 'bottom right' + | 'inside' + | 'outside' + | 'auto' + | 'none'; + textfont: Partial<Font>; + textangle: 'auto' | number; + insidetextanchor: 'end' | 'middle' | 'start'; + constraintext: 'inside' | 'outside' | 'both' | 'none'; + fill: 'none' | 'tozeroy' | 'tozerox' | 'tonexty' | 'tonextx' | 'toself' | 'tonext'; + fillcolor: string; + fillpattern: Partial<Pattern>; + showlegend: boolean; + legendgroup: string; + legendgrouptitle: { + text: string; + font?: Partial<Font>; + }; + legendrank: number; + parents: string[]; + name: string; + stackgroup: string; + groupnorm: '' | 'fraction' | 'percent'; + stackgaps: 'infer zero' | 'interpolate'; + connectgaps: boolean; + visible: boolean | 'legendonly'; + delta: Partial<Delta>; + gauge: Partial<Gauge>; + number: Partial<PlotNumber>; + transforms: DataTransform[]; + orientation: 'v' | 'h'; + width: number | number[]; + boxmean: boolean | 'sd'; + boxpoints: 'all' | 'outliers' | 'suspectedoutliers' | false; + jitter: number; + pointpos: number; + opacity: number; + showscale: boolean; + colorscale: ColorScale; + zsmooth: 'fast' | 'best' | false; + zmin: number; + zmax: number; + ygap: number; + xgap: number; + transpose: boolean; + autobinx: boolean; + xbins: { + start: number | string; + end: number | string; + size: number | string; + }; + value: number; + values: Datum[]; + labels: Datum[]; + direction: 'clockwise' | 'counterclockwise'; + hole: number; + rotation: number; + theta: Datum[]; + r: Datum[]; + customdata: Datum[] | Datum[][]; + selectedpoints: Datum[]; + domain: Partial<{ + row: number; + column: number; + x: number[]; + y: number[]; + }>; + title: Partial<DataTitle>; + branchvalues: 'total' | 'remainder'; + ids: string[]; + level: string; + cliponaxis: boolean; + automargin: boolean; + locationmode: 'ISO-3' | 'USA-states' | 'country names' | 'geojson-id'; + locations: Datum[]; + reversescale: boolean; + colorbar: Partial<ColorBar>; + offset: number | number[]; + contours: Partial<{ + coloring: 'fill' | 'heatmap' | 'lines' | 'none'; + end: number; + labelfont: Partial<Font>; + labelformat: string; + operation: '=' | '<' | '>=' | '>' | '<=' | '[]' | '()' | '[)' | '(]' | '][' | ')(' | '](' | ')['; + showlabels: boolean; + showlines: boolean; + size: number; + start: number; + type: 'levels' | 'constraint'; + value: number | [lowerBound: number, upperBound: number]; + }>; + autocontour: boolean; + ncontours: number; + uirevision: string | number; + uid: string; +} + +/** + * These interfaces are based on attribute descriptions in + * https://github.com/plotly/plotly.js/tree/9d6144304308fc3007f0facf2535d38ea3e9b26c/src/transforms + */ +export interface TransformStyle { + target: number | string | number[] | string[]; + value: Partial<PlotData>; +} + +export interface TransformAggregation { + target: string; + func?: 'count' | 'sum' | 'avg' | 'median' | 'mode' | 'rms' | 'stddev' | 'min' | 'max' | 'first' | 'last' | undefined; + funcmode?: 'sample' | 'population' | undefined; + enabled?: boolean | undefined; +} + +export interface Transform { + type: 'aggregate' | 'filter' | 'groupby' | 'sort'; + enabled: boolean; + target: number | string | number[] | string[]; + operation: string; + aggregations: TransformAggregation[]; + preservegaps: boolean; + groups: string | number[] | string[]; + nameformat: string; + styles: TransformStyle[]; + value: any; + order: 'ascending' | 'descending'; +} + +export interface ColorBar { + thicknessmode: 'fraction' | 'pixels'; + thickness: number; + lenmode: 'fraction' | 'pixels'; + len: number; + x: number; + xanchor: 'left' | 'center' | 'right'; + xpad: number; + y: number; + yanchor: 'top' | 'middle' | 'bottom'; + ypad: number; + outlinecolor: Color; + outlinewidth: number; + bordercolor: Color; + borderwidth: Color; + bgcolor: Color; + tickmode: 'auto' | 'linear' | 'array'; + nticks: number; + tick0: number | string; + dtick: DTickValue; + tickvals: Datum[] | Datum[][] | Datum[][][] | TypedArray; + ticktext: Datum[] | Datum[][] | Datum[][][] | TypedArray; + ticks: 'outside' | 'inside' | ''; + ticklen: number; + tickwidth: number; + tickcolor: Color; + showticklabels: boolean; + tickfont: Font; + tickangle: 'auto' | number; + tickformat: string; + tickformatstops: Array<Partial<TickFormatStop>>; + tickprefix: string; + showtickprefix: 'all' | 'first' | 'last' | 'none'; + ticksuffix: string; + showticksuffix: 'all' | 'first' | 'last' | 'none'; + separatethousands: boolean; + exponentformat: 'none' | 'e' | 'E' | 'power' | 'SI' | 'B'; + showexponent: 'all' | 'first' | 'last' | 'none'; + minexponent: number; + title: string; + titlefont: Font; + titleside: 'right' | 'top' | 'bottom'; + tickvalssrc: any; + ticktextsrc: any; +} + +export type MarkerSymbol = string | number | Array<string | number>; + +/** + * Any combination of "x", "y", "z", "text", "name" joined with a "+" OR "all" or "none" or "skip". + * examples: "x", "y", "x+y", "x+y+z", "all" + * default: "all" + */ +export interface PlotMarker { + symbol: MarkerSymbol; + color?: Color | Color[] | undefined; + colors?: Color[] | undefined; + colorscale?: ColorScale | undefined; + cauto?: boolean | undefined; + cmax?: number | undefined; + cmin?: number | undefined; + autocolorscale?: boolean | undefined; + reversescale?: boolean | undefined; + opacity: number | number[]; + size: number | number[]; + maxdisplayed?: number | undefined; + sizeref?: number | undefined; + sizemax?: number | undefined; + sizemin?: number | undefined; + sizemode?: 'diameter' | 'area' | undefined; + showscale?: boolean | undefined; + line: Partial<ScatterMarkerLine>; + pad?: Partial<Padding> | undefined; + width?: number | undefined; + colorbar?: Partial<ColorBar> | undefined; + gradient?: + | { + type: 'radial' | 'horizontal' | 'vertical' | 'none'; + color: Color; + typesrc: any; + colorsrc: any; + } + | undefined; + pattern?: Partial<Pattern>; +} + +export type ScatterMarker = PlotMarker; + +export interface ScatterMarkerLine { + width: number | number[]; + color: Color; + cauto?: boolean | undefined; + cmax?: number | undefined; + cmin?: number | undefined; + cmid?: number | undefined; + colorscale?: ColorScale | undefined; + autocolorscale?: boolean | undefined; + reversescale?: boolean | undefined; + coloraxis?: string | undefined; +} + +export interface ScatterLine { + color: Color; + width: number; + dash: Dash; + shape: 'linear' | 'spline' | 'hv' | 'vh' | 'hvh' | 'vhv'; + smoothing: number; + simplify: boolean; +} + +export interface Font { + color: Color; + /** + * HTML font family - the typeface that will be applied by the web browser. + * The web browser will only be able to apply a font if it is available on the system + * which it operates. Provide multiple font families, separated by commas, to indicate + * the preference in which to apply fonts if they aren't available on the system. + * The plotly service (at https://plot.ly or on-premise) generates images on a server, + * where only a select number of fonts are installed and supported. + * These include *Arial*, *Balto*, *Courier New*, *Droid Sans*, *Droid Serif*, + * *Droid Sans Mono*, *Gravitas One*, *Old Standard TT*, *Open Sans*, *Overpass*, + * *PT Sans Narrow*, *Raleway*, *Times New Roman*. + * @default "Arial, sans-serif" + */ + family: string; + /** + * Sets the shape and color of the shadow behind text. "auto" places minimal shadow and applies contrast text font color. See https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow for additional options. + * @default "none" + */ + shadow: string; + /** + * number greater than or equal to 1 + * @default 13 + */ + size: number; + /** + * Sets the weight (or boldness) of the font. + * number between or equal to 1 and 1000 + * @default normal + */ + weight: number; +} + +export interface Config { + /** + * Determines whether math should be typeset or not, + * when MathJax (either v2 or v3) is present on the page. + */ + typesetMath: boolean; + + /** DO autosize once regardless of layout.autosize (use default width or height values otherwise) */ + autosizable: boolean; + + /** set the length of the undo/redo queue */ + queueLength: number; + + /** if we DO autosize, do we fill the container or the screen? */ + fillFrame: boolean; + + /** if we DO autosize, set the frame margins in percents of plot size */ + frameMargins: number; + + /** Set global transform to be applied to all traces with no specification needed */ + globalTransforms: any[]; + + /** Which localization should we use? Should be a string like 'en' or 'en-US' */ + locale: string; + + /** + * Localization definitions + * Locales can be provided either here (specific to one chart) or globally + * by registering them as modules. + * Should be an object of objects {locale: {dictionary: {...}, format: {...}}} + * { + * da: { + * dictionary: {'Reset axes': 'Nulstil aksler', ...}, + * format: {months: [...], shortMonths: [...]} + * }, + * ... + * } + * All parts are optional. When looking for translation or format fields, we + * look first for an exact match in a config locale, then in a registered + * module. If those fail, we strip off any regionalization ('en-US' -> 'en') + * and try each (config, registry) again. The final fallback for translation + * is untranslated (which is US English) and for formats is the base English + * (the only consequence being the last fallback date format %x is DD/MM/YYYY + * instead of MM/DD/YYYY). Currently `grouping` and `currency` are ignored + * for our automatic number formatting, but can be used in custom formats. + */ + locales: {}; + + /** Make the chart responsive to window size */ + responsive: boolean; +} + +// Components + +export interface RangeSlider { + visible: boolean; + thickness: number; + range: [Datum, Datum]; + borderwidth: number; + bordercolor: string; + bgcolor: string; +} + +export interface RangeSelectorButton { + step: 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' | 'all'; + stepmode: 'backward' | 'todate'; + count: number; + label: string; +} + +export interface RangeSelector extends Label { + buttons: Array<Partial<RangeSelectorButton>>; + visible: boolean; + x: number; + xanchor: 'auto' | 'left' | 'center' | 'right'; + y: number; + yanchor: 'auto' | 'top' | 'middle' | 'bottom'; + activecolor: string; + borderwidth: number; +} + +export interface Label { + /** Sets the background color of all hover labels on graph. */ + bgcolor: string; + + /** Sets the border color of all hover labels on graph. */ + bordercolor: string; + + /** Sets the default hover label font used by all traces on the graph. */ + font: Partial<Font>; +} + +export interface LegendTitle { + font: Partial<Font>; + side: 'top' | 'left' | 'top left' | 'top center' | 'top right'; + text: string; +} + +export interface HoverLabel extends Label { + /** + * Sets the horizontal alignment of the text content within hover label box. + * @default "auto" + */ + align: 'left' | 'right' | 'auto'; + + /** + * Sets the default length (in number of characters) of the trace name + * in the hover labels for all traces. + * -1 shows the whole name regardless of length. + * @default 15 + */ + namelength: number; +} + +export interface Annotations extends Label { + /** Determines whether or not this annotation is visible. */ + visible: boolean; + + /** + * Sets the text associated with this annotation. + * Plotly uses a subset of HTML tags to do things like + * newline (<br>), bold (<b></b>), italics (<i></i>), + * hyperlinks (<a href='...'></a>). Tags <em>, <sup>, <sub> + * <span> are also supported. + */ + text: string; + + /** Sets the angle at which the `text` is drawn with respect to the horizontal. */ + textangle: string; + + /** + * Sets an explicit width for the text box. null (default) lets the + * text set the box width. Wider text will be clipped. + * There is no automatic wrapping; use <br> to start a new line. + */ + width: number; + + /** + * Sets an explicit height for the text box. null (default) lets the + * text set the box height. Taller text will be clipped. + */ + height: number; + + /** Sets the opacity of the annotation (text + arrow). */ + opacity: number; + + /** + * Sets the horizontal alignment of the `text` within the box. + * Has an effect only if `text` spans more two or more lines + * (i.e. `text` contains one or more <br> HTML tags) or if an + * explicit width is set to override the text width. + */ + align: 'left' | 'center' | 'right'; + + /** + * Sets the vertical alignment of the `text` within the box. + * Has an effect only if an explicit height is set to override the text height. + */ + valign: 'top' | 'middle' | 'bottom'; + + /** Sets the padding (in px) between the `text` and the enclosing border. */ + borderpad: number; + + /** Sets the width (in px) of the border enclosing the annotation `text`. */ + borderwidth: number; + + /** + * Determines whether or not the annotation is drawn with an arrow. + * If *true*, `text` is placed near the arrow's tail. + * If *false*, `text` lines up with the `x` and `y` provided. + */ + showarrow: boolean; + + /** Sets the color of the annotation arrow. */ + arrowcolor: string; + + /** Sets the end annotation arrow head style. */ + arrowhead: number; + + /** Sets the start annotation arrow head style. */ + startarrowhead: number; + + /** Sets the annotation arrow head position. */ + arrowside: 'end' | 'start'; + + /** + * Sets the size of the end annotation arrow head, relative to `arrowwidth`. + * A value of 1 (default) gives a head about 3x as wide as the line. + */ + arrowsize: number; + + /** + * Sets the size of the start annotation arrow head, relative to `arrowwidth`. + * A value of 1 (default) gives a head about 3x as wide as the line. + */ + startarrowsize: number; + + /** Sets the width (in px) of annotation arrow line. */ + arrowwidth: number; + + /** + * Sets a distance, in pixels, to move the end arrowhead away from the + * position it is pointing at, for example to point at the edge of + * a marker independent of zoom. Note that this shortens the arrow + * from the `ax` / `ay` vector, in contrast to `xshift` / `yshift` + * which moves everything by this amount. + */ + standoff: number; + + /** + * Sets a distance, in pixels, to move the start arrowhead away from the + * position it is pointing at, for example to point at the edge of + * a marker independent of zoom. Note that this shortens the arrow + * from the `ax` / `ay` vector, in contrast to `xshift` / `yshift` + * which moves everything by this amount. + */ + startstandoff: number; + + /** + * Sets the x component of the arrow tail about the arrow head. + * If `axref` is `pixel`, a positive (negative) + * component corresponds to an arrow pointing + * from right to left (left to right). + * If `axref` is an axis, this is an absolute value on that axis, + * like `x`, NOT a relative value. + */ + ax: number; + + /** + * Sets the y component of the arrow tail about the arrow head. + * If `ayref` is `pixel`, a positive (negative) + * component corresponds to an arrow pointing + * from bottom to top (top to bottom). + * If `ayref` is an axis, this is an absolute value on that axis, + * like `y`, NOT a relative value. + */ + ay: number; + + /** + * Indicates in what terms the tail of the annotation (ax,ay) + * is specified. If `pixel`, `ax` is a relative offset in pixels + * from `x`. If set to an x axis id (e.g. *x* or *x2*), `ax` is + * specified in the same terms as that axis. This is useful + * for trendline annotations which should continue to indicate + * the correct trend when zoomed. + */ + axref: 'pixel' | XAxisName; + + /** + * Indicates in what terms the tail of the annotation (ax,ay) + * is specified. If `pixel`, `ay` is a relative offset in pixels + * from `y`. If set to a y axis id (e.g. *y* or *y2*), `ay` is + * specified in the same terms as that axis. This is useful + * for trendline annotations which should continue to indicate + * the correct trend when zoomed. + */ + ayref: 'pixel' | YAxisName; + + /** + * Sets the annotation's x coordinate axis. + * If set to an x axis id (e.g. *x* or *x2*), the `x` position refers to an x coordinate + * If set to *paper*, the `x` position refers to the distance from + * the left side of the plotting area in normalized coordinates + * where 0 (1) corresponds to the left (right) side. + */ + xref: 'paper' | XAxisName; + + /** + * Sets the annotation's x position. + * If the axis `type` is *log*, then you must take the log of your desired range. + * If the axis `type` is *date*, it should be date strings, like date data, + * though Date objects and unix milliseconds will be accepted and converted to strings. + * If the axis `type` is *category*, it should be numbers, using the scale where each + * category is assigned a serial number from zero in the order it appears. + */ + x: number | string; + + /** + * Sets the text box's horizontal position anchor + * This anchor binds the `x` position to the *left*, *center* or *right* of the annotation. + * For example, if `x` is set to 1, `xref` to *paper* and `xanchor` to *right* then the + * right-most portion of the annotation lines up with the right-most edge of the plotting area. + * If *auto*, the anchor is equivalent to *center* for data-referenced annotations or if there + * is an arrow, whereas for paper-referenced with no arrow, the anchor picked corresponds to the closest side. + */ + xanchor: 'auto' | 'left' | 'center' | 'right'; + + /** + * Shifts the position of the whole annotation and arrow to the + * right (positive) or left (negative) by this many pixels. + */ + xshift: number; + + /** + * Sets the annotation's y coordinate axis. + * If set to an y axis id (e.g. *y* or *y2*), the `y` position refers to an y coordinate + * If set to *paper*, the `y` position refers to the distance from + * the bottom of the plotting area in normalized coordinates + * where 0 (1) corresponds to the bottom (top). + */ + yref: 'paper' | YAxisName; + + /** + * Sets the annotation's y position. + * If the axis `type` is *log*, then you must take the log of your desired range. + * If the axis `type` is *date*, it should be date strings, like date data, + * though Date objects and unix milliseconds will be accepted and converted to strings. + * If the axis `type` is *category*, it should be numbers, using the scale where each + * category is assigned a serial number from zero in the order it appears. + */ + y: number | string; + + /** + * Sets the text box's vertical position anchor + * This anchor binds the `y` position to the *top*, *middle* or *bottom* of the annotation. + * For example, if `y` is set to 1, `yref` to *paper* and `yanchor` to *top* then the + * top-most portion of the annotation lines up with the top-most edge of the plotting area. + * If *auto*, the anchor is equivalent to *middle* for data-referenced annotations or if + * there is an arrow, whereas for paper-referenced with no arrow, the anchor picked + * corresponds to the closest side. + */ + yanchor: 'auto' | 'top' | 'middle' | 'bottom'; + + /** + * Shifts the position of the whole annotation and arrow up + * (positive) or down (negative) by this many pixels. + */ + yshift: number; + + /** + * Makes this annotation respond to clicks on the plot. + * If you click a data point that exactly matches the `x` and `y` values of this annotation, + * and it is hidden (visible: false), it will appear. In *onoff* mode, you must click the same + * point again to make it disappear, so if you click multiple points, you can show multiple + * annotations. In *onout* mode, a click anywhere else in the plot (on another data point or not) + * will hide this annotation. If you need to show/hide this annotation in response to different + * `x` or `y` values, you can set `xclick` and/or `yclick`. This is useful for example to label + * the side of a bar. To label markers though, `standoff` is preferred over `xclick` and `yclick`. + */ + clicktoshow: false | 'onoff' | 'onout'; + + /** + * Toggle this annotation when clicking a data point whose `x` value + * is `xclick` rather than the annotation's `x` value. + */ + xclick: any; + + /** + * Toggle this annotation when clicking a data point whose `y` value + * is `yclick` rather than the annotation's `y` value. + */ + yclick: any; + + /** + * Sets text to appear when hovering over this annotation. + * If omitted or blank, no hover label will appear. + */ + hovertext: string; + + hoverlabel: Partial<HoverLabel>; + + /** + * Determines whether the annotation text box captures mouse move and click events, + * or allows those events to pass through to data points in the plot that may be + * behind the annotation. By default `captureevents` is *false* unless `hovertext` + * is provided. If you use the event `plotly_clickannotation` without `hovertext` + * you must explicitly enable `captureevents`. + */ + captureevents: boolean; +} + +export interface Domain { + x: number[]; + y: number[]; + row: number; + column: number; +} + +export interface Padding { + /** + * The amount of padding (in px) along the top of the component. + */ + t: number; + /** + * The amount of padding (in px) on the right side of the component. + */ + r: number; + /** + * The amount of padding (in px) along the bottom of the component. + */ + b: number; + /** + * The amount of padding (in px) on the left side of the component. + */ + l: number; + editType: 'arraydraw'; +} + +/** + * 'Sets the pattern within the marker. + */ +export interface Pattern { + /** + * Sets the shape of the pattern fill. + * By default, no pattern is used for filling the area. + */ + shape?: '' | '/' | '\\' | 'x' | '-' | '|' | '+' | '.'; + /** + * Determines whether `marker.color` should be used + * as a default to `bgcolor` or a `fgcolor`. + */ + fillmode?: 'replace' | 'overlay'; + /** + * When there is no colorscale sets the color of background pattern fill. + * Defaults to a `marker.color` background when `fillmode` is *overlay*. + * Otherwise, defaults to a transparent background. + */ + bgcolor?: string; + /** + * When there is no colorscale sets the color of foreground pattern fill. + * Defaults to a `marker.color` background when `fillmode` is *replace*. + * Otherwise, defaults to dark grey or white + * to increase contrast with the `bgcolor`. + */ + fgcolor?: string; + /** + * Sets the opacity of the foreground pattern fill. + * Defaults to a 0.5 when `fillmode` is *overlay*. + * Otherwise, defaults to 1. + */ + fgopacity?: string; + /** + * Sets the size of unit squares of the pattern fill in pixels, + * which corresponds to the interval of repetition of the pattern. + */ + size?: number; + /** + * Sets the solidity of the pattern fill. + * Solidity is roughly the fraction of the area filled by the pattern. + * Solidity of 0 shows only the background color without pattern + * and solidty of 1 shows only the foreground color without pattern. + */ + solidity?: number; +} diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts index be544d55d72cc8..54f61f4e559e1c 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts @@ -17,6 +17,7 @@ import { IHeatMapChartDataPoint, IGroupedVerticalBarChartData, IVerticalBarChartDataPoint, + ISankeyChartData, } from '../../types/IDataPoint'; import { ISankeyChartProps } from '../SankeyChart/index'; import { IVerticalStackedBarChartProps } from '../VerticalStackedBarChart/index'; @@ -28,46 +29,109 @@ import { DataVizPalette, getColorFromToken, getNextColor } from '../../utilities import { GaugeChartVariant, IGaugeChartProps, IGaugeChartSegment } from '../GaugeChart/index'; import { IGroupedVerticalBarChartProps } from '../GroupedVerticalBarChart/index'; import { IVerticalBarChartProps } from '../VerticalBarChart/index'; +import { Layout, PlotlySchema, PieData, PlotData, SankeyData } from './PlotlySchema'; +import type { Datum, TypedArray } from './PlotlySchema'; import { timeParse } from 'd3-time-format'; -const isDate = (value: any): boolean => !isNaN(Date.parse(value)); +interface ISecondaryYAxisValues { + secondaryYAxistitle?: string; + secondaryYScaleOptions?: { yMinValue?: number; yMaxValue?: number }; +} + +const SUPPORTED_PLOT_TYPES = ['pie', 'bar', 'scatter', 'heatmap', 'sankey', 'indicator', 'histogram']; +const isDate = (value: any): boolean => { + const parsedDate = new Date(Date.parse(value)); + if (isNaN(parsedDate.getTime())) { + return false; + } + const parsedYear = parsedDate.getFullYear(); + const yearInString = /\b\d{4}\b/.test(value); + if (!yearInString && (parsedYear === 2000 || parsedYear === 2001)) { + return false; + } + return true; +}; + const isNumber = (value: any): boolean => !isNaN(parseFloat(value)) && isFinite(value); -export const isDateArray = (array: any[]): boolean => isArrayOrTypedArray(array) && array.every(isDate); -export const isNumberArray = (array: any[]): boolean => isArrayOrTypedArray(array) && array.every(isNumber); -export const isMonthArray = (array: any[]): boolean => { - if (array && array.length > 0) { - const parseFullMonth = timeParse('%B'); - const parseShortMonth = timeParse('%b'); - return array.every(possiblyMonthValue => { - return parseFullMonth(possiblyMonthValue) !== null || parseShortMonth(possiblyMonthValue) !== null; - }); + +const isMonth = (possiblyMonthValue: any): boolean => { + const parseFullMonth = timeParse('%B'); + const parseShortMonth = timeParse('%b'); + return parseFullMonth(possiblyMonthValue) !== null || parseShortMonth(possiblyMonthValue) !== null; +}; + +const isArrayOfType = ( + plotCoordinates: Datum[] | Datum[][] | TypedArray | undefined, + typeCheck: (datum: any, ...args: any[]) => boolean, + ...args: any[] +): boolean => { + if (!isArrayOrTypedArray(plotCoordinates)) { + return false; } - return false; + + if (plotCoordinates!.length === 0) { + return false; + } + + if (Array.isArray(plotCoordinates![0])) { + // Handle 2D array + return (plotCoordinates as Datum[][]).every(innerArray => innerArray.every(datum => typeCheck(datum, ...args))); + } else { + // Handle 1D array + return (plotCoordinates as Datum[]).every(datum => typeCheck(datum, ...args)); + } +}; + +export const isDateArray = (data: Datum[] | Datum[][] | TypedArray): boolean => { + return isArrayOfType(data, isDate); +}; + +export const isNumberArray = (data: Datum[] | Datum[][] | TypedArray): boolean => { + return isArrayOfType(data, isNumber); +}; + +export const isMonthArray = (data: Datum[] | Datum[][] | TypedArray): boolean => { + return isArrayOfType(data, isMonth); }; -function getTitles(layout: any) { +export const isLineData = (data: Partial<PlotData>): boolean => { + return ( + !SUPPORTED_PLOT_TYPES.includes(`${data.type}`) && + Array.isArray(data.x) && + isArrayOfType(data.y, (value: any) => typeof value === 'number') && + data.x.length > 0 && + data.x.length === data.y!.length + ); +}; + +const invalidate2Dseries = (series: PlotData, chartType: string): void => { + if (series.x?.length > 0 && Array.isArray(series.x[0])) { + throw new Error(`transform to ${chartType}:: 2D x array not supported`); + } + if (series.y?.length > 0 && Array.isArray(series.y[0])) { + throw new Error(`transform to ${chartType}:: 2D y array not supported`); + } +}; + +const getLegend = (series: PlotData, index: number): string => { + return series.name || `Series ${index + 1}`; +}; + +function getTitles(layout: Partial<Layout> | undefined) { const titles = { - chartTitle: - typeof layout.title === 'string' ? layout.title : typeof layout.title?.text === 'string' ? layout.title.text : '', - xAxisTitle: - typeof layout?.xaxis?.title === 'string' - ? layout?.xaxis?.title - : typeof layout?.xaxis?.title?.text === 'string' - ? layout?.xaxis?.title?.text - : '', - yAxisTitle: - typeof layout?.yaxis?.title === 'string' - ? layout?.yaxis?.title - : typeof layout?.yaxis?.title?.text === 'string' - ? layout?.yaxis?.title?.text - : '', + chartTitle: typeof layout?.title === 'string' ? layout.title : layout?.title?.text ?? '', + xAxisTitle: typeof layout?.xaxis?.title === 'string' ? layout?.xaxis?.title : layout?.xaxis?.title?.text ?? '', + yAxisTitle: typeof layout?.yaxis?.title === 'string' ? layout?.yaxis?.title : layout?.yaxis?.title?.text ?? '', }; return titles; } -export const updateXValues = (xValues: any[]): any[] => { +export const updateXValues = (xValues: Datum[] | Datum[][] | TypedArray): any[] => { const presentYear = new Date().getFullYear(); - const dates = xValues.map(possiblyMonthValue => { + if (xValues.length > 0 && Array.isArray(xValues[0])) { + throw new Error('updateXValues:: 2D array not supported'); + } + const dates = (xValues as Datum[]).map(possiblyMonthValue => { const parsedDate = `${possiblyMonthValue} 01, ${presentYear}`; return isDate(parsedDate) ? new Date(parsedDate) : null; }); @@ -82,11 +146,12 @@ export const updateXValues = (xValues: any[]): any[] => { dates[i - 1]!.setFullYear(currentYear); } } - xValues = xValues.map((month, index) => { + xValues = (xValues as Datum[]).map((month, index) => { return `${month} 01, ${dates[index]!.getFullYear()}`; }); return xValues; }; + export const getColor = ( legendLabel: string, colorMap: React.MutableRefObject<Map<string, string>>, @@ -101,25 +166,57 @@ export const getColor = ( return colorMap.current.get(legendLabel) as string; }; +const getSecondaryYAxisValues = (series: PlotData, layout: Partial<Layout> | undefined) => { + const secondaryYAxisValues: ISecondaryYAxisValues = {}; + if (layout && layout.yaxis2 && series.yaxis === 'y2') { + secondaryYAxisValues.secondaryYAxistitle = + typeof layout.yaxis2.title === 'string' + ? layout.yaxis2.title + : typeof layout.yaxis2.title?.text === 'string' + ? layout.yaxis2.title.text + : ''; + if (layout.yaxis2.range) { + secondaryYAxisValues.secondaryYScaleOptions = { + yMinValue: layout.yaxis2.range[0], + yMaxValue: layout.yaxis2.range[1], + }; + } else { + const yValues = series.y as number[]; + if (yValues) { + secondaryYAxisValues.secondaryYScaleOptions = { + yMinValue: Math.min(...yValues), + yMaxValue: Math.max(...yValues), + }; + } + } + } + secondaryYAxisValues.secondaryYAxistitle = + secondaryYAxisValues.secondaryYAxistitle !== '' ? secondaryYAxisValues.secondaryYAxistitle : undefined; + secondaryYAxisValues.secondaryYScaleOptions = + secondaryYAxisValues.secondaryYScaleOptions && Object.keys(secondaryYAxisValues.secondaryYScaleOptions).length !== 0 + ? secondaryYAxisValues.secondaryYScaleOptions + : undefined; + return secondaryYAxisValues; +}; + export const transformPlotlyJsonToDonutProps = ( - jsonObj: any, + input: PlotlySchema, colorMap: React.MutableRefObject<Map<string, string>>, isDarkTheme?: boolean, ): IDonutChartProps => { - const { data, layout } = jsonObj; - const firstData = data[0]; + const firstData = input.data[0] as PieData; const donutData = firstData.labels?.map((label: string, index: number): IChartDataPoint => { const color = getColor(label, colorMap, isDarkTheme); return { legend: label, - data: firstData.values?.[index], + data: firstData.values?.[index] as number, //ToDo how to handle string data? color, }; }); - const width: number = typeof layout?.width === 'number' ? layout?.width : 440; - const height: number = typeof layout?.height === 'number' ? layout?.height : 220; + const width: number = input.layout?.width ?? 440; + const height: number = input.layout?.height ?? 220; const hideLabels: boolean = firstData.textinfo ? !['value', 'percent', 'label+percent'].includes(firstData.textinfo) : false; @@ -137,14 +234,14 @@ export const transformPlotlyJsonToDonutProps = ( }, }; - const { chartTitle } = getTitles(layout); + const { chartTitle } = getTitles(input.layout); return { data: { chartTitle, chartData: donutData, }, - hideLegend: layout?.showlegend === false ? true : false, + hideLegend: input.layout?.showlegend === false ? true : false, width, height, innerRadius, @@ -155,41 +252,49 @@ export const transformPlotlyJsonToDonutProps = ( }; export const transformPlotlyJsonToVSBCProps = ( - jsonObj: any, + input: PlotlySchema, colorMap: React.MutableRefObject<Map<string, string>>, isDarkTheme?: boolean, + fallbackVSBC?: boolean, ): IVerticalStackedBarChartProps => { - const { data, layout } = jsonObj; const mapXToDataPoints: { [key: string]: IVerticalStackedChartProps } = {}; let yMaxValue = 0; + let secondaryYAxisValues: ISecondaryYAxisValues = {}; + input.data.forEach((series: PlotData, index1: number) => { + invalidate2Dseries(series, 'VSBC'); + + if (!isNumberArray(series.y)) { + throw new Error('transform to VSBC:: y values should be numeric'); + } - data.forEach((series: any, index1: number) => { - series.x?.forEach((x: string | number, index2: number) => { + (series.x as Datum[])?.forEach((x: string | number, index2: number) => { if (!mapXToDataPoints[x]) { mapXToDataPoints[x] = { xAxisPoint: x, chartData: [], lineData: [] }; } - const legend: string = series.name || `Series ${index1 + 1}`; - if (series.type === 'bar' || series.type === 'scatter') { + const legend: string = getLegend(series, index1); + const yVal: number = (series.y?.[index2] as number) ?? 0; + if (series.type === 'bar') { const color = getColor(legend, colorMap, isDarkTheme); mapXToDataPoints[x].chartData.push({ legend, - data: series.y?.[index2], + data: yVal, color, }); - } else if (series.type === 'line') { + } else if (series.type === 'scatter' || isLineData(series) || !!fallbackVSBC) { const color = getColor(legend, colorMap, isDarkTheme); mapXToDataPoints[x].lineData!.push({ legend, - y: series.y?.[index2], + y: yVal, color, }); } - yMaxValue = Math.max(yMaxValue, series.y?.[index2]); + yMaxValue = Math.max(yMaxValue, yVal); }); + secondaryYAxisValues = getSecondaryYAxisValues(series, input.layout); }); - const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(layout); + const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(input.layout); return { data: Object.values(mapXToDataPoints), @@ -201,38 +306,46 @@ export const transformPlotlyJsonToVSBCProps = ( xAxisTitle, yAxisTitle, mode: 'plotly', + secondaryYAxistitle: secondaryYAxisValues.secondaryYAxistitle, + secondaryYScaleOptions: secondaryYAxisValues.secondaryYScaleOptions, }; }; export const transformPlotlyJsonToGVBCProps = ( - jsonObj: any, + input: PlotlySchema, colorMap: React.MutableRefObject<Map<string, string>>, isDarkTheme?: boolean, ): IGroupedVerticalBarChartProps => { - const { data, layout } = jsonObj; const mapXToDataPoints: Record<string, IGroupedVerticalBarChartData> = {}; + let secondaryYAxisValues: ISecondaryYAxisValues = {}; + input.data.forEach((series: PlotData, index1: number) => { + invalidate2Dseries(series, 'GVBC'); - data.forEach((series: any, index1: number) => { - series.x?.forEach((x: string | number, index2: number) => { + if (!isNumberArray(series.y)) { + throw new Error('transform to GVBC:: y values should be numeric'); + } + + (series.x as Datum[])?.forEach((x: string | number, index2: number) => { if (!mapXToDataPoints[x]) { mapXToDataPoints[x] = { name: x.toString(), series: [] }; } if (series.type === 'bar') { - const legend: string = series.name || `Series ${index1 + 1}`; + const legend: string = getLegend(series, index1); const color = getColor(legend, colorMap, isDarkTheme); mapXToDataPoints[x].series.push({ key: legend, - data: series.y?.[index2], + data: (series.y?.[index2] as number) ?? 0, xAxisCalloutData: x as string, color, legend, }); } }); + secondaryYAxisValues = getSecondaryYAxisValues(series, input.layout); }); - const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(layout); + const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(input.layout); return { data: Object.values(mapXToDataPoints), @@ -243,24 +356,27 @@ export const transformPlotlyJsonToGVBCProps = ( xAxisTitle, yAxisTitle, mode: 'plotly', + secondaryYAxistitle: secondaryYAxisValues.secondaryYAxistitle, + secondaryYScaleOptions: secondaryYAxisValues.secondaryYScaleOptions, }; }; export const transformPlotlyJsonToVBCProps = ( - jsonObj: any, + input: PlotlySchema, colorMap: React.MutableRefObject<Map<string, string>>, isDarkTheme?: boolean, ): IVerticalBarChartProps => { - const { data, layout } = jsonObj; const vbcData: IVerticalBarChartDataPoint[] = []; - data.forEach((series: any, index: number) => { + input.data.forEach((series: PlotData, index: number) => { + invalidate2Dseries(series, 'VBC'); + if (!series.x) { return; } const scale = d3ScaleLinear() - .domain(d3Extent<number>(series.x) as [number, number]) + .domain(d3Extent<number>(series.x as number[]) as [number, number]) .nice(); let [xMin, xMax] = scale.domain(); @@ -285,12 +401,12 @@ export const transformPlotlyJsonToVBCProps = ( bin.domain([xMin, xMax]).thresholds(thresholds); } - const buckets = bin(series.x); + const buckets = bin(series.x as number[]); // If the start or end of xbins is specified, then the number of datapoints may become less than x.length const totalDataPoints = d3Merge(buckets).length; buckets.forEach(bucket => { - const legend: string = series.name || `Series ${index + 1}`; + const legend: string = getLegend(series, index); const color: string = getColor(legend, colorMap, isDarkTheme); let y = bucket.length; @@ -322,7 +438,7 @@ export const transformPlotlyJsonToVBCProps = ( }); }); - const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(layout); + const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(input.layout); return { data: vbcData, @@ -338,34 +454,35 @@ export const transformPlotlyJsonToVBCProps = ( }; export const transformPlotlyJsonToScatterChartProps = ( - jsonObj: any, + input: PlotlySchema, isAreaChart: boolean, colorMap: React.MutableRefObject<Map<string, string>>, isDarkTheme?: boolean, ): ILineChartProps | IAreaChartProps => { - const { data, layout } = jsonObj; + let secondaryYAxisValues: ISecondaryYAxisValues = {}; let mode: string = 'tonexty'; - - const chartData: ILineChartPoints[] = data.map((series: any, index: number) => { - const xValues = series.x; + const chartData: ILineChartPoints[] = input.data.map((series: PlotData, index: number) => { + invalidate2Dseries(series, 'Scatter'); + const xValues = series.x as Datum[]; const isString = typeof xValues[0] === 'string'; const isXDate = isDateArray(xValues); const isXNumber = isNumberArray(xValues); - const legend: string = series.name || `Series ${index + 1}`; + const legend: string = getLegend(series, index); const lineColor = getColor(legend, colorMap, isDarkTheme); + secondaryYAxisValues = getSecondaryYAxisValues(series, input.layout); mode = series.fill === 'tozeroy' ? 'tozeroy' : 'tonexty'; return { legend, - data: xValues.map((x: string | number, i: number) => ({ - x: isString ? (isXDate ? new Date(x) : isXNumber ? parseFloat(x as string) : x) : x, + data: xValues.map((x, i: number) => ({ + x: isString ? (isXDate ? new Date(x as string) : isXNumber ? parseFloat(x as string) : x) : x, y: series.y[i], })), color: lineColor, - }; + } as ILineChartPoints; }); - const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(layout); + const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(input.layout); const chartProps: IChartProps = { chartTitle, @@ -378,6 +495,8 @@ export const transformPlotlyJsonToScatterChartProps = ( supportNegativeData: true, xAxisTitle, yAxisTitle, + secondaryYAxistitle: secondaryYAxisValues.secondaryYAxistitle, + secondaryYScaleOptions: secondaryYAxisValues.secondaryYScaleOptions, mode, } as IAreaChartProps; } else { @@ -386,43 +505,45 @@ export const transformPlotlyJsonToScatterChartProps = ( supportNegativeData: true, xAxisTitle, yAxisTitle, + secondaryYAxistitle: secondaryYAxisValues.secondaryYAxistitle, + secondaryYScaleOptions: secondaryYAxisValues.secondaryYScaleOptions, } as ILineChartProps; } }; export const transformPlotlyJsonToHorizontalBarWithAxisProps = ( - jsonObj: any, + input: PlotlySchema, colorMap: React.MutableRefObject<Map<string, string>>, isDarkTheme?: boolean, ): IHorizontalBarChartWithAxisProps => { - const { data, layout } = jsonObj; + const chartData: IHorizontalBarChartWithAxisDataPoint[] = input.data + .map((series: PlotData, index: number) => { + invalidate2Dseries(series, 'HBC'); - const chartData: IHorizontalBarChartWithAxisDataPoint[] = data - .map((series: any, index: number) => { - return series.y.map((yValue: string, i: number) => { + return (series.y as Datum[]).map((yValue: string, i: number) => { const color = getColor(yValue, colorMap, isDarkTheme); return { x: series.x[i], y: yValue, legend: yValue, color, - }; + } as IHorizontalBarChartWithAxisDataPoint; }); }) .flat() //reversing the order to invert the Y bars order as required by plotly. .reverse(); - const chartHeight: number = typeof layout.height === 'number' ? layout.height : 450; - const margin: number = typeof layout.margin?.l === 'number' ? layout.margin?.l : 0; - const padding: number = typeof layout.margin?.pad === 'number' ? layout.margin?.pad : 0; + const chartHeight: number = input.layout?.height ?? 450; + const margin: number = input.layout?.margin?.l ?? 0; + const padding: number = input.layout?.margin?.pad ?? 0; const availableHeight: number = chartHeight - margin - padding; - const numberOfBars = data[0].y.length; + const numberOfBars = (input.data[0] as PlotData).y.length; const scalingFactor = 0.01; const gapFactor = 1 / (1 + scalingFactor * numberOfBars); const barHeight = availableHeight / (numberOfBars * (1 + gapFactor)); - const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(layout); + const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(input.layout); return { data: chartData, @@ -430,32 +551,33 @@ export const transformPlotlyJsonToHorizontalBarWithAxisProps = ( xAxisTitle, yAxisTitle, secondaryYAxistitle: - typeof layout?.yaxis2?.title === 'string' ? layout?.yaxis2?.title : layout?.yaxis2?.title?.text || '', + typeof input.layout?.yaxis2?.title === 'string' + ? input.layout?.yaxis2?.title + : input.layout?.yaxis2?.title?.text || '', barHeight, showYAxisLables: true, styles: { root: { height: chartHeight, - width: typeof layout.width === 'number' ? layout.width : 600, + width: input.layout?.width ?? 600, }, }, }; }; -export const transformPlotlyJsonToHeatmapProps = (jsonObj: any): IHeatMapChartProps => { - const { data, layout } = jsonObj; - const firstData = data[0]; +export const transformPlotlyJsonToHeatmapProps = (input: PlotlySchema): IHeatMapChartProps => { + const firstData = input.data[0] as PlotData; const heatmapDataPoints: IHeatMapChartDataPoint[] = []; let zMin = Number.POSITIVE_INFINITY; let zMax = Number.NEGATIVE_INFINITY; - firstData.x?.forEach((xVal: any, xIdx: number) => { + (firstData.x as Datum[])?.forEach((xVal, xIdx: number) => { firstData.y?.forEach((yVal: any, yIdx: number) => { - const zVal = firstData.z?.[yIdx]?.[xIdx]; + const zVal = (firstData.z as number[][])?.[yIdx]?.[xIdx]; heatmapDataPoints.push({ - x: layout.xaxis?.type === 'date' ? new Date(xVal) : xVal, - y: layout.yaxis?.type === 'date' ? new Date(yVal) : yVal, + x: input.layout?.xaxis?.type === 'date' ? (xVal as Date) : xVal ?? 0, + y: input.layout?.yaxis?.type === 'date' ? (yVal as Date) : yVal, value: zVal, rectText: zVal, }); @@ -465,17 +587,27 @@ export const transformPlotlyJsonToHeatmapProps = (jsonObj: any): IHeatMapChartPr }); }); const heatmapData: IHeatMapChartData = { - legend: typeof firstData.name === 'string' ? firstData.name : '', + legend: firstData.name, data: heatmapDataPoints, value: 0, }; - // Convert normalized values to actual values - const domainValuesForColorScale: number[] = firstData.colorscale - ? firstData.colorscale.map((arr: any) => arr[0] * (zMax - zMin) + zMin) - : []; - const rangeValuesForColorScale: string[] = firstData.colorscale ? firstData.colorscale.map((arr: any) => arr[1]) : []; - const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(layout); + // Initialize domain and range to default values + const defaultDomain = [zMin, zMax]; + const defaultRange = [ + getColorFromToken(DataVizPalette.color1), + getColorFromToken(DataVizPalette.color2), + getColorFromToken(DataVizPalette.color3), + ]; + const domainValuesForColorScale: number[] = Array.isArray(firstData.colorscale) + ? (firstData.colorscale as Array<[number, string]>).map(arr => arr[0] * (zMax - zMin) + zMin) + : defaultDomain; + + const rangeValuesForColorScale: string[] = Array.isArray(firstData.colorscale) + ? (firstData.colorscale as Array<[number, string]>).map(arr => arr[1]) + : defaultRange; + + const { chartTitle, xAxisTitle, yAxisTitle } = getTitles(input.layout); return { data: [heatmapData], @@ -491,25 +623,23 @@ export const transformPlotlyJsonToHeatmapProps = (jsonObj: any): IHeatMapChartPr }; export const transformPlotlyJsonToSankeyProps = ( - jsonObj: any, + input: PlotlySchema, colorMap: React.MutableRefObject<Map<string, string>>, isDarkTheme?: boolean, ): ISankeyChartProps => { - const { data, layout } = jsonObj; - const { link, node } = data[0]; - const validLinks = link.value + const { link, node } = input.data[0] as SankeyData; + const validLinks = (link?.value ?? []) .map((val: number, index: number) => ({ value: val, - source: link.source[index], - target: link.target[index], + source: link?.source![index], + target: link?.target![index], })) // eslint-disable-next-line @typescript-eslint/no-shadow - //@ts-expect-error Dynamic link object. Ignore for now. // Filter out negative nodes, unequal nodes and self-references (circular links) .filter(x => x.source >= 0 && x.target >= 0 && x.source !== x.target); const sankeyChartData = { - nodes: node.label.map((label: string, index: number) => { + nodes: node.label?.map((label: string, index: number) => { const color = getColor(label, colorMap, isDarkTheme); return { @@ -523,18 +653,18 @@ export const transformPlotlyJsonToSankeyProps = ( ...validLink, }; }), - }; + } as ISankeyChartData; - const width: number = typeof layout?.width === 'number' ? layout?.width : 440; - const height: number = typeof layout?.height === 'number' ? layout?.height : 220; + const width: number = input.layout?.width ?? 440; + const height: number = input.layout?.height ?? 220; const styles: ISankeyChartProps['styles'] = { root: { - ...(typeof layout.font?.size === 'number' ? { fontSize: layout.font?.size } : {}), + ...(input.layout?.font?.size ? { fontSize: input.layout.font?.size } : {}), }, }; const shouldResize: number = width + height; - const { chartTitle } = getTitles(layout); + const { chartTitle } = getTitles(input.layout); return { data: { @@ -550,12 +680,11 @@ export const transformPlotlyJsonToSankeyProps = ( }; export const transformPlotlyJsonToGaugeProps = ( - jsonObj: any, + input: PlotlySchema, colorMap: React.MutableRefObject<Map<string, string>>, isDarkTheme?: boolean, ): IGaugeChartProps => { - const { data, layout } = jsonObj; - const firstData = data[0]; + const firstData = input.data[0] as PlotData; const segments = firstData.gauge?.steps?.length ? firstData.gauge.steps.map((step: any, index: number): IGaugeChartSegment => { @@ -570,19 +699,19 @@ export const transformPlotlyJsonToGaugeProps = ( : [ { legend: 'Current', - size: firstData.value ?? 0 - (firstData.gauge?.range?.[0] ?? 0), + size: firstData.value ?? 0 - (firstData.gauge?.axis?.range?.[0] ?? 0), color: getColor('Current', colorMap, isDarkTheme), }, { legend: 'Target', - size: (firstData.gauge?.range?.[1] ?? 100) - (firstData.value ?? 0), + size: (firstData.gauge?.axis?.range?.[1] ?? 100) - (firstData.value ?? 0), color: DataVizPalette.disabled, }, ]; let sublabel: string | undefined; let sublabelColor: string | undefined; - if (typeof firstData.delta?.reference === 'number') { + if (firstData.delta?.reference) { const diff = firstData.value - firstData.delta.reference; if (diff >= 0) { sublabel = `\u25B2 ${diff}`; @@ -601,19 +730,19 @@ export const transformPlotlyJsonToGaugeProps = ( }, }; - const { chartTitle } = getTitles(layout); + const { chartTitle } = getTitles(input.layout); return { segments, - chartValue: typeof firstData.value === 'number' ? firstData.value : 0, + chartValue: firstData.value ?? 0, chartTitle, sublabel, // range values can be null minValue: typeof firstData.gauge?.axis?.range?.[0] === 'number' ? firstData.gauge?.axis?.range?.[0] : undefined, maxValue: typeof firstData.gauge?.axis?.range?.[1] === 'number' ? firstData.gauge?.axis?.range?.[1] : undefined, - chartValueFormat: () => firstData.value, - width: typeof layout?.width === 'number' ? layout?.width : 440, - height: typeof layout?.height === 'number' ? layout?.height : 220, + chartValueFormat: () => firstData.value?.toString() ?? '', + width: input.layout?.width ?? 440, + height: input.layout?.height ?? 220, styles, variant: firstData.gauge?.steps?.length ? GaugeChartVariant.MultipleSegments : GaugeChartVariant.SingleSegment, }; diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap index bf5cdb41de7cbd..5f131e387622e1 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap @@ -5646,7 +5646,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </g> </g> <g - aria-label="x_0, y_19. , 1.4746401926975559." + aria-label="x_0, y_19. undefined, 1.4746401926975559." data-is-focusable="true" fill-opacity="1" role="img" @@ -5678,7 +5678,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_19. , 76.5710413276318." + aria-label="x_1, y_19. undefined, 76.5710413276318." data-is-focusable="true" fill-opacity="1" role="img" @@ -5710,7 +5710,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_19. , 22.444170064560886." + aria-label="x_2, y_19. undefined, 22.444170064560886." data-is-focusable="true" fill-opacity="1" role="img" @@ -5742,7 +5742,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_19. , -11.754560357801614." + aria-label="x_3, y_19. undefined, -11.754560357801614." data-is-focusable="true" fill-opacity="1" role="img" @@ -5774,7 +5774,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_19. , 31.65020848831535." + aria-label="x_4, y_19. undefined, 31.65020848831535." data-is-focusable="true" fill-opacity="1" role="img" @@ -5806,7 +5806,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_19. , -6.747073251084499." + aria-label="x_5, y_19. undefined, -6.747073251084499." data-is-focusable="true" fill-opacity="1" role="img" @@ -5838,7 +5838,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_19. , 10.677375854561543." + aria-label="x_6, y_19. undefined, 10.677375854561543." data-is-focusable="true" fill-opacity="1" role="img" @@ -5870,7 +5870,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_19. , 18.290237353501528." + aria-label="x_7, y_19. undefined, 18.290237353501528." data-is-focusable="true" fill-opacity="1" role="img" @@ -5902,7 +5902,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_19. , 44.04246479548906." + aria-label="x_8, y_19. undefined, 44.04246479548906." data-is-focusable="true" fill-opacity="1" role="img" @@ -5934,7 +5934,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_19. , -0.9669084139974888." + aria-label="x_9, y_19. undefined, -0.9669084139974888." data-is-focusable="true" fill-opacity="1" role="img" @@ -5966,7 +5966,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_19. , -10.02999798650989." + aria-label="x_10, y_19. undefined, -10.02999798650989." data-is-focusable="true" fill-opacity="1" role="img" @@ -5998,7 +5998,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_19. , 26.331023176529538." + aria-label="x_11, y_19. undefined, 26.331023176529538." data-is-focusable="true" fill-opacity="1" role="img" @@ -6030,7 +6030,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_19. , 23.744787277420585." + aria-label="x_12, y_19. undefined, 23.744787277420585." data-is-focusable="true" fill-opacity="1" role="img" @@ -6062,7 +6062,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_19. , 21.58401811955205." + aria-label="x_13, y_19. undefined, 21.58401811955205." data-is-focusable="true" fill-opacity="1" role="img" @@ -6094,7 +6094,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_19. , -5.054619683005746." + aria-label="x_14, y_19. undefined, -5.054619683005746." data-is-focusable="true" fill-opacity="1" role="img" @@ -6126,7 +6126,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_19. , -12.304220941049874." + aria-label="x_15, y_19. undefined, -12.304220941049874." data-is-focusable="true" fill-opacity="1" role="img" @@ -6158,7 +6158,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_19. , 22.0278850405599." + aria-label="x_16, y_19. undefined, 22.0278850405599." data-is-focusable="true" fill-opacity="1" role="img" @@ -6190,7 +6190,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_19. , 68.76140423378733." + aria-label="x_17, y_19. undefined, 68.76140423378733." data-is-focusable="true" fill-opacity="1" role="img" @@ -6222,7 +6222,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_19. , -11.104838839030073." + aria-label="x_18, y_19. undefined, -11.104838839030073." data-is-focusable="true" fill-opacity="1" role="img" @@ -6254,7 +6254,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_19. , 32.93901719565705." + aria-label="x_19, y_19. undefined, 32.93901719565705." data-is-focusable="true" fill-opacity="1" role="img" @@ -6286,7 +6286,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_18. , 2.008683713506029." + aria-label="x_0, y_18. undefined, 2.008683713506029." data-is-focusable="true" fill-opacity="1" role="img" @@ -6318,7 +6318,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_18. , 68.77074374390875." + aria-label="x_1, y_18. undefined, 68.77074374390875." data-is-focusable="true" fill-opacity="1" role="img" @@ -6350,7 +6350,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_18. , 27.561261630596558." + aria-label="x_2, y_18. undefined, 27.561261630596558." data-is-focusable="true" fill-opacity="1" role="img" @@ -6382,7 +6382,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_18. , -11.972754232678293." + aria-label="x_3, y_18. undefined, -11.972754232678293." data-is-focusable="true" fill-opacity="1" role="img" @@ -6414,7 +6414,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_18. , 27.652138241890253." + aria-label="x_4, y_18. undefined, 27.652138241890253." data-is-focusable="true" fill-opacity="1" role="img" @@ -6446,7 +6446,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_18. , -8.994598412149836." + aria-label="x_5, y_18. undefined, -8.994598412149836." data-is-focusable="true" fill-opacity="1" role="img" @@ -6478,7 +6478,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_18. , 16.01202612993778." + aria-label="x_6, y_18. undefined, 16.01202612993778." data-is-focusable="true" fill-opacity="1" role="img" @@ -6510,7 +6510,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_18. , 27.496822437992087." + aria-label="x_7, y_18. undefined, 27.496822437992087." data-is-focusable="true" fill-opacity="1" role="img" @@ -6542,7 +6542,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_18. , 42.223038572972655." + aria-label="x_8, y_18. undefined, 42.223038572972655." data-is-focusable="true" fill-opacity="1" role="img" @@ -6574,7 +6574,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_18. , 9.14302748045202." + aria-label="x_9, y_18. undefined, 9.14302748045202." data-is-focusable="true" fill-opacity="1" role="img" @@ -6606,7 +6606,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_18. , -9.49672264010566." + aria-label="x_10, y_18. undefined, -9.49672264010566." data-is-focusable="true" fill-opacity="1" role="img" @@ -6638,7 +6638,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_18. , 25.872388552562622." + aria-label="x_11, y_18. undefined, 25.872388552562622." data-is-focusable="true" fill-opacity="1" role="img" @@ -6670,7 +6670,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_18. , 29.591488992612543." + aria-label="x_12, y_18. undefined, 29.591488992612543." data-is-focusable="true" fill-opacity="1" role="img" @@ -6702,7 +6702,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_18. , 17.887210405056912." + aria-label="x_13, y_18. undefined, 17.887210405056912." data-is-focusable="true" fill-opacity="1" role="img" @@ -6734,7 +6734,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_18. , -5.273287251587566." + aria-label="x_14, y_18. undefined, -5.273287251587566." data-is-focusable="true" fill-opacity="1" role="img" @@ -6766,7 +6766,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_18. , -12.231659074097587." + aria-label="x_15, y_18. undefined, -12.231659074097587." data-is-focusable="true" fill-opacity="1" role="img" @@ -6798,7 +6798,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_18. , 25.21878307435221." + aria-label="x_16, y_18. undefined, 25.21878307435221." data-is-focusable="true" fill-opacity="1" role="img" @@ -6830,7 +6830,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_18. , 55.4498407189013." + aria-label="x_17, y_18. undefined, 55.4498407189013." data-is-focusable="true" fill-opacity="1" role="img" @@ -6862,7 +6862,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_18. , -16.160855914516." + aria-label="x_18, y_18. undefined, -16.160855914516." data-is-focusable="true" fill-opacity="1" role="img" @@ -6894,7 +6894,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_18. , 32.26936734704534." + aria-label="x_19, y_18. undefined, 32.26936734704534." data-is-focusable="true" fill-opacity="1" role="img" @@ -6926,7 +6926,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_17. , 8.834804620855842." + aria-label="x_0, y_17. undefined, 8.834804620855842." data-is-focusable="true" fill-opacity="1" role="img" @@ -6958,7 +6958,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_17. , 58.63396530456222." + aria-label="x_1, y_17. undefined, 58.63396530456222." data-is-focusable="true" fill-opacity="1" role="img" @@ -6990,7 +6990,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_17. , 32.725737544844485." + aria-label="x_2, y_17. undefined, 32.725737544844485." data-is-focusable="true" fill-opacity="1" role="img" @@ -7022,7 +7022,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_17. , -13.465901648481573." + aria-label="x_3, y_17. undefined, -13.465901648481573." data-is-focusable="true" fill-opacity="1" role="img" @@ -7054,7 +7054,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_17. , 31.313375862796256." + aria-label="x_4, y_17. undefined, 31.313375862796256." data-is-focusable="true" fill-opacity="1" role="img" @@ -7086,7 +7086,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_17. , -1.937020141351771." + aria-label="x_5, y_17. undefined, -1.937020141351771." data-is-focusable="true" fill-opacity="1" role="img" @@ -7118,7 +7118,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_17. , 14.893297536987049." + aria-label="x_6, y_17. undefined, 14.893297536987049." data-is-focusable="true" fill-opacity="1" role="img" @@ -7150,7 +7150,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_17. , 23.629750932895455." + aria-label="x_7, y_17. undefined, 23.629750932895455." data-is-focusable="true" fill-opacity="1" role="img" @@ -7182,7 +7182,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_17. , 41.77269087492713." + aria-label="x_8, y_17. undefined, 41.77269087492713." data-is-focusable="true" fill-opacity="1" role="img" @@ -7214,7 +7214,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_17. , 9.082388429023517." + aria-label="x_9, y_17. undefined, 9.082388429023517." data-is-focusable="true" fill-opacity="1" role="img" @@ -7246,7 +7246,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_17. , -6.034577415215565." + aria-label="x_10, y_17. undefined, -6.034577415215565." data-is-focusable="true" fill-opacity="1" role="img" @@ -7278,7 +7278,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_17. , 26.401238496860607." + aria-label="x_11, y_17. undefined, 26.401238496860607." data-is-focusable="true" fill-opacity="1" role="img" @@ -7310,7 +7310,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_17. , 30.051671106505943." + aria-label="x_12, y_17. undefined, 30.051671106505943." data-is-focusable="true" fill-opacity="1" role="img" @@ -7342,7 +7342,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_17. , 23.834062269627154." + aria-label="x_13, y_17. undefined, 23.834062269627154." data-is-focusable="true" fill-opacity="1" role="img" @@ -7374,7 +7374,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_17. , -3.561155588342318." + aria-label="x_14, y_17. undefined, -3.561155588342318." data-is-focusable="true" fill-opacity="1" role="img" @@ -7406,7 +7406,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_17. , -10.717340944667358." + aria-label="x_15, y_17. undefined, -10.717340944667358." data-is-focusable="true" fill-opacity="1" role="img" @@ -7438,7 +7438,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_17. , 25.98741506616426." + aria-label="x_16, y_17. undefined, 25.98741506616426." data-is-focusable="true" fill-opacity="1" role="img" @@ -7470,7 +7470,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_17. , 55.13836837404197." + aria-label="x_17, y_17. undefined, 55.13836837404197." data-is-focusable="true" fill-opacity="1" role="img" @@ -7502,7 +7502,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_17. , -12.222227236438126." + aria-label="x_18, y_17. undefined, -12.222227236438126." data-is-focusable="true" fill-opacity="1" role="img" @@ -7534,7 +7534,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_17. , 30.768724196434682." + aria-label="x_19, y_17. undefined, 30.768724196434682." data-is-focusable="true" fill-opacity="1" role="img" @@ -7566,7 +7566,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_16. , 9.52854140993721." + aria-label="x_0, y_16. undefined, 9.52854140993721." data-is-focusable="true" fill-opacity="1" role="img" @@ -7598,7 +7598,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_16. , 66.15934256222516." + aria-label="x_1, y_16. undefined, 66.15934256222516." data-is-focusable="true" fill-opacity="1" role="img" @@ -7630,7 +7630,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_16. , 25.727095609917317." + aria-label="x_2, y_16. undefined, 25.727095609917317." data-is-focusable="true" fill-opacity="1" role="img" @@ -7662,7 +7662,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_16. , -16.01042996598902." + aria-label="x_3, y_16. undefined, -16.01042996598902." data-is-focusable="true" fill-opacity="1" role="img" @@ -7694,7 +7694,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_16. , 24.77811171644336." + aria-label="x_4, y_16. undefined, 24.77811171644336." data-is-focusable="true" fill-opacity="1" role="img" @@ -7726,7 +7726,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_16. , -1.2825355952790376." + aria-label="x_5, y_16. undefined, -1.2825355952790376." data-is-focusable="true" fill-opacity="1" role="img" @@ -7758,7 +7758,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_16. , 19.064261874916085." + aria-label="x_6, y_16. undefined, 19.064261874916085." data-is-focusable="true" fill-opacity="1" role="img" @@ -7790,7 +7790,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_16. , 14.509555473536986." + aria-label="x_7, y_16. undefined, 14.509555473536986." data-is-focusable="true" fill-opacity="1" role="img" @@ -7822,7 +7822,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_16. , 43.57067434580797." + aria-label="x_8, y_16. undefined, 43.57067434580797." data-is-focusable="true" fill-opacity="1" role="img" @@ -7854,7 +7854,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_16. , 7.890650307112603." + aria-label="x_9, y_16. undefined, 7.890650307112603." data-is-focusable="true" fill-opacity="1" role="img" @@ -7886,7 +7886,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_16. , 1.6731169765193206." + aria-label="x_10, y_16. undefined, 1.6731169765193206." data-is-focusable="true" fill-opacity="1" role="img" @@ -7918,7 +7918,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_16. , 11.216733394728445." + aria-label="x_11, y_16. undefined, 11.216733394728445." data-is-focusable="true" fill-opacity="1" role="img" @@ -7950,7 +7950,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_16. , 25.858459074516183." + aria-label="x_12, y_16. undefined, 25.858459074516183." data-is-focusable="true" fill-opacity="1" role="img" @@ -7982,7 +7982,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_16. , 18.23274943606415." + aria-label="x_13, y_16. undefined, 18.23274943606415." data-is-focusable="true" fill-opacity="1" role="img" @@ -8014,7 +8014,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_16. , -1.5424885952686824." + aria-label="x_14, y_16. undefined, -1.5424885952686824." data-is-focusable="true" fill-opacity="1" role="img" @@ -8046,7 +8046,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_16. , -9.408565254995368." + aria-label="x_15, y_16. undefined, -9.408565254995368." data-is-focusable="true" fill-opacity="1" role="img" @@ -8078,7 +8078,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_16. , 24.78142561950699." + aria-label="x_16, y_16. undefined, 24.78142561950699." data-is-focusable="true" fill-opacity="1" role="img" @@ -8110,7 +8110,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_16. , 55.72892300395096." + aria-label="x_17, y_16. undefined, 55.72892300395096." data-is-focusable="true" fill-opacity="1" role="img" @@ -8142,7 +8142,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_16. , -6.132435488791322." + aria-label="x_18, y_16. undefined, -6.132435488791322." data-is-focusable="true" fill-opacity="1" role="img" @@ -8174,7 +8174,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_16. , 32.12418971970468." + aria-label="x_19, y_16. undefined, 32.12418971970468." data-is-focusable="true" fill-opacity="1" role="img" @@ -8206,7 +8206,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_15. , 18.3594620989525." + aria-label="x_0, y_15. undefined, 18.3594620989525." data-is-focusable="true" fill-opacity="1" role="img" @@ -8238,7 +8238,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_15. , 66.76755465163893." + aria-label="x_1, y_15. undefined, 66.76755465163893." data-is-focusable="true" fill-opacity="1" role="img" @@ -8270,7 +8270,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_15. , 23.378561600159312." + aria-label="x_2, y_15. undefined, 23.378561600159312." data-is-focusable="true" fill-opacity="1" role="img" @@ -8302,7 +8302,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_15. , -9.221557127656212." + aria-label="x_3, y_15. undefined, -9.221557127656212." data-is-focusable="true" fill-opacity="1" role="img" @@ -8334,7 +8334,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_15. , 28.23165649899542." + aria-label="x_4, y_15. undefined, 28.23165649899542." data-is-focusable="true" fill-opacity="1" role="img" @@ -8366,7 +8366,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_15. , -0.3620931039471351." + aria-label="x_5, y_15. undefined, -0.3620931039471351." data-is-focusable="true" fill-opacity="1" role="img" @@ -8398,7 +8398,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_15. , 28.91643855216486." + aria-label="x_6, y_15. undefined, 28.91643855216486." data-is-focusable="true" fill-opacity="1" role="img" @@ -8430,7 +8430,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_15. , 11.188848304771073." + aria-label="x_7, y_15. undefined, 11.188848304771073." data-is-focusable="true" fill-opacity="1" role="img" @@ -8462,7 +8462,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_15. , 43.30138646653476." + aria-label="x_8, y_15. undefined, 43.30138646653476." data-is-focusable="true" fill-opacity="1" role="img" @@ -8494,7 +8494,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_15. , 5.000880279196099." + aria-label="x_9, y_15. undefined, 5.000880279196099." data-is-focusable="true" fill-opacity="1" role="img" @@ -8526,7 +8526,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_15. , 1.955677009677276." + aria-label="x_10, y_15. undefined, 1.955677009677276." data-is-focusable="true" fill-opacity="1" role="img" @@ -8558,7 +8558,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_15. , 17.279662785715818." + aria-label="x_11, y_15. undefined, 17.279662785715818." data-is-focusable="true" fill-opacity="1" role="img" @@ -8590,7 +8590,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_15. , 26.178614647552152." + aria-label="x_12, y_15. undefined, 26.178614647552152." data-is-focusable="true" fill-opacity="1" role="img" @@ -8622,7 +8622,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_15. , 21.57198989722974." + aria-label="x_13, y_15. undefined, 21.57198989722974." data-is-focusable="true" fill-opacity="1" role="img" @@ -8654,7 +8654,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_15. , -1.3161643920050667." + aria-label="x_14, y_15. undefined, -1.3161643920050667." data-is-focusable="true" fill-opacity="1" role="img" @@ -8686,7 +8686,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_15. , -9.439334496282449." + aria-label="x_15, y_15. undefined, -9.439334496282449." data-is-focusable="true" fill-opacity="1" role="img" @@ -8718,7 +8718,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_15. , 18.312638310718047." + aria-label="x_16, y_15. undefined, 18.312638310718047." data-is-focusable="true" fill-opacity="1" role="img" @@ -8750,7 +8750,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_15. , 54.77270799612626." + aria-label="x_17, y_15. undefined, 54.77270799612626." data-is-focusable="true" fill-opacity="1" role="img" @@ -8782,7 +8782,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_15. , -13.618633943842825." + aria-label="x_18, y_15. undefined, -13.618633943842825." data-is-focusable="true" fill-opacity="1" role="img" @@ -8814,7 +8814,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_15. , 34.04601203745518." + aria-label="x_19, y_15. undefined, 34.04601203745518." data-is-focusable="true" fill-opacity="1" role="img" @@ -8846,7 +8846,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_14. , 17.878378279408615." + aria-label="x_0, y_14. undefined, 17.878378279408615." data-is-focusable="true" fill-opacity="1" role="img" @@ -8878,7 +8878,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_14. , 65.61603877495548." + aria-label="x_1, y_14. undefined, 65.61603877495548." data-is-focusable="true" fill-opacity="1" role="img" @@ -8910,7 +8910,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_14. , 21.1073514253479." + aria-label="x_2, y_14. undefined, 21.1073514253479." data-is-focusable="true" fill-opacity="1" role="img" @@ -8942,7 +8942,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_14. , -9.253213203481765." + aria-label="x_3, y_14. undefined, -9.253213203481765." data-is-focusable="true" fill-opacity="1" role="img" @@ -8974,7 +8974,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_14. , 27.879670681460908." + aria-label="x_4, y_14. undefined, 27.879670681460908." data-is-focusable="true" fill-opacity="1" role="img" @@ -9006,7 +9006,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_14. , -2.8320537701090256." + aria-label="x_5, y_14. undefined, -2.8320537701090256." data-is-focusable="true" fill-opacity="1" role="img" @@ -9038,7 +9038,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_14. , 26.13796211607032." + aria-label="x_6, y_14. undefined, 26.13796211607032." data-is-focusable="true" fill-opacity="1" role="img" @@ -9070,7 +9070,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_14. , 24.926244822709098." + aria-label="x_7, y_14. undefined, 24.926244822709098." data-is-focusable="true" fill-opacity="1" role="img" @@ -9102,7 +9102,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_14. , 41.22820882460708." + aria-label="x_8, y_14. undefined, 41.22820882460708." data-is-focusable="true" fill-opacity="1" role="img" @@ -9134,7 +9134,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_14. , 4.291828909220028." + aria-label="x_9, y_14. undefined, 4.291828909220028." data-is-focusable="true" fill-opacity="1" role="img" @@ -9166,7 +9166,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_14. , 4.713688574820864." + aria-label="x_10, y_14. undefined, 4.713688574820864." data-is-focusable="true" fill-opacity="1" role="img" @@ -9198,7 +9198,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_14. , 16.71505221410986." + aria-label="x_11, y_14. undefined, 16.71505221410986." data-is-focusable="true" fill-opacity="1" role="img" @@ -9230,7 +9230,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_14. , 27.48982397761371." + aria-label="x_12, y_14. undefined, 27.48982397761371." data-is-focusable="true" fill-opacity="1" role="img" @@ -9262,7 +9262,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_14. , 14.998235183145638." + aria-label="x_13, y_14. undefined, 14.998235183145638." data-is-focusable="true" fill-opacity="1" role="img" @@ -9294,7 +9294,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_14. , -1.0419904618770504." + aria-label="x_14, y_14. undefined, -1.0419904618770504." data-is-focusable="true" fill-opacity="1" role="img" @@ -9326,7 +9326,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_14. , -0.1509352342460648." + aria-label="x_15, y_14. undefined, -0.1509352342460648." data-is-focusable="true" fill-opacity="1" role="img" @@ -9358,7 +9358,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_14. , 11.562765259884168." + aria-label="x_16, y_14. undefined, 11.562765259884168." data-is-focusable="true" fill-opacity="1" role="img" @@ -9390,7 +9390,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_14. , 54.381939331520186." + aria-label="x_17, y_14. undefined, 54.381939331520186." data-is-focusable="true" fill-opacity="1" role="img" @@ -9422,7 +9422,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_14. , -15.369316543252658." + aria-label="x_18, y_14. undefined, -15.369316543252658." data-is-focusable="true" fill-opacity="1" role="img" @@ -9454,7 +9454,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_14. , 25.018616836414115." + aria-label="x_19, y_14. undefined, 25.018616836414115." data-is-focusable="true" fill-opacity="1" role="img" @@ -9486,7 +9486,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_13. , 9.197351864496074." + aria-label="x_0, y_13. undefined, 9.197351864496074." data-is-focusable="true" fill-opacity="1" role="img" @@ -9518,7 +9518,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_13. , 55.98556586180058." + aria-label="x_1, y_13. undefined, 55.98556586180058." data-is-focusable="true" fill-opacity="1" role="img" @@ -9550,7 +9550,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_13. , 19.688495387348357." + aria-label="x_2, y_13. undefined, 19.688495387348357." data-is-focusable="true" fill-opacity="1" role="img" @@ -9582,7 +9582,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_13. , -1.1757697666321." + aria-label="x_3, y_13. undefined, -1.1757697666321." data-is-focusable="true" fill-opacity="1" role="img" @@ -9614,7 +9614,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_13. , 26.78831096366896." + aria-label="x_4, y_13. undefined, 26.78831096366896." data-is-focusable="true" fill-opacity="1" role="img" @@ -9646,7 +9646,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_13. , -5.206570891432279." + aria-label="x_5, y_13. undefined, -5.206570891432279." data-is-focusable="true" fill-opacity="1" role="img" @@ -9678,7 +9678,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_13. , 29.755041090905404." + aria-label="x_6, y_13. undefined, 29.755041090905404." data-is-focusable="true" fill-opacity="1" role="img" @@ -9710,7 +9710,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_13. , 35.45913888587404." + aria-label="x_7, y_13. undefined, 35.45913888587404." data-is-focusable="true" fill-opacity="1" role="img" @@ -9742,7 +9742,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_13. , 48.543398737558654." + aria-label="x_8, y_13. undefined, 48.543398737558654." data-is-focusable="true" fill-opacity="1" role="img" @@ -9774,7 +9774,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_13. , 3.274578409778302." + aria-label="x_9, y_13. undefined, 3.274578409778302." data-is-focusable="true" fill-opacity="1" role="img" @@ -9806,7 +9806,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_13. , 7.640442280843416." + aria-label="x_10, y_13. undefined, 7.640442280843416." data-is-focusable="true" fill-opacity="1" role="img" @@ -9838,7 +9838,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_13. , 6.615425581412669." + aria-label="x_11, y_13. undefined, 6.615425581412669." data-is-focusable="true" fill-opacity="1" role="img" @@ -9870,7 +9870,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_13. , 27.520672134556655." + aria-label="x_12, y_13. undefined, 27.520672134556655." data-is-focusable="true" fill-opacity="1" role="img" @@ -9902,7 +9902,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_13. , 17.13948338893387." + aria-label="x_13, y_13. undefined, 17.13948338893387." data-is-focusable="true" fill-opacity="1" role="img" @@ -9934,7 +9934,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_13. , -0.7130168306222968." + aria-label="x_14, y_13. undefined, -0.7130168306222968." data-is-focusable="true" fill-opacity="1" role="img" @@ -9966,7 +9966,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_13. , 3.4923248627721257." + aria-label="x_15, y_13. undefined, 3.4923248627721257." data-is-focusable="true" fill-opacity="1" role="img" @@ -9998,7 +9998,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_13. , 10.663420634170265." + aria-label="x_16, y_13. undefined, 10.663420634170265." data-is-focusable="true" fill-opacity="1" role="img" @@ -10030,7 +10030,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_13. , 62.79712211239938." + aria-label="x_17, y_13. undefined, 62.79712211239938." data-is-focusable="true" fill-opacity="1" role="img" @@ -10062,7 +10062,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_13. , -7.102421907260435." + aria-label="x_18, y_13. undefined, -7.102421907260435." data-is-focusable="true" fill-opacity="1" role="img" @@ -10094,7 +10094,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_13. , 25.96909143426486." + aria-label="x_19, y_13. undefined, 25.96909143426486." data-is-focusable="true" fill-opacity="1" role="img" @@ -10126,7 +10126,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_12. , 3.673504371828866." + aria-label="x_0, y_12. undefined, 3.673504371828866." data-is-focusable="true" fill-opacity="1" role="img" @@ -10158,7 +10158,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_12. , 55.66537870906952." + aria-label="x_1, y_12. undefined, 55.66537870906952." data-is-focusable="true" fill-opacity="1" role="img" @@ -10190,7 +10190,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_12. , 22.222025244923273." + aria-label="x_2, y_12. undefined, 22.222025244923273." data-is-focusable="true" fill-opacity="1" role="img" @@ -10222,7 +10222,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_12. , -2.1871046243479864." + aria-label="x_3, y_12. undefined, -2.1871046243479864." data-is-focusable="true" fill-opacity="1" role="img" @@ -10254,7 +10254,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_12. , 28.014054309766728." + aria-label="x_4, y_12. undefined, 28.014054309766728." data-is-focusable="true" fill-opacity="1" role="img" @@ -10286,7 +10286,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_12. , -1.9343227464152601." + aria-label="x_5, y_12. undefined, -1.9343227464152601." data-is-focusable="true" fill-opacity="1" role="img" @@ -10318,7 +10318,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_12. , 29.16438526268995." + aria-label="x_6, y_12. undefined, 29.16438526268995." data-is-focusable="true" fill-opacity="1" role="img" @@ -10350,7 +10350,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_12. , 44.051494895676456." + aria-label="x_7, y_12. undefined, 44.051494895676456." data-is-focusable="true" fill-opacity="1" role="img" @@ -10382,7 +10382,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_12. , 47.138525452751004." + aria-label="x_8, y_12. undefined, 47.138525452751004." data-is-focusable="true" fill-opacity="1" role="img" @@ -10414,7 +10414,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_12. , -2.533067604753474." + aria-label="x_9, y_12. undefined, -2.533067604753474." data-is-focusable="true" fill-opacity="1" role="img" @@ -10446,7 +10446,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_12. , 2.4604369987892873." + aria-label="x_10, y_12. undefined, 2.4604369987892873." data-is-focusable="true" fill-opacity="1" role="img" @@ -10478,7 +10478,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_12. , 19.673236477344094." + aria-label="x_11, y_12. undefined, 19.673236477344094." data-is-focusable="true" fill-opacity="1" role="img" @@ -10510,7 +10510,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_12. , 23.43582349379937." + aria-label="x_12, y_12. undefined, 23.43582349379937." data-is-focusable="true" fill-opacity="1" role="img" @@ -10542,7 +10542,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_12. , 18.46461800040717." + aria-label="x_13, y_12. undefined, 18.46461800040717." data-is-focusable="true" fill-opacity="1" role="img" @@ -10574,7 +10574,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_12. , 3.2513035287755745." + aria-label="x_14, y_12. undefined, 3.2513035287755745." data-is-focusable="true" fill-opacity="1" role="img" @@ -10606,7 +10606,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_12. , 7.4638277204597046." + aria-label="x_15, y_12. undefined, 7.4638277204597046." data-is-focusable="true" fill-opacity="1" role="img" @@ -10638,7 +10638,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_12. , 5.836414662127938." + aria-label="x_16, y_12. undefined, 5.836414662127938." data-is-focusable="true" fill-opacity="1" role="img" @@ -10670,7 +10670,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_12. , 63.63736027633095." + aria-label="x_17, y_12. undefined, 63.63736027633095." data-is-focusable="true" fill-opacity="1" role="img" @@ -10702,7 +10702,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_12. , -2.3182235215935463." + aria-label="x_18, y_12. undefined, -2.3182235215935463." data-is-focusable="true" fill-opacity="1" role="img" @@ -10734,7 +10734,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_12. , 28.362102774855607." + aria-label="x_19, y_12. undefined, 28.362102774855607." data-is-focusable="true" fill-opacity="1" role="img" @@ -10766,7 +10766,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_11. , -1.2496939708148902." + aria-label="x_0, y_11. undefined, -1.2496939708148902." data-is-focusable="true" fill-opacity="1" role="img" @@ -10798,7 +10798,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_11. , 52.0753263525035." + aria-label="x_1, y_11. undefined, 52.0753263525035." data-is-focusable="true" fill-opacity="1" role="img" @@ -10830,7 +10830,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_11. , 16.573843720560127." + aria-label="x_2, y_11. undefined, 16.573843720560127." data-is-focusable="true" fill-opacity="1" role="img" @@ -10862,7 +10862,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_11. , 0.6254954059905691." + aria-label="x_3, y_11. undefined, 0.6254954059905691." data-is-focusable="true" fill-opacity="1" role="img" @@ -10894,7 +10894,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_11. , 25.67070005332393." + aria-label="x_4, y_11. undefined, 25.67070005332393." data-is-focusable="true" fill-opacity="1" role="img" @@ -10926,7 +10926,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_11. , 2.8833642841959586." + aria-label="x_5, y_11. undefined, 2.8833642841959586." data-is-focusable="true" fill-opacity="1" role="img" @@ -10958,7 +10958,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_11. , 21.05489065711163." + aria-label="x_6, y_11. undefined, 21.05489065711163." data-is-focusable="true" fill-opacity="1" role="img" @@ -10990,7 +10990,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_11. , 45.54977153406254." + aria-label="x_7, y_11. undefined, 45.54977153406254." data-is-focusable="true" fill-opacity="1" role="img" @@ -11022,7 +11022,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_11. , 54.790476948309696." + aria-label="x_8, y_11. undefined, 54.790476948309696." data-is-focusable="true" fill-opacity="1" role="img" @@ -11054,7 +11054,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_11. , -1.1319446806674005." + aria-label="x_9, y_11. undefined, -1.1319446806674005." data-is-focusable="true" fill-opacity="1" role="img" @@ -11086,7 +11086,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_11. , -6.836880142255078." + aria-label="x_10, y_11. undefined, -6.836880142255078." data-is-focusable="true" fill-opacity="1" role="img" @@ -11118,7 +11118,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_11. , 15.502730715077965." + aria-label="x_11, y_11. undefined, 15.502730715077965." data-is-focusable="true" fill-opacity="1" role="img" @@ -11150,7 +11150,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_11. , 16.434991284495794." + aria-label="x_12, y_11. undefined, 16.434991284495794." data-is-focusable="true" fill-opacity="1" role="img" @@ -11182,7 +11182,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_11. , 20.05330736176254." + aria-label="x_13, y_11. undefined, 20.05330736176254." data-is-focusable="true" fill-opacity="1" role="img" @@ -11214,7 +11214,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_11. , 2.3102989662620654." + aria-label="x_14, y_11. undefined, 2.3102989662620654." data-is-focusable="true" fill-opacity="1" role="img" @@ -11246,7 +11246,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_11. , 6.6400837474901095." + aria-label="x_15, y_11. undefined, 6.6400837474901095." data-is-focusable="true" fill-opacity="1" role="img" @@ -11278,7 +11278,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_11. , 3.4554008460006247." + aria-label="x_16, y_11. undefined, 3.4554008460006247." data-is-focusable="true" fill-opacity="1" role="img" @@ -11310,7 +11310,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_11. , 54.703320294165096." + aria-label="x_17, y_11. undefined, 54.703320294165096." data-is-focusable="true" fill-opacity="1" role="img" @@ -11342,7 +11342,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_11. , -3.275155410653531." + aria-label="x_18, y_11. undefined, -3.275155410653531." data-is-focusable="true" fill-opacity="1" role="img" @@ -11374,7 +11374,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_11. , 34.69783250602105." + aria-label="x_19, y_11. undefined, 34.69783250602105." data-is-focusable="true" fill-opacity="1" role="img" @@ -11406,7 +11406,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_10. , -0.34155835630595655." + aria-label="x_0, y_10. undefined, -0.34155835630595655." data-is-focusable="true" fill-opacity="1" role="img" @@ -11438,7 +11438,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_10. , 52.257883472637104." + aria-label="x_1, y_10. undefined, 52.257883472637104." data-is-focusable="true" fill-opacity="1" role="img" @@ -11470,7 +11470,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_10. , 14.63013635132661." + aria-label="x_2, y_10. undefined, 14.63013635132661." data-is-focusable="true" fill-opacity="1" role="img" @@ -11502,7 +11502,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_10. , -1.1475310646451669." + aria-label="x_3, y_10. undefined, -1.1475310646451669." data-is-focusable="true" fill-opacity="1" role="img" @@ -11534,7 +11534,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_10. , 19.815434611539906." + aria-label="x_4, y_10. undefined, 19.815434611539906." data-is-focusable="true" fill-opacity="1" role="img" @@ -11566,7 +11566,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_10. , -0.3597615447940745." + aria-label="x_5, y_10. undefined, -0.3597615447940745." data-is-focusable="true" fill-opacity="1" role="img" @@ -11598,7 +11598,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_10. , 22.773438522174473." + aria-label="x_6, y_10. undefined, 22.773438522174473." data-is-focusable="true" fill-opacity="1" role="img" @@ -11630,7 +11630,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_10. , 45.16830973647258." + aria-label="x_7, y_10. undefined, 45.16830973647258." data-is-focusable="true" fill-opacity="1" role="img" @@ -11662,7 +11662,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_10. , 50.90620858214391." + aria-label="x_8, y_10. undefined, 50.90620858214391." data-is-focusable="true" fill-opacity="1" role="img" @@ -11694,7 +11694,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_10. , -4.123416917882673." + aria-label="x_9, y_10. undefined, -4.123416917882673." data-is-focusable="true" fill-opacity="1" role="img" @@ -11726,7 +11726,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_10. , -10.08874106711032." + aria-label="x_10, y_10. undefined, -10.08874106711032." data-is-focusable="true" fill-opacity="1" role="img" @@ -11758,7 +11758,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_10. , 17.77058648507848." + aria-label="x_11, y_10. undefined, 17.77058648507848." data-is-focusable="true" fill-opacity="1" role="img" @@ -11790,7 +11790,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_10. , 17.40525407651549." + aria-label="x_12, y_10. undefined, 17.40525407651549." data-is-focusable="true" fill-opacity="1" role="img" @@ -11822,7 +11822,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_10. , 19.428287067763215." + aria-label="x_13, y_10. undefined, 19.428287067763215." data-is-focusable="true" fill-opacity="1" role="img" @@ -11854,7 +11854,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_10. , 10.154808609159593." + aria-label="x_14, y_10. undefined, 10.154808609159593." data-is-focusable="true" fill-opacity="1" role="img" @@ -11886,7 +11886,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_10. , 9.41560200751194." + aria-label="x_15, y_10. undefined, 9.41560200751194." data-is-focusable="true" fill-opacity="1" role="img" @@ -11918,7 +11918,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_10. , 1.9106824056688325." + aria-label="x_16, y_10. undefined, 1.9106824056688325." data-is-focusable="true" fill-opacity="1" role="img" @@ -11950,7 +11950,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_10. , 55.50321452563245." + aria-label="x_17, y_10. undefined, 55.50321452563245." data-is-focusable="true" fill-opacity="1" role="img" @@ -11982,7 +11982,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_10. , -1.086930629298445." + aria-label="x_18, y_10. undefined, -1.086930629298445." data-is-focusable="true" fill-opacity="1" role="img" @@ -12014,7 +12014,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_10. , 29.942519927990794." + aria-label="x_19, y_10. undefined, 29.942519927990794." data-is-focusable="true" fill-opacity="1" role="img" @@ -12046,7 +12046,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_9. , 1.3315750803470996." + aria-label="x_0, y_9. undefined, 1.3315750803470996." data-is-focusable="true" fill-opacity="1" role="img" @@ -12078,7 +12078,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_9. , 45.90255894008207." + aria-label="x_1, y_9. undefined, 45.90255894008207." data-is-focusable="true" fill-opacity="1" role="img" @@ -12110,7 +12110,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_9. , 9.162060301209916." + aria-label="x_2, y_9. undefined, 9.162060301209916." data-is-focusable="true" fill-opacity="1" role="img" @@ -12142,7 +12142,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_9. , -1.2943200134022526." + aria-label="x_3, y_9. undefined, -1.2943200134022526." data-is-focusable="true" fill-opacity="1" role="img" @@ -12174,7 +12174,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_9. , 21.982396858443334." + aria-label="x_4, y_9. undefined, 21.982396858443334." data-is-focusable="true" fill-opacity="1" role="img" @@ -12206,7 +12206,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_9. , -2.0046315173801657." + aria-label="x_5, y_9. undefined, -2.0046315173801657." data-is-focusable="true" fill-opacity="1" role="img" @@ -12238,7 +12238,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_9. , 23.75776947991829." + aria-label="x_6, y_9. undefined, 23.75776947991829." data-is-focusable="true" fill-opacity="1" role="img" @@ -12270,7 +12270,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_9. , 42.681396519281044." + aria-label="x_7, y_9. undefined, 42.681396519281044." data-is-focusable="true" fill-opacity="1" role="img" @@ -12302,7 +12302,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_9. , 44.65189694360409." + aria-label="x_8, y_9. undefined, 44.65189694360409." data-is-focusable="true" fill-opacity="1" role="img" @@ -12334,7 +12334,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_9. , -3.233129329636757." + aria-label="x_9, y_9. undefined, -3.233129329636757." data-is-focusable="true" fill-opacity="1" role="img" @@ -12366,7 +12366,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_9. , -11.7007015295863." + aria-label="x_10, y_9. undefined, -11.7007015295863." data-is-focusable="true" fill-opacity="1" role="img" @@ -12398,7 +12398,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_9. , 8.768962763531919." + aria-label="x_11, y_9. undefined, 8.768962763531919." data-is-focusable="true" fill-opacity="1" role="img" @@ -12430,7 +12430,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_9. , 21.48008268870696." + aria-label="x_12, y_9. undefined, 21.48008268870696." data-is-focusable="true" fill-opacity="1" role="img" @@ -12462,7 +12462,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_9. , 11.750650693071353." + aria-label="x_13, y_9. undefined, 11.750650693071353." data-is-focusable="true" fill-opacity="1" role="img" @@ -12494,7 +12494,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_9. , 10.314016323078881." + aria-label="x_14, y_9. undefined, 10.314016323078881." data-is-focusable="true" fill-opacity="1" role="img" @@ -12526,7 +12526,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_9. , 6.044971885000999." + aria-label="x_15, y_9. undefined, 6.044971885000999." data-is-focusable="true" fill-opacity="1" role="img" @@ -12558,7 +12558,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_9. , 0.39568846222827236." + aria-label="x_16, y_9. undefined, 0.39568846222827236." data-is-focusable="true" fill-opacity="1" role="img" @@ -12590,7 +12590,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_9. , 56.79992555682459." + aria-label="x_17, y_9. undefined, 56.79992555682459." data-is-focusable="true" fill-opacity="1" role="img" @@ -12622,7 +12622,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_9. , 9.686881597266042." + aria-label="x_18, y_9. undefined, 9.686881597266042." data-is-focusable="true" fill-opacity="1" role="img" @@ -12654,7 +12654,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_9. , 29.573837224244713." + aria-label="x_19, y_9. undefined, 29.573837224244713." data-is-focusable="true" fill-opacity="1" role="img" @@ -12686,7 +12686,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_8. , 0.02929945240777787." + aria-label="x_0, y_8. undefined, 0.02929945240777787." data-is-focusable="true" fill-opacity="1" role="img" @@ -12718,7 +12718,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_8. , 47.8943258538308." + aria-label="x_1, y_8. undefined, 47.8943258538308." data-is-focusable="true" fill-opacity="1" role="img" @@ -12750,7 +12750,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_8. , 13.4384038570412." + aria-label="x_2, y_8. undefined, 13.4384038570412." data-is-focusable="true" fill-opacity="1" role="img" @@ -12782,7 +12782,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_8. , 17.917433759396193." + aria-label="x_3, y_8. undefined, 17.917433759396193." data-is-focusable="true" fill-opacity="1" role="img" @@ -12814,7 +12814,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_8. , 17.039432522289083." + aria-label="x_4, y_8. undefined, 17.039432522289083." data-is-focusable="true" fill-opacity="1" role="img" @@ -12846,7 +12846,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_8. , -4.774743239794282." + aria-label="x_5, y_8. undefined, -4.774743239794282." data-is-focusable="true" fill-opacity="1" role="img" @@ -12878,7 +12878,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_8. , 12.169188113505435." + aria-label="x_6, y_8. undefined, 12.169188113505435." data-is-focusable="true" fill-opacity="1" role="img" @@ -12910,7 +12910,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_8. , 40.42317097918186." + aria-label="x_7, y_8. undefined, 40.42317097918186." data-is-focusable="true" fill-opacity="1" role="img" @@ -12942,7 +12942,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_8. , 37.22474246115934." + aria-label="x_8, y_8. undefined, 37.22474246115934." data-is-focusable="true" fill-opacity="1" role="img" @@ -12974,7 +12974,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_8. , 0.22091049853526112." + aria-label="x_9, y_8. undefined, 0.22091049853526112." data-is-focusable="true" fill-opacity="1" role="img" @@ -13006,7 +13006,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_8. , -9.687370268531138." + aria-label="x_10, y_8. undefined, -9.687370268531138." data-is-focusable="true" fill-opacity="1" role="img" @@ -13038,7 +13038,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_8. , 10.608534707379862." + aria-label="x_11, y_8. undefined, 10.608534707379862." data-is-focusable="true" fill-opacity="1" role="img" @@ -13070,7 +13070,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_8. , 22.489367975650175." + aria-label="x_12, y_8. undefined, 22.489367975650175." data-is-focusable="true" fill-opacity="1" role="img" @@ -13102,7 +13102,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_8. , 10.669348146795615." + aria-label="x_13, y_8. undefined, 10.669348146795615." data-is-focusable="true" fill-opacity="1" role="img" @@ -13134,7 +13134,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_8. , 13.95650541886101." + aria-label="x_14, y_8. undefined, 13.95650541886101." data-is-focusable="true" fill-opacity="1" role="img" @@ -13166,7 +13166,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_8. , 6.839552569406474." + aria-label="x_15, y_8. undefined, 6.839552569406474." data-is-focusable="true" fill-opacity="1" role="img" @@ -13198,7 +13198,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_8. , 2.066756467090924." + aria-label="x_16, y_8. undefined, 2.066756467090924." data-is-focusable="true" fill-opacity="1" role="img" @@ -13230,7 +13230,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_8. , 54.581934085152405." + aria-label="x_17, y_8. undefined, 54.581934085152405." data-is-focusable="true" fill-opacity="1" role="img" @@ -13262,7 +13262,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_8. , 3.5319443821756225." + aria-label="x_18, y_8. undefined, 3.5319443821756225." data-is-focusable="true" fill-opacity="1" role="img" @@ -13294,7 +13294,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_8. , 24.532968918280666." + aria-label="x_19, y_8. undefined, 24.532968918280666." data-is-focusable="true" fill-opacity="1" role="img" @@ -13326,7 +13326,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_7. , -7.513284950652834." + aria-label="x_0, y_7. undefined, -7.513284950652834." data-is-focusable="true" fill-opacity="1" role="img" @@ -13358,7 +13358,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_7. , 44.21182779048812." + aria-label="x_1, y_7. undefined, 44.21182779048812." data-is-focusable="true" fill-opacity="1" role="img" @@ -13390,7 +13390,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_7. , 14.479713711226983." + aria-label="x_2, y_7. undefined, 14.479713711226983." data-is-focusable="true" fill-opacity="1" role="img" @@ -13422,7 +13422,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_7. , 17.660499931671584." + aria-label="x_3, y_7. undefined, 17.660499931671584." data-is-focusable="true" fill-opacity="1" role="img" @@ -13454,7 +13454,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_7. , 14.436062506263415." + aria-label="x_4, y_7. undefined, 14.436062506263415." data-is-focusable="true" fill-opacity="1" role="img" @@ -13486,7 +13486,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_7. , -8.630753569571617." + aria-label="x_5, y_7. undefined, -8.630753569571617." data-is-focusable="true" fill-opacity="1" role="img" @@ -13518,7 +13518,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_7. , 18.920515851612024." + aria-label="x_6, y_7. undefined, 18.920515851612024." data-is-focusable="true" fill-opacity="1" role="img" @@ -13550,7 +13550,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_7. , 41.961872256649784." + aria-label="x_7, y_7. undefined, 41.961872256649784." data-is-focusable="true" fill-opacity="1" role="img" @@ -13582,7 +13582,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_7. , 30.992785862263872." + aria-label="x_8, y_7. undefined, 30.992785862263872." data-is-focusable="true" fill-opacity="1" role="img" @@ -13614,7 +13614,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_7. , 0.3821317782171232." + aria-label="x_9, y_7. undefined, 0.3821317782171232." data-is-focusable="true" fill-opacity="1" role="img" @@ -13646,7 +13646,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_7. , -9.481337721021028." + aria-label="x_10, y_7. undefined, -9.481337721021028." data-is-focusable="true" fill-opacity="1" role="img" @@ -13678,7 +13678,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_7. , 1.6266164906990555." + aria-label="x_11, y_7. undefined, 1.6266164906990555." data-is-focusable="true" fill-opacity="1" role="img" @@ -13710,7 +13710,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_7. , 20.52198483872326." + aria-label="x_12, y_7. undefined, 20.52198483872326." data-is-focusable="true" fill-opacity="1" role="img" @@ -13742,7 +13742,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_7. , 9.822475957217343." + aria-label="x_13, y_7. undefined, 9.822475957217343." data-is-focusable="true" fill-opacity="1" role="img" @@ -13774,7 +13774,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_7. , 15.658011352744083." + aria-label="x_14, y_7. undefined, 15.658011352744083." data-is-focusable="true" fill-opacity="1" role="img" @@ -13806,7 +13806,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_7. , 12.855391500184762." + aria-label="x_15, y_7. undefined, 12.855391500184762." data-is-focusable="true" fill-opacity="1" role="img" @@ -13838,7 +13838,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_7. , 10.723957376497331." + aria-label="x_16, y_7. undefined, 10.723957376497331." data-is-focusable="true" fill-opacity="1" role="img" @@ -13870,7 +13870,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_7. , 41.76485494373556." + aria-label="x_17, y_7. undefined, 41.76485494373556." data-is-focusable="true" fill-opacity="1" role="img" @@ -13902,7 +13902,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_7. , 2.2340479176319485." + aria-label="x_18, y_7. undefined, 2.2340479176319485." data-is-focusable="true" fill-opacity="1" role="img" @@ -13934,7 +13934,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_7. , 16.088953253894616." + aria-label="x_19, y_7. undefined, 16.088953253894616." data-is-focusable="true" fill-opacity="1" role="img" @@ -13966,7 +13966,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_6. , -6.877933971525136." + aria-label="x_0, y_6. undefined, -6.877933971525136." data-is-focusable="true" fill-opacity="1" role="img" @@ -13998,7 +13998,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_6. , 44.04384439381119." + aria-label="x_1, y_6. undefined, 44.04384439381119." data-is-focusable="true" fill-opacity="1" role="img" @@ -14030,7 +14030,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_6. , 13.548126342387011." + aria-label="x_2, y_6. undefined, 13.548126342387011." data-is-focusable="true" fill-opacity="1" role="img" @@ -14062,7 +14062,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_6. , 17.74014481550033." + aria-label="x_3, y_6. undefined, 17.74014481550033." data-is-focusable="true" fill-opacity="1" role="img" @@ -14094,7 +14094,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_6. , 15.7912983146064." + aria-label="x_4, y_6. undefined, 15.7912983146064." data-is-focusable="true" fill-opacity="1" role="img" @@ -14126,7 +14126,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_6. , -6.563883600581922." + aria-label="x_5, y_6. undefined, -6.563883600581922." data-is-focusable="true" fill-opacity="1" role="img" @@ -14158,7 +14158,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_6. , 21.49865383744765." + aria-label="x_6, y_6. undefined, 21.49865383744765." data-is-focusable="true" fill-opacity="1" role="img" @@ -14190,7 +14190,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_6. , 38.24729505908534." + aria-label="x_7, y_6. undefined, 38.24729505908534." data-is-focusable="true" fill-opacity="1" role="img" @@ -14222,7 +14222,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_6. , 25.710457133039732." + aria-label="x_8, y_6. undefined, 25.710457133039732." data-is-focusable="true" fill-opacity="1" role="img" @@ -14254,7 +14254,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_6. , 2.2251747151953722." + aria-label="x_9, y_6. undefined, 2.2251747151953722." data-is-focusable="true" fill-opacity="1" role="img" @@ -14286,7 +14286,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_6. , -10.093623877175773." + aria-label="x_10, y_6. undefined, -10.093623877175773." data-is-focusable="true" fill-opacity="1" role="img" @@ -14318,7 +14318,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_6. , 1.9137585062069147." + aria-label="x_11, y_6. undefined, 1.9137585062069147." data-is-focusable="true" fill-opacity="1" role="img" @@ -14350,7 +14350,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_6. , 28.853944000537858." + aria-label="x_12, y_6. undefined, 28.853944000537858." data-is-focusable="true" fill-opacity="1" role="img" @@ -14382,7 +14382,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_6. , 9.119846857537635." + aria-label="x_13, y_6. undefined, 9.119846857537635." data-is-focusable="true" fill-opacity="1" role="img" @@ -14414,7 +14414,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_6. , 16.770107402461807." + aria-label="x_14, y_6. undefined, 16.770107402461807." data-is-focusable="true" fill-opacity="1" role="img" @@ -14446,7 +14446,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_6. , 7.3577813910229235." + aria-label="x_15, y_6. undefined, 7.3577813910229235." data-is-focusable="true" fill-opacity="1" role="img" @@ -14478,7 +14478,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_6. , 5.875139865786533." + aria-label="x_16, y_6. undefined, 5.875139865786533." data-is-focusable="true" fill-opacity="1" role="img" @@ -14510,7 +14510,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_6. , 39.12143717188403." + aria-label="x_17, y_6. undefined, 39.12143717188403." data-is-focusable="true" fill-opacity="1" role="img" @@ -14542,7 +14542,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_6. , 1.341905660672623." + aria-label="x_18, y_6. undefined, 1.341905660672623." data-is-focusable="true" fill-opacity="1" role="img" @@ -14574,7 +14574,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_6. , 16.777803239858564." + aria-label="x_19, y_6. undefined, 16.777803239858564." data-is-focusable="true" fill-opacity="1" role="img" @@ -14606,7 +14606,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_5. , 1.3848305486418013." + aria-label="x_0, y_5. undefined, 1.3848305486418013." data-is-focusable="true" fill-opacity="1" role="img" @@ -14638,7 +14638,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_5. , 28.88858899620542." + aria-label="x_1, y_5. undefined, 28.88858899620542." data-is-focusable="true" fill-opacity="1" role="img" @@ -14670,7 +14670,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_5. , 12.971410893817621." + aria-label="x_2, y_5. undefined, 12.971410893817621." data-is-focusable="true" fill-opacity="1" role="img" @@ -14702,7 +14702,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_5. , 21.143305039916708." + aria-label="x_3, y_5. undefined, 21.143305039916708." data-is-focusable="true" fill-opacity="1" role="img" @@ -14734,7 +14734,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_5. , 7.466382276034302." + aria-label="x_4, y_5. undefined, 7.466382276034302." data-is-focusable="true" fill-opacity="1" role="img" @@ -14766,7 +14766,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_5. , -2.108394838355938." + aria-label="x_5, y_5. undefined, -2.108394838355938." data-is-focusable="true" fill-opacity="1" role="img" @@ -14798,7 +14798,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_5. , 16.027000754389025." + aria-label="x_6, y_5. undefined, 16.027000754389025." data-is-focusable="true" fill-opacity="1" role="img" @@ -14830,7 +14830,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_5. , 40.70844626018491." + aria-label="x_7, y_5. undefined, 40.70844626018491." data-is-focusable="true" fill-opacity="1" role="img" @@ -14862,7 +14862,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_5. , 25.966261645863177." + aria-label="x_8, y_5. undefined, 25.966261645863177." data-is-focusable="true" fill-opacity="1" role="img" @@ -14894,7 +14894,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_5. , 0.9043901831061678." + aria-label="x_9, y_5. undefined, 0.9043901831061678." data-is-focusable="true" fill-opacity="1" role="img" @@ -14926,7 +14926,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_5. , -0.6718858579700804." + aria-label="x_10, y_5. undefined, -0.6718858579700804." data-is-focusable="true" fill-opacity="1" role="img" @@ -14958,7 +14958,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_5. , 2.6597070827875093." + aria-label="x_11, y_5. undefined, 2.6597070827875093." data-is-focusable="true" fill-opacity="1" role="img" @@ -14990,7 +14990,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_5. , 36.093975687401766." + aria-label="x_12, y_5. undefined, 36.093975687401766." data-is-focusable="true" fill-opacity="1" role="img" @@ -15022,7 +15022,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_5. , 12.79240265673884." + aria-label="x_13, y_5. undefined, 12.79240265673884." data-is-focusable="true" fill-opacity="1" role="img" @@ -15054,7 +15054,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_5. , 16.292076219475025." + aria-label="x_14, y_5. undefined, 16.292076219475025." data-is-focusable="true" fill-opacity="1" role="img" @@ -15086,7 +15086,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_5. , 13.792475502830154." + aria-label="x_15, y_5. undefined, 13.792475502830154." data-is-focusable="true" fill-opacity="1" role="img" @@ -15118,7 +15118,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_5. , 9.90068532879486." + aria-label="x_16, y_5. undefined, 9.90068532879486." data-is-focusable="true" fill-opacity="1" role="img" @@ -15150,7 +15150,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_5. , 36.74806639404701." + aria-label="x_17, y_5. undefined, 36.74806639404701." data-is-focusable="true" fill-opacity="1" role="img" @@ -15182,7 +15182,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_5. , 26.577346684827898." + aria-label="x_18, y_5. undefined, 26.577346684827898." data-is-focusable="true" fill-opacity="1" role="img" @@ -15214,7 +15214,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_5. , 16.005211030243927." + aria-label="x_19, y_5. undefined, 16.005211030243927." data-is-focusable="true" fill-opacity="1" role="img" @@ -15246,7 +15246,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_4. , 10.424697200562369." + aria-label="x_0, y_4. undefined, 10.424697200562369." data-is-focusable="true" fill-opacity="1" role="img" @@ -15278,7 +15278,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_4. , 28.78022939969912." + aria-label="x_1, y_4. undefined, 28.78022939969912." data-is-focusable="true" fill-opacity="1" role="img" @@ -15310,7 +15310,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_4. , 3.274446200066722." + aria-label="x_2, y_4. undefined, 3.274446200066722." data-is-focusable="true" fill-opacity="1" role="img" @@ -15342,7 +15342,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_4. , 8.669870516018236." + aria-label="x_3, y_4. undefined, 8.669870516018236." data-is-focusable="true" fill-opacity="1" role="img" @@ -15374,7 +15374,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_4. , 17.75655781585482." + aria-label="x_4, y_4. undefined, 17.75655781585482." data-is-focusable="true" fill-opacity="1" role="img" @@ -15406,7 +15406,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_4. , -6.896721183137775." + aria-label="x_5, y_4. undefined, -6.896721183137775." data-is-focusable="true" fill-opacity="1" role="img" @@ -15438,7 +15438,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_4. , 17.337127681913973." + aria-label="x_6, y_4. undefined, 17.337127681913973." data-is-focusable="true" fill-opacity="1" role="img" @@ -15470,7 +15470,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_4. , 42.70107878756259." + aria-label="x_7, y_4. undefined, 42.70107878756259." data-is-focusable="true" fill-opacity="1" role="img" @@ -15502,7 +15502,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_4. , 27.376076996458107." + aria-label="x_8, y_4. undefined, 27.376076996458107." data-is-focusable="true" fill-opacity="1" role="img" @@ -15534,7 +15534,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_4. , 10.416788406228507." + aria-label="x_9, y_4. undefined, 10.416788406228507." data-is-focusable="true" fill-opacity="1" role="img" @@ -15566,7 +15566,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_4. , 5.9545352540812." + aria-label="x_10, y_4. undefined, 5.9545352540812." data-is-focusable="true" fill-opacity="1" role="img" @@ -15598,7 +15598,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_4. , 15.043018310072712." + aria-label="x_11, y_4. undefined, 15.043018310072712." data-is-focusable="true" fill-opacity="1" role="img" @@ -15630,7 +15630,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_4. , 32.12573718137715." + aria-label="x_12, y_4. undefined, 32.12573718137715." data-is-focusable="true" fill-opacity="1" role="img" @@ -15662,7 +15662,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_4. , 11.294834569956391." + aria-label="x_13, y_4. undefined, 11.294834569956391." data-is-focusable="true" fill-opacity="1" role="img" @@ -15694,7 +15694,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_4. , 16.313424113247194." + aria-label="x_14, y_4. undefined, 16.313424113247194." data-is-focusable="true" fill-opacity="1" role="img" @@ -15726,7 +15726,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_4. , 15.444451104553893." + aria-label="x_15, y_4. undefined, 15.444451104553893." data-is-focusable="true" fill-opacity="1" role="img" @@ -15758,7 +15758,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_4. , 10.443516068409753." + aria-label="x_16, y_4. undefined, 10.443516068409753." data-is-focusable="true" fill-opacity="1" role="img" @@ -15790,7 +15790,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_4. , 33.07558322142471." + aria-label="x_17, y_4. undefined, 33.07558322142471." data-is-focusable="true" fill-opacity="1" role="img" @@ -15822,7 +15822,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_4. , 22.67825393852671." + aria-label="x_18, y_4. undefined, 22.67825393852671." data-is-focusable="true" fill-opacity="1" role="img" @@ -15854,7 +15854,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_4. , 14.910979364805373." + aria-label="x_19, y_4. undefined, 14.910979364805373." data-is-focusable="true" fill-opacity="1" role="img" @@ -15886,7 +15886,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_3. , 12.732656491556462." + aria-label="x_0, y_3. undefined, 12.732656491556462." data-is-focusable="true" fill-opacity="1" role="img" @@ -15918,7 +15918,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_3. , 24.158612074358526." + aria-label="x_1, y_3. undefined, 24.158612074358526." data-is-focusable="true" fill-opacity="1" role="img" @@ -15950,7 +15950,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_3. , 1.8639666906231516." + aria-label="x_2, y_3. undefined, 1.8639666906231516." data-is-focusable="true" fill-opacity="1" role="img" @@ -15982,7 +15982,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_3. , 9.195075731494875." + aria-label="x_3, y_3. undefined, 9.195075731494875." data-is-focusable="true" fill-opacity="1" role="img" @@ -16014,7 +16014,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_3. , 19.788944565361437." + aria-label="x_4, y_3. undefined, 19.788944565361437." data-is-focusable="true" fill-opacity="1" role="img" @@ -16046,7 +16046,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_3. , -6.833645216204284." + aria-label="x_5, y_3. undefined, -6.833645216204284." data-is-focusable="true" fill-opacity="1" role="img" @@ -16078,7 +16078,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_3. , 9.969142303073252." + aria-label="x_6, y_3. undefined, 9.969142303073252." data-is-focusable="true" fill-opacity="1" role="img" @@ -16110,7 +16110,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_3. , 46.34145242145437." + aria-label="x_7, y_3. undefined, 46.34145242145437." data-is-focusable="true" fill-opacity="1" role="img" @@ -16142,7 +16142,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_3. , 27.310374393715577." + aria-label="x_8, y_3. undefined, 27.310374393715577." data-is-focusable="true" fill-opacity="1" role="img" @@ -16174,7 +16174,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_3. , 15.451738777747869." + aria-label="x_9, y_3. undefined, 15.451738777747869." data-is-focusable="true" fill-opacity="1" role="img" @@ -16206,7 +16206,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_3. , 6.691398648622392." + aria-label="x_10, y_3. undefined, 6.691398648622392." data-is-focusable="true" fill-opacity="1" role="img" @@ -16238,7 +16238,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_3. , 14.55281641333698." + aria-label="x_11, y_3. undefined, 14.55281641333698." data-is-focusable="true" fill-opacity="1" role="img" @@ -16270,7 +16270,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_3. , 31.321025344254267." + aria-label="x_12, y_3. undefined, 31.321025344254267." data-is-focusable="true" fill-opacity="1" role="img" @@ -16302,7 +16302,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_3. , 9.311054030160307." + aria-label="x_13, y_3. undefined, 9.311054030160307." data-is-focusable="true" fill-opacity="1" role="img" @@ -16334,7 +16334,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_3. , 12.004790333591908." + aria-label="x_14, y_3. undefined, 12.004790333591908." data-is-focusable="true" fill-opacity="1" role="img" @@ -16366,7 +16366,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_3. , 13.059625413572078." + aria-label="x_15, y_3. undefined, 13.059625413572078." data-is-focusable="true" fill-opacity="1" role="img" @@ -16398,7 +16398,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_3. , 10.25485330260371." + aria-label="x_16, y_3. undefined, 10.25485330260371." data-is-focusable="true" fill-opacity="1" role="img" @@ -16430,7 +16430,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_3. , 29.181400631242038." + aria-label="x_17, y_3. undefined, 29.181400631242038." data-is-focusable="true" fill-opacity="1" role="img" @@ -16462,7 +16462,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_3. , 17.203123079730577." + aria-label="x_18, y_3. undefined, 17.203123079730577." data-is-focusable="true" fill-opacity="1" role="img" @@ -16494,7 +16494,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_3. , 15.96262678993938." + aria-label="x_19, y_3. undefined, 15.96262678993938." data-is-focusable="true" fill-opacity="1" role="img" @@ -16526,7 +16526,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_2. , 16.104827483834423." + aria-label="x_0, y_2. undefined, 16.104827483834423." data-is-focusable="true" fill-opacity="1" role="img" @@ -16558,7 +16558,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_2. , 16.816096580158092." + aria-label="x_1, y_2. undefined, 16.816096580158092." data-is-focusable="true" fill-opacity="1" role="img" @@ -16590,7 +16590,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_2. , -1.0796033248100874." + aria-label="x_2, y_2. undefined, -1.0796033248100874." data-is-focusable="true" fill-opacity="1" role="img" @@ -16622,7 +16622,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_2. , 13.037577162924944." + aria-label="x_3, y_2. undefined, 13.037577162924944." data-is-focusable="true" fill-opacity="1" role="img" @@ -16654,7 +16654,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_2. , 25.071276081749808." + aria-label="x_4, y_2. undefined, 25.071276081749808." data-is-focusable="true" fill-opacity="1" role="img" @@ -16686,7 +16686,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_2. , -6.016235615271988." + aria-label="x_5, y_2. undefined, -6.016235615271988." data-is-focusable="true" fill-opacity="1" role="img" @@ -16718,7 +16718,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_2. , 12.248777535804365." + aria-label="x_6, y_2. undefined, 12.248777535804365." data-is-focusable="true" fill-opacity="1" role="img" @@ -16750,7 +16750,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_2. , 35.617617939013286." + aria-label="x_7, y_2. undefined, 35.617617939013286." data-is-focusable="true" fill-opacity="1" role="img" @@ -16782,7 +16782,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_2. , 20.621055215762404." + aria-label="x_8, y_2. undefined, 20.621055215762404." data-is-focusable="true" fill-opacity="1" role="img" @@ -16814,7 +16814,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_2. , 18.321563171124787." + aria-label="x_9, y_2. undefined, 18.321563171124787." data-is-focusable="true" fill-opacity="1" role="img" @@ -16846,7 +16846,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_2. , 5.106104151848498." + aria-label="x_10, y_2. undefined, 5.106104151848498." data-is-focusable="true" fill-opacity="1" role="img" @@ -16878,7 +16878,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_2. , 20.47764211274059." + aria-label="x_11, y_2. undefined, 20.47764211274059." data-is-focusable="true" fill-opacity="1" role="img" @@ -16910,7 +16910,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_2. , 13.078423154116999." + aria-label="x_12, y_2. undefined, 13.078423154116999." data-is-focusable="true" fill-opacity="1" role="img" @@ -16942,7 +16942,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_2. , 4.270904076038434." + aria-label="x_13, y_2. undefined, 4.270904076038434." data-is-focusable="true" fill-opacity="1" role="img" @@ -16974,7 +16974,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_2. , 10.32885307002288." + aria-label="x_14, y_2. undefined, 10.32885307002288." data-is-focusable="true" fill-opacity="1" role="img" @@ -17006,7 +17006,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_2. , 11.953280688550777." + aria-label="x_15, y_2. undefined, 11.953280688550777." data-is-focusable="true" fill-opacity="1" role="img" @@ -17038,7 +17038,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_2. , 1.5514493835400103." + aria-label="x_16, y_2. undefined, 1.5514493835400103." data-is-focusable="true" fill-opacity="1" role="img" @@ -17070,7 +17070,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_2. , 28.102083355215736." + aria-label="x_17, y_2. undefined, 28.102083355215736." data-is-focusable="true" fill-opacity="1" role="img" @@ -17102,7 +17102,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_2. , 11.122082151320692." + aria-label="x_18, y_2. undefined, 11.122082151320692." data-is-focusable="true" fill-opacity="1" role="img" @@ -17134,7 +17134,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_2. , 17.271525748515398." + aria-label="x_19, y_2. undefined, 17.271525748515398." data-is-focusable="true" fill-opacity="1" role="img" @@ -17166,7 +17166,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_1. , 18.072596781382654." + aria-label="x_0, y_1. undefined, 18.072596781382654." data-is-focusable="true" fill-opacity="1" role="img" @@ -17198,7 +17198,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_1. , 6.872368565119988." + aria-label="x_1, y_1. undefined, 6.872368565119988." data-is-focusable="true" fill-opacity="1" role="img" @@ -17230,7 +17230,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_1. , 2.6331323456979367." + aria-label="x_2, y_1. undefined, 2.6331323456979367." data-is-focusable="true" fill-opacity="1" role="img" @@ -17262,7 +17262,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_1. , 8.910260123844887." + aria-label="x_3, y_1. undefined, 8.910260123844887." data-is-focusable="true" fill-opacity="1" role="img" @@ -17294,7 +17294,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_1. , 23.29825386450679." + aria-label="x_4, y_1. undefined, 23.29825386450679." data-is-focusable="true" fill-opacity="1" role="img" @@ -17326,7 +17326,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_1. , 9.18418261775059." + aria-label="x_5, y_1. undefined, 9.18418261775059." data-is-focusable="true" fill-opacity="1" role="img" @@ -17358,7 +17358,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_1. , 18.052236884018036." + aria-label="x_6, y_1. undefined, 18.052236884018036." data-is-focusable="true" fill-opacity="1" role="img" @@ -17390,7 +17390,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_1. , 32.088269277118485." + aria-label="x_7, y_1. undefined, 32.088269277118485." data-is-focusable="true" fill-opacity="1" role="img" @@ -17422,7 +17422,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_1. , 15.862814449470617." + aria-label="x_8, y_1. undefined, 15.862814449470617." data-is-focusable="true" fill-opacity="1" role="img" @@ -17454,7 +17454,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_1. , 20.517302217015732." + aria-label="x_9, y_1. undefined, 20.517302217015732." data-is-focusable="true" fill-opacity="1" role="img" @@ -17486,7 +17486,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_1. , 1.5668378537843557." + aria-label="x_10, y_1. undefined, 1.5668378537843557." data-is-focusable="true" fill-opacity="1" role="img" @@ -17518,7 +17518,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_1. , 19.031137709612036." + aria-label="x_11, y_1. undefined, 19.031137709612036." data-is-focusable="true" fill-opacity="1" role="img" @@ -17550,7 +17550,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_1. , 12.133745300119848." + aria-label="x_12, y_1. undefined, 12.133745300119848." data-is-focusable="true" fill-opacity="1" role="img" @@ -17582,7 +17582,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_1. , 8.724453334098921." + aria-label="x_13, y_1. undefined, 8.724453334098921." data-is-focusable="true" fill-opacity="1" role="img" @@ -17614,7 +17614,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_1. , 8.972456038301432." + aria-label="x_14, y_1. undefined, 8.972456038301432." data-is-focusable="true" fill-opacity="1" role="img" @@ -17646,7 +17646,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_1. , 9.771921362871048." + aria-label="x_15, y_1. undefined, 9.771921362871048." data-is-focusable="true" fill-opacity="1" role="img" @@ -17678,7 +17678,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_1. , 4.761205803361531." + aria-label="x_16, y_1. undefined, 4.761205803361531." data-is-focusable="true" fill-opacity="1" role="img" @@ -17710,7 +17710,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_1. , 23.82727745555418." + aria-label="x_17, y_1. undefined, 23.82727745555418." data-is-focusable="true" fill-opacity="1" role="img" @@ -17742,7 +17742,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_1. , 14.369250386770794." + aria-label="x_18, y_1. undefined, 14.369250386770794." data-is-focusable="true" fill-opacity="1" role="img" @@ -17774,7 +17774,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_1. , 9.730029718884163." + aria-label="x_19, y_1. undefined, 9.730029718884163." data-is-focusable="true" fill-opacity="1" role="img" @@ -17806,7 +17806,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_0, y_0. , 12." + aria-label="x_0, y_0. undefined, 12." data-is-focusable="true" fill-opacity="1" role="img" @@ -17838,7 +17838,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_1, y_0. , 11.697147742124411." + aria-label="x_1, y_0. undefined, 11.697147742124411." data-is-focusable="true" fill-opacity="1" role="img" @@ -17870,7 +17870,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_2, y_0. , 7.1748009833505355." + aria-label="x_2, y_0. undefined, 7.1748009833505355." data-is-focusable="true" fill-opacity="1" role="img" @@ -17902,7 +17902,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_3, y_0. , 11.443688379214382." + aria-label="x_3, y_0. undefined, 11.443688379214382." data-is-focusable="true" fill-opacity="1" role="img" @@ -17934,7 +17934,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_4, y_0. , 23.648522429525176." + aria-label="x_4, y_0. undefined, 23.648522429525176." data-is-focusable="true" fill-opacity="1" role="img" @@ -17966,7 +17966,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_5, y_0. , 10.040502684649338." + aria-label="x_5, y_0. undefined, 10.040502684649338." data-is-focusable="true" fill-opacity="1" role="img" @@ -17998,7 +17998,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_6, y_0. , 10.819974608119614." + aria-label="x_6, y_0. undefined, 10.819974608119614." data-is-focusable="true" fill-opacity="1" role="img" @@ -18030,7 +18030,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_7, y_0. , 20.83991840239746." + aria-label="x_7, y_0. undefined, 20.83991840239746." data-is-focusable="true" fill-opacity="1" role="img" @@ -18062,7 +18062,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_8, y_0. , 14.378243279399832." + aria-label="x_8, y_0. undefined, 14.378243279399832." data-is-focusable="true" fill-opacity="1" role="img" @@ -18094,7 +18094,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_9, y_0. , 9.546437633051273." + aria-label="x_9, y_0. undefined, 9.546437633051273." data-is-focusable="true" fill-opacity="1" role="img" @@ -18126,7 +18126,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_10, y_0. , 2.117430162487592." + aria-label="x_10, y_0. undefined, 2.117430162487592." data-is-focusable="true" fill-opacity="1" role="img" @@ -18158,7 +18158,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_11, y_0. , 24.053122758748437." + aria-label="x_11, y_0. undefined, 24.053122758748437." data-is-focusable="true" fill-opacity="1" role="img" @@ -18190,7 +18190,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_12, y_0. , 14.741753869753929." + aria-label="x_12, y_0. undefined, 14.741753869753929." data-is-focusable="true" fill-opacity="1" role="img" @@ -18222,7 +18222,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_13, y_0. , 11.223068582526338." + aria-label="x_13, y_0. undefined, 11.223068582526338." data-is-focusable="true" fill-opacity="1" role="img" @@ -18254,7 +18254,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_14, y_0. , 2.9058799108357736." + aria-label="x_14, y_0. undefined, 2.9058799108357736." data-is-focusable="true" fill-opacity="1" role="img" @@ -18286,7 +18286,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_15, y_0. , 12.523922839169199." + aria-label="x_15, y_0. undefined, 12.523922839169199." data-is-focusable="true" fill-opacity="1" role="img" @@ -18318,7 +18318,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_16, y_0. , 12.426446278371158." + aria-label="x_16, y_0. undefined, 12.426446278371158." data-is-focusable="true" fill-opacity="1" role="img" @@ -18350,7 +18350,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_17, y_0. , 15.786820017213348." + aria-label="x_17, y_0. undefined, 15.786820017213348." data-is-focusable="true" fill-opacity="1" role="img" @@ -18382,7 +18382,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_18, y_0. , 25.828355052498736." + aria-label="x_18, y_0. undefined, 25.828355052498736." data-is-focusable="true" fill-opacity="1" role="img" @@ -18414,7 +18414,7 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` </text> </g> <g - aria-label="x_19, y_0. , 15.884458175971286." + aria-label="x_19, y_0. undefined, 15.884458175971286." data-is-focusable="true" fill-opacity="1" role="img" diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap index 85baf67c9f3528..6faa14a576ee1b 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap @@ -357,6 +357,8 @@ Object { }, ], "mode": "plotly", + "secondaryYAxistitle": undefined, + "secondaryYScaleOptions": undefined, "xAxisTitle": "Votes", "yAxisTitle": "Framework", } @@ -2800,7 +2802,7 @@ Object { "y": "y_19", }, ], - "legend": "", + "legend": undefined, "value": 0, }, ], @@ -3325,6 +3327,8 @@ Object { ], }, "mode": "tonexty", + "secondaryYAxistitle": undefined, + "secondaryYScaleOptions": undefined, "supportNegativeData": true, "xAxisTitle": "", "yAxisTitle": "", @@ -4557,6 +4561,8 @@ Object { ], }, "mode": "tonexty", + "secondaryYAxistitle": undefined, + "secondaryYScaleOptions": undefined, "supportNegativeData": true, "xAxisTitle": "", "yAxisTitle": "", @@ -4929,6 +4935,8 @@ Object { }, ], "mode": "plotly", + "secondaryYAxistitle": undefined, + "secondaryYScaleOptions": undefined, "xAxisTitle": "", "yAxisTitle": "", "yMaxValue": 3400, diff --git a/packages/charts/react-charting/src/components/HorizontalBarChartWithAxis/HorizontalBarChartWithAxis.base.tsx b/packages/charts/react-charting/src/components/HorizontalBarChartWithAxis/HorizontalBarChartWithAxis.base.tsx index cce810f303e167..9bd1d116c7bc84 100644 --- a/packages/charts/react-charting/src/components/HorizontalBarChartWithAxis/HorizontalBarChartWithAxis.base.tsx +++ b/packages/charts/react-charting/src/components/HorizontalBarChartWithAxis/HorizontalBarChartWithAxis.base.tsx @@ -91,7 +91,9 @@ export class HorizontalBarChartWithAxisBase color: '', dataForHoverCard: 0, isCalloutVisible: false, - isLegendSelected: props.legendProps?.selectedLegend !== undefined, + isLegendSelected: + (props.legendProps?.selectedLegends && props.legendProps.selectedLegends.length > 0) || + props.legendProps?.selectedLegend !== undefined, isLegendHovered: false, refSelected: null, selectedLegendTitle: props.legendProps?.selectedLegend ?? '', diff --git a/packages/charts/react-charting/src/components/VerticalBarChart/__snapshots__/VerticalBarChartRTL.test.tsx.snap b/packages/charts/react-charting/src/components/VerticalBarChart/__snapshots__/VerticalBarChartRTL.test.tsx.snap index 7107331244face..676ff7ca71b994 100644 --- a/packages/charts/react-charting/src/components/VerticalBarChart/__snapshots__/VerticalBarChartRTL.test.tsx.snap +++ b/packages/charts/react-charting/src/components/VerticalBarChart/__snapshots__/VerticalBarChartRTL.test.tsx.snap @@ -2505,7 +2505,7 @@ exports[`Vertical bar chart re-rendering Should re-render the vertical bar chart fill="currentColor" y="16" > - 10,000 + 10000 </text> </g> <g @@ -2523,7 +2523,7 @@ exports[`Vertical bar chart re-rendering Should re-render the vertical bar chart fill="currentColor" y="16" > - 25,000 + 25000 </text> </g> </g> diff --git a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx index 5577c5829b4a35..7b897388bb9203 100644 --- a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx @@ -1254,7 +1254,7 @@ export class VerticalStackedBarChartBase return !( this.props.data && this.props.data.length > 0 && - this.props.data.filter(item => item.chartData.length === 0).length === 0 + this.props.data.some(item => item.chartData.length > 0 || (item.lineData && item.lineData.length > 0)) ); } diff --git a/packages/charts/react-charting/src/utilities/utilities.ts b/packages/charts/react-charting/src/utilities/utilities.ts index 735024e852f983..9396c424fdce08 100644 --- a/packages/charts/react-charting/src/utilities/utilities.ts +++ b/packages/charts/react-charting/src/utilities/utilities.ts @@ -312,19 +312,12 @@ export function createStringXAxis( .range([domainNRangeValues.rStartValue, domainNRangeValues.rEndValue]) .paddingInner(typeof xAxisInnerPadding !== 'undefined' ? xAxisInnerPadding : xAxisPadding) .paddingOuter(typeof xAxisOuterPadding !== 'undefined' ? xAxisOuterPadding : xAxisPadding); - const xAxis = d3AxisBottom(xAxisScale) - .tickSize(xAxistickSize) - .tickPadding(tickPadding) - .ticks(xAxisCount) - .tickFormat((x: string, index: number) => { - return convertToLocaleString(dataset[index], culture) as string; - }); + const xAxis = d3AxisBottom(xAxisScale).tickSize(xAxistickSize).tickPadding(tickPadding).ticks(xAxisCount); if (xAxisParams.xAxisElement) { d3Select(xAxisParams.xAxisElement).call(xAxis).selectAll('text').attr('aria-hidden', 'true'); } - const tickValues = dataset.map(xAxis.tickFormat()!); - return { xScale: xAxisScale, tickValues }; + return { xScale: xAxisScale, tickValues: dataset }; } /** From 5afd9daa49ae9ca719260238b2b64451e575d913 Mon Sep 17 00:00:00 2001 From: Carla Muntean <carla.muntean@microsoft.com> Date: Mon, 20 Jan 2025 22:08:56 +0200 Subject: [PATCH 63/78] fix(react-spinbutton): slot input handler set value (#33680) --- ...ct-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json | 7 +++++++ .../library/src/components/SpinButton/SpinButton.test.tsx | 2 +- .../library/src/components/SpinButton/useSpinButton.tsx | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 change/@fluentui-react-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json diff --git a/change/@fluentui-react-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json b/change/@fluentui-react-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json new file mode 100644 index 00000000000000..3f61d17745a214 --- /dev/null +++ b/change/@fluentui-react-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix spinbutton test", + "packageName": "@fluentui/react-spinbutton", + "email": "carla.muntean@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-spinbutton/library/src/components/SpinButton/SpinButton.test.tsx b/packages/react-components/react-spinbutton/library/src/components/SpinButton/SpinButton.test.tsx index 0f166d403f3bc6..bb2b4e0ae9a0f3 100644 --- a/packages/react-components/react-spinbutton/library/src/components/SpinButton/SpinButton.test.tsx +++ b/packages/react-components/react-spinbutton/library/src/components/SpinButton/SpinButton.test.tsx @@ -554,7 +554,7 @@ describe('SpinButton', () => { userEvent.click(decrementButton); expect(onChange).toHaveBeenCalledTimes(2); - expect(onChange.mock.calls[1][1]).toEqual({ value: -1, displayValue: undefined }); + expect(onChange.mock.calls[1][1]).toEqual({ value: 0, displayValue: undefined }); }); it('calls on change when defaultValue is `null` with min when uncontrolled', () => { diff --git a/packages/react-components/react-spinbutton/library/src/components/SpinButton/useSpinButton.tsx b/packages/react-components/react-spinbutton/library/src/components/SpinButton/useSpinButton.tsx index 329c72a131958f..d88da840cfe847 100644 --- a/packages/react-components/react-spinbutton/library/src/components/SpinButton/useSpinButton.tsx +++ b/packages/react-components/react-spinbutton/library/src/components/SpinButton/useSpinButton.tsx @@ -154,11 +154,13 @@ export const useSpinButton_unstable = (props: SpinButtonProps, ref: React.Ref<HT }; const handleIncrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => { + commit(e, currentValue, textValue); internalState.current.spinState = 'up'; stepValue(e, 'up'); }; const handleDecrementMouseDown = (e: React.MouseEvent<HTMLButtonElement>) => { + commit(e, currentValue, textValue); internalState.current.spinState = 'down'; stepValue(e, 'down'); }; @@ -231,10 +233,12 @@ export const useSpinButton_unstable = (props: SpinButtonProps, ref: React.Ref<HT if (valueChanged) { roundedValue = precisionRound(newValue!, precision); setCurrentValue(roundedValue); + internalState.current.value = roundedValue; } else if (displayValueChanged && !isControlled) { const nextValue = parseFloat(newDisplayValue as string); if (!isNaN(nextValue)) { setCurrentValue(precisionRound(nextValue, precision)); + internalState.current.value = precisionRound(nextValue, precision); } } @@ -323,6 +327,7 @@ export const useSpinButton_unstable = (props: SpinButtonProps, ref: React.Ref<HT state.input['aria-valuemax'] = max; state.input['aria-valuetext'] = state.input['aria-valuetext'] ?? ((value !== undefined && displayValue) || undefined); state.input.onChange = mergeCallbacks(state.input.onChange, handleInputChange); + state.input.onInput = mergeCallbacks(state.input.onInput, handleInputChange); state.input.onBlur = mergeCallbacks(state.input.onBlur, handleBlur); state.input.onKeyDown = mergeCallbacks(state.input.onKeyDown, handleKeyDown); state.input.onKeyUp = mergeCallbacks(state.input.onKeyUp, handleKeyUp); From 08575f8e7d2362e9b986bccee516546f88fe562a Mon Sep 17 00:00:00 2001 From: krkshitij <110246001+krkshitij@users.noreply.github.com> Date: Tue, 21 Jan 2025 11:54:10 +0530 Subject: [PATCH 64/78] fix(react-charting): resolve overlapping bars issue in histogram (#33695) --- ...-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json | 7 +++++++ .../components/DeclarativeChart/DeclarativeChart.tsx | 2 +- .../components/DeclarativeChart/PlotlySchemaAdapter.ts | 1 - .../__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap | 1 - .../VerticalBarChart/VerticalBarChart.base.tsx | 10 +++++++++- 5 files changed, 17 insertions(+), 4 deletions(-) create mode 100644 change/@fluentui-react-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json diff --git a/change/@fluentui-react-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json b/change/@fluentui-react-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json new file mode 100644 index 00000000000000..e03f66fe77138b --- /dev/null +++ b/change/@fluentui-react-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: resolve overlapping bars issue in histogram", + "packageName": "@fluentui/react-charting", + "email": "110246001+krkshitij@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx b/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx index 728f5ddfbbf797..c84024a8684b7a 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx +++ b/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx @@ -179,7 +179,7 @@ export const DeclarativeChart: React.FunctionComponent<DeclarativeChartProps> = (opts?: IImageExportOptions) => { return toImage(chartRef.current?.chartContainer, { background: theme.semanticColors.bodyBackground, - scale: 3, + scale: 5, ...opts, }); }, diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts index 54f61f4e559e1c..728bc2cf4f1b38 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts @@ -444,7 +444,6 @@ export const transformPlotlyJsonToVBCProps = ( data: vbcData, // width: layout?.width, // height: layout?.height, - barWidth: 24, supportNegativeData: true, chartTitle, xAxisTitle, diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap index 6faa14a576ee1b..fb2586596c12f4 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/PlotlySchemaAdapterUT.test.tsx.snap @@ -4571,7 +4571,6 @@ Object { exports[`transform Plotly Json To chart Props transformPlotlyJsonToVBCProps - Should return VBC props 1`] = ` Object { - "barWidth": 24, "chartTitle": "", "data": Array [ Object { diff --git a/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.base.tsx b/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.base.tsx index 484461c1a1cab8..7b1eeabf68272f 100644 --- a/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/VerticalBarChart/VerticalBarChart.base.tsx @@ -1272,7 +1272,15 @@ export class VerticalBarChartBase this._domainMargin = MIN_DOMAIN_MARGIN + Math.max(0, Math.min(margin1, margin2)); } } else { - const data = (this.props.data?.map(point => point.x) as number[] | Date[] | undefined) || []; + const uniqueX: Record<number, number | Date> = {}; + this.props.data?.forEach(point => { + if (point.x instanceof Date) { + uniqueX[point.x.getTime()] = point.x; + } else { + uniqueX[point.x as number] = point.x as number; + } + }); + const data = Object.values(uniqueX) as number[] | Date[]; this._barWidth = getBarWidth( this.props.barWidth, this.props.maxBarWidth, From d5bc603085379050e08bb9ba6b2cbb8bf478a81b Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Tue, 21 Jan 2025 07:14:08 +0000 Subject: [PATCH 65/78] release: applying package updates - react v8 --- ...-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json | 7 ---- ...-17bc0f58-a206-47b6-b5dc-6bf008820978.json | 7 ---- ...-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json | 7 ---- ...-b50824ac-5ec3-43fe-af53-76307680fb75.json | 7 ---- ...-be791d81-9cfb-4576-961c-03c4f6eb85c0.json | 7 ---- packages/charts/react-charting/CHANGELOG.json | 39 +++++++++++++++++++ packages/charts/react-charting/CHANGELOG.md | 15 ++++++- packages/charts/react-charting/package.json | 2 +- .../react-docsite-components/CHANGELOG.json | 15 +++++++ .../react-docsite-components/CHANGELOG.md | 11 +++++- .../react-docsite-components/package.json | 4 +- packages/react-examples/package.json | 4 +- packages/react-monaco-editor/CHANGELOG.json | 15 +++++++ packages/react-monaco-editor/CHANGELOG.md | 11 +++++- packages/react-monaco-editor/package.json | 4 +- 15 files changed, 110 insertions(+), 45 deletions(-) delete mode 100644 change/@fluentui-react-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json delete mode 100644 change/@fluentui-react-charting-17bc0f58-a206-47b6-b5dc-6bf008820978.json delete mode 100644 change/@fluentui-react-charting-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json delete mode 100644 change/@fluentui-react-charting-b50824ac-5ec3-43fe-af53-76307680fb75.json delete mode 100644 change/@fluentui-react-charting-be791d81-9cfb-4576-961c-03c4f6eb85c0.json diff --git a/change/@fluentui-react-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json b/change/@fluentui-react-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json deleted file mode 100644 index e03f66fe77138b..00000000000000 --- a/change/@fluentui-react-charting-11f4c890-d9e5-4e7e-afde-fbfc66beb0d7.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: resolve overlapping bars issue in histogram", - "packageName": "@fluentui/react-charting", - "email": "110246001+krkshitij@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-charting-17bc0f58-a206-47b6-b5dc-6bf008820978.json b/change/@fluentui-react-charting-17bc0f58-a206-47b6-b5dc-6bf008820978.json deleted file mode 100644 index 1026025406a1b3..00000000000000 --- a/change/@fluentui-react-charting-17bc0f58-a206-47b6-b5dc-6bf008820978.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Adding fallback and fixes for test app crashes for 12 schema data ", - "packageName": "@fluentui/react-charting", - "email": "120183316+srmukher@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-charting-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json b/change/@fluentui-react-charting-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json deleted file mode 100644 index fef536a369732e..00000000000000 --- a/change/@fluentui-react-charting-a8a1b0ef-ed4a-471e-bc5c-c9da614fc26f.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Use strongly typed interfaces for plotly schema", - "packageName": "@fluentui/react-charting", - "email": "98592573+AtishayMsft@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-charting-b50824ac-5ec3-43fe-af53-76307680fb75.json b/change/@fluentui-react-charting-b50824ac-5ec3-43fe-af53-76307680fb75.json deleted file mode 100644 index e18e77a6242e66..00000000000000 --- a/change/@fluentui-react-charting-b50824ac-5ec3-43fe-af53-76307680fb75.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: resolve bugs in declarative chart", - "packageName": "@fluentui/react-charting", - "email": "110246001+krkshitij@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-charting-be791d81-9cfb-4576-961c-03c4f6eb85c0.json b/change/@fluentui-react-charting-be791d81-9cfb-4576-961c-03c4f6eb85c0.json deleted file mode 100644 index b3c031f141fdbb..00000000000000 --- a/change/@fluentui-react-charting-be791d81-9cfb-4576-961c-03c4f6eb85c0.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "StronglyType plotly schema bug fix", - "packageName": "@fluentui/react-charting", - "email": "74965306+Anush2303@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/packages/charts/react-charting/CHANGELOG.json b/packages/charts/react-charting/CHANGELOG.json index f6da08d1e22a0c..ff4f3f3b32a70a 100644 --- a/packages/charts/react-charting/CHANGELOG.json +++ b/packages/charts/react-charting/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-charting", "entries": [ + { + "date": "Tue, 21 Jan 2025 07:13:50 GMT", + "tag": "@fluentui/react-charting_v5.23.43", + "version": "5.23.43", + "comments": { + "patch": [ + { + "author": "110246001+krkshitij@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "08575f8e7d2362e9b986bccee516546f88fe562a", + "comment": "fix: resolve overlapping bars issue in histogram" + }, + { + "author": "120183316+srmukher@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "b929a867df391be107630afe2de281c5d06594e7", + "comment": "Adding fallback and fixes for test app crashes for 12 schema data " + }, + { + "author": "98592573+AtishayMsft@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "b929a867df391be107630afe2de281c5d06594e7", + "comment": "Use strongly typed interfaces for plotly schema" + }, + { + "author": "110246001+krkshitij@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "b929a867df391be107630afe2de281c5d06594e7", + "comment": "fix: resolve bugs in declarative chart" + }, + { + "author": "74965306+Anush2303@users.noreply.github.com", + "package": "@fluentui/react-charting", + "commit": "b929a867df391be107630afe2de281c5d06594e7", + "comment": "StronglyType plotly schema bug fix" + } + ] + } + }, { "date": "Mon, 20 Jan 2025 07:21:43 GMT", "tag": "@fluentui/react-charting_v5.23.42", diff --git a/packages/charts/react-charting/CHANGELOG.md b/packages/charts/react-charting/CHANGELOG.md index ead744ab3ae8e3..178ccd9991cebf 100644 --- a/packages/charts/react-charting/CHANGELOG.md +++ b/packages/charts/react-charting/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-charting -This log was last generated on Mon, 20 Jan 2025 07:21:43 GMT and should not be manually modified. +This log was last generated on Tue, 21 Jan 2025 07:13:50 GMT and should not be manually modified. <!-- Start content --> +## [5.23.43](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.43) + +Tue, 21 Jan 2025 07:13:50 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charting_v5.23.42..@fluentui/react-charting_v5.23.43) + +### Patches + +- fix: resolve overlapping bars issue in histogram ([PR #33695](https://github.com/microsoft/fluentui/pull/33695) by 110246001+krkshitij@users.noreply.github.com) +- Adding fallback and fixes for test app crashes for 12 schema data ([PR #33621](https://github.com/microsoft/fluentui/pull/33621) by 120183316+srmukher@users.noreply.github.com) +- Use strongly typed interfaces for plotly schema ([PR #33621](https://github.com/microsoft/fluentui/pull/33621) by 98592573+AtishayMsft@users.noreply.github.com) +- fix: resolve bugs in declarative chart ([PR #33621](https://github.com/microsoft/fluentui/pull/33621) by 110246001+krkshitij@users.noreply.github.com) +- StronglyType plotly schema bug fix ([PR #33621](https://github.com/microsoft/fluentui/pull/33621) by 74965306+Anush2303@users.noreply.github.com) + ## [5.23.42](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.42) Mon, 20 Jan 2025 07:21:43 GMT diff --git a/packages/charts/react-charting/package.json b/packages/charts/react-charting/package.json index 71f2748e09d90f..d91ee34bf3ac28 100644 --- a/packages/charts/react-charting/package.json +++ b/packages/charts/react-charting/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-charting", - "version": "5.23.42", + "version": "5.23.43", "description": "React web charting controls for Microsoft fluentui system.", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-docsite-components/CHANGELOG.json b/packages/react-docsite-components/CHANGELOG.json index a5a561b8dc8503..5e649d24d2a9c5 100644 --- a/packages/react-docsite-components/CHANGELOG.json +++ b/packages/react-docsite-components/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-docsite-components", "entries": [ + { + "date": "Tue, 21 Jan 2025 07:13:51 GMT", + "tag": "@fluentui/react-docsite-components_v8.13.163", + "version": "8.13.163", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react-monaco-editor to v1.7.281", + "commit": "08575f8e7d2362e9b986bccee516546f88fe562a" + } + ] + } + }, { "date": "Mon, 20 Jan 2025 07:21:47 GMT", "tag": "@fluentui/react-docsite-components_v8.13.162", diff --git a/packages/react-docsite-components/CHANGELOG.md b/packages/react-docsite-components/CHANGELOG.md index f2e9af5b8bbb09..14b7ea915169e2 100644 --- a/packages/react-docsite-components/CHANGELOG.md +++ b/packages/react-docsite-components/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-docsite-components -This log was last generated on Mon, 20 Jan 2025 07:21:47 GMT and should not be manually modified. +This log was last generated on Tue, 21 Jan 2025 07:13:51 GMT and should not be manually modified. <!-- Start content --> +## [8.13.163](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.163) + +Tue, 21 Jan 2025 07:13:51 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-docsite-components_v8.13.162..@fluentui/react-docsite-components_v8.13.163) + +### Patches + +- Bump @fluentui/react-monaco-editor to v1.7.281 ([PR #33695](https://github.com/microsoft/fluentui/pull/33695) by beachball) + ## [8.13.162](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.162) Mon, 20 Jan 2025 07:21:47 GMT diff --git a/packages/react-docsite-components/package.json b/packages/react-docsite-components/package.json index 1299b7f308c8a2..b8257ed0fc401d 100644 --- a/packages/react-docsite-components/package.json +++ b/packages/react-docsite-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-docsite-components", - "version": "8.13.162", + "version": "8.13.163", "description": "Fluent UI React components for building documentation sites.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -42,7 +42,7 @@ "@fluentui/public-docsite-setup": "^0.3.34", "@fluentui/react-hooks": "^8.8.16", "@fluentui/set-version": "^8.2.23", - "@fluentui/react-monaco-editor": "^1.7.280", + "@fluentui/react-monaco-editor": "^1.7.281", "color-check": "0.0.2", "markdown-to-jsx": "^7.0.0", "office-ui-fabric-core": "^11.0.0", diff --git a/packages/react-examples/package.json b/packages/react-examples/package.json index 42e68cdf6178e1..ca5e20d784014d 100644 --- a/packages/react-examples/package.json +++ b/packages/react-examples/package.json @@ -36,8 +36,8 @@ "@fluentui/merge-styles": "^8.6.13", "@fluentui/react": "^8.122.7", "@fluentui/react-cards": "^0.205.196", - "@fluentui/react-charting": "^5.23.42", - "@fluentui/react-docsite-components": "^8.13.162", + "@fluentui/react-charting": "^5.23.43", + "@fluentui/react-docsite-components": "^8.13.163", "@fluentui/react-experiments": "^8.14.193", "@fluentui/react-file-type-icons": "^8.12.7", "@fluentui/react-focus": "^8.9.20", diff --git a/packages/react-monaco-editor/CHANGELOG.json b/packages/react-monaco-editor/CHANGELOG.json index 532a1478e0b13e..272c9adba363fd 100644 --- a/packages/react-monaco-editor/CHANGELOG.json +++ b/packages/react-monaco-editor/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-monaco-editor", "entries": [ + { + "date": "Tue, 21 Jan 2025 07:13:51 GMT", + "tag": "@fluentui/react-monaco-editor_v1.7.281", + "version": "1.7.281", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react-charting to v5.23.43", + "commit": "08575f8e7d2362e9b986bccee516546f88fe562a" + } + ] + } + }, { "date": "Mon, 20 Jan 2025 07:21:45 GMT", "tag": "@fluentui/react-monaco-editor_v1.7.280", diff --git a/packages/react-monaco-editor/CHANGELOG.md b/packages/react-monaco-editor/CHANGELOG.md index 824f64d4196921..3ea218b12d6b2a 100644 --- a/packages/react-monaco-editor/CHANGELOG.md +++ b/packages/react-monaco-editor/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-monaco-editor -This log was last generated on Mon, 20 Jan 2025 07:21:45 GMT and should not be manually modified. +This log was last generated on Tue, 21 Jan 2025 07:13:51 GMT and should not be manually modified. <!-- Start content --> +## [1.7.281](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.281) + +Tue, 21 Jan 2025 07:13:51 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-monaco-editor_v1.7.280..@fluentui/react-monaco-editor_v1.7.281) + +### Patches + +- Bump @fluentui/react-charting to v5.23.43 ([PR #33695](https://github.com/microsoft/fluentui/pull/33695) by beachball) + ## [1.7.280](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.280) Mon, 20 Jan 2025 07:21:45 GMT diff --git a/packages/react-monaco-editor/package.json b/packages/react-monaco-editor/package.json index 5a39e456a2918d..f20c04f3ff0a78 100644 --- a/packages/react-monaco-editor/package.json +++ b/packages/react-monaco-editor/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-monaco-editor", - "version": "1.7.280", + "version": "1.7.281", "description": "Live React example editing using monaco", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -34,7 +34,7 @@ "@fluentui/example-data": "^8.4.25", "@fluentui/monaco-editor": "^1.3.24", "@fluentui/react-hooks": "^8.8.16", - "@fluentui/react-charting": "^5.23.42", + "@fluentui/react-charting": "^5.23.43", "raw-loader": "4.0.2", "react-syntax-highlighter": "^10.1.3", "tslib": "^2.1.0" From b987de6afa58c99706f17fa52aa0d64fc1f38643 Mon Sep 17 00:00:00 2001 From: Bernardo Sunderhus <bernardo.sunderhus@gmail.com> Date: Tue, 21 Jan 2025 14:58:44 +0100 Subject: [PATCH 66/78] bugfix: secondaryContent not displaying properly (#33689) --- ...t-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json | 7 +++++++ .../__snapshots__/TagPickerOption.test.tsx.snap | 2 +- .../TagPickerOption/useTagPickerOptionStyles.styles.ts | 8 +++++--- 3 files changed, 13 insertions(+), 4 deletions(-) create mode 100644 change/@fluentui-react-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json diff --git a/change/@fluentui-react-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json b/change/@fluentui-react-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json new file mode 100644 index 00000000000000..3f3abb7239db9f --- /dev/null +++ b/change/@fluentui-react-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "bugfix: secondaryContent not displaying properly", + "packageName": "@fluentui/react-tag-picker", + "email": "bernardo.sunderhus@gmail.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-tag-picker/library/src/components/TagPickerOption/__snapshots__/TagPickerOption.test.tsx.snap b/packages/react-components/react-tag-picker/library/src/components/TagPickerOption/__snapshots__/TagPickerOption.test.tsx.snap index 907a79f7e94918..2b7ec9972e024e 100644 --- a/packages/react-components/react-tag-picker/library/src/components/TagPickerOption/__snapshots__/TagPickerOption.test.tsx.snap +++ b/packages/react-components/react-tag-picker/library/src/components/TagPickerOption/__snapshots__/TagPickerOption.test.tsx.snap @@ -4,7 +4,7 @@ exports[`TagPickerOption renders a default state 1`] = ` <div> <div aria-selected="false" - class="fui-TagPickerOption fui-Option" + class="fui-Option fui-TagPickerOption" id="fluent-option8" role="option" > diff --git a/packages/react-components/react-tag-picker/library/src/components/TagPickerOption/useTagPickerOptionStyles.styles.ts b/packages/react-components/react-tag-picker/library/src/components/TagPickerOption/useTagPickerOptionStyles.styles.ts index d9ae8758f70399..c8b27a0f42eb16 100644 --- a/packages/react-components/react-tag-picker/library/src/components/TagPickerOption/useTagPickerOptionStyles.styles.ts +++ b/packages/react-components/react-tag-picker/library/src/components/TagPickerOption/useTagPickerOptionStyles.styles.ts @@ -2,6 +2,7 @@ import { makeStyles, mergeClasses } from '@griffel/react'; import type { SlotClassNames } from '@fluentui/react-utilities'; import type { TagPickerOptionSlots, TagPickerOptionState } from './TagPickerOption.types'; import { useOptionStyles_unstable } from '@fluentui/react-combobox'; +import { typographyStyles } from '@fluentui/react-theme'; export const tagPickerOptionClassNames: SlotClassNames<TagPickerOptionSlots> = { root: 'fui-TagPickerOption', @@ -22,6 +23,7 @@ const useStyles = makeStyles({ secondaryContent: { gridColumnStart: 2, gridRowStart: 2, + ...typographyStyles.caption1, }, media: { @@ -35,6 +37,9 @@ const useStyles = makeStyles({ export const useTagPickerOptionStyles_unstable = (state: TagPickerOptionState): TagPickerOptionState => { 'use no memo'; + const styles = useStyles(); + + state.root.className = mergeClasses(tagPickerOptionClassNames.root, styles.root, state.root.className); useOptionStyles_unstable({ ...state, active: false, @@ -43,9 +48,6 @@ export const useTagPickerOptionStyles_unstable = (state: TagPickerOptionState): checkIcon: undefined, selected: false, }); - const styles = useStyles(); - - state.root.className = mergeClasses(tagPickerOptionClassNames.root, styles.root, state.root.className); if (state.media) { state.media.className = mergeClasses(tagPickerOptionClassNames.media, styles.media, state.media.className); } From 246f5b3ed047531f7a329ad8ca7e5693cd3838a9 Mon Sep 17 00:00:00 2001 From: Bernardo Sunderhus <bernardo.sunderhus@gmail.com> Date: Tue, 21 Jan 2025 14:59:17 +0100 Subject: [PATCH 67/78] feature(react-tree): introduces navigationMode property (#33658) --- ...-69773403-5633-414b-866a-f20aedf4bc0c.json | 7 ++ .../react-tree/library/etc/react-tree.api.md | 6 + .../react-tree/library/src/Tree.ts | 1 + .../src/components/FlatTree/FlatTree.cy.tsx | 82 +++++++++--- .../src/components/FlatTree/FlatTree.types.ts | 7 ++ .../src/components/FlatTree/useFlatTree.ts | 2 +- .../FlatTree/useFlatTreeContextValues.ts | 2 + .../library/src/components/Tree/Tree.cy.tsx | 81 +++++++++--- .../library/src/components/Tree/Tree.types.ts | 9 ++ .../library/src/components/Tree/index.ts | 1 + .../library/src/components/Tree/useTree.ts | 2 +- .../components/Tree/useTreeContextValues.ts | 2 + .../src/components/TreeItem/useTreeItem.tsx | 90 +++++++++---- .../TreeItemLayout/useTreeItemLayout.tsx | 4 +- .../library/src/contexts/treeContext.ts | 4 + .../src/hooks/useFlatTreeNavigation.ts | 22 +++- .../library/src/hooks/useRootTree.ts | 1 + .../library/src/hooks/useTreeNavigation.ts | 26 +++- .../react-tree/library/src/index.ts | 1 + .../TreeNavigationModeTreeGrid.stories.tsx | 118 ++++++++++++++++++ .../stories/src/Tree/index.stories.tsx | 1 + 21 files changed, 398 insertions(+), 71 deletions(-) create mode 100644 change/@fluentui-react-tree-69773403-5633-414b-866a-f20aedf4bc0c.json create mode 100644 packages/react-components/react-tree/stories/src/Tree/TreeNavigationModeTreeGrid.stories.tsx diff --git a/change/@fluentui-react-tree-69773403-5633-414b-866a-f20aedf4bc0c.json b/change/@fluentui-react-tree-69773403-5633-414b-866a-f20aedf4bc0c.json new file mode 100644 index 00000000000000..299a1892740844 --- /dev/null +++ b/change/@fluentui-react-tree-69773403-5633-414b-866a-f20aedf4bc0c.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "feature: introduces navigationMode property", + "packageName": "@fluentui/react-tree", + "email": "bernardo.sunderhus@gmail.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-tree/library/etc/react-tree.api.md b/packages/react-components/react-tree/library/etc/react-tree.api.md index 419d5b136e4352..210a53b0625064 100644 --- a/packages/react-components/react-tree/library/etc/react-tree.api.md +++ b/packages/react-components/react-tree/library/etc/react-tree.api.md @@ -62,6 +62,7 @@ export type FlatTreeItemProps = TreeItemProps & { // @public (undocumented) export type FlatTreeProps = ComponentProps<TreeSlots> & { + navigationMode?: 'tree' | 'treegrid'; appearance?: 'subtle' | 'subtle-alpha' | 'transparent'; size?: 'small' | 'medium'; openItems?: Iterable<TreeItemValue>; @@ -160,6 +161,7 @@ export type TreeContextValue = { checkedItems: ImmutableMap<TreeItemValue, 'mixed' | boolean>; requestTreeResponse(request: TreeItemRequest): void; forceUpdateRovingTabIndex?(): void; + navigationMode?: 'tree' | 'treegrid'; }; // @public (undocumented) @@ -331,6 +333,9 @@ export type TreeNavigationData_unstable = { // @public (undocumented) export type TreeNavigationEvent_unstable = TreeNavigationData_unstable['event']; +// @public (undocumented) +export type TreeNavigationMode = 'tree' | 'treegrid'; + // @public (undocumented) export type TreeOpenChangeData = { open: boolean; @@ -366,6 +371,7 @@ export type TreeOpenChangeEvent = TreeOpenChangeData['event']; // @public (undocumented) export type TreeProps = ComponentProps<TreeSlots> & { + navigationMode?: TreeNavigationMode; appearance?: 'subtle' | 'subtle-alpha' | 'transparent'; size?: 'small' | 'medium'; openItems?: Iterable<TreeItemValue>; diff --git a/packages/react-components/react-tree/library/src/Tree.ts b/packages/react-components/react-tree/library/src/Tree.ts index f6591a88e83ac3..a4bd46d2b4b4a8 100644 --- a/packages/react-components/react-tree/library/src/Tree.ts +++ b/packages/react-components/react-tree/library/src/Tree.ts @@ -10,6 +10,7 @@ export type { TreeSelectionValue, TreeSlots, TreeState, + TreeNavigationMode, } from './components/Tree/index'; export { Tree, diff --git a/packages/react-components/react-tree/library/src/components/FlatTree/FlatTree.cy.tsx b/packages/react-components/react-tree/library/src/components/FlatTree/FlatTree.cy.tsx index 820f0ff2e38779..50d5822afc05f8 100644 --- a/packages/react-components/react-tree/library/src/components/FlatTree/FlatTree.cy.tsx +++ b/packages/react-components/react-tree/library/src/components/FlatTree/FlatTree.cy.tsx @@ -207,6 +207,25 @@ describe('FlatTree', () => { cy.document().realPress('Tab'); cy.get('#action').should('be.focused'); }); + describe('navigationMode="treegrid"', () => { + it('should focus on actions/treeitem when pressing right/left arrow', () => { + mount( + <TreeTest openItems={['item1']} navigationMode="treegrid" id="tree" aria-label="Tree"> + <TreeItem itemType="branch" value="item1" data-testid="item1"> + <TreeItemLayout actions={<Button id="action">action</Button>}>level 1, item 1</TreeItemLayout> + <Tree> + <TreeItem itemType="leaf" value="item1__item1" data-testid="item1__item1"> + <TreeItemLayout>level 2, item 1</TreeItemLayout> + </TreeItem> + </Tree> + </TreeItem> + </TreeTest>, + ); + cy.get('[data-testid="item1"]').focus().realPress('{rightarrow}'); + cy.get('#action').should('be.focused').realPress('{leftarrow}'); + cy.get('[data-testid="item1"]').should('be.focused'); + }); + }); it('should not expand/collapse item on actions Enter/Space key', () => { mount( <TreeTest id="tree" aria-label="Tree"> @@ -250,25 +269,50 @@ describe('FlatTree', () => { cy.get('[data-testid="item2"]').should('be.focused'); cy.focused().realPress('Tab').should('not.exist'); }); - it('should move with Left/Right keys', () => { - mount(<TreeTest defaultOpenItems={['item2', 'item2__item1']} />); - cy.get('[data-testid="item1"]').focus().realPress('{downarrow}'); - cy.get('[data-testid="item2"]').should('be.focused').realPress('{rightarrow}'); - cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{rightarrow}'); - cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress('{leftarrow}'); - cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{leftarrow}').realPress('{leftarrow}'); - cy.get('[data-testid="item2"]').should('be.focused'); - }); - it('should not move with Alt + Left/Right keys', () => { - mount(<TreeTest defaultOpenItems={['item2', 'item2__item1']} />); - cy.get('[data-testid="item1"]').focus().realPress('{downarrow}'); - cy.get('[data-testid="item2"]').should('be.focused').realPress(['Alt', '{rightarrow}']); - cy.get('[data-testid="item2"]').should('be.focused').realPress('{rightarrow}'); - cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{rightarrow}'); - cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress(['Alt', '{leftarrow}']); - cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress('{leftarrow}'); - cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{leftarrow}').realPress('{leftarrow}'); - cy.get('[data-testid="item2"]').should('be.focused'); + describe('navigationMode="treegrid"', () => { + it('should move with Up/Down keys', () => { + mount( + <TreeTest openItems={['item1']} navigationMode="treegrid" id="tree" aria-label="Tree"> + <TreeItem itemType="branch" value="item1" data-testid="item1"> + <TreeItemLayout>level 1, item 1</TreeItemLayout> + <Tree> + <TreeItem itemType="leaf" value="item1__item1" data-testid="item1__item1"> + <TreeItemLayout actions={<Button id="action">action</Button>}>level 2, item 1</TreeItemLayout> + </TreeItem> + <TreeItem itemType="leaf" value="item1__item2" data-testid="item1__item2"> + <TreeItemLayout>level 2, item 2</TreeItemLayout> + </TreeItem> + </Tree> + </TreeItem> + </TreeTest>, + ); + cy.get('[data-testid="item1__item1"]').focus().realPress('{rightarrow}'); + cy.get('#action').should('be.focused').realPress('{uparrow}'); + cy.get('[data-testid="item1"]').should('be.focused'); + cy.get('[data-testid="item1__item1"]').focus().realPress('{rightarrow}'); + cy.get('#action').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item1__item2"]').should('be.focused'); + }); + it('should move with Left keys', () => { + mount(<TreeTest navigationMode="treegrid" defaultOpenItems={['item2', 'item2__item1']} />); + cy.get('[data-testid="item1"]').focus().realPress('{downarrow}'); + cy.get('[data-testid="item2"]').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress('{leftarrow}'); + cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{leftarrow}').realPress('{leftarrow}'); + cy.get('[data-testid="item2"]').should('be.focused'); + }); + + it('should not move with Alt + Left keys', () => { + mount(<TreeTest navigationMode="treegrid" defaultOpenItems={['item2', 'item2__item1']} />); + cy.get('[data-testid="item1"]').focus().realPress('{downarrow}'); + cy.get('[data-testid="item2"]').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress(['Alt', '{leftarrow}']); + cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress('{leftarrow}'); + cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{leftarrow}').realPress('{leftarrow}'); + cy.get('[data-testid="item2"]').should('be.focused'); + }); }); it('should move to last item with End key', () => { mount(<TreeTest defaultOpenItems={['item1', 'item2', 'item2__item1']} />); diff --git a/packages/react-components/react-tree/library/src/components/FlatTree/FlatTree.types.ts b/packages/react-components/react-tree/library/src/components/FlatTree/FlatTree.types.ts index 56e8b8a0312181..51ca908f5c16a4 100644 --- a/packages/react-components/react-tree/library/src/components/FlatTree/FlatTree.types.ts +++ b/packages/react-components/react-tree/library/src/components/FlatTree/FlatTree.types.ts @@ -19,6 +19,13 @@ export type FlatTreeContextValues = { }; export type FlatTreeProps = ComponentProps<TreeSlots> & { + /** + * Indicates how navigation between a treeitem and its actions work + * - 'tree' (default): The default navigation, pressing right arrow key navigates inward the first inner children of a branch treeitem + * - 'treegrid': Pressing right arrow key navigate towards the actions of a treeitem + * @default 'tree' + */ + navigationMode?: 'tree' | 'treegrid'; /** * A tree item can have various appearances: * - 'subtle' (default): The default tree item styles. diff --git a/packages/react-components/react-tree/library/src/components/FlatTree/useFlatTree.ts b/packages/react-components/react-tree/library/src/components/FlatTree/useFlatTree.ts index 12d019abab8748..5e7610a3193a3c 100644 --- a/packages/react-components/react-tree/library/src/components/FlatTree/useFlatTree.ts +++ b/packages/react-components/react-tree/library/src/components/FlatTree/useFlatTree.ts @@ -22,7 +22,7 @@ export const useFlatTree_unstable: (props: FlatTreeProps, ref: React.Ref<HTMLEle }; function useRootFlatTree(props: FlatTreeProps, ref: React.Ref<HTMLElement>): FlatTreeState { - const navigation = useFlatTreeNavigation(); + const navigation = useFlatTreeNavigation(props.navigationMode); return Object.assign( useRootTree( diff --git a/packages/react-components/react-tree/library/src/components/FlatTree/useFlatTreeContextValues.ts b/packages/react-components/react-tree/library/src/components/FlatTree/useFlatTreeContextValues.ts index a06d65e2ec568d..9c30a476081ed7 100644 --- a/packages/react-components/react-tree/library/src/components/FlatTree/useFlatTreeContextValues.ts +++ b/packages/react-components/react-tree/library/src/components/FlatTree/useFlatTreeContextValues.ts @@ -9,6 +9,7 @@ export const useFlatTreeContextValues_unstable = (state: FlatTreeState): FlatTre treeType, checkedItems, selectionMode, + navigationMode, appearance, size, requestTreeResponse, @@ -25,6 +26,7 @@ export const useFlatTreeContextValues_unstable = (state: FlatTreeState): FlatTre appearance, checkedItems, selectionMode, + navigationMode, contextType, level, requestTreeResponse, diff --git a/packages/react-components/react-tree/library/src/components/Tree/Tree.cy.tsx b/packages/react-components/react-tree/library/src/components/Tree/Tree.cy.tsx index 0413eafba5eb90..87ae49eedd53dd 100644 --- a/packages/react-components/react-tree/library/src/components/Tree/Tree.cy.tsx +++ b/packages/react-components/react-tree/library/src/components/Tree/Tree.cy.tsx @@ -188,6 +188,25 @@ describe('Tree', () => { cy.document().realPress('Tab'); cy.get('#action').should('be.focused'); }); + describe('navigationMode="treegrid"', () => { + it('should focus on actions/treeitem when pressing right/left arrow', () => { + mount( + <TreeTest openItems={['item1']} navigationMode="treegrid" id="tree" aria-label="Tree"> + <TreeItem itemType="branch" value="item1" data-testid="item1"> + <TreeItemLayout actions={<Button id="action">action</Button>}>level 1, item 1</TreeItemLayout> + <Tree> + <TreeItem itemType="leaf" value="item1__item1" data-testid="item1__item1"> + <TreeItemLayout>level 2, item 1</TreeItemLayout> + </TreeItem> + </Tree> + </TreeItem> + </TreeTest>, + ); + cy.get('[data-testid="item1"]').focus().realPress('{rightarrow}'); + cy.get('#action').should('be.focused').realPress('{leftarrow}'); + cy.get('[data-testid="item1"]').should('be.focused'); + }); + }); it('should not expand/collapse item on actions Enter/Space key', () => { mount( <TreeTest id="tree" aria-label="Tree"> @@ -231,25 +250,49 @@ describe('Tree', () => { cy.get('[data-testid="item2"]').should('be.focused'); cy.focused().realPress('Tab').should('not.exist'); }); - it('should move with Left/Right keys', () => { - mount(<TreeTest defaultOpenItems={['item2', 'item2__item1']} />); - cy.get('[data-testid="item1"]').focus().realPress('{downarrow}'); - cy.get('[data-testid="item2"]').should('be.focused').realPress('{rightarrow}'); - cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{rightarrow}'); - cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress('{leftarrow}'); - cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{leftarrow}').realPress('{leftarrow}'); - cy.get('[data-testid="item2"]').should('be.focused'); - }); - it('should not move with Alt + Left/Right keys', () => { - mount(<TreeTest defaultOpenItems={['item2', 'item2__item1']} />); - cy.get('[data-testid="item1"]').focus().realPress('{downarrow}'); - cy.get('[data-testid="item2"]').should('be.focused').realPress(['Alt', '{rightarrow}']); - cy.get('[data-testid="item2"]').should('be.focused').realPress('{rightarrow}'); - cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{rightarrow}'); - cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress(['Alt', '{leftarrow}']); - cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress('{leftarrow}'); - cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{leftarrow}').realPress('{leftarrow}'); - cy.get('[data-testid="item2"]').should('be.focused'); + describe('navigationMode="treegrid"', () => { + it('should move with Up/Down keys', () => { + mount( + <TreeTest openItems={['item1']} navigationMode="treegrid" id="tree" aria-label="Tree"> + <TreeItem itemType="branch" value="item1" data-testid="item1"> + <TreeItemLayout>level 1, item 1</TreeItemLayout> + <Tree> + <TreeItem itemType="leaf" value="item1__item1" data-testid="item1__item1"> + <TreeItemLayout actions={<Button id="action">action</Button>}>level 2, item 1</TreeItemLayout> + </TreeItem> + <TreeItem itemType="leaf" value="item1__item2" data-testid="item1__item2"> + <TreeItemLayout>level 2, item 2</TreeItemLayout> + </TreeItem> + </Tree> + </TreeItem> + </TreeTest>, + ); + cy.get('[data-testid="item1__item1"]').focus().realPress('{rightarrow}'); + cy.get('#action').should('be.focused').realPress('{uparrow}'); + cy.get('[data-testid="item1"]').should('be.focused'); + cy.get('[data-testid="item1__item1"]').focus().realPress('{rightarrow}'); + cy.get('#action').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item1__item2"]').should('be.focused'); + }); + it('should move with Left keys', () => { + mount(<TreeTest navigationMode="treegrid" defaultOpenItems={['item2', 'item2__item1']} />); + cy.get('[data-testid="item1"]').focus().realPress('{downarrow}'); + cy.get('[data-testid="item2"]').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress('{leftarrow}'); + cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{leftarrow}').realPress('{leftarrow}'); + cy.get('[data-testid="item2"]').should('be.focused'); + }); + it('should not move with Alt + Left keys', () => { + mount(<TreeTest navigationMode="treegrid" defaultOpenItems={['item2', 'item2__item1']} />); + cy.get('[data-testid="item1"]').focus().realPress('{downarrow}'); + cy.get('[data-testid="item2"]').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{downarrow}'); + cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress(['Alt', '{leftarrow}']); + cy.get('[data-testid="item2__item1__item1"]').should('be.focused').realPress('{leftarrow}'); + cy.get('[data-testid="item2__item1"]').should('be.focused').realPress('{leftarrow}').realPress('{leftarrow}'); + cy.get('[data-testid="item2"]').should('be.focused'); + }); }); it('should move to last item with End key', () => { mount(<TreeTest defaultOpenItems={['item1', 'item2', 'item2__item1']} />); diff --git a/packages/react-components/react-tree/library/src/components/Tree/Tree.types.ts b/packages/react-components/react-tree/library/src/components/Tree/Tree.types.ts index 959ba074dcad9b..92f6f8824ee01a 100644 --- a/packages/react-components/react-tree/library/src/components/Tree/Tree.types.ts +++ b/packages/react-components/react-tree/library/src/components/Tree/Tree.types.ts @@ -91,7 +91,16 @@ export type TreeContextValues = { tree: TreeContextValue | SubtreeContextValue; }; +export type TreeNavigationMode = 'tree' | 'treegrid'; + export type TreeProps = ComponentProps<TreeSlots> & { + /** + * Indicates how navigation between a treeitem and its actions work + * - 'tree' (default): The default navigation, pressing right arrow key navigates inward the first inner children of a branch treeitem + * - 'treegrid': Pressing right arrow key navigate towards the actions of a treeitem + * @default 'tree' + */ + navigationMode?: TreeNavigationMode; /** * A tree item can have various appearances: * - 'subtle' (default): The default tree item styles. diff --git a/packages/react-components/react-tree/library/src/components/Tree/index.ts b/packages/react-components/react-tree/library/src/components/Tree/index.ts index c49dc6c59cd400..6d35eba2306cad 100644 --- a/packages/react-components/react-tree/library/src/components/Tree/index.ts +++ b/packages/react-components/react-tree/library/src/components/Tree/index.ts @@ -11,6 +11,7 @@ export type { TreeSelectionValue, TreeSlots, TreeState, + TreeNavigationMode, } from './Tree.types'; export { useTree_unstable } from './useTree'; export { useTreeContextValues_unstable } from './useTreeContextValues'; diff --git a/packages/react-components/react-tree/library/src/components/Tree/useTree.ts b/packages/react-components/react-tree/library/src/components/Tree/useTree.ts index 233b7fdf32628b..625dd6d5fe299a 100644 --- a/packages/react-components/react-tree/library/src/components/Tree/useTree.ts +++ b/packages/react-components/react-tree/library/src/components/Tree/useTree.ts @@ -26,7 +26,7 @@ function useNestedRootTree(props: TreeProps, ref: React.Ref<HTMLElement>): TreeS const [openItems, setOpenItems] = useControllableOpenItems(props); const checkedItems = useNestedCheckedItems(props); - const navigation = useTreeNavigation(); + const navigation = useTreeNavigation(props.navigationMode); return Object.assign( useRootTree( diff --git a/packages/react-components/react-tree/library/src/components/Tree/useTreeContextValues.ts b/packages/react-components/react-tree/library/src/components/Tree/useTreeContextValues.ts index fdfa26728522c6..4431b8be3909f8 100644 --- a/packages/react-components/react-tree/library/src/components/Tree/useTreeContextValues.ts +++ b/packages/react-components/react-tree/library/src/components/Tree/useTreeContextValues.ts @@ -13,6 +13,7 @@ export function useTreeContextValues_unstable(state: TreeState): TreeContextValu treeType, checkedItems, selectionMode, + navigationMode, appearance, size, requestTreeResponse, @@ -29,6 +30,7 @@ export function useTreeContextValues_unstable(state: TreeState): TreeContextValu appearance, checkedItems, selectionMode, + navigationMode, contextType, level, requestTreeResponse, diff --git a/packages/react-components/react-tree/library/src/components/TreeItem/useTreeItem.tsx b/packages/react-components/react-tree/library/src/components/TreeItem/useTreeItem.tsx index 0b01ccce4a61c0..bc6c4400e0c306 100644 --- a/packages/react-components/react-tree/library/src/components/TreeItem/useTreeItem.tsx +++ b/packages/react-components/react-tree/library/src/components/TreeItem/useTreeItem.tsx @@ -7,6 +7,7 @@ import { slot, elementContains, useMergedRefs, + isHTMLElement, } from '@fluentui/react-utilities'; import type { TreeItemProps, TreeItemState, TreeItemValue } from './TreeItem.types'; import { Space } from '@fluentui/keyboard-keys'; @@ -38,6 +39,7 @@ export function useTreeItem_unstable(props: TreeItemProps, ref: React.Ref<HTMLDi warnIfNoProperPropsFlatTreeItem(props); } const requestTreeResponse = useTreeContext_unstable(ctx => ctx.requestTreeResponse); + const navigationMode = useTreeContext_unstable(ctx => ctx.navigationMode ?? 'tree'); const forceUpdateRovingTabIndex = useTreeContext_unstable(ctx => ctx.forceUpdateRovingTabIndex); const { level: contextLevel } = useSubtreeContext_unstable(); const parentValue = useTreeItemContext_unstable(ctx => props.parentValue ?? ctx.value); @@ -147,25 +149,36 @@ export function useTreeItem_unstable(props: TreeItemProps, ref: React.Ref<HTMLDi const handleKeyDown = useEventCallback((event: React.KeyboardEvent<HTMLDivElement>) => { onKeyDown?.(event); - // Ignore keyboard events that do not originate from the current tree item. - if (event.isDefaultPrevented() || event.currentTarget !== event.target) { + if (event.isDefaultPrevented() || !treeItemRef.current) { return; } + const isEventFromTreeItem = event.currentTarget === event.target; + const isEventFromActions = actionsRef.current && actionsRef.current.contains(event.target as Node); + switch (event.key) { - case Space: + case Space: { + if (!isEventFromTreeItem) { + return; + } if (selectionMode !== 'none') { selectionRef.current?.click(); // Prevents the page from scrolling down when the spacebar is pressed event.preventDefault(); } return; + } case treeDataTypes.Enter: { + if (!isEventFromTreeItem) { + return; + } return event.currentTarget.click(); } case treeDataTypes.End: case treeDataTypes.Home: - case treeDataTypes.ArrowUp: - case treeDataTypes.ArrowDown: + case treeDataTypes.ArrowUp: { + if (!isEventFromTreeItem && !isEventFromActions) { + return; + } return requestTreeResponse({ requestType: 'navigate', event, @@ -175,40 +188,63 @@ export function useTreeItem_unstable(props: TreeItemProps, ref: React.Ref<HTMLDi type: event.key, target: event.currentTarget, }); + } + case treeDataTypes.ArrowDown: { + if (!isEventFromTreeItem && !isEventFromActions) { + return; + } + if (isEventFromActions && (!isHTMLElement(event.target) || event.target.hasAttribute('aria-haspopup'))) { + return; + } + return requestTreeResponse({ + requestType: 'navigate', + event, + value, + itemType, + parentValue, + type: event.key, + target: event.currentTarget, + }); + } case treeDataTypes.ArrowLeft: { // arrow left with alt key is reserved for history navigation if (event.altKey) { return; } - // do not navigate to parent if the item is on the top level - if (level === 1 && !open) { - return; - } const data = { value, event, open: getNextOpen(), type: event.key, + itemType, + parentValue, target: event.currentTarget, } as const; + + if (isEventFromActions && navigationMode === 'treegrid') { + requestTreeResponse({ ...data, requestType: 'navigate' }); + return; + } + if (!isEventFromTreeItem) { + return; + } + // do not navigate to parent if the item is on the top level + if (level === 1 && !open) { + return; + } if (open) { props.onOpenChange?.(event, data); } - requestTreeResponse({ - ...data, - itemType, - parentValue, - requestType: open ? 'open' : 'navigate', - }); + requestTreeResponse({ ...data, requestType: open ? 'open' : 'navigate' }); return; } case treeDataTypes.ArrowRight: { - // arrow right with alt key is reserved for history navigation - if (event.altKey) { + // Ignore keyboard events that do not originate from the current tree item. + if (!isEventFromTreeItem) { return; } - // do not navigate or open if the item is a leaf - if (itemType === 'leaf') { + // arrow right with alt key is reserved for history navigation + if (event.altKey) { return; } const data = { @@ -218,18 +254,20 @@ export function useTreeItem_unstable(props: TreeItemProps, ref: React.Ref<HTMLDi type: event.key, target: event.currentTarget, } as const; - if (!open) { + + if (itemType === 'branch' && !open) { props.onOpenChange?.(event, data); + requestTreeResponse({ ...data, itemType, requestType: 'open' }); + } else { + requestTreeResponse({ ...data, itemType, parentValue, requestType: 'navigate' }); } - requestTreeResponse({ - ...data, - itemType, - parentValue, - requestType: open ? 'navigate' : 'open', - }); return; } } + // Ignore keyboard events that do not originate from the current tree item. + if (!isEventFromTreeItem) { + return; + } const isTypeAheadCharacter = event.key.length === 1 && event.key.match(/\w/) && !event.altKey && !event.ctrlKey && !event.metaKey; if (isTypeAheadCharacter) { diff --git a/packages/react-components/react-tree/library/src/components/TreeItemLayout/useTreeItemLayout.tsx b/packages/react-components/react-tree/library/src/components/TreeItemLayout/useTreeItemLayout.tsx index 53a4092e107c35..37d09af613ad9a 100644 --- a/packages/react-components/react-tree/library/src/components/TreeItemLayout/useTreeItemLayout.tsx +++ b/packages/react-components/react-tree/library/src/components/TreeItemLayout/useTreeItemLayout.tsx @@ -39,6 +39,7 @@ export const useTreeItemLayout_unstable = ( const layoutRef = useTreeItemContext_unstable(ctx => ctx.layoutRef); const selectionMode = useTreeContext_unstable(ctx => ctx.selectionMode); + const navigationMode = useTreeContext_unstable(ctx => ctx.navigationMode ?? 'tree'); const [isActionsVisibleFromProps, onActionVisibilityChange]: [ TreeItemLayoutActionSlotProps['visible'], @@ -134,7 +135,7 @@ export const useTreeItemLayout_unstable = ( if (expandIcon) { expandIcon.ref = expandIconRefs; } - const arrowNavigationProps = useArrowNavigationGroup({ circular: true, axis: 'horizontal' }); + const arrowNavigationProps = useArrowNavigationGroup({ circular: navigationMode === 'tree', axis: 'horizontal' }); const actions = isActionsVisible ? slot.optional(props.actions, { defaultProps: { ...arrowNavigationProps, role: 'toolbar' }, @@ -143,6 +144,7 @@ export const useTreeItemLayout_unstable = ( : undefined; delete actions?.visible; delete actions?.onVisibilityChange; + const actionsRefs = useMergedRefs(actions?.ref, actionsRef, actionsRefInternal); const handleActionsBlur = useEventCallback((event: React.FocusEvent<HTMLDivElement>) => { if (isResolvedShorthand(props.actions)) { diff --git a/packages/react-components/react-tree/library/src/contexts/treeContext.ts b/packages/react-components/react-tree/library/src/contexts/treeContext.ts index 721a33fb67b3d5..e81a4868f0c5d4 100644 --- a/packages/react-components/react-tree/library/src/contexts/treeContext.ts +++ b/packages/react-components/react-tree/library/src/contexts/treeContext.ts @@ -21,6 +21,9 @@ export type TreeContextValue = { // FIXME: this is only marked as optional to avoid breaking changes // it should always be provided internally forceUpdateRovingTabIndex?(): void; + // FIXME: this is only marked as optional to avoid breaking changes + // it should always be provided internally + navigationMode?: 'tree' | 'treegrid'; }; export type TreeItemRequest = { itemType: TreeItemType } & ( @@ -43,6 +46,7 @@ const defaultTreeContextValue: TreeContextValue = { forceUpdateRovingTabIndex: noop, appearance: 'subtle', size: 'medium', + navigationMode: 'tree', }; function noop() { diff --git a/packages/react-components/react-tree/library/src/hooks/useFlatTreeNavigation.ts b/packages/react-components/react-tree/library/src/hooks/useFlatTreeNavigation.ts index cf1cbaf262e092..7c40d566b825ad 100644 --- a/packages/react-components/react-tree/library/src/hooks/useFlatTreeNavigation.ts +++ b/packages/react-components/react-tree/library/src/hooks/useFlatTreeNavigation.ts @@ -8,12 +8,16 @@ import { TreeItemValue } from '../TreeItem'; import { dataTreeItemValueAttrName } from '../utils/getTreeItemValueFromElement'; import * as React from 'react'; import { useHTMLElementWalkerRef } from './useHTMLElementWalkerRef'; +import { TreeNavigationMode } from '../components/Tree/Tree.types'; +import { useFocusFinders } from '@fluentui/react-tabster'; +import { treeItemLayoutClassNames } from '../TreeItemLayout'; -export function useFlatTreeNavigation() { +export function useFlatTreeNavigation(navigationMode: TreeNavigationMode = 'tree') { 'use no memo'; const { walkerRef, rootRef: walkerRootRef } = useHTMLElementWalkerRef(); const { rove, forceUpdate: forceUpdateRovingTabIndex, initialize: initializeRovingTabIndex } = useRovingTabIndex(); + const { findFirstFocusable } = useFocusFinders(); const rootRefCallback: React.RefCallback<HTMLElement> = React.useCallback( root => { @@ -35,6 +39,10 @@ export function useFlatTreeNavigation() { walkerRef.current.currentElement = data.target; return nextTypeAheadElement(walkerRef.current, data.event.key); case treeDataTypes.ArrowLeft: { + const actions = queryActions(data.target); + if (navigationMode === 'treegrid' && actions?.contains(data.target.ownerDocument.activeElement)) { + return data.target; + } const nextElement = parentElement(data.parentValue, walkerRef.current); if (!nextElement && process.env.NODE_ENV !== 'production') { // eslint-disable-next-line no-console @@ -50,6 +58,13 @@ export function useFlatTreeNavigation() { return nextElement; } case treeDataTypes.ArrowRight: { + if (navigationMode === 'treegrid') { + const actions = queryActions(data.target); + if (actions) { + findFirstFocusable(actions)?.focus(); + } + return null; + } walkerRef.current.currentElement = data.target; const nextElement = firstChild(data.target, walkerRef.current); if (!nextElement && process.env.NODE_ENV !== 'production') { @@ -114,3 +129,8 @@ function parentElement(parentValue: TreeItemValue | undefined, treeWalker: HTMLE } return treeWalker.root.querySelector<HTMLElement>(`[${dataTreeItemValueAttrName}="${parentValue}"]`); } + +const queryActions = (target: HTMLElement) => + target.querySelector<HTMLElement>( + `:scope > .${treeItemLayoutClassNames.root} > .${treeItemLayoutClassNames.actions}`, + ); diff --git a/packages/react-components/react-tree/library/src/hooks/useRootTree.ts b/packages/react-components/react-tree/library/src/hooks/useRootTree.ts index f127e698d88e29..f7714274176ce1 100644 --- a/packages/react-components/react-tree/library/src/hooks/useRootTree.ts +++ b/packages/react-components/react-tree/library/src/hooks/useRootTree.ts @@ -88,6 +88,7 @@ export function useRootTree( }, contextType: 'root', selectionMode, + navigationMode: props.navigationMode ?? 'tree', open: true, appearance, size, diff --git a/packages/react-components/react-tree/library/src/hooks/useTreeNavigation.ts b/packages/react-components/react-tree/library/src/hooks/useTreeNavigation.ts index 93e85bfbef4473..c6f82d19a7afc0 100644 --- a/packages/react-components/react-tree/library/src/hooks/useTreeNavigation.ts +++ b/packages/react-components/react-tree/library/src/hooks/useTreeNavigation.ts @@ -1,4 +1,4 @@ -import { TreeNavigationData_unstable } from '../components/Tree/Tree.types'; +import { TreeNavigationData_unstable, TreeNavigationMode } from '../components/Tree/Tree.types'; import { nextTypeAheadElement } from '../utils/nextTypeAheadElement'; import { treeDataTypes } from '../utils/tokens'; import { useRovingTabIndex } from './useRovingTabIndexes'; @@ -6,14 +6,17 @@ import { HTMLElementWalker } from '../utils/createHTMLElementWalker'; import * as React from 'react'; import { useHTMLElementWalkerRef } from './useHTMLElementWalkerRef'; import { useMergedRefs } from '@fluentui/react-utilities'; +import { treeItemLayoutClassNames } from '../TreeItemLayout'; +import { useFocusFinders } from '@fluentui/react-tabster'; /** * @internal */ -export function useTreeNavigation() { +export function useTreeNavigation(navigationMode: TreeNavigationMode = 'tree') { 'use no memo'; const { rove, initialize: initializeRovingTabIndex, forceUpdate: forceUpdateRovingTabIndex } = useRovingTabIndex(); + const { findFirstFocusable } = useFocusFinders(); const { walkerRef, rootRef: walkerRootRef } = useHTMLElementWalkerRef(); const rootRefCallback: React.RefCallback<HTMLElement> = React.useCallback( @@ -35,10 +38,22 @@ export function useTreeNavigation() { case treeDataTypes.TypeAhead: walkerRef.current.currentElement = data.target; return nextTypeAheadElement(walkerRef.current, data.event.key); - case treeDataTypes.ArrowLeft: + case treeDataTypes.ArrowLeft: { + const actions = queryActions(data.target); + if (navigationMode === 'treegrid' && actions?.contains(data.target.ownerDocument.activeElement)) { + return data.target; + } walkerRef.current.currentElement = data.target; return walkerRef.current.parentElement(); + } case treeDataTypes.ArrowRight: + if (navigationMode === 'treegrid') { + const actions = queryActions(data.target); + if (actions) { + findFirstFocusable(actions)?.focus(); + } + return null; + } walkerRef.current.currentElement = data.target; return walkerRef.current.firstChild(); case treeDataTypes.End: @@ -76,3 +91,8 @@ function lastChildRecursive(walker: HTMLElementWalker) { } return lastElement; } + +const queryActions = (target: HTMLElement) => + target.querySelector<HTMLElement>( + `:scope > .${treeItemLayoutClassNames.root} > .${treeItemLayoutClassNames.actions}`, + ); diff --git a/packages/react-components/react-tree/library/src/index.ts b/packages/react-components/react-tree/library/src/index.ts index bb0478843dcf80..eba48f9ef7c7bb 100644 --- a/packages/react-components/react-tree/library/src/index.ts +++ b/packages/react-components/react-tree/library/src/index.ts @@ -19,6 +19,7 @@ export type { TreeCheckedChangeEvent, TreeNavigationData_unstable, TreeNavigationEvent_unstable, + TreeNavigationMode, } from './Tree'; export { diff --git a/packages/react-components/react-tree/stories/src/Tree/TreeNavigationModeTreeGrid.stories.tsx b/packages/react-components/react-tree/stories/src/Tree/TreeNavigationModeTreeGrid.stories.tsx new file mode 100644 index 00000000000000..bbbae19d853bbe --- /dev/null +++ b/packages/react-components/react-tree/stories/src/Tree/TreeNavigationModeTreeGrid.stories.tsx @@ -0,0 +1,118 @@ +import * as React from 'react'; +import { Tree, TreeItem, TreeItemLayout, TreeItemProps } from '@fluentui/react-components'; +import { Edit20Regular, MoreHorizontal20Regular } from '@fluentui/react-icons'; +import { + Button, + Menu, + MenuItem, + MenuList, + MenuPopover, + MenuTrigger, + useRestoreFocusTarget, +} from '@fluentui/react-components'; + +type CustomTreeItemProps = TreeItemProps; + +const CustomTreeItem = ({ children, ...props }: CustomTreeItemProps) => { + const focusTargetAttribute = useRestoreFocusTarget(); + const [layoutChildren, subtree] = React.Children.toArray(children); + + // same items to be used between contextmenu and actions + const commonMenuItems = ( + <> + <MenuItem>New </MenuItem> + <MenuItem>New Window</MenuItem> + <MenuItem disabled>Open File</MenuItem> + <MenuItem>Open Folder</MenuItem> + </> + ); + + return ( + <Menu positioning="below-end" openOnContext> + <MenuTrigger disableButtonEnhancement> + <TreeItem aria-description="has actions" {...focusTargetAttribute} {...props}> + <TreeItemLayout + actions={ + <> + <Button aria-label="Edit" appearance="subtle" icon={<Edit20Regular />} /> + <Menu> + <MenuTrigger disableButtonEnhancement> + <Button aria-label="More options" appearance="subtle" icon={<MoreHorizontal20Regular />} /> + </MenuTrigger> + <MenuPopover> + <MenuList>{commonMenuItems}</MenuList> + </MenuPopover> + </Menu> + </> + } + > + {layoutChildren} + </TreeItemLayout> + {subtree} + </TreeItem> + </MenuTrigger> + <MenuPopover> + <MenuList> + <MenuItem>Edit</MenuItem> + {commonMenuItems} + </MenuList> + </MenuPopover> + </Menu> + ); +}; + +export const NavigationModeTreeGrid = () => { + return ( + <Tree navigationMode="treegrid" aria-label="Actions"> + <CustomTreeItem itemType="branch"> + item 1 + <Tree> + <CustomTreeItem itemType="branch"> + item 1-1 + <Tree> + <CustomTreeItem itemType="leaf">item 1-1-1</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 1-1-2</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 1-1-3</CustomTreeItem> + </Tree> + </CustomTreeItem> + <CustomTreeItem itemType="leaf">item 1-2</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 1-3</CustomTreeItem> + </Tree> + </CustomTreeItem> + <CustomTreeItem itemType="branch"> + item 2 + <Tree> + <CustomTreeItem itemType="branch"> + item 2-1 + <Tree> + <CustomTreeItem itemType="leaf">item 2-1-1</CustomTreeItem> + </Tree> + </CustomTreeItem> + + <CustomTreeItem itemType="branch"> + item 3 + <Tree> + <CustomTreeItem itemType="leaf">item 3-1</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 3-2</CustomTreeItem> + <CustomTreeItem itemType="leaf">item 3-3</CustomTreeItem> + </Tree> + </CustomTreeItem> + </Tree> + </CustomTreeItem> + </Tree> + ); +}; + +NavigationModeTreeGrid.parameters = { + docs: { + description: { + story: ` +If \`navigationMode\` is set to \`treegrid\`, the navigation pattern changes to allow navigation between tree items and their actions. + +1. If the treeitem is a branch and it's not expanded, pressing right arrow key will expand the treeitem. +2. If the treeitem is a branch and it's expanded, pressing right arrow key will navigate towards the actions of the treeitem. +3. If focused in the actions, pressing left arrow key will navigate back to the treeitem. +`, + }, + }, +}; diff --git a/packages/react-components/react-tree/stories/src/Tree/index.stories.tsx b/packages/react-components/react-tree/stories/src/Tree/index.stories.tsx index ac5aa99c24248b..cfbc1e6fd3973e 100644 --- a/packages/react-components/react-tree/stories/src/Tree/index.stories.tsx +++ b/packages/react-components/react-tree/stories/src/Tree/index.stories.tsx @@ -20,6 +20,7 @@ export { ExpandIcon } from './TreeExpandIcon.stories'; export { IconBeforeAndAfter } from './TreeIconBeforeAndAfter.stories'; export { Aside } from './TreeAside.stories'; export { Actions } from './TreeActions.stories'; +export { NavigationModeTreeGrid } from './TreeNavigationModeTreeGrid.stories'; // FUNCTIONAL EXAMPLES export { DefaultOpen } from './TreeDefaultOpen.stories'; From e706ac0ac7f2aa46a7f6f48efda24938a539a835 Mon Sep 17 00:00:00 2001 From: Bernardo Sunderhus <bernardo.sunderhus@gmail.com> Date: Tue, 21 Jan 2025 15:49:24 +0100 Subject: [PATCH 68/78] feature(react-tag-picker): single line layout (#32247) --- ...-2c418aac-078d-45dc-ad47-4bf796a2e600.json | 7 + ...-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json | 7 + .../etc/react-components.api.md | 6 + .../react-components/src/index.ts | 2 + .../library/etc/react-tag-picker.api.md | 24 +++ .../useTagPickerControlStyles.styles.ts | 19 +- .../react-tag-picker/library/src/index.ts | 3 + .../TagPicker/TagPickerSingleLine.stories.tsx | 199 ++++++++++++++++++ .../stories/src/TagPicker/index.stories.tsx | 1 + 9 files changed, 263 insertions(+), 5 deletions(-) create mode 100644 change/@fluentui-react-components-2c418aac-078d-45dc-ad47-4bf796a2e600.json create mode 100644 change/@fluentui-react-tag-picker-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json create mode 100644 packages/react-components/react-tag-picker/stories/src/TagPicker/TagPickerSingleLine.stories.tsx diff --git a/change/@fluentui-react-components-2c418aac-078d-45dc-ad47-4bf796a2e600.json b/change/@fluentui-react-components-2c418aac-078d-45dc-ad47-4bf796a2e600.json new file mode 100644 index 00000000000000..d1657869b81f19 --- /dev/null +++ b/change/@fluentui-react-components-2c418aac-078d-45dc-ad47-4bf796a2e600.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "feature: re-export react-tag-picker context", + "packageName": "@fluentui/react-components", + "email": "bernardo.sunderhus@gmail.com", + "dependentChangeType": "patch" +} diff --git a/change/@fluentui-react-tag-picker-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json b/change/@fluentui-react-tag-picker-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json new file mode 100644 index 00000000000000..9060ffa1cb620a --- /dev/null +++ b/change/@fluentui-react-tag-picker-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json @@ -0,0 +1,7 @@ +{ + "type": "minor", + "comment": "feature: single line layout", + "packageName": "@fluentui/react-tag-picker", + "email": "bernardo.sunderhus@gmail.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-components/etc/react-components.api.md b/packages/react-components/react-components/etc/react-components.api.md index a64d3393804726..9fa63ed455f95c 100644 --- a/packages/react-components/react-components/etc/react-components.api.md +++ b/packages/react-components/react-components/etc/react-components.api.md @@ -1135,6 +1135,7 @@ import { tagPickerButtonClassNames } from '@fluentui/react-tag-picker'; import { TagPickerButtonProps } from '@fluentui/react-tag-picker'; import { TagPickerButtonSlots } from '@fluentui/react-tag-picker'; import { TagPickerButtonState } from '@fluentui/react-tag-picker'; +import { TagPickerContextValue } from '@fluentui/react-tag-picker'; import { TagPickerContextValues } from '@fluentui/react-tag-picker'; import { TagPickerControl } from '@fluentui/react-tag-picker'; import { tagPickerControlClassNames } from '@fluentui/react-tag-picker'; @@ -1734,6 +1735,7 @@ import { useTagGroupStyles_unstable } from '@fluentui/react-tags'; import { useTagPicker_unstable } from '@fluentui/react-tag-picker'; import { useTagPickerButton_unstable } from '@fluentui/react-tag-picker'; import { useTagPickerButtonStyles_unstable } from '@fluentui/react-tag-picker'; +import { useTagPickerContext_unstable } from '@fluentui/react-tag-picker'; import { useTagPickerControl_unstable } from '@fluentui/react-tag-picker'; import { useTagPickerControlStyles_unstable } from '@fluentui/react-tag-picker'; import { useTagPickerFilter } from '@fluentui/react-tag-picker'; @@ -4087,6 +4089,8 @@ export { TagPickerButtonSlots } export { TagPickerButtonState } +export { TagPickerContextValue } + export { TagPickerContextValues } export { TagPickerControl } @@ -5285,6 +5289,8 @@ export { useTagPickerButton_unstable } export { useTagPickerButtonStyles_unstable } +export { useTagPickerContext_unstable } + export { useTagPickerControl_unstable } export { useTagPickerControlStyles_unstable } diff --git a/packages/react-components/react-components/src/index.ts b/packages/react-components/react-components/src/index.ts index 8c37965039c6c1..32dd9b20295d32 100644 --- a/packages/react-components/react-components/src/index.ts +++ b/packages/react-components/react-components/src/index.ts @@ -1782,6 +1782,7 @@ export { useTagPickerOptionGroupStyles, useTagPickerOptionGroup, useTagPickerFilter, + useTagPickerContext_unstable, } from '@fluentui/react-tag-picker'; export type { TagPickerContextValues, @@ -1812,6 +1813,7 @@ export type { TagPickerOptionGroupProps, TagPickerOptionGroupSlots, TagPickerOptionGroupState, + TagPickerContextValue, } from '@fluentui/react-tag-picker'; export { diff --git a/packages/react-components/react-tag-picker/library/etc/react-tag-picker.api.md b/packages/react-components/react-tag-picker/library/etc/react-tag-picker.api.md index ad2eb52a97aab4..f24b3971d088c4 100644 --- a/packages/react-components/react-tag-picker/library/etc/react-tag-picker.api.md +++ b/packages/react-components/react-tag-picker/library/etc/react-tag-picker.api.md @@ -13,6 +13,7 @@ import { ComboboxSlots } from '@fluentui/react-combobox'; import type { ComboboxState } from '@fluentui/react-combobox'; import { ComponentProps } from '@fluentui/react-utilities'; import { ComponentState } from '@fluentui/react-utilities'; +import { ContextSelector } from '@fluentui/react-context-selector'; import { DropdownProps } from '@fluentui/react-combobox'; import type { EventData } from '@fluentui/react-utilities'; import type { EventHandler } from '@fluentui/react-utilities'; @@ -80,6 +81,26 @@ export type TagPickerButtonState = ComponentState<TagPickerButtonSlots> & Pick<T hasSelectedOption: boolean; }; +// @public (undocumented) +export interface TagPickerContextValue extends Pick<ComboboxBaseState, 'open' | 'clearSelection' | 'getOptionById' | 'selectedOptions' | 'selectOption' | 'setHasFocus' | 'setOpen' | 'setValue' | 'value' | 'appearance' | 'disabled'> { + // (undocumented) + noPopover?: boolean; + // (undocumented) + popoverId: string; + // (undocumented) + popoverRef: React_2.RefObject<HTMLDivElement>; + // (undocumented) + secondaryActionRef: React_2.RefObject<HTMLSpanElement>; + // (undocumented) + size: TagPickerSize; + // (undocumented) + tagPickerGroupRef: React_2.RefObject<HTMLDivElement>; + // (undocumented) + targetRef: React_2.RefObject<HTMLDivElement>; + // (undocumented) + triggerRef: React_2.RefObject<HTMLInputElement | HTMLButtonElement>; +} + // @public (undocumented) export type TagPickerContextValues = { picker: TagPickerContextValue; @@ -246,6 +267,9 @@ export const useTagPickerButton_unstable: (props: TagPickerButtonProps, ref: Rea // @public export const useTagPickerButtonStyles_unstable: (state: TagPickerButtonState) => TagPickerButtonState; +// @public (undocumented) +export const useTagPickerContext_unstable: <T>(selector: ContextSelector<TagPickerContextValue, T>) => T; + // @public export const useTagPickerControl_unstable: (props: TagPickerControlProps, ref: React_2.Ref<HTMLDivElement>) => TagPickerControlState; diff --git a/packages/react-components/react-tag-picker/library/src/components/TagPickerControl/useTagPickerControlStyles.styles.ts b/packages/react-components/react-tag-picker/library/src/components/TagPickerControl/useTagPickerControlStyles.styles.ts index 980821d8ced7a5..dcd96c40b5556d 100644 --- a/packages/react-components/react-tag-picker/library/src/components/TagPickerControl/useTagPickerControlStyles.styles.ts +++ b/packages/react-components/react-tag-picker/library/src/components/TagPickerControl/useTagPickerControlStyles.styles.ts @@ -154,13 +154,10 @@ const useStyles = makeStyles({ const useAsideStyles = makeStyles({ root: { - display: 'grid', - alignItems: 'center', + display: 'flex', position: 'absolute', top: '0', right: tokens.spacingHorizontalM, - gridTemplateColumns: 'repeat(2, auto)', - gridTemplateRows: 'minmax(32px, auto) 1fr', height: '100%', cursor: 'text', }, @@ -187,7 +184,10 @@ const useIconStyles = makeStyles({ boxSizing: 'border-box', color: tokens.colorNeutralStrokeAccessible, cursor: 'pointer', - display: 'block', + display: 'flex', + justifyContent: 'center', + alignItems: 'center', + alignSelf: 'flex-start', fontSize: tokens.fontSizeBase500, // the SVG must have display: block for accurate positioning // otherwise an extra inline space is inserted after the svg element @@ -199,14 +199,17 @@ const useIconStyles = makeStyles({ medium: { fontSize: iconSizes.small, marginLeft: tokens.spacingHorizontalXXS, + minHeight: '32px', }, large: { fontSize: iconSizes.medium, marginLeft: tokens.spacingHorizontalXXS, + minHeight: '40px', }, 'extra-large': { fontSize: iconSizes.large, marginLeft: tokens.spacingHorizontalSNudge, + minHeight: '44px', }, disabled: { color: tokens.colorNeutralForegroundDisabled, @@ -214,6 +217,10 @@ const useIconStyles = makeStyles({ }, }); +const useSecondaryActionStyles = makeStyles({ + root: { display: 'flex' }, +}); + /** * Apply styling to the PickerControl slots based on the state */ @@ -223,6 +230,7 @@ export const useTagPickerControlStyles_unstable = (state: TagPickerControlState) const styles = useStyles(); const iconStyles = useIconStyles(); const asideStyles = useAsideStyles(); + const secondaryActionStyles = useSecondaryActionStyles(); state.root.className = mergeClasses( tagPickerControlClassNames.root, styles.root, @@ -257,6 +265,7 @@ export const useTagPickerControlStyles_unstable = (state: TagPickerControlState) if (state.secondaryAction) { state.secondaryAction.className = mergeClasses( tagPickerControlClassNames.secondaryAction, + secondaryActionStyles.root, state.secondaryAction.className, ); } diff --git a/packages/react-components/react-tag-picker/library/src/index.ts b/packages/react-components/react-tag-picker/library/src/index.ts index 77af524786d038..68e8e6f000f3a5 100644 --- a/packages/react-components/react-tag-picker/library/src/index.ts +++ b/packages/react-components/react-tag-picker/library/src/index.ts @@ -71,3 +71,6 @@ export type { } from './TagPickerOptionGroup'; export { useTagPickerFilter } from './utils/useTagPickerFilter'; + +export { useTagPickerContext_unstable } from './contexts/TagPickerContext'; +export type { TagPickerContextValue } from './contexts/TagPickerContext'; diff --git a/packages/react-components/react-tag-picker/stories/src/TagPicker/TagPickerSingleLine.stories.tsx b/packages/react-components/react-tag-picker/stories/src/TagPicker/TagPickerSingleLine.stories.tsx new file mode 100644 index 00000000000000..78d105c0a449e6 --- /dev/null +++ b/packages/react-components/react-tag-picker/stories/src/TagPicker/TagPickerSingleLine.stories.tsx @@ -0,0 +1,199 @@ +import * as React from 'react'; +import { + TagPicker, + TagPickerList, + TagPickerInput, + TagPickerControl, + TagPickerProps, + TagPickerOption, + TagPickerGroup, + makeStyles, + tagPickerGroupClassNames, + useOverflowCount, + TagPickerInputProps, + useTagPickerContext_unstable, + TagProps, + Tag, + Avatar, + Overflow, + OverflowItem, +} from '@fluentui/react-components'; +import { ChevronDownRegular, ChevronUpRegular } from '@fluentui/react-icons'; + +const useStyles = makeStyles({ + focusedExpandIcon: { alignSelf: 'flex-end' }, + countButton: { minWidth: 0 }, + control: { + flexWrap: 'nowrap', + display: 'flex', + flexGrow: 1, + minWidth: 0, + overflow: 'hidden', + [`& > .${tagPickerGroupClassNames.root}`]: { + flexWrap: 'nowrap', + }, + ':focus-within': { + flexWrap: 'wrap', + [`& > .${tagPickerGroupClassNames.root}`]: { + flexWrap: 'wrap', + }, + }, + }, +}); + +const options = [ + 'John Doe', + 'Jane Doe', + 'Max Mustermann', + 'Erika Mustermann', + 'Pierre Dupont', + 'Amelie Dupont', + 'Mario Rossi', + 'Maria Rossi', +]; + +type ExpandIconProps = { open: boolean; focus: boolean }; + +const ExpandIcon = (props: ExpandIconProps) => { + const overflowCount = useOverflowCount(); + + if (props.open) { + return <ChevronUpRegular />; + } + if (overflowCount === 0 || props.focus) { + return <ChevronDownRegular />; + } + return null; +}; + +const OverFlowCountTag = (props: TagProps) => { + const overflowCount = useOverflowCount(); + const styles = useStyles(); + if (overflowCount === 0) { + return null; + } + return ( + <Tag + as="span" + role={undefined} + dismissible={false} + aria-hidden + tabIndex={-1} + {...props} + className={styles.countButton} + > + +{overflowCount} + </Tag> + ); +}; + +type CustomTagPickerInputProps = TagPickerInputProps & { focus: boolean }; + +const CustomTagPickerInput = React.forwardRef<HTMLInputElement, CustomTagPickerInputProps>( + ({ focus, onMouseDown, placeholder, ...rest }, ref) => { + const overflowCount = useOverflowCount(); + const selectedOptionsAmount = useTagPickerContext_unstable(ctx => ctx.selectedOptions.length); + return ( + <TagPickerInput + ref={ref} + {...rest} + placeholder={selectedOptionsAmount === 0 || (overflowCount > 0 && focus) ? placeholder : undefined} + /> + ); + }, +); + +export const SingleLine = () => { + const styles = useStyles(); + const [open, setOpen] = React.useState(false); + const [selectedOptions, setSelectedOptions] = React.useState<string[]>([]); + const inputRef = React.useRef<HTMLInputElement>(null); + const onOptionSelect: TagPickerProps['onOptionSelect'] = (e, data) => { + setSelectedOptions(data.selectedOptions); + }; + const tagPickerOptions = options.filter(option => !selectedOptions.includes(option)); + + const [hasFocus, setFocus] = React.useState(false); + + const handleOpenChange: TagPickerProps['onOpenChange'] = (_, data) => setOpen(data.open); + + const handleFocus = () => { + setFocus(true); + }; + + const handleBlur = (event: React.FocusEvent) => { + if (event.currentTarget.contains(event.relatedTarget as Node)) { + return; + } + setFocus(false); + }; + + const handleOverflowCountTagMouseDown = (event: React.MouseEvent) => { + event.preventDefault(); + inputRef.current?.focus(); + }; + + return ( + <TagPicker + open={open} + onOpenChange={handleOpenChange} + onOptionSelect={onOptionSelect} + selectedOptions={selectedOptions} + > + {/* 24 = min input size */} + {/* 30 = padding right */} + {/* 2 = gap between input and tags */} + {/* 4 = gap between tags */} + <Overflow minimumVisible={1} padding={24 + 30 + 2 + selectedOptions.length * 4}> + <TagPickerControl + style={{ maxWidth: 400 }} + expandIcon={{ + className: hasFocus ? styles.focusedExpandIcon : undefined, + children: <ExpandIcon focus={hasFocus} open={open} />, + }} + onFocus={handleFocus} + onBlur={handleBlur} + className={styles.control} + > + <TagPickerGroup> + {selectedOptions.map(option => ( + <OverflowItem id={option} key={option}> + <Tag + // force style to display the tag even if it's overflowing when focused + style={hasFocus ? { display: 'inline-grid' } : undefined} + key={option} + shape="rounded" + media={<Avatar aria-hidden name={option} color="colorful" />} + value={option} + > + {option} + </Tag> + </OverflowItem> + ))} + {!open && !hasFocus ? <OverFlowCountTag onMouseDown={handleOverflowCountTagMouseDown} /> : null} + </TagPickerGroup> + <CustomTagPickerInput + ref={inputRef} + focus={hasFocus} + placeholder="Select Employees" + aria-label="Select Employees" + /> + </TagPickerControl> + </Overflow> + <TagPickerList> + {tagPickerOptions.length > 0 + ? tagPickerOptions.map(option => ( + <TagPickerOption + secondaryContent="Microsoft FTE" + media={<Avatar shape="square" aria-hidden name={option} color="colorful" />} + value={option} + key={option} + > + {option} + </TagPickerOption> + )) + : 'No options available'} + </TagPickerList> + </TagPicker> + ); +}; diff --git a/packages/react-components/react-tag-picker/stories/src/TagPicker/index.stories.tsx b/packages/react-components/react-tag-picker/stories/src/TagPicker/index.stories.tsx index 97b263c6324bee..32a0f841262503 100644 --- a/packages/react-components/react-tag-picker/stories/src/TagPicker/index.stories.tsx +++ b/packages/react-components/react-tag-picker/stories/src/TagPicker/index.stories.tsx @@ -24,6 +24,7 @@ export { Grouped } from './TagPickerGrouped.stories'; export { TruncatedText } from './TagPickerTruncatedText.stories'; export { SingleSelect } from './TagPickerSingleSelect.stories'; export { NoPopover } from './TagPickerNoPopover.stories'; +export { SingleLine } from './TagPickerSingleLine.stories'; export default { title: 'Components/TagPicker', From 012298d98651800023aac24c591831e9bc51bea2 Mon Sep 17 00:00:00 2001 From: "Kevin T. Coughlin" <706967+KevinTCoughlin@users.noreply.github.com> Date: Tue, 21 Jan 2025 10:54:15 -0800 Subject: [PATCH 69/78] BaseFloatingPicker - Release references held by Async (#33685) --- ...luentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json | 7 +++++++ .../src/components/FloatingPicker/BaseFloatingPicker.tsx | 1 + 2 files changed, 8 insertions(+) create mode 100644 change/@fluentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json diff --git a/change/@fluentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json b/change/@fluentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json new file mode 100644 index 00000000000000..0b41cf5900b414 --- /dev/null +++ b/change/@fluentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Async dispose to release references", + "packageName": "@fluentui/react", + "email": "706967+KevinTCoughlin@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/react/src/components/FloatingPicker/BaseFloatingPicker.tsx b/packages/react/src/components/FloatingPicker/BaseFloatingPicker.tsx index 4738d7d5a967c7..616d9947c86adc 100644 --- a/packages/react/src/components/FloatingPicker/BaseFloatingPicker.tsx +++ b/packages/react/src/components/FloatingPicker/BaseFloatingPicker.tsx @@ -125,6 +125,7 @@ export class BaseFloatingPicker<T extends {}, P extends IBaseFloatingPickerProps public componentWillUnmount(): void { this._unbindFromInputElement(); + this._async.dispose(); this.isComponentMounted = false; } From 84217fcd61d51c761ca953af29c991c1b49b6f8b Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Wed, 22 Jan 2025 07:22:06 +0000 Subject: [PATCH 70/78] release: applying package updates - react v8 --- ...-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json | 7 ------- packages/azure-themes/CHANGELOG.json | 15 +++++++++++++ packages/azure-themes/CHANGELOG.md | 11 +++++++++- packages/azure-themes/package.json | 4 ++-- packages/charts/react-charting/CHANGELOG.json | 21 +++++++++++++++++++ packages/charts/react-charting/CHANGELOG.md | 12 ++++++++++- packages/charts/react-charting/package.json | 6 +++--- packages/cra-template/package.json | 2 +- packages/fluent2-theme/CHANGELOG.json | 15 +++++++++++++ packages/fluent2-theme/CHANGELOG.md | 11 +++++++++- packages/fluent2-theme/package.json | 4 ++-- packages/react-cards/CHANGELOG.json | 15 +++++++++++++ packages/react-cards/CHANGELOG.md | 11 +++++++++- packages/react-cards/package.json | 4 ++-- .../library/package.json | 4 ++-- packages/react-date-time/CHANGELOG.json | 15 +++++++++++++ packages/react-date-time/CHANGELOG.md | 11 +++++++++- packages/react-date-time/package.json | 4 ++-- .../react-docsite-components/CHANGELOG.json | 21 +++++++++++++++++++ .../react-docsite-components/CHANGELOG.md | 12 ++++++++++- .../react-docsite-components/package.json | 6 +++--- packages/react-examples/package.json | 14 ++++++------- packages/react-experiments/CHANGELOG.json | 15 +++++++++++++ packages/react-experiments/CHANGELOG.md | 11 +++++++++- packages/react-experiments/package.json | 4 ++-- packages/react-monaco-editor/CHANGELOG.json | 21 +++++++++++++++++++ packages/react-monaco-editor/CHANGELOG.md | 12 ++++++++++- packages/react-monaco-editor/package.json | 6 +++--- packages/react/CHANGELOG.json | 15 +++++++++++++ packages/react/CHANGELOG.md | 11 +++++++++- packages/react/package.json | 2 +- packages/storybook/package.json | 6 +++--- packages/theme-samples/CHANGELOG.json | 15 +++++++++++++ packages/theme-samples/CHANGELOG.md | 11 +++++++++- packages/theme-samples/package.json | 4 ++-- 35 files changed, 306 insertions(+), 52 deletions(-) delete mode 100644 change/@fluentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json diff --git a/change/@fluentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json b/change/@fluentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json deleted file mode 100644 index 0b41cf5900b414..00000000000000 --- a/change/@fluentui-react-1b776c96-e0cd-4c27-a7a5-b8b53dc322d2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "Async dispose to release references", - "packageName": "@fluentui/react", - "email": "706967+KevinTCoughlin@users.noreply.github.com", - "dependentChangeType": "patch" -} diff --git a/packages/azure-themes/CHANGELOG.json b/packages/azure-themes/CHANGELOG.json index d422a264bc9375..a0185635ef128a 100644 --- a/packages/azure-themes/CHANGELOG.json +++ b/packages/azure-themes/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/azure-themes", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/azure-themes_v8.6.121", + "version": "8.6.121", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/azure-themes", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/azure-themes_v8.6.120", diff --git a/packages/azure-themes/CHANGELOG.md b/packages/azure-themes/CHANGELOG.md index 5599d162f0a4ee..0a998808b18353 100644 --- a/packages/azure-themes/CHANGELOG.md +++ b/packages/azure-themes/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/azure-themes -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [8.6.121](https://github.com/microsoft/fluentui/tree/@fluentui/azure-themes_v8.6.121) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/azure-themes_v8.6.120..@fluentui/azure-themes_v8.6.121) + +### Patches + +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [8.6.120](https://github.com/microsoft/fluentui/tree/@fluentui/azure-themes_v8.6.120) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/azure-themes/package.json b/packages/azure-themes/package.json index b6a061aef01ccc..3855caecd4c52d 100644 --- a/packages/azure-themes/package.json +++ b/packages/azure-themes/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/azure-themes", - "version": "8.6.120", + "version": "8.6.121", "description": "Azure themes for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" } diff --git a/packages/charts/react-charting/CHANGELOG.json b/packages/charts/react-charting/CHANGELOG.json index ff4f3f3b32a70a..8db0554ca711ad 100644 --- a/packages/charts/react-charting/CHANGELOG.json +++ b/packages/charts/react-charting/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-charting", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/react-charting_v5.23.44", + "version": "5.23.44", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-charting", + "comment": "Bump @fluentui/theme-samples to v8.7.197", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + }, + { + "author": "beachball", + "package": "@fluentui/react-charting", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Tue, 21 Jan 2025 07:13:50 GMT", "tag": "@fluentui/react-charting_v5.23.43", diff --git a/packages/charts/react-charting/CHANGELOG.md b/packages/charts/react-charting/CHANGELOG.md index 178ccd9991cebf..a0a47695911967 100644 --- a/packages/charts/react-charting/CHANGELOG.md +++ b/packages/charts/react-charting/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-charting -This log was last generated on Tue, 21 Jan 2025 07:13:50 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [5.23.44](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.44) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charting_v5.23.43..@fluentui/react-charting_v5.23.44) + +### Patches + +- Bump @fluentui/theme-samples to v8.7.197 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [5.23.43](https://github.com/microsoft/fluentui/tree/@fluentui/react-charting_v5.23.43) Tue, 21 Jan 2025 07:13:50 GMT diff --git a/packages/charts/react-charting/package.json b/packages/charts/react-charting/package.json index d91ee34bf3ac28..78a0a53fde6f4e 100644 --- a/packages/charts/react-charting/package.json +++ b/packages/charts/react-charting/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-charting", - "version": "5.23.43", + "version": "5.23.44", "description": "React web charting controls for Microsoft fluentui system.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -40,7 +40,7 @@ }, "dependencies": { "@fluentui/react-focus": "^8.9.20", - "@fluentui/theme-samples": "^8.7.196", + "@fluentui/theme-samples": "^8.7.197", "@microsoft/load-themed-styles": "^1.10.26", "@types/d3-array": "^3.0.0", "@types/d3-axis": "^3.0.0", @@ -66,7 +66,7 @@ "tslib": "^2.1.0" }, "peerDependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@types/react": ">=16.8.0 <19.0.0", "@types/react-dom": ">=16.8.0 <19.0.0", "react": ">=16.8.0 <19.0.0", diff --git a/packages/cra-template/package.json b/packages/cra-template/package.json index 93d870af2b4e44..29a3e5fe65b069 100644 --- a/packages/cra-template/package.json +++ b/packages/cra-template/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/cra-template", - "version": "8.4.197", + "version": "8.4.198", "description": "Create React App template for Fluent UI React (@fluentui/react)", "repository": { "type": "git", diff --git a/packages/fluent2-theme/CHANGELOG.json b/packages/fluent2-theme/CHANGELOG.json index d1bb9fd55ca5a1..b8274831e84fd9 100644 --- a/packages/fluent2-theme/CHANGELOG.json +++ b/packages/fluent2-theme/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/fluent2-theme", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/fluent2-theme_v8.107.125", + "version": "8.107.125", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/fluent2-theme", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/fluent2-theme_v8.107.124", diff --git a/packages/fluent2-theme/CHANGELOG.md b/packages/fluent2-theme/CHANGELOG.md index 0c6911011eb685..afad4360c1074c 100644 --- a/packages/fluent2-theme/CHANGELOG.md +++ b/packages/fluent2-theme/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/fluent2-theme -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [8.107.125](https://github.com/microsoft/fluentui/tree/@fluentui/fluent2-theme_v8.107.125) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/fluent2-theme_v8.107.124..@fluentui/fluent2-theme_v8.107.125) + +### Patches + +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [8.107.124](https://github.com/microsoft/fluentui/tree/@fluentui/fluent2-theme_v8.107.124) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/fluent2-theme/package.json b/packages/fluent2-theme/package.json index 6922e4d226a17b..3520d70af08217 100644 --- a/packages/fluent2-theme/package.json +++ b/packages/fluent2-theme/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/fluent2-theme", - "version": "8.107.124", + "version": "8.107.125", "description": "A Fluent2 theme for Fluent UI React 8.x", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" } diff --git a/packages/react-cards/CHANGELOG.json b/packages/react-cards/CHANGELOG.json index 55faad53754276..109187b21d3487 100644 --- a/packages/react-cards/CHANGELOG.json +++ b/packages/react-cards/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-cards", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/react-cards_v0.205.197", + "version": "0.205.197", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-cards", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/react-cards_v0.205.196", diff --git a/packages/react-cards/CHANGELOG.md b/packages/react-cards/CHANGELOG.md index 6772d275a15ad3..df89134139661d 100644 --- a/packages/react-cards/CHANGELOG.md +++ b/packages/react-cards/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-cards -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [0.205.197](https://github.com/microsoft/fluentui/tree/@fluentui/react-cards_v0.205.197) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-cards_v0.205.196..@fluentui/react-cards_v0.205.197) + +### Patches + +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [0.205.196](https://github.com/microsoft/fluentui/tree/@fluentui/react-cards_v0.205.196) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/react-cards/package.json b/packages/react-cards/package.json index 1d983cc06104c4..7fd8762fa3654e 100644 --- a/packages/react-cards/package.json +++ b/packages/react-cards/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-cards", - "version": "0.205.196", + "version": "0.205.197", "description": "Deprecated experimental Card container components for Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -33,7 +33,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@fluentui/foundation-legacy": "^8.4.23", "@fluentui/set-version": "^8.2.23", "@microsoft/load-themed-styles": "^1.10.26", diff --git a/packages/react-components/react-migration-v8-v9/library/package.json b/packages/react-components/react-migration-v8-v9/library/package.json index d5f844d5560978..df3233a522a3b5 100644 --- a/packages/react-components/react-migration-v8-v9/library/package.json +++ b/packages/react-components/react-migration-v8-v9/library/package.json @@ -19,8 +19,8 @@ }, "dependencies": { "@ctrl/tinycolor": "^3.3.4", - "@fluentui/fluent2-theme": "^8.107.124", - "@fluentui/react": "^8.122.7", + "@fluentui/fluent2-theme": "^8.107.125", + "@fluentui/react": "^8.122.8", "@fluentui/react-components": "^9.57.0", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-hooks": "^8.8.16", diff --git a/packages/react-date-time/CHANGELOG.json b/packages/react-date-time/CHANGELOG.json index 75114f82fe8458..647d4ff874c3b4 100644 --- a/packages/react-date-time/CHANGELOG.json +++ b/packages/react-date-time/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-date-time", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/react-date-time_v8.7.197", + "version": "8.7.197", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-date-time", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Mon, 20 Jan 2025 07:21:44 GMT", "tag": "@fluentui/react-date-time_v8.7.196", diff --git a/packages/react-date-time/CHANGELOG.md b/packages/react-date-time/CHANGELOG.md index e5498181ef7b9c..d2c86a0a5b9693 100644 --- a/packages/react-date-time/CHANGELOG.md +++ b/packages/react-date-time/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-date-time -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [8.7.197](https://github.com/microsoft/fluentui/tree/@fluentui/react-date-time_v8.7.197) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-date-time_v8.7.196..@fluentui/react-date-time_v8.7.197) + +### Patches + +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [8.7.196](https://github.com/microsoft/fluentui/tree/@fluentui/react-date-time_v8.7.196) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/react-date-time/package.json b/packages/react-date-time/package.json index dad5ed73ea5ba7..bcce27e0081ff9 100644 --- a/packages/react-date-time/package.json +++ b/packages/react-date-time/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-date-time", - "version": "8.7.196", + "version": "8.7.197", "description": "Date and time related React components for building experiences for Microsoft 365.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -27,7 +27,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@fluentui/set-version": "^8.2.23", "tslib": "^2.1.0" }, diff --git a/packages/react-docsite-components/CHANGELOG.json b/packages/react-docsite-components/CHANGELOG.json index 5e649d24d2a9c5..4e4713abc16d2d 100644 --- a/packages/react-docsite-components/CHANGELOG.json +++ b/packages/react-docsite-components/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-docsite-components", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/react-docsite-components_v8.13.164", + "version": "8.13.164", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + }, + { + "author": "beachball", + "package": "@fluentui/react-docsite-components", + "comment": "Bump @fluentui/react-monaco-editor to v1.7.282", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Tue, 21 Jan 2025 07:13:51 GMT", "tag": "@fluentui/react-docsite-components_v8.13.163", diff --git a/packages/react-docsite-components/CHANGELOG.md b/packages/react-docsite-components/CHANGELOG.md index 14b7ea915169e2..1ef89494b13355 100644 --- a/packages/react-docsite-components/CHANGELOG.md +++ b/packages/react-docsite-components/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-docsite-components -This log was last generated on Tue, 21 Jan 2025 07:13:51 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [8.13.164](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.164) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-docsite-components_v8.13.163..@fluentui/react-docsite-components_v8.13.164) + +### Patches + +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) +- Bump @fluentui/react-monaco-editor to v1.7.282 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [8.13.163](https://github.com/microsoft/fluentui/tree/@fluentui/react-docsite-components_v8.13.163) Tue, 21 Jan 2025 07:13:51 GMT diff --git a/packages/react-docsite-components/package.json b/packages/react-docsite-components/package.json index b8257ed0fc401d..abab114325df30 100644 --- a/packages/react-docsite-components/package.json +++ b/packages/react-docsite-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-docsite-components", - "version": "8.13.163", + "version": "8.13.164", "description": "Fluent UI React components for building documentation sites.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -35,14 +35,14 @@ "react-dom": ">=16.8.0 <19.0.0" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@fluentui/theme": "^2.6.64", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", "@fluentui/public-docsite-setup": "^0.3.34", "@fluentui/react-hooks": "^8.8.16", "@fluentui/set-version": "^8.2.23", - "@fluentui/react-monaco-editor": "^1.7.281", + "@fluentui/react-monaco-editor": "^1.7.282", "color-check": "0.0.2", "markdown-to-jsx": "^7.0.0", "office-ui-fabric-core": "^11.0.0", diff --git a/packages/react-examples/package.json b/packages/react-examples/package.json index ca5e20d784014d..6bacbfd4dff619 100644 --- a/packages/react-examples/package.json +++ b/packages/react-examples/package.json @@ -27,18 +27,18 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/azure-themes": "^8.6.120", + "@fluentui/azure-themes": "^8.6.121", "@fluentui/date-time-utilities": "^8.6.9", "@fluentui/dom-utilities": "^2.3.9", "@fluentui/example-data": "^8.4.25", "@fluentui/font-icons-mdl2": "^8.5.57", "@fluentui/foundation-legacy": "^8.4.23", "@fluentui/merge-styles": "^8.6.13", - "@fluentui/react": "^8.122.7", - "@fluentui/react-cards": "^0.205.196", - "@fluentui/react-charting": "^5.23.43", - "@fluentui/react-docsite-components": "^8.13.163", - "@fluentui/react-experiments": "^8.14.193", + "@fluentui/react": "^8.122.8", + "@fluentui/react-cards": "^0.205.197", + "@fluentui/react-charting": "^5.23.44", + "@fluentui/react-docsite-components": "^8.13.164", + "@fluentui/react-experiments": "^8.14.194", "@fluentui/react-file-type-icons": "^8.12.7", "@fluentui/react-focus": "^8.9.20", "@fluentui/react-hooks": "^8.8.16", @@ -47,7 +47,7 @@ "@fluentui/scheme-utilities": "^8.3.65", "@fluentui/style-utilities": "^8.11.6", "@fluentui/theme": "^2.6.64", - "@fluentui/theme-samples": "^8.7.196", + "@fluentui/theme-samples": "^8.7.197", "@fluentui/utilities": "^8.15.19", "@microsoft/load-themed-styles": "^1.10.26", "d3-fetch": "3.0.1", diff --git a/packages/react-experiments/CHANGELOG.json b/packages/react-experiments/CHANGELOG.json index 213ae0a64004fe..b0f4e6f2d8fd3e 100644 --- a/packages/react-experiments/CHANGELOG.json +++ b/packages/react-experiments/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-experiments", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/react-experiments_v8.14.194", + "version": "8.14.194", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-experiments", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Mon, 20 Jan 2025 07:21:44 GMT", "tag": "@fluentui/react-experiments_v8.14.193", diff --git a/packages/react-experiments/CHANGELOG.md b/packages/react-experiments/CHANGELOG.md index c4bcce1227cca6..3000e20911e01b 100644 --- a/packages/react-experiments/CHANGELOG.md +++ b/packages/react-experiments/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-experiments -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [8.14.194](https://github.com/microsoft/fluentui/tree/@fluentui/react-experiments_v8.14.194) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-experiments_v8.14.193..@fluentui/react-experiments_v8.14.194) + +### Patches + +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [8.14.193](https://github.com/microsoft/fluentui/tree/@fluentui/react-experiments_v8.14.193) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/react-experiments/package.json b/packages/react-experiments/package.json index c08698e4eb6eb4..7dae13598d11ca 100644 --- a/packages/react-experiments/package.json +++ b/packages/react-experiments/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-experiments", - "version": "8.14.193", + "version": "8.14.194", "description": "Experimental React components for building experiences for Microsoft 365.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -38,7 +38,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@fluentui/theme": "^2.6.64", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", diff --git a/packages/react-monaco-editor/CHANGELOG.json b/packages/react-monaco-editor/CHANGELOG.json index 272c9adba363fd..520705d278ed88 100644 --- a/packages/react-monaco-editor/CHANGELOG.json +++ b/packages/react-monaco-editor/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-monaco-editor", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/react-monaco-editor_v1.7.282", + "version": "1.7.282", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + }, + { + "author": "beachball", + "package": "@fluentui/react-monaco-editor", + "comment": "Bump @fluentui/react-charting to v5.23.44", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Tue, 21 Jan 2025 07:13:51 GMT", "tag": "@fluentui/react-monaco-editor_v1.7.281", diff --git a/packages/react-monaco-editor/CHANGELOG.md b/packages/react-monaco-editor/CHANGELOG.md index 3ea218b12d6b2a..7455c40d5f1fd0 100644 --- a/packages/react-monaco-editor/CHANGELOG.md +++ b/packages/react-monaco-editor/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-monaco-editor -This log was last generated on Tue, 21 Jan 2025 07:13:51 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [1.7.282](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.282) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-monaco-editor_v1.7.281..@fluentui/react-monaco-editor_v1.7.282) + +### Patches + +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) +- Bump @fluentui/react-charting to v5.23.44 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [1.7.281](https://github.com/microsoft/fluentui/tree/@fluentui/react-monaco-editor_v1.7.281) Tue, 21 Jan 2025 07:13:51 GMT diff --git a/packages/react-monaco-editor/package.json b/packages/react-monaco-editor/package.json index f20c04f3ff0a78..8c8ed891c4b016 100644 --- a/packages/react-monaco-editor/package.json +++ b/packages/react-monaco-editor/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-monaco-editor", - "version": "1.7.281", + "version": "1.7.282", "description": "Live React example editing using monaco", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -29,12 +29,12 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@microsoft/load-themed-styles": "^1.10.26", "@fluentui/example-data": "^8.4.25", "@fluentui/monaco-editor": "^1.3.24", "@fluentui/react-hooks": "^8.8.16", - "@fluentui/react-charting": "^5.23.43", + "@fluentui/react-charting": "^5.23.44", "raw-loader": "4.0.2", "react-syntax-highlighter": "^10.1.3", "tslib": "^2.1.0" diff --git a/packages/react/CHANGELOG.json b/packages/react/CHANGELOG.json index 59b59940d8660f..32f8a0eb066bbd 100644 --- a/packages/react/CHANGELOG.json +++ b/packages/react/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/react_v8.122.8", + "version": "8.122.8", + "comments": { + "patch": [ + { + "author": "706967+KevinTCoughlin@users.noreply.github.com", + "package": "@fluentui/react", + "commit": "012298d98651800023aac24c591831e9bc51bea2", + "comment": "Async dispose to release references" + } + ] + } + }, { "date": "Mon, 20 Jan 2025 07:21:47 GMT", "tag": "@fluentui/react_v8.122.7", diff --git a/packages/react/CHANGELOG.md b/packages/react/CHANGELOG.md index 8e1e2d1642a521..e42a107901ba98 100644 --- a/packages/react/CHANGELOG.md +++ b/packages/react/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react -This log was last generated on Fri, 17 Jan 2025 07:21:31 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [8.122.8](https://github.com/microsoft/fluentui/tree/@fluentui/react_v8.122.8) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react_v8.122.7..@fluentui/react_v8.122.8) + +### Patches + +- Async dispose to release references ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by 706967+KevinTCoughlin@users.noreply.github.com) + ## [8.122.7](https://github.com/microsoft/fluentui/tree/@fluentui/react_v8.122.7) Fri, 17 Jan 2025 07:21:31 GMT diff --git a/packages/react/package.json b/packages/react/package.json index fe335a033141be..63f77740d6a543 100644 --- a/packages/react/package.json +++ b/packages/react/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react", - "version": "8.122.7", + "version": "8.122.8", "description": "Reusable React components for building web experiences.", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/storybook/package.json b/packages/storybook/package.json index fdace2fd7618c0..42aba8e780bc14 100644 --- a/packages/storybook/package.json +++ b/packages/storybook/package.json @@ -22,11 +22,11 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@fluentui/theme": "^2.6.64", "@storybook/addon-essentials": "7.6.20", - "@fluentui/azure-themes": "^8.6.120", - "@fluentui/theme-samples": "^8.7.196", + "@fluentui/azure-themes": "^8.6.121", + "@fluentui/theme-samples": "^8.7.197", "tslib": "^2.1.0" }, "peerDependencies": { diff --git a/packages/theme-samples/CHANGELOG.json b/packages/theme-samples/CHANGELOG.json index ff0fa6af1a1f81..efe450fbdc39b9 100644 --- a/packages/theme-samples/CHANGELOG.json +++ b/packages/theme-samples/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/theme-samples", "entries": [ + { + "date": "Wed, 22 Jan 2025 07:21:49 GMT", + "tag": "@fluentui/theme-samples_v8.7.197", + "version": "8.7.197", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/theme-samples", + "comment": "Bump @fluentui/react to v8.122.8", + "commit": "012298d98651800023aac24c591831e9bc51bea2" + } + ] + } + }, { "date": "Fri, 17 Jan 2025 07:21:32 GMT", "tag": "@fluentui/theme-samples_v8.7.196", diff --git a/packages/theme-samples/CHANGELOG.md b/packages/theme-samples/CHANGELOG.md index 6ed21c779e917d..6acf3094183296 100644 --- a/packages/theme-samples/CHANGELOG.md +++ b/packages/theme-samples/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/theme-samples -This log was last generated on Fri, 17 Jan 2025 07:21:32 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 07:21:49 GMT and should not be manually modified. <!-- Start content --> +## [8.7.197](https://github.com/microsoft/fluentui/tree/@fluentui/theme-samples_v8.7.197) + +Wed, 22 Jan 2025 07:21:49 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/theme-samples_v8.7.196..@fluentui/theme-samples_v8.7.197) + +### Patches + +- Bump @fluentui/react to v8.122.8 ([PR #33685](https://github.com/microsoft/fluentui/pull/33685) by beachball) + ## [8.7.196](https://github.com/microsoft/fluentui/tree/@fluentui/theme-samples_v8.7.196) Fri, 17 Jan 2025 07:21:32 GMT diff --git a/packages/theme-samples/package.json b/packages/theme-samples/package.json index d46cde211cdeaa..acb886ed069d77 100644 --- a/packages/theme-samples/package.json +++ b/packages/theme-samples/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/theme-samples", - "version": "8.7.196", + "version": "8.7.197", "description": "Sample themes for use with Fabric components.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -26,7 +26,7 @@ "@fluentui/scripts-webpack": "*" }, "dependencies": { - "@fluentui/react": "^8.122.7", + "@fluentui/react": "^8.122.8", "@fluentui/set-version": "^8.2.23", "@fluentui/scheme-utilities": "^8.3.65", "tslib": "^2.1.0" From f91bddab1340f723e3de863a73c10a334a384522 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2025 11:14:28 +0100 Subject: [PATCH 71/78] chore(deps-dev): bump vite from 6.0.7 to 6.0.9 (#33698) Signed-off-by: dependabot[bot] <support@github.com> Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 39 ++++++++++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index b05c90218db7e1..ab198d1871b4b1 100644 --- a/package.json +++ b/package.json @@ -342,7 +342,7 @@ "tslib": "2.6.3", "typescript": "5.3.3", "vinyl": "2.2.0", - "vite": "6.0.7", + "vite": "6.0.9", "webpack": "5.94.0", "webpack-bundle-analyzer": "4.10.1", "webpack-cli": "5.1.4", diff --git a/yarn.lock b/yarn.lock index ccea6816c1add4..60998a81babad6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21729,7 +21729,7 @@ string-length@^5.0.1: char-regex "^2.0.0" strip-ansi "^7.0.1" -"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: +"string-width-cjs@npm:string-width@^4.2.0": version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== @@ -21764,6 +21764,15 @@ string-width@^3.0.0, string-width@^3.1.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^5.1.0" +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + string-width@^5.0.1, string-width@^5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794" @@ -21864,7 +21873,7 @@ stringify-object@^3.3.0: is-obj "^1.0.1" is-regexp "^1.0.0" -"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1: +"strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== @@ -21899,6 +21908,13 @@ strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: dependencies: ansi-regex "^4.1.0" +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + strip-ansi@^7.0.1, strip-ansi@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" @@ -23780,10 +23796,10 @@ vinyl@^0.5.0: clone-stats "^0.0.1" replace-ext "0.0.1" -vite@6.0.7: - version "6.0.7" - resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.7.tgz#f0f8c120733b04af52b4a1e3e7cb54eb851a799b" - integrity sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ== +vite@6.0.9: + version "6.0.9" + resolved "https://registry.yarnpkg.com/vite/-/vite-6.0.9.tgz#0a830b767ef7aa762360b56bdef955c1395dc1ee" + integrity sha512-MSgUxHcaXLtnBPktkbUSoQUANApKYuxZ6DrbVENlIorbhL2dZydTLaZ01tjUoE3szeFzlFk9ANOKk0xurh4MKA== dependencies: esbuild "^0.24.2" postcss "^8.4.49" @@ -24228,7 +24244,7 @@ workspace-tools@^0.27.0: js-yaml "^4.1.0" micromatch "^4.0.0" -"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: +"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== @@ -24263,6 +24279,15 @@ wrap-ansi@^6.2.0: string-width "^4.1.0" strip-ansi "^6.0.0" +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + wrap-ansi@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" From cb051bc143d3fde05a46c24de7827cebf9a79de0 Mon Sep 17 00:00:00 2001 From: Martin Hochel <martinhochel@microsoft.com> Date: Wed, 22 Jan 2025 12:44:47 +0100 Subject: [PATCH 72/78] ci: trigger VRT PR workflow only against testing branch (#33701) --- .github/workflows/pr-vrt.yml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/pr-vrt.yml b/.github/workflows/pr-vrt.yml index 7cb8853eb8e604..90901135c32cb7 100644 --- a/.github/workflows/pr-vrt.yml +++ b/.github/workflows/pr-vrt.yml @@ -1,8 +1,9 @@ name: VRT CI on: - # TODO: once testing is done enable pull_request trigger again - # pull_request: - workflow_dispatch: + pull_request: + # TODO: once testing is done enable pull_request on all branches again + branches: + - vrt-gha-testing concurrency: # see https://docs.github.com/en/actions/writing-workflows/workflow-syntax-for-github-actions#example-only-cancel-in-progress-jobs-or-runs-for-the-current-workflow From 5e95b13c1b6f513e6bdd9a4c688139748f912695 Mon Sep 17 00:00:00 2001 From: Dmytro Kirpa <dmytrokirpa@microsoft.com> Date: Wed, 22 Jan 2025 14:32:02 +0100 Subject: [PATCH 73/78] feat: add vite sandbox template (#33631) --- package.json | 3 +- starter-templates/README.md | 43 +++++++++++++++++++ starter-templates/package.json | 7 +++ starter-templates/project.json | 6 +++ .../src/react-components-vite/.gitignore | 24 +++++++++++ .../src/react-components-vite/README.md | 32 ++++++++++++++ .../src/react-components-vite/index.html | 13 ++++++ .../src/react-components-vite/package.json | 22 ++++++++++ .../src/react-components-vite/src/App.tsx | 12 ++++++ .../src/react-components-vite/src/Example.tsx | 26 +++++++++++ .../src/react-components-vite/src/main.tsx | 11 +++++ .../react-components-vite/tsconfig.app.json | 26 +++++++++++ .../src/react-components-vite/tsconfig.json | 4 ++ .../react-components-vite/tsconfig.node.json | 24 +++++++++++ .../src/react-components-vite/vite.config.ts | 7 +++ 15 files changed, 259 insertions(+), 1 deletion(-) create mode 100644 starter-templates/README.md create mode 100644 starter-templates/package.json create mode 100644 starter-templates/project.json create mode 100644 starter-templates/src/react-components-vite/.gitignore create mode 100644 starter-templates/src/react-components-vite/README.md create mode 100644 starter-templates/src/react-components-vite/index.html create mode 100644 starter-templates/src/react-components-vite/package.json create mode 100644 starter-templates/src/react-components-vite/src/App.tsx create mode 100644 starter-templates/src/react-components-vite/src/Example.tsx create mode 100644 starter-templates/src/react-components-vite/src/main.tsx create mode 100644 starter-templates/src/react-components-vite/tsconfig.app.json create mode 100644 starter-templates/src/react-components-vite/tsconfig.json create mode 100644 starter-templates/src/react-components-vite/tsconfig.node.json create mode 100644 starter-templates/src/react-components-vite/vite.config.ts diff --git a/package.json b/package.json index ab198d1871b4b1..fe776603835202 100644 --- a/package.json +++ b/package.json @@ -370,7 +370,8 @@ "packages/charts/*/*", "scripts/*", "tools/*", - "typings" + "typings", + "starter-templates" ] }, "resolutions": { diff --git a/starter-templates/README.md b/starter-templates/README.md new file mode 100644 index 00000000000000..78c740c64fecc2 --- /dev/null +++ b/starter-templates/README.md @@ -0,0 +1,43 @@ +# FluentUI v9 Starter Templates + +Collection of starter templates for FluentUI v9 with popular frameworks and build tools. + +## Available Templates + +- [React Components + Vite](src/react-components-vite/README.md) - Modern starter template using Vite and FluentUI React Components + +## Project Structure + +``` +starter-templates/ +├── project.json +├── package.json +├── README.md +└── src/ + └── react-components-vite/ + ├── README.md + └── ... +``` + +## Contributing + +We welcome contributions! You can help by: + +- Improving existing templates +- Adding new starter templates following the guidelines below + +### Adding New Templates + +1. Create a new directory under `src/` +2. Follow the naming convention: `react-components-{framework}` +3. Include a comprehensive README.md with: + - Setup instructions + - Usage examples + - Configuration details + - Development guidelines +4. Test the template thoroughly +5. Submit a pull request + +## License + +This project is licensed under the MIT License - see the [LICENSE](../LICENSE) file for details. diff --git a/starter-templates/package.json b/starter-templates/package.json new file mode 100644 index 00000000000000..2b8553d03020c3 --- /dev/null +++ b/starter-templates/package.json @@ -0,0 +1,7 @@ +{ + "name": "@fluentui/starter-templates", + "version": "0.0.1", + "private": true, + "description": "Starter templates for Fluent UI", + "license": "MIT" +} diff --git a/starter-templates/project.json b/starter-templates/project.json new file mode 100644 index 00000000000000..470a19c617a900 --- /dev/null +++ b/starter-templates/project.json @@ -0,0 +1,6 @@ +{ + "name": "stater-templates", + "$schema": "../node_modules/nx/schemas/project-schema.json", + "projectType": "application", + "tags": ["vNext", "tools"] +} diff --git a/starter-templates/src/react-components-vite/.gitignore b/starter-templates/src/react-components-vite/.gitignore new file mode 100644 index 00000000000000..a547bf36d8d11a --- /dev/null +++ b/starter-templates/src/react-components-vite/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/starter-templates/src/react-components-vite/README.md b/starter-templates/src/react-components-vite/README.md new file mode 100644 index 00000000000000..81ae49cb019ee5 --- /dev/null +++ b/starter-templates/src/react-components-vite/README.md @@ -0,0 +1,32 @@ +# FluentUI React v9 - Vite.js example + +## How to use + +Download the example [or clone the repo](https://github.com/microsoft/fluentui): + +```bash +npx degit microsoft/fluentui/starter-templates/src/react-components-vite +cd react-components-vite +``` + +Install it and run: + +```bash +npm install +npm run dev +``` + +or: + +[](https://stackblitz.com/github/microsoft/fluentui/tree/master/starter-templates/src/react-components-vite) + +[](https://codesandbox.io/p/sandbox/github/microsoft/fluentui/tree/master/starter-templates/src/react-components-vite) + +## The idea behind the example + +This example uses [Vite.js](https://github.com/vitejs/vite). +It includes `@fluentui/react-components` and its peer dependencies, including `@fluentui/react-icons`. + +## What's next? + +You now have a working example project. To continue, you can explore the [FluentUI React documentation](https://react.fluentui.dev) for more information and advanced usage. diff --git a/starter-templates/src/react-components-vite/index.html b/starter-templates/src/react-components-vite/index.html new file mode 100644 index 00000000000000..e0d1c840806ee7 --- /dev/null +++ b/starter-templates/src/react-components-vite/index.html @@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html lang="en"> + <head> + <meta charset="UTF-8" /> + <link rel="icon" type="image/svg+xml" href="/vite.svg" /> + <meta name="viewport" content="width=device-width, initial-scale=1.0" /> + <title>Vite + React + TS</title> + </head> + <body> + <div id="root"></div> + <script type="module" src="/src/main.tsx"></script> + </body> +</html> diff --git a/starter-templates/src/react-components-vite/package.json b/starter-templates/src/react-components-vite/package.json new file mode 100644 index 00000000000000..e25dd4aaca2ffe --- /dev/null +++ b/starter-templates/src/react-components-vite/package.json @@ -0,0 +1,22 @@ +{ + "name": "react-components-vite", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "react": "^18.3.1", + "react-dom": "^18.3.1" + }, + "devDependencies": { + "@types/react": "^18.3.18", + "@types/react-dom": "^18.3.5", + "@vitejs/plugin-react": "^4.3.4", + "typescript": "~5.6.2", + "vite": "^6.0.5" + } +} diff --git a/starter-templates/src/react-components-vite/src/App.tsx b/starter-templates/src/react-components-vite/src/App.tsx new file mode 100644 index 00000000000000..935f87718d024f --- /dev/null +++ b/starter-templates/src/react-components-vite/src/App.tsx @@ -0,0 +1,12 @@ +import { FluentProvider, webLightTheme } from '@fluentui/react-components'; +import { Example } from './Example'; + +const App = () => { + return ( + <FluentProvider theme={webLightTheme}> + <Example /> + </FluentProvider> + ); +}; + +export default App; diff --git a/starter-templates/src/react-components-vite/src/Example.tsx b/starter-templates/src/react-components-vite/src/Example.tsx new file mode 100644 index 00000000000000..88d9ba87a2b31a --- /dev/null +++ b/starter-templates/src/react-components-vite/src/Example.tsx @@ -0,0 +1,26 @@ +import { Button, Title1, makeStyles } from '@fluentui/react-components'; +import { bundleIcon, CalendarMonthFilled, CalendarMonthRegular } from '@fluentui/react-icons'; + +const CalendarMonth = bundleIcon(CalendarMonthFilled, CalendarMonthRegular); + +const useStyles = makeStyles({ + container: { + display: 'flex', + flexDirection: 'column', + gap: '16px', + padding: '32px', + }, +}); + +export const Example = () => { + const styles = useStyles(); + + return ( + <div className={styles.container}> + <Title1>Hello, Fluent UI!</Title1> + <Button appearance="primary" icon={<CalendarMonth />}> + Click Me + </Button> + </div> + ); +}; diff --git a/starter-templates/src/react-components-vite/src/main.tsx b/starter-templates/src/react-components-vite/src/main.tsx new file mode 100644 index 00000000000000..ff9107a7d32da5 --- /dev/null +++ b/starter-templates/src/react-components-vite/src/main.tsx @@ -0,0 +1,11 @@ +import { StrictMode } from 'react'; +import { createRoot } from 'react-dom/client'; +import App from './App.tsx'; + +const root = createRoot(document.getElementById('root') as HTMLElement); + +root.render( + <StrictMode> + <App /> + </StrictMode>, +); diff --git a/starter-templates/src/react-components-vite/tsconfig.app.json b/starter-templates/src/react-components-vite/tsconfig.app.json new file mode 100644 index 00000000000000..358ca9ba93f089 --- /dev/null +++ b/starter-templates/src/react-components-vite/tsconfig.app.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src"] +} diff --git a/starter-templates/src/react-components-vite/tsconfig.json b/starter-templates/src/react-components-vite/tsconfig.json new file mode 100644 index 00000000000000..d32ff682003e0f --- /dev/null +++ b/starter-templates/src/react-components-vite/tsconfig.json @@ -0,0 +1,4 @@ +{ + "files": [], + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] +} diff --git a/starter-templates/src/react-components-vite/tsconfig.node.json b/starter-templates/src/react-components-vite/tsconfig.node.json new file mode 100644 index 00000000000000..db0becc8b033a4 --- /dev/null +++ b/starter-templates/src/react-components-vite/tsconfig.node.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/starter-templates/src/react-components-vite/vite.config.ts b/starter-templates/src/react-components-vite/vite.config.ts new file mode 100644 index 00000000000000..4a5def4c3d78f7 --- /dev/null +++ b/starter-templates/src/react-components-vite/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [react()], +}); From 58fb29e201d7546b86e543f7bdc77e8a33f7c100 Mon Sep 17 00:00:00 2001 From: Fluent UI Build <fluentui-internal@service.microsoft.com> Date: Wed, 22 Jan 2025 14:00:41 +0000 Subject: [PATCH 74/78] release: applying package updates - react-components --- ...-b082df99-c014-4ba8-8523-fdc134b25bcb.json | 7 - ...-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json | 7 - ...-9cab8d3a-1bcd-4c03-8138-82520de36649.json | 7 - ...-1411f212-27ea-4335-bcd3-b210359b0bd1.json | 7 - ...-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json | 7 - ...-8a924d25-d099-4172-ab21-290a69090030.json | 7 - ...-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json | 7 - ...-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json | 7 - ...-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json | 7 - ...-2c418aac-078d-45dc-ad47-4bf796a2e600.json | 7 - ...-8e070f58-09e6-4a66-bd63-bbd13b27db88.json | 7 - ...-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json | 7 - ...-4944bee5-948a-4649-87a1-8362f68d4635.json | 7 - ...-d79ea04c-0316-4c1e-9c1e-96710298947a.json | 7 - ...-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json | 7 - ...-51e8bb80-2224-47a8-8a42-282214bcee42.json | 7 - ...-045b67fd-ae48-4ed9-abbd-669235409ead.json | 7 - ...-d059899d-0a8a-4a74-8136-70b89e36f065.json | 7 - ...-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json | 7 - ...-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json | 7 - ...-67537ce1-b461-4bec-bbcb-61d9202e6632.json | 7 - ...-7795f18a-df86-480a-8546-efca47ef6069.json | 7 - ...-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json | 7 - ...-b0930295-331e-4b55-96fc-c17b84ce854b.json | 7 - ...-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json | 7 - ...-f1f67efd-37ec-4bf3-a0b8-470029586904.json | 7 - ...-f95778aa-ad54-4ba0-9ef8-38237de444a8.json | 7 - ...-02147114-2b1f-427d-a369-c495dcc060f7.json | 7 - ...-7ff1890e-77cb-4078-be01-2673bb29a80b.json | 7 - ...-9f506bc2-b69a-4140-b85e-67b97c87e955.json | 7 - ...-59106324-2e52-43e5-b407-87f41706faa5.json | 7 - ...-a56360e5-91b4-443c-90d7-d16c9a672862.json | 7 - ...-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json | 7 - ...-041ffd34-f086-4af7-a72a-66dbbd56617b.json | 7 - ...-c489edef-c7ee-4bf0-8f32-8565edccb381.json | 7 - ...-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json | 7 - ...-a4a177a3-0514-4657-9fdd-a0e90d44e813.json | 7 - ...-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json | 7 - ...-f788c84a-933e-4291-9111-2a6187517663.json | 7 - ...-b6083bc4-f97c-4ad1-a457-a150145f3543.json | 7 - ...-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json | 7 - ...-4088de96-b20d-4c18-9567-9987be622dbf.json | 7 - ...-7be3b676-890f-4c2c-8a08-d7abf38084de.json | 7 - ...-287da350-699b-410f-bd97-7cb590731302.json | 7 - ...-69773403-5633-414b-866a-f20aedf4bc0c.json | 7 - ...-b452026f-0282-4a88-a922-34c2a983c77c.json | 7 - ...-0b333279-3531-4fce-a0ee-8e9c05d6f830.json | 7 - ...-82544042-02b6-4262-91cd-e7f9fe24bad2.json | 7 - ...-00dd23f0-89d0-486d-844f-30a880feb0f5.json | 7 - ...-d6716ae8-9732-454c-9c6f-65ab98953a42.json | 7 - .../library/CHANGELOG.json | 51 +++ .../react-charts-preview/library/CHANGELOG.md | 17 +- .../react-charts-preview/library/package.json | 16 +- .../CHANGELOG.json | 15 + .../babel-preset-global-context/CHANGELOG.md | 11 +- .../babel-preset-global-context/package.json | 4 +- .../global-context/CHANGELOG.json | 21 ++ .../global-context/CHANGELOG.md | 12 +- .../global-context/package.json | 6 +- .../react-accordion/library/CHANGELOG.json | 59 ++++ .../react-accordion/library/CHANGELOG.md | 17 +- .../react-accordion/library/package.json | 16 +- .../react-aria/library/CHANGELOG.json | 35 ++ .../react-aria/library/CHANGELOG.md | 13 +- .../react-aria/library/package.json | 8 +- .../react-avatar/library/CHANGELOG.json | 59 ++++ .../react-avatar/library/CHANGELOG.md | 17 +- .../react-avatar/library/package.json | 16 +- .../react-badge/library/CHANGELOG.json | 21 ++ .../react-badge/library/CHANGELOG.md | 12 +- .../react-badge/library/package.json | 6 +- .../react-breadcrumb/library/CHANGELOG.json | 45 +++ .../react-breadcrumb/library/CHANGELOG.md | 16 +- .../react-breadcrumb/library/package.json | 14 +- .../react-button/library/CHANGELOG.json | 33 ++ .../react-button/library/CHANGELOG.md | 14 +- .../react-button/library/package.json | 10 +- .../library/CHANGELOG.json | 27 ++ .../library/CHANGELOG.md | 13 +- .../library/package.json | 8 +- .../react-card/library/CHANGELOG.json | 33 ++ .../react-card/library/CHANGELOG.md | 14 +- .../react-card/library/package.json | 10 +- .../react-carousel/library/CHANGELOG.json | 45 +++ .../react-carousel/library/CHANGELOG.md | 16 +- .../react-carousel/library/package.json | 14 +- .../react-checkbox/library/CHANGELOG.json | 39 +++ .../react-checkbox/library/CHANGELOG.md | 15 +- .../react-checkbox/library/package.json | 12 +- .../library/CHANGELOG.json | 65 ++++ .../library/CHANGELOG.md | 17 +- .../library/package.json | 10 +- .../react-colorpicker-compat/package.json | 4 +- .../react-combobox/library/CHANGELOG.json | 65 ++++ .../react-combobox/library/CHANGELOG.md | 18 +- .../react-combobox/library/package.json | 18 +- .../react-components/CHANGELOG.json | 313 ++++++++++++++++++ .../react-components/CHANGELOG.md | 48 ++- .../react-components/package.json | 110 +++--- .../react-context-selector/CHANGELOG.json | 15 + .../react-context-selector/CHANGELOG.md | 11 +- .../react-context-selector/package.json | 4 +- .../library/CHANGELOG.json | 63 ++++ .../library/CHANGELOG.md | 19 +- .../library/package.json | 20 +- .../react-dialog/library/CHANGELOG.json | 57 ++++ .../react-dialog/library/CHANGELOG.md | 18 +- .../react-dialog/library/package.json | 18 +- .../react-divider/library/CHANGELOG.json | 21 ++ .../react-divider/library/CHANGELOG.md | 12 +- .../react-divider/library/package.json | 6 +- .../react-drawer/library/CHANGELOG.json | 45 +++ .../react-drawer/library/CHANGELOG.md | 16 +- .../react-drawer/library/package.json | 14 +- .../react-field/library/CHANGELOG.json | 33 ++ .../react-field/library/CHANGELOG.md | 14 +- .../react-field/library/package.json | 10 +- .../react-icons-compat/library/CHANGELOG.json | 29 ++ .../react-icons-compat/library/CHANGELOG.md | 12 +- .../react-icons-compat/library/package.json | 6 +- .../react-image/library/CHANGELOG.json | 21 ++ .../react-image/library/CHANGELOG.md | 12 +- .../react-image/library/package.json | 6 +- .../react-infolabel/library/CHANGELOG.json | 39 +++ .../react-infolabel/library/CHANGELOG.md | 15 +- .../react-infolabel/library/package.json | 12 +- .../react-input/library/CHANGELOG.json | 27 ++ .../react-input/library/CHANGELOG.md | 13 +- .../react-input/library/package.json | 8 +- .../react-jsx-runtime/CHANGELOG.json | 15 + .../react-jsx-runtime/CHANGELOG.md | 11 +- .../react-jsx-runtime/package.json | 4 +- .../react-label/library/CHANGELOG.json | 21 ++ .../react-label/library/CHANGELOG.md | 12 +- .../react-label/library/package.json | 6 +- .../react-link/library/CHANGELOG.json | 33 ++ .../react-link/library/CHANGELOG.md | 14 +- .../react-link/library/package.json | 8 +- .../react-list/library/CHANGELOG.json | 39 +++ .../react-list/library/CHANGELOG.md | 15 +- .../react-list/library/package.json | 12 +- .../react-menu/library/CHANGELOG.json | 59 ++++ .../react-menu/library/CHANGELOG.md | 17 +- .../react-menu/library/package.json | 16 +- .../react-message-bar/library/CHANGELOG.json | 53 +++ .../react-message-bar/library/CHANGELOG.md | 16 +- .../react-message-bar/library/package.json | 14 +- .../library/CHANGELOG.json | 45 +++ .../library/CHANGELOG.md | 16 +- .../library/package.json | 14 +- .../library/CHANGELOG.json | 21 ++ .../library/CHANGELOG.md | 12 +- .../library/package.json | 4 +- .../library/CHANGELOG.json | 29 ++ .../library/CHANGELOG.md | 11 +- .../library/package.json | 2 +- .../react-motion/library/CHANGELOG.json | 29 ++ .../react-motion/library/CHANGELOG.md | 12 +- .../react-motion/library/package.json | 4 +- .../react-nav-preview/library/CHANGELOG.json | 91 +++++ .../react-nav-preview/library/CHANGELOG.md | 25 +- .../react-nav-preview/library/package.json | 20 +- .../react-overflow/library/CHANGELOG.json | 21 ++ .../react-overflow/library/CHANGELOG.md | 12 +- .../react-overflow/library/package.json | 6 +- .../react-persona/library/CHANGELOG.json | 33 ++ .../react-persona/library/CHANGELOG.md | 14 +- .../react-persona/library/package.json | 10 +- .../react-popover/library/CHANGELOG.json | 59 ++++ .../react-popover/library/CHANGELOG.md | 17 +- .../react-popover/library/package.json | 16 +- .../react-portal-compat/CHANGELOG.json | 21 ++ .../react-portal-compat/CHANGELOG.md | 12 +- .../react-portal-compat/package.json | 6 +- .../react-portal/library/CHANGELOG.json | 21 ++ .../react-portal/library/CHANGELOG.md | 12 +- .../react-portal/library/package.json | 6 +- .../react-positioning/CHANGELOG.json | 23 ++ .../react-positioning/CHANGELOG.md | 11 +- .../react-positioning/package.json | 4 +- .../react-progress/library/CHANGELOG.json | 27 ++ .../react-progress/library/CHANGELOG.md | 13 +- .../react-progress/library/package.json | 8 +- .../react-provider/library/CHANGELOG.json | 33 ++ .../react-provider/library/CHANGELOG.md | 14 +- .../react-provider/library/package.json | 8 +- .../react-radio/library/CHANGELOG.json | 47 +++ .../react-radio/library/CHANGELOG.md | 15 +- .../react-radio/library/package.json | 12 +- .../react-rating/library/CHANGELOG.json | 27 ++ .../react-rating/library/CHANGELOG.md | 13 +- .../react-rating/library/package.json | 8 +- .../react-search/library/CHANGELOG.json | 27 ++ .../react-search/library/CHANGELOG.md | 13 +- .../react-search/library/package.json | 8 +- .../react-select/library/CHANGELOG.json | 27 ++ .../react-select/library/CHANGELOG.md | 13 +- .../react-select/library/package.json | 8 +- .../react-skeleton/library/CHANGELOG.json | 27 ++ .../react-skeleton/library/CHANGELOG.md | 13 +- .../react-skeleton/library/package.json | 8 +- .../react-slider/library/CHANGELOG.json | 33 ++ .../react-slider/library/CHANGELOG.md | 14 +- .../react-slider/library/package.json | 10 +- .../react-spinbutton/library/CHANGELOG.json | 33 ++ .../react-spinbutton/library/CHANGELOG.md | 14 +- .../react-spinbutton/library/package.json | 8 +- .../react-spinner/library/CHANGELOG.json | 27 ++ .../react-spinner/library/CHANGELOG.md | 13 +- .../react-spinner/library/package.json | 8 +- .../react-storybook-addon/package.json | 4 +- .../library/CHANGELOG.json | 39 +++ .../react-swatch-picker/library/CHANGELOG.md | 15 +- .../react-swatch-picker/library/package.json | 12 +- .../react-switch/library/CHANGELOG.json | 47 +++ .../react-switch/library/CHANGELOG.md | 15 +- .../react-switch/library/package.json | 12 +- .../react-table/library/CHANGELOG.json | 65 ++++ .../react-table/library/CHANGELOG.md | 18 +- .../react-table/library/package.json | 18 +- .../react-tabs/library/CHANGELOG.json | 41 +++ .../react-tabs/library/CHANGELOG.md | 14 +- .../react-tabs/library/package.json | 10 +- .../react-tabster/CHANGELOG.json | 29 ++ .../react-tabster/CHANGELOG.md | 11 +- .../react-tabster/package.json | 4 +- .../react-tag-picker/library/CHANGELOG.json | 83 +++++ .../react-tag-picker/library/CHANGELOG.md | 25 +- .../react-tag-picker/library/package.json | 22 +- .../react-tags/library/CHANGELOG.json | 39 +++ .../react-tags/library/CHANGELOG.md | 15 +- .../react-tags/library/package.json | 12 +- .../library/CHANGELOG.json | 51 +++ .../library/CHANGELOG.md | 17 +- .../library/package.json | 16 +- .../react-text/library/CHANGELOG.json | 21 ++ .../react-text/library/CHANGELOG.md | 12 +- .../react-text/library/package.json | 6 +- .../react-textarea/library/CHANGELOG.json | 27 ++ .../react-textarea/library/CHANGELOG.md | 13 +- .../react-textarea/library/package.json | 8 +- .../library/CHANGELOG.json | 33 ++ .../library/CHANGELOG.md | 14 +- .../library/package.json | 10 +- .../react-toast/library/CHANGELOG.json | 59 ++++ .../react-toast/library/CHANGELOG.md | 17 +- .../react-toast/library/package.json | 16 +- .../react-toolbar/library/CHANGELOG.json | 51 +++ .../react-toolbar/library/CHANGELOG.md | 17 +- .../react-toolbar/library/package.json | 16 +- .../react-tooltip/library/CHANGELOG.json | 59 ++++ .../react-tooltip/library/CHANGELOG.md | 16 +- .../react-tooltip/library/package.json | 12 +- .../react-tree/library/CHANGELOG.json | 95 ++++++ .../react-tree/library/CHANGELOG.md | 23 +- .../react-tree/library/package.json | 24 +- .../library/package.json | 4 +- .../react-utilities/CHANGELOG.json | 23 ++ .../react-utilities/CHANGELOG.md | 11 +- .../react-utilities/package.json | 2 +- .../react-virtualizer/library/CHANGELOG.json | 35 ++ .../react-virtualizer/library/CHANGELOG.md | 12 +- .../react-virtualizer/library/package.json | 6 +- .../react-components/recipes/package.json | 6 +- .../theme-designer/package.json | 6 +- packages/react-conformance/CHANGELOG.json | 15 + 266 files changed, 4415 insertions(+), 845 deletions(-) delete mode 100644 change/@fluentui-react-accordion-b082df99-c014-4ba8-8523-fdc134b25bcb.json delete mode 100644 change/@fluentui-react-aria-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json delete mode 100644 change/@fluentui-react-avatar-9cab8d3a-1bcd-4c03-8138-82520de36649.json delete mode 100644 change/@fluentui-react-color-picker-preview-1411f212-27ea-4335-bcd3-b210359b0bd1.json delete mode 100644 change/@fluentui-react-color-picker-preview-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json delete mode 100644 change/@fluentui-react-color-picker-preview-8a924d25-d099-4172-ab21-290a69090030.json delete mode 100644 change/@fluentui-react-color-picker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json delete mode 100644 change/@fluentui-react-color-picker-preview-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json delete mode 100644 change/@fluentui-react-combobox-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json delete mode 100644 change/@fluentui-react-components-2c418aac-078d-45dc-ad47-4bf796a2e600.json delete mode 100644 change/@fluentui-react-components-8e070f58-09e6-4a66-bd63-bbd13b27db88.json delete mode 100644 change/@fluentui-react-components-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json delete mode 100644 change/@fluentui-react-conformance-4944bee5-948a-4649-87a1-8362f68d4635.json delete mode 100644 change/@fluentui-react-icons-compat-d79ea04c-0316-4c1e-9c1e-96710298947a.json delete mode 100644 change/@fluentui-react-link-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json delete mode 100644 change/@fluentui-react-menu-51e8bb80-2224-47a8-8a42-282214bcee42.json delete mode 100644 change/@fluentui-react-message-bar-045b67fd-ae48-4ed9-abbd-669235409ead.json delete mode 100644 change/@fluentui-react-migration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json delete mode 100644 change/@fluentui-react-motion-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json delete mode 100644 change/@fluentui-react-motion-components-preview-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json delete mode 100644 change/@fluentui-react-motion-components-preview-67537ce1-b461-4bec-bbcb-61d9202e6632.json delete mode 100644 change/@fluentui-react-motion-components-preview-7795f18a-df86-480a-8546-efca47ef6069.json delete mode 100644 change/@fluentui-react-motion-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json delete mode 100644 change/@fluentui-react-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json delete mode 100644 change/@fluentui-react-nav-preview-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json delete mode 100644 change/@fluentui-react-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json delete mode 100644 change/@fluentui-react-nav-preview-f95778aa-ad54-4ba0-9ef8-38237de444a8.json delete mode 100644 change/@fluentui-react-popover-02147114-2b1f-427d-a369-c495dcc060f7.json delete mode 100644 change/@fluentui-react-positioning-7ff1890e-77cb-4078-be01-2673bb29a80b.json delete mode 100644 change/@fluentui-react-provider-9f506bc2-b69a-4140-b85e-67b97c87e955.json delete mode 100644 change/@fluentui-react-radio-59106324-2e52-43e5-b407-87f41706faa5.json delete mode 100644 change/@fluentui-react-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json delete mode 100644 change/@fluentui-react-switch-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json delete mode 100644 change/@fluentui-react-table-041ffd34-f086-4af7-a72a-66dbbd56617b.json delete mode 100644 change/@fluentui-react-tabs-c489edef-c7ee-4bf0-8f32-8565edccb381.json delete mode 100644 change/@fluentui-react-tabster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json delete mode 100644 change/@fluentui-react-tabster-a4a177a3-0514-4657-9fdd-a0e90d44e813.json delete mode 100644 change/@fluentui-react-tag-picker-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json delete mode 100644 change/@fluentui-react-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json delete mode 100644 change/@fluentui-react-toast-b6083bc4-f97c-4ad1-a457-a150145f3543.json delete mode 100644 change/@fluentui-react-tooltip-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json delete mode 100644 change/@fluentui-react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json delete mode 100644 change/@fluentui-react-tooltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json delete mode 100644 change/@fluentui-react-tree-287da350-699b-410f-bd97-7cb590731302.json delete mode 100644 change/@fluentui-react-tree-69773403-5633-414b-866a-f20aedf4bc0c.json delete mode 100644 change/@fluentui-react-tree-b452026f-0282-4a88-a922-34c2a983c77c.json delete mode 100644 change/@fluentui-react-utilities-0b333279-3531-4fce-a0ee-8e9c05d6f830.json delete mode 100644 change/@fluentui-react-utilities-82544042-02b6-4262-91cd-e7f9fe24bad2.json delete mode 100644 change/@fluentui-react-virtualizer-00dd23f0-89d0-486d-844f-30a880feb0f5.json delete mode 100644 change/@fluentui-react-virtualizer-d6716ae8-9732-454c-9c6f-65ab98953a42.json diff --git a/change/@fluentui-react-accordion-b082df99-c014-4ba8-8523-fdc134b25bcb.json b/change/@fluentui-react-accordion-b082df99-c014-4ba8-8523-fdc134b25bcb.json deleted file mode 100644 index ae55ba19bba18f..00000000000000 --- a/change/@fluentui-react-accordion-b082df99-c014-4ba8-8523-fdc134b25bcb.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-accordion", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-aria-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json b/change/@fluentui-react-aria-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json deleted file mode 100644 index dc9f1971ad978a..00000000000000 --- a/change/@fluentui-react-aria-ece4e8b8-ef6f-487c-a209-1a55c9dc6bfb.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-aria", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-avatar-9cab8d3a-1bcd-4c03-8138-82520de36649.json b/change/@fluentui-react-avatar-9cab8d3a-1bcd-4c03-8138-82520de36649.json deleted file mode 100644 index 9d3bbebf5cb5e1..00000000000000 --- a/change/@fluentui-react-avatar-9cab8d3a-1bcd-4c03-8138-82520de36649.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-avatar", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-color-picker-preview-1411f212-27ea-4335-bcd3-b210359b0bd1.json b/change/@fluentui-react-color-picker-preview-1411f212-27ea-4335-bcd3-b210359b0bd1.json deleted file mode 100644 index 6e323e0af85625..00000000000000 --- a/change/@fluentui-react-color-picker-preview-1411f212-27ea-4335-bcd3-b210359b0bd1.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-color-picker-preview", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-color-picker-preview-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json b/change/@fluentui-react-color-picker-preview-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json deleted file mode 100644 index 65b78e7e086001..00000000000000 --- a/change/@fluentui-react-color-picker-preview-4f2e285e-18a9-4ad5-8543-5310072fd1e9.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "fix: make api.md up to date", - "packageName": "@fluentui/react-color-picker-preview", - "email": "martinhochel@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-color-picker-preview-8a924d25-d099-4172-ab21-290a69090030.json b/change/@fluentui-react-color-picker-preview-8a924d25-d099-4172-ab21-290a69090030.json deleted file mode 100644 index 448468fae0103b..00000000000000 --- a/change/@fluentui-react-color-picker-preview-8a924d25-d099-4172-ab21-290a69090030.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages.", - "packageName": "@fluentui/react-color-picker-preview", - "email": "makotom@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-color-picker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json b/change/@fluentui-react-color-picker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json deleted file mode 100644 index 659240a99245b9..00000000000000 --- a/change/@fluentui-react-color-picker-preview-c30cb79c-aed3-4e9b-ad55-b1f946c8c691.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: focus jumps to inputY instead of next element", - "packageName": "@fluentui/react-color-picker-preview", - "email": "vkozlova@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-color-picker-preview-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json b/change/@fluentui-react-color-picker-preview-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json deleted file mode 100644 index f30eab37953f98..00000000000000 --- a/change/@fluentui-react-color-picker-preview-d36c4ad2-9cc0-4131-bdee-dd557b75c0bb.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "feat: Added `transparent` option to the AlphaSlider", - "packageName": "@fluentui/react-color-picker-preview", - "email": "v.kozlova13@gmail.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-combobox-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json b/change/@fluentui-react-combobox-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json deleted file mode 100644 index 793132b08fa9f9..00000000000000 --- a/change/@fluentui-react-combobox-6b28f16b-50a6-4ea3-8afc-d21e6b99bc5e.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-combobox", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-components-2c418aac-078d-45dc-ad47-4bf796a2e600.json b/change/@fluentui-react-components-2c418aac-078d-45dc-ad47-4bf796a2e600.json deleted file mode 100644 index d1657869b81f19..00000000000000 --- a/change/@fluentui-react-components-2c418aac-078d-45dc-ad47-4bf796a2e600.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "feature: re-export react-tag-picker context", - "packageName": "@fluentui/react-components", - "email": "bernardo.sunderhus@gmail.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-components-8e070f58-09e6-4a66-bd63-bbd13b27db88.json b/change/@fluentui-react-components-8e070f58-09e6-4a66-bd63-bbd13b27db88.json deleted file mode 100644 index ddc6a6c41d1080..00000000000000 --- a/change/@fluentui-react-components-8e070f58-09e6-4a66-bd63-bbd13b27db88.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "feature: TreeRootReset component", - "packageName": "@fluentui/react-components", - "email": "bernardo.sunderhus@gmail.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-components-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json b/change/@fluentui-react-components-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json deleted file mode 100644 index 6c9209a8e0effa..00000000000000 --- a/change/@fluentui-react-components-a1ed2f9c-dd8c-4d5c-82ae-295a90a26772.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-components", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-conformance-4944bee5-948a-4649-87a1-8362f68d4635.json b/change/@fluentui-react-conformance-4944bee5-948a-4649-87a1-8362f68d4635.json deleted file mode 100644 index 58fe9ad666bf04..00000000000000 --- a/change/@fluentui-react-conformance-4944bee5-948a-4649-87a1-8362f68d4635.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-conformance", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-icons-compat-d79ea04c-0316-4c1e-9c1e-96710298947a.json b/change/@fluentui-react-icons-compat-d79ea04c-0316-4c1e-9c1e-96710298947a.json deleted file mode 100644 index 3fb672d36efa9b..00000000000000 --- a/change/@fluentui-react-icons-compat-d79ea04c-0316-4c1e-9c1e-96710298947a.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-icons-compat", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-link-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json b/change/@fluentui-react-link-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json deleted file mode 100644 index c77906f88a7d1f..00000000000000 --- a/change/@fluentui-react-link-3fcc87af-d93e-43d3-8c48-d38b192fd9ac.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: support Enter and Space interaction, if rendered as span", - "packageName": "@fluentui/react-link", - "email": "vgenaev@gmail.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-menu-51e8bb80-2224-47a8-8a42-282214bcee42.json b/change/@fluentui-react-menu-51e8bb80-2224-47a8-8a42-282214bcee42.json deleted file mode 100644 index 369c63a243bb20..00000000000000 --- a/change/@fluentui-react-menu-51e8bb80-2224-47a8-8a42-282214bcee42.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-menu", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-message-bar-045b67fd-ae48-4ed9-abbd-669235409ead.json b/change/@fluentui-react-message-bar-045b67fd-ae48-4ed9-abbd-669235409ead.json deleted file mode 100644 index f62fce2bae66b0..00000000000000 --- a/change/@fluentui-react-message-bar-045b67fd-ae48-4ed9-abbd-669235409ead.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-message-bar", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-migration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json b/change/@fluentui-react-migration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json deleted file mode 100644 index dac1b4b49e6557..00000000000000 --- a/change/@fluentui-react-migration-v8-v9-d059899d-0a8a-4a74-8136-70b89e36f065.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages.", - "packageName": "@fluentui/react-migration-v8-v9", - "email": "makotom@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-motion-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json b/change/@fluentui-react-motion-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json deleted file mode 100644 index 57cfdd1c1b62b2..00000000000000 --- a/change/@fluentui-react-motion-32b72aa4-8d6a-42e7-8adc-3d0eb8162c7a.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-motion", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-motion-components-preview-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json b/change/@fluentui-react-motion-components-preview-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json deleted file mode 100644 index 1599dbedebc4be..00000000000000 --- a/change/@fluentui-react-motion-components-preview-1e0e7b65-3a13-46be-9f9c-01fdb511c16f.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "fix: make api.md up to date", - "packageName": "@fluentui/react-motion-components-preview", - "email": "martinhochel@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-motion-components-preview-67537ce1-b461-4bec-bbcb-61d9202e6632.json b/change/@fluentui-react-motion-components-preview-67537ce1-b461-4bec-bbcb-61d9202e6632.json deleted file mode 100644 index 970d564c51cda6..00000000000000 --- a/change/@fluentui-react-motion-components-preview-67537ce1-b461-4bec-bbcb-61d9202e6632.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "refactor(Collapse): streamline motion atom functions", - "packageName": "@fluentui/react-motion-components-preview", - "email": "robertpenner@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-motion-components-preview-7795f18a-df86-480a-8546-efca47ef6069.json b/change/@fluentui-react-motion-components-preview-7795f18a-df86-480a-8546-efca47ef6069.json deleted file mode 100644 index 36a3d3b7e344cc..00000000000000 --- a/change/@fluentui-react-motion-components-preview-7795f18a-df86-480a-8546-efca47ef6069.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-motion-components-preview", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-motion-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json b/change/@fluentui-react-motion-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json deleted file mode 100644 index cba37e60ef3fdd..00000000000000 --- a/change/@fluentui-react-motion-f4c1433b-f36e-4b2c-a9bd-9b16f37489fc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "feat: add extended support for reduced motion", - "packageName": "@fluentui/react-motion", - "email": "olfedias@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json b/change/@fluentui-react-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json deleted file mode 100644 index 15efc7af0656d4..00000000000000 --- a/change/@fluentui-react-nav-preview-b0930295-331e-4b55-96fc-c17b84ce854b.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: Speeding up animations in Nav.", - "packageName": "@fluentui/react-nav-preview", - "email": "matejera@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-nav-preview-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json b/change/@fluentui-react-nav-preview-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json deleted file mode 100644 index 6330f4d3225373..00000000000000 --- a/change/@fluentui-react-nav-preview-dbba66d7-ef68-4cb3-ac4f-dccf895fdd97.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "[BREAKING CHANGE] Replacing NavSize type and size prop with NavDensity type and density prop to avoid collisions with size on base Drawer component. ", - "packageName": "@fluentui/react-nav-preview", - "email": "matejera@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json b/change/@fluentui-react-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json deleted file mode 100644 index f180fa0c84851c..00000000000000 --- a/change/@fluentui-react-nav-preview-f1f67efd-37ec-4bf3-a0b8-470029586904.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix - changing hover animation curve to linear.", - "packageName": "@fluentui/react-nav-preview", - "email": "matejera@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-nav-preview-f95778aa-ad54-4ba0-9ef8-38237de444a8.json b/change/@fluentui-react-nav-preview-f95778aa-ad54-4ba0-9ef8-38237de444a8.json deleted file mode 100644 index 86031271d82853..00000000000000 --- a/change/@fluentui-react-nav-preview-f95778aa-ad54-4ba0-9ef8-38237de444a8.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "fix: make api.md up to date", - "packageName": "@fluentui/react-nav-preview", - "email": "martinhochel@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-popover-02147114-2b1f-427d-a369-c495dcc060f7.json b/change/@fluentui-react-popover-02147114-2b1f-427d-a369-c495dcc060f7.json deleted file mode 100644 index 7c818960694aea..00000000000000 --- a/change/@fluentui-react-popover-02147114-2b1f-427d-a369-c495dcc060f7.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-popover", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-positioning-7ff1890e-77cb-4078-be01-2673bb29a80b.json b/change/@fluentui-react-positioning-7ff1890e-77cb-4078-be01-2673bb29a80b.json deleted file mode 100644 index fa917f363eb6e0..00000000000000 --- a/change/@fluentui-react-positioning-7ff1890e-77cb-4078-be01-2673bb29a80b.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-positioning", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-provider-9f506bc2-b69a-4140-b85e-67b97c87e955.json b/change/@fluentui-react-provider-9f506bc2-b69a-4140-b85e-67b97c87e955.json deleted file mode 100644 index c7f52f2deb033f..00000000000000 --- a/change/@fluentui-react-provider-9f506bc2-b69a-4140-b85e-67b97c87e955.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "fix: Updating FluentProvider types to avoid implicit import in API definition.", - "packageName": "@fluentui/react-provider", - "email": "makotom@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-radio-59106324-2e52-43e5-b407-87f41706faa5.json b/change/@fluentui-react-radio-59106324-2e52-43e5-b407-87f41706faa5.json deleted file mode 100644 index 85b8c6c078c718..00000000000000 --- a/change/@fluentui-react-radio-59106324-2e52-43e5-b407-87f41706faa5.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-radio", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json b/change/@fluentui-react-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json deleted file mode 100644 index 3f61d17745a214..00000000000000 --- a/change/@fluentui-react-spinbutton-a56360e5-91b4-443c-90d7-d16c9a672862.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix spinbutton test", - "packageName": "@fluentui/react-spinbutton", - "email": "carla.muntean@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-switch-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json b/change/@fluentui-react-switch-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json deleted file mode 100644 index e6327946c49fac..00000000000000 --- a/change/@fluentui-react-switch-eef105b5-30ee-4c92-bac3-3eb2f1db9980.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-switch", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-table-041ffd34-f086-4af7-a72a-66dbbd56617b.json b/change/@fluentui-react-table-041ffd34-f086-4af7-a72a-66dbbd56617b.json deleted file mode 100644 index 9855003d9f9cca..00000000000000 --- a/change/@fluentui-react-table-041ffd34-f086-4af7-a72a-66dbbd56617b.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-table", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tabs-c489edef-c7ee-4bf0-8f32-8565edccb381.json b/change/@fluentui-react-tabs-c489edef-c7ee-4bf0-8f32-8565edccb381.json deleted file mode 100644 index add9f9f3024781..00000000000000 --- a/change/@fluentui-react-tabs-c489edef-c7ee-4bf0-8f32-8565edccb381.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-tabs", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tabster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json b/change/@fluentui-react-tabster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json deleted file mode 100644 index 9931e30185f731..00000000000000 --- a/change/@fluentui-react-tabster-53bcacad-3ce8-4391-a3eb-72bc219d93f9.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "docs: fix invalid TSdoc that is causing warnings within generate-api task", - "packageName": "@fluentui/react-tabster", - "email": "martinhochel@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tabster-a4a177a3-0514-4657-9fdd-a0e90d44e813.json b/change/@fluentui-react-tabster-a4a177a3-0514-4657-9fdd-a0e90d44e813.json deleted file mode 100644 index 8e5d56c1248819..00000000000000 --- a/change/@fluentui-react-tabster-a4a177a3-0514-4657-9fdd-a0e90d44e813.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-tabster", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tag-picker-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json b/change/@fluentui-react-tag-picker-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json deleted file mode 100644 index 9060ffa1cb620a..00000000000000 --- a/change/@fluentui-react-tag-picker-7ed3243d-60b5-4678-9762-f1b1722ca0fe.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "feature: single line layout", - "packageName": "@fluentui/react-tag-picker", - "email": "bernardo.sunderhus@gmail.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json b/change/@fluentui-react-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json deleted file mode 100644 index 3f3abb7239db9f..00000000000000 --- a/change/@fluentui-react-tag-picker-f788c84a-933e-4291-9111-2a6187517663.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "bugfix: secondaryContent not displaying properly", - "packageName": "@fluentui/react-tag-picker", - "email": "bernardo.sunderhus@gmail.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-toast-b6083bc4-f97c-4ad1-a457-a150145f3543.json b/change/@fluentui-react-toast-b6083bc4-f97c-4ad1-a457-a150145f3543.json deleted file mode 100644 index 6bf5ab81b5af14..00000000000000 --- a/change/@fluentui-react-toast-b6083bc4-f97c-4ad1-a457-a150145f3543.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "fix: make api.md up to date", - "packageName": "@fluentui/react-toast", - "email": "martinhochel@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tooltip-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json b/change/@fluentui-react-tooltip-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json deleted file mode 100644 index c1ea720b6a9e45..00000000000000 --- a/change/@fluentui-react-tooltip-058754b5-d9ec-459a-acc5-ba9ff587c4e3.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-tooltip", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json b/change/@fluentui-react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json deleted file mode 100644 index d8e0b5362d896c..00000000000000 --- a/change/@fluentui-react-tooltip-4088de96-b20d-4c18-9567-9987be622dbf.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: wrong call of useIsNavigatingWithKeyboard", - "packageName": "@fluentui/react-tooltip", - "email": "viktorgenaev@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-tooltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json b/change/@fluentui-react-tooltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json deleted file mode 100644 index 985a836a6abda3..00000000000000 --- a/change/@fluentui-react-tooltip-7be3b676-890f-4c2c-8a08-d7abf38084de.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "fix: make api.md up to date", - "packageName": "@fluentui/react-tooltip", - "email": "martinhochel@microsoft.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tree-287da350-699b-410f-bd97-7cb590731302.json b/change/@fluentui-react-tree-287da350-699b-410f-bd97-7cb590731302.json deleted file mode 100644 index 712df07693df6e..00000000000000 --- a/change/@fluentui-react-tree-287da350-699b-410f-bd97-7cb590731302.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-tree", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-tree-69773403-5633-414b-866a-f20aedf4bc0c.json b/change/@fluentui-react-tree-69773403-5633-414b-866a-f20aedf4bc0c.json deleted file mode 100644 index 299a1892740844..00000000000000 --- a/change/@fluentui-react-tree-69773403-5633-414b-866a-f20aedf4bc0c.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "feature: introduces navigationMode property", - "packageName": "@fluentui/react-tree", - "email": "bernardo.sunderhus@gmail.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-tree-b452026f-0282-4a88-a922-34c2a983c77c.json b/change/@fluentui-react-tree-b452026f-0282-4a88-a922-34c2a983c77c.json deleted file mode 100644 index 7e09b55e865d5d..00000000000000 --- a/change/@fluentui-react-tree-b452026f-0282-4a88-a922-34c2a983c77c.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "minor", - "comment": "feature: TreeRootReset component", - "packageName": "@fluentui/react-tree", - "email": "bernardo.sunderhus@gmail.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-utilities-0b333279-3531-4fce-a0ee-8e9c05d6f830.json b/change/@fluentui-react-utilities-0b333279-3531-4fce-a0ee-8e9c05d6f830.json deleted file mode 100644 index 050e7fdba7a165..00000000000000 --- a/change/@fluentui-react-utilities-0b333279-3531-4fce-a0ee-8e9c05d6f830.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "patch", - "comment": "fix: add autoCorrect and minLength input properties support to getNativeProps utility", - "packageName": "@fluentui/react-utilities", - "email": "dmytrokirpa@microsoft.com", - "dependentChangeType": "patch" -} diff --git a/change/@fluentui-react-utilities-82544042-02b6-4262-91cd-e7f9fe24bad2.json b/change/@fluentui-react-utilities-82544042-02b6-4262-91cd-e7f9fe24bad2.json deleted file mode 100644 index 6b1ae1f1853dd9..00000000000000 --- a/change/@fluentui-react-utilities-82544042-02b6-4262-91cd-e7f9fe24bad2.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-utilities", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-virtualizer-00dd23f0-89d0-486d-844f-30a880feb0f5.json b/change/@fluentui-react-virtualizer-00dd23f0-89d0-486d-844f-30a880feb0f5.json deleted file mode 100644 index 556a8a1950726c..00000000000000 --- a/change/@fluentui-react-virtualizer-00dd23f0-89d0-486d-844f-30a880feb0f5.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule", - "packageName": "@fluentui/react-virtualizer", - "email": "vgenaev@gmail.com", - "dependentChangeType": "none" -} diff --git a/change/@fluentui-react-virtualizer-d6716ae8-9732-454c-9c6f-65ab98953a42.json b/change/@fluentui-react-virtualizer-d6716ae8-9732-454c-9c6f-65ab98953a42.json deleted file mode 100644 index d4ed76c700480b..00000000000000 --- a/change/@fluentui-react-virtualizer-d6716ae8-9732-454c-9c6f-65ab98953a42.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "type": "none", - "comment": "fix: make api.md up to date", - "packageName": "@fluentui/react-virtualizer", - "email": "martinhochel@microsoft.com", - "dependentChangeType": "none" -} diff --git a/packages/charts/react-charts-preview/library/CHANGELOG.json b/packages/charts/react-charts-preview/library/CHANGELOG.json index 94ed98519669a4..8c8ca8cd805bd6 100644 --- a/packages/charts/react-charts-preview/library/CHANGELOG.json +++ b/packages/charts/react-charts-preview/library/CHANGELOG.json @@ -1,6 +1,57 @@ { "name": "@fluentui/react-charts-preview", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-charts-preview_v0.1.7", + "version": "0.1.7", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-button to v9.3.100", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-overflow to v9.2.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-popover to v9.9.31", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-tooltip to v9.5.4", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-charts-preview", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-charts-preview_v0.1.6", diff --git a/packages/charts/react-charts-preview/library/CHANGELOG.md b/packages/charts/react-charts-preview/library/CHANGELOG.md index ede8b5d0bf0233..804e04942d8714 100644 --- a/packages/charts/react-charts-preview/library/CHANGELOG.md +++ b/packages/charts/react-charts-preview/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-charts-preview -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [0.1.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-charts-preview_v0.1.7) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-charts-preview_v0.1.6..@fluentui/react-charts-preview_v0.1.7) + +### Patches + +- Bump @fluentui/react-button to v9.3.100 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-overflow to v9.2.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-popover to v9.9.31 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tooltip to v9.5.4 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [0.1.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-charts-preview_v0.1.6) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/charts/react-charts-preview/library/package.json b/packages/charts/react-charts-preview/library/package.json index 2bcc9cb58d91b8..548ee0fe1f743c 100644 --- a/packages/charts/react-charts-preview/library/package.json +++ b/packages/charts/react-charts-preview/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-charts-preview", - "version": "0.1.6", + "version": "0.1.7", "description": "React web chart controls for Microsoft fluentui v9 system.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -37,15 +37,15 @@ "@fluentui/scripts-tasks": "*" }, "dependencies": { - "@fluentui/react-button": "^9.3.99", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-overflow": "^9.2.6", - "@fluentui/react-popover": "^9.9.30", + "@fluentui/react-button": "^9.3.100", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-overflow": "^9.2.7", + "@fluentui/react-popover": "^9.9.31", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-tooltip": "^9.5.3", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-tooltip": "^9.5.4", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", "@types/d3-array": "^3.0.0", diff --git a/packages/react-components/babel-preset-global-context/CHANGELOG.json b/packages/react-components/babel-preset-global-context/CHANGELOG.json index 4aad018887c9b1..e8a001752075a3 100644 --- a/packages/react-components/babel-preset-global-context/CHANGELOG.json +++ b/packages/react-components/babel-preset-global-context/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/babel-preset-global-context", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/babel-preset-global-context_v9.0.0-beta.79", + "version": "9.0.0-beta.79", + "comments": { + "prerelease": [ + { + "author": "beachball", + "package": "@fluentui/babel-preset-global-context", + "comment": "Bump @fluentui/global-context to v9.0.0-beta.79", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/babel-preset-global-context_v9.0.0-beta.78", diff --git a/packages/react-components/babel-preset-global-context/CHANGELOG.md b/packages/react-components/babel-preset-global-context/CHANGELOG.md index 3c1e3659ab4490..d8a7774770321c 100644 --- a/packages/react-components/babel-preset-global-context/CHANGELOG.md +++ b/packages/react-components/babel-preset-global-context/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/babel-preset-global-context -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.0-beta.79](https://github.com/microsoft/fluentui/tree/@fluentui/babel-preset-global-context_v9.0.0-beta.79) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/babel-preset-global-context_v9.0.0-beta.78..@fluentui/babel-preset-global-context_v9.0.0-beta.79) + +### Changes + +- Bump @fluentui/global-context to v9.0.0-beta.79 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.0-beta.78](https://github.com/microsoft/fluentui/tree/@fluentui/babel-preset-global-context_v9.0.0-beta.78) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/babel-preset-global-context/package.json b/packages/react-components/babel-preset-global-context/package.json index ae065f3a0ae66e..561d0fcb493c63 100644 --- a/packages/react-components/babel-preset-global-context/package.json +++ b/packages/react-components/babel-preset-global-context/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/babel-preset-global-context", - "version": "9.0.0-beta.78", + "version": "9.0.0-beta.79", "description": "Babel preset that transforms createContext calls to use global context shims", "main": "lib-commonjs/index.js", "typings": "./dist/index.d.ts", @@ -25,7 +25,7 @@ "find-up": "^5.0.0" }, "peerDependencies": { - "@fluentui/global-context": "9.0.0-beta.78" + "@fluentui/global-context": "9.0.0-beta.79" }, "beachball": { "disallowedChangeTypes": [ diff --git a/packages/react-components/global-context/CHANGELOG.json b/packages/react-components/global-context/CHANGELOG.json index 883ca394b5b52e..1f4a5e1fbc23fc 100644 --- a/packages/react-components/global-context/CHANGELOG.json +++ b/packages/react-components/global-context/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/global-context", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/global-context_v9.0.0-beta.79", + "version": "9.0.0-beta.79", + "comments": { + "prerelease": [ + { + "author": "beachball", + "package": "@fluentui/global-context", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/global-context", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/global-context_v9.0.0-beta.78", diff --git a/packages/react-components/global-context/CHANGELOG.md b/packages/react-components/global-context/CHANGELOG.md index edef96c00de15b..d9fa75d8193239 100644 --- a/packages/react-components/global-context/CHANGELOG.md +++ b/packages/react-components/global-context/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/global-context -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.0-beta.79](https://github.com/microsoft/fluentui/tree/@fluentui/global-context_v9.0.0-beta.79) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/global-context_v9.0.0-beta.78..@fluentui/global-context_v9.0.0-beta.79) + +### Changes + +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.0-beta.78](https://github.com/microsoft/fluentui/tree/@fluentui/global-context_v9.0.0-beta.78) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/global-context/package.json b/packages/react-components/global-context/package.json index ba64f0ebcac54f..de6cb8687f61f5 100644 --- a/packages/react-components/global-context/package.json +++ b/packages/react-components/global-context/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/global-context", - "version": "9.0.0-beta.78", + "version": "9.0.0-beta.79", "description": "Extension of React createContext to be a true singleton on the global scope", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -17,8 +17,8 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-utilities": "^9.18.20", "@swc/helpers": "^0.5.1" }, "peerDependencies": { diff --git a/packages/react-components/react-accordion/library/CHANGELOG.json b/packages/react-components/react-accordion/library/CHANGELOG.json index 6d918b9c6a9ec7..4233a7d940dc2c 100644 --- a/packages/react-components/react-accordion/library/CHANGELOG.json +++ b/packages/react-components/react-accordion/library/CHANGELOG.json @@ -1,6 +1,65 @@ { "name": "@fluentui/react-accordion", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:14 GMT", + "tag": "@fluentui/react-accordion_v9.5.14", + "version": "9.5.14", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-accordion", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-motion to v9.6.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-accordion", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-accordion_v9.5.13", diff --git a/packages/react-components/react-accordion/library/CHANGELOG.md b/packages/react-components/react-accordion/library/CHANGELOG.md index 5f4519eed6cf93..9af72439ec4335 100644 --- a/packages/react-components/react-accordion/library/CHANGELOG.md +++ b/packages/react-components/react-accordion/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-accordion -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:14 GMT and should not be manually modified. <!-- Start content --> +## [9.5.14](https://github.com/microsoft/fluentui/tree/@fluentui/react-accordion_v9.5.14) + +Wed, 22 Jan 2025 14:00:14 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-accordion_v9.5.13..@fluentui/react-accordion_v9.5.14) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion to v9.6.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.5.13](https://github.com/microsoft/fluentui/tree/@fluentui/react-accordion_v9.5.13) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-accordion/library/package.json b/packages/react-components/react-accordion/library/package.json index b9812bfd106852..ba589605e4aa54 100644 --- a/packages/react-components/react-accordion/library/package.json +++ b/packages/react-components/react-accordion/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-accordion", - "version": "9.5.13", + "version": "9.5.14", "description": "Fluent UI accordion component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,16 +18,16 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-motion": "^9.6.6", - "@fluentui/react-motion-components-preview": "^0.4.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-motion": "^9.6.7", + "@fluentui/react-motion-components-preview": "^0.4.3", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-aria/library/CHANGELOG.json b/packages/react-components/react-aria/library/CHANGELOG.json index bd4d8fd100391d..354ff83f424f2d 100644 --- a/packages/react-components/react-aria/library/CHANGELOG.json +++ b/packages/react-components/react-aria/library/CHANGELOG.json @@ -1,6 +1,41 @@ { "name": "@fluentui/react-aria", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:14 GMT", + "tag": "@fluentui/react-aria_v9.13.14", + "version": "9.13.14", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-aria", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-aria", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-aria", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-aria", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-aria_v9.13.13", diff --git a/packages/react-components/react-aria/library/CHANGELOG.md b/packages/react-components/react-aria/library/CHANGELOG.md index de32309340dabb..1ad9d577a45748 100644 --- a/packages/react-components/react-aria/library/CHANGELOG.md +++ b/packages/react-components/react-aria/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-aria -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:14 GMT and should not be manually modified. <!-- Start content --> +## [9.13.14](https://github.com/microsoft/fluentui/tree/@fluentui/react-aria_v9.13.14) + +Wed, 22 Jan 2025 14:00:14 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-aria_v9.13.13..@fluentui/react-aria_v9.13.14) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.13.13](https://github.com/microsoft/fluentui/tree/@fluentui/react-aria_v9.13.13) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-aria/library/package.json b/packages/react-components/react-aria/library/package.json index 8df4f1e8f2d1dc..a3e71a3422df04 100644 --- a/packages/react-components/react-aria/library/package.json +++ b/packages/react-components/react-aria/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-aria", - "version": "9.13.13", + "version": "9.13.14", "description": "React helper to ensure ARIA", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,9 +20,9 @@ "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-tabster": "^9.23.3", + "@fluentui/react-utilities": "^9.18.20", "@swc/helpers": "^0.5.1" }, "peerDependencies": { diff --git a/packages/react-components/react-avatar/library/CHANGELOG.json b/packages/react-components/react-avatar/library/CHANGELOG.json index 20f5de14d1b2a7..5d7f86f725c8c9 100644 --- a/packages/react-components/react-avatar/library/CHANGELOG.json +++ b/packages/react-components/react-avatar/library/CHANGELOG.json @@ -1,6 +1,65 @@ { "name": "@fluentui/react-avatar", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:14 GMT", + "tag": "@fluentui/react-avatar_v9.6.49", + "version": "9.6.49", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-avatar", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-badge to v9.2.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-popover to v9.9.31", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-tooltip to v9.5.4", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-avatar", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-avatar_v9.6.48", diff --git a/packages/react-components/react-avatar/library/CHANGELOG.md b/packages/react-components/react-avatar/library/CHANGELOG.md index 944829443990ca..7256a95595839e 100644 --- a/packages/react-components/react-avatar/library/CHANGELOG.md +++ b/packages/react-components/react-avatar/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-avatar -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:14 GMT and should not be manually modified. <!-- Start content --> +## [9.6.49](https://github.com/microsoft/fluentui/tree/@fluentui/react-avatar_v9.6.49) + +Wed, 22 Jan 2025 14:00:14 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-avatar_v9.6.48..@fluentui/react-avatar_v9.6.49) + +### Patches + +- Bump @fluentui/react-badge to v9.2.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-popover to v9.9.31 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tooltip to v9.5.4 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.6.48](https://github.com/microsoft/fluentui/tree/@fluentui/react-avatar_v9.6.48) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-avatar/library/package.json b/packages/react-components/react-avatar/library/package.json index 2f9d349d45ee4e..4c02410c71da77 100644 --- a/packages/react-components/react-avatar/library/package.json +++ b/packages/react-components/react-avatar/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-avatar", - "version": "9.6.48", + "version": "9.6.49", "description": "React components for building Microsoft web experiences.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,16 +21,16 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-badge": "^9.2.49", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-badge": "^9.2.50", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-popover": "^9.9.30", + "@fluentui/react-popover": "^9.9.31", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-tooltip": "^9.5.3", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-tooltip": "^9.5.4", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-badge/library/CHANGELOG.json b/packages/react-components/react-badge/library/CHANGELOG.json index f1cc7a2126c9a1..efac2d70c8eec3 100644 --- a/packages/react-components/react-badge/library/CHANGELOG.json +++ b/packages/react-components/react-badge/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-badge", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-badge_v9.2.50", + "version": "9.2.50", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-badge", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-badge", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-badge_v9.2.49", diff --git a/packages/react-components/react-badge/library/CHANGELOG.md b/packages/react-components/react-badge/library/CHANGELOG.md index 6c04179d03e350..33347dfe86ee72 100644 --- a/packages/react-components/react-badge/library/CHANGELOG.md +++ b/packages/react-components/react-badge/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-badge -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.50](https://github.com/microsoft/fluentui/tree/@fluentui/react-badge_v9.2.50) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-badge_v9.2.49..@fluentui/react-badge_v9.2.50) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.49](https://github.com/microsoft/fluentui/tree/@fluentui/react-badge_v9.2.49) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-badge/library/package.json b/packages/react-components/react-badge/library/package.json index 25d81efe78c90c..870712d4dac4f7 100644 --- a/packages/react-components/react-badge/library/package.json +++ b/packages/react-components/react-badge/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-badge", - "version": "9.2.49", + "version": "9.2.50", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,10 +19,10 @@ }, "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-breadcrumb/library/CHANGELOG.json b/packages/react-components/react-breadcrumb/library/CHANGELOG.json index 0fb1591c357a6b..e6585c0b6e9822 100644 --- a/packages/react-components/react-breadcrumb/library/CHANGELOG.json +++ b/packages/react-components/react-breadcrumb/library/CHANGELOG.json @@ -1,6 +1,51 @@ { "name": "@fluentui/react-breadcrumb", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-breadcrumb_v9.0.49", + "version": "9.0.49", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-button to v9.3.100", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-link to v9.3.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-breadcrumb", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-breadcrumb_v9.0.48", diff --git a/packages/react-components/react-breadcrumb/library/CHANGELOG.md b/packages/react-components/react-breadcrumb/library/CHANGELOG.md index 703053e51edcfd..009e8ab911cd64 100644 --- a/packages/react-components/react-breadcrumb/library/CHANGELOG.md +++ b/packages/react-components/react-breadcrumb/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-breadcrumb -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.49](https://github.com/microsoft/fluentui/tree/@fluentui/react-breadcrumb_v9.0.49) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-breadcrumb_v9.0.48..@fluentui/react-breadcrumb_v9.0.49) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-button to v9.3.100 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-link to v9.3.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.48](https://github.com/microsoft/fluentui/tree/@fluentui/react-breadcrumb_v9.0.48) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-breadcrumb/library/package.json b/packages/react-components/react-breadcrumb/library/package.json index 55e7425017793e..16a086dc4ca01e 100644 --- a/packages/react-components/react-breadcrumb/library/package.json +++ b/packages/react-components/react-breadcrumb/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-breadcrumb", - "version": "9.0.48", + "version": "9.0.49", "description": "Breadcrumb component for Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -22,15 +22,15 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-button": "^9.3.99", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-button": "^9.3.100", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-link": "^9.3.6", + "@fluentui/react-link": "^9.3.7", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-button/library/CHANGELOG.json b/packages/react-components/react-button/library/CHANGELOG.json index d7913c861648d2..fa248b35557474 100644 --- a/packages/react-components/react-button/library/CHANGELOG.json +++ b/packages/react-components/react-button/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-button", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-button_v9.3.100", + "version": "9.3.100", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-button", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-button", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-button", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-button", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-button_v9.3.99", diff --git a/packages/react-components/react-button/library/CHANGELOG.md b/packages/react-components/react-button/library/CHANGELOG.md index 55ed9021a9fb48..820d20a9ecd3a6 100644 --- a/packages/react-components/react-button/library/CHANGELOG.md +++ b/packages/react-components/react-button/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-button -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.3.100](https://github.com/microsoft/fluentui/tree/@fluentui/react-button_v9.3.100) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-button_v9.3.99..@fluentui/react-button_v9.3.100) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.3.99](https://github.com/microsoft/fluentui/tree/@fluentui/react-button_v9.3.99) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-button/library/package.json b/packages/react-components/react-button/library/package.json index b632cf2d08c840..536b17b0df1ee9 100644 --- a/packages/react-components/react-button/library/package.json +++ b/packages/react-components/react-button/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-button", - "version": "9.3.99", + "version": "9.3.100", "description": "Fluent UI React Button component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,13 +20,13 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-aria": "^9.13.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-calendar-compat/library/CHANGELOG.json b/packages/react-components/react-calendar-compat/library/CHANGELOG.json index edb0f761aaea45..e1687b5f89adb1 100644 --- a/packages/react-components/react-calendar-compat/library/CHANGELOG.json +++ b/packages/react-components/react-calendar-compat/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-calendar-compat", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-calendar-compat_v0.1.26", + "version": "0.1.26", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-calendar-compat", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-calendar-compat", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-calendar-compat", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-calendar-compat_v0.1.25", diff --git a/packages/react-components/react-calendar-compat/library/CHANGELOG.md b/packages/react-components/react-calendar-compat/library/CHANGELOG.md index c0f3f3865b4c77..00592358ba8ed7 100644 --- a/packages/react-components/react-calendar-compat/library/CHANGELOG.md +++ b/packages/react-components/react-calendar-compat/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-calendar-compat -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [0.1.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-calendar-compat_v0.1.26) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-calendar-compat_v0.1.25..@fluentui/react-calendar-compat_v0.1.26) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [0.1.25](https://github.com/microsoft/fluentui/tree/@fluentui/react-calendar-compat_v0.1.25) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-calendar-compat/library/package.json b/packages/react-components/react-calendar-compat/library/package.json index 8dfb256dc9abf6..89995e6fa3c48f 100644 --- a/packages/react-components/react-calendar-compat/library/package.json +++ b/packages/react-components/react-calendar-compat/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-calendar-compat", - "version": "0.1.25", + "version": "0.1.26", "description": "Calendar compat component for Fluent UI v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,11 +20,11 @@ "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-card/library/CHANGELOG.json b/packages/react-components/react-card/library/CHANGELOG.json index 98cac8664bfbe8..e31bc1b0b00a6c 100644 --- a/packages/react-components/react-card/library/CHANGELOG.json +++ b/packages/react-components/react-card/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-card", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-card_v9.0.102", + "version": "9.0.102", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-card", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-card", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-card", + "comment": "Bump @fluentui/react-text to v9.4.32", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-card", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-card_v9.0.101", diff --git a/packages/react-components/react-card/library/CHANGELOG.md b/packages/react-components/react-card/library/CHANGELOG.md index 3e15430679e69c..2cea98f8842eff 100644 --- a/packages/react-components/react-card/library/CHANGELOG.md +++ b/packages/react-components/react-card/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-card -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.102](https://github.com/microsoft/fluentui/tree/@fluentui/react-card_v9.0.102) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-card_v9.0.101..@fluentui/react-card_v9.0.102) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-text to v9.4.32 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.101](https://github.com/microsoft/fluentui/tree/@fluentui/react-card_v9.0.101) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-card/library/package.json b/packages/react-components/react-card/library/package.json index f0a088e09f34b2..7a18f4bc807fc9 100644 --- a/packages/react-components/react-card/library/package.json +++ b/packages/react-components/react-card/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-card", - "version": "9.0.101", + "version": "9.0.102", "private": false, "description": "Card container components for Fluent UI React.", "main": "lib-commonjs/index.js", @@ -23,11 +23,11 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-text": "^9.4.31", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-tabster": "^9.23.3", + "@fluentui/react-text": "^9.4.32", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-carousel/library/CHANGELOG.json b/packages/react-components/react-carousel/library/CHANGELOG.json index 0081147104e9ac..792b4e5f87f761 100644 --- a/packages/react-components/react-carousel/library/CHANGELOG.json +++ b/packages/react-components/react-carousel/library/CHANGELOG.json @@ -1,6 +1,51 @@ { "name": "@fluentui/react-carousel", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-carousel_v9.4.5", + "version": "9.4.5", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-button to v9.3.100", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-carousel", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-carousel_v9.4.4", diff --git a/packages/react-components/react-carousel/library/CHANGELOG.md b/packages/react-components/react-carousel/library/CHANGELOG.md index ffcbf93a31bdd2..c0a4f27c42e88b 100644 --- a/packages/react-components/react-carousel/library/CHANGELOG.md +++ b/packages/react-components/react-carousel/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-carousel -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.4.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-carousel_v9.4.5) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-carousel_v9.4.4..@fluentui/react-carousel_v9.4.5) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-button to v9.3.100 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.4.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-carousel_v9.4.4) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-carousel/library/package.json b/packages/react-components/react-carousel/library/package.json index 8f8e5514146c4f..b4003021fdc1f6 100644 --- a/packages/react-components/react-carousel/library/package.json +++ b/packages/react-components/react-carousel/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-carousel", - "version": "9.4.4", + "version": "9.4.5", "description": "A composable carousel component that enables pagination with minimal rerenders", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -25,15 +25,15 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-button": "^9.3.99", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-button": "^9.3.100", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", "embla-carousel": "^8.5.1", diff --git a/packages/react-components/react-checkbox/library/CHANGELOG.json b/packages/react-components/react-checkbox/library/CHANGELOG.json index be6eaffe0562ac..b004e64ea85311 100644 --- a/packages/react-components/react-checkbox/library/CHANGELOG.json +++ b/packages/react-components/react-checkbox/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-checkbox", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-checkbox_v9.2.46", + "version": "9.2.46", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-checkbox", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-checkbox", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-checkbox", + "comment": "Bump @fluentui/react-label to v9.1.83", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-checkbox", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-checkbox", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-checkbox_v9.2.45", diff --git a/packages/react-components/react-checkbox/library/CHANGELOG.md b/packages/react-components/react-checkbox/library/CHANGELOG.md index 77f54ee619c374..ab98250e96c6ec 100644 --- a/packages/react-components/react-checkbox/library/CHANGELOG.md +++ b/packages/react-components/react-checkbox/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-checkbox -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.46](https://github.com/microsoft/fluentui/tree/@fluentui/react-checkbox_v9.2.46) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-checkbox_v9.2.45..@fluentui/react-checkbox_v9.2.46) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-label to v9.1.83 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.45](https://github.com/microsoft/fluentui/tree/@fluentui/react-checkbox_v9.2.45) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-checkbox/library/package.json b/packages/react-components/react-checkbox/library/package.json index 60de9de02621c0..a375e707c8dc70 100644 --- a/packages/react-components/react-checkbox/library/package.json +++ b/packages/react-components/react-checkbox/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-checkbox", - "version": "9.2.45", + "version": "9.2.46", "description": "Fluent UI checkbox component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,14 +18,14 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-field": "^9.1.85", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-label": "^9.1.82", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-label": "^9.1.83", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-color-picker-preview/library/CHANGELOG.json b/packages/react-components/react-color-picker-preview/library/CHANGELOG.json index f8e64896e9ddc1..564d0819ed10f7 100644 --- a/packages/react-components/react-color-picker-preview/library/CHANGELOG.json +++ b/packages/react-components/react-color-picker-preview/library/CHANGELOG.json @@ -1,6 +1,71 @@ { "name": "@fluentui/react-color-picker-preview", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:14 GMT", + "tag": "@fluentui/react-color-picker-preview_v0.1.4", + "version": "0.1.4", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + } + ], + "patch": [ + { + "author": "makotom@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "e7a954abbbe42a13ba302f28710a908cd34b72b9", + "comment": "chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages." + }, + { + "author": "vkozlova@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "9ed5fce8dda03bb85d583a23478ed298e51d305d", + "comment": "fix: focus jumps to inputY instead of next element" + }, + { + "author": "v.kozlova13@gmail.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "f1a15496cf7c7121f4d163e2394d5647fbe9eb96", + "comment": "feat: Added `transparent` option to the AlphaSlider" + }, + { + "author": "beachball", + "package": "@fluentui/react-color-picker-preview", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-color-picker-preview", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-color-picker-preview", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-color-picker-preview", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:32 GMT", "tag": "@fluentui/react-color-picker-preview_v0.1.3", diff --git a/packages/react-components/react-color-picker-preview/library/CHANGELOG.md b/packages/react-components/react-color-picker-preview/library/CHANGELOG.md index 52bcf72cde4c4d..be239d64392bd9 100644 --- a/packages/react-components/react-color-picker-preview/library/CHANGELOG.md +++ b/packages/react-components/react-color-picker-preview/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-color-picker-preview -This log was last generated on Wed, 08 Jan 2025 18:33:32 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:14 GMT and should not be manually modified. <!-- Start content --> +## [0.1.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-color-picker-preview_v0.1.4) + +Wed, 22 Jan 2025 14:00:14 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-color-picker-preview_v0.1.3..@fluentui/react-color-picker-preview_v0.1.4) + +### Patches + +- chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages. ([PR #33611](https://github.com/microsoft/fluentui/pull/33611) by makotom@microsoft.com) +- fix: focus jumps to inputY instead of next element ([PR #33620](https://github.com/microsoft/fluentui/pull/33620) by vkozlova@microsoft.com) +- feat: Added `transparent` option to the AlphaSlider ([PR #33572](https://github.com/microsoft/fluentui/pull/33572) by v.kozlova13@gmail.com) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [0.1.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-color-picker-preview_v0.1.3) Wed, 08 Jan 2025 18:33:32 GMT diff --git a/packages/react-components/react-color-picker-preview/library/package.json b/packages/react-components/react-color-picker-preview/library/package.json index 04b24ee067e828..66e8b1d5e9fd44 100644 --- a/packages/react-components/react-color-picker-preview/library/package.json +++ b/packages/react-components/react-color-picker-preview/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-color-picker-preview", - "version": "0.1.3", + "version": "0.1.4", "description": "ColorPicker component for Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -25,12 +25,12 @@ }, "dependencies": { "@ctrl/tinycolor": "^3.3.4", - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-colorpicker-compat/package.json b/packages/react-components/react-colorpicker-compat/package.json index e9209a38f85286..0b094aaac00793 100644 --- a/packages/react-components/react-colorpicker-compat/package.json +++ b/packages/react-components/react-colorpicker-compat/package.json @@ -19,9 +19,9 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-combobox/library/CHANGELOG.json b/packages/react-components/react-combobox/library/CHANGELOG.json index 03ad9f5d9ce256..ef9f84b29bbb64 100644 --- a/packages/react-components/react-combobox/library/CHANGELOG.json +++ b/packages/react-components/react-combobox/library/CHANGELOG.json @@ -1,6 +1,71 @@ { "name": "@fluentui/react-combobox", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:16 GMT", + "tag": "@fluentui/react-combobox_v9.13.17", + "version": "9.13.17", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-combobox", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-positioning to v9.16.2", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-combobox", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-combobox_v9.13.16", diff --git a/packages/react-components/react-combobox/library/CHANGELOG.md b/packages/react-components/react-combobox/library/CHANGELOG.md index 9d10ca0edeb740..e2f38640b8aaff 100644 --- a/packages/react-components/react-combobox/library/CHANGELOG.md +++ b/packages/react-components/react-combobox/library/CHANGELOG.md @@ -1,9 +1,25 @@ # Change Log - @fluentui/react-combobox -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:16 GMT and should not be manually modified. <!-- Start content --> +## [9.13.17](https://github.com/microsoft/fluentui/tree/@fluentui/react-combobox_v9.13.17) + +Wed, 22 Jan 2025 14:00:16 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-combobox_v9.13.16..@fluentui/react-combobox_v9.13.17) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-positioning to v9.16.2 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.13.16](https://github.com/microsoft/fluentui/tree/@fluentui/react-combobox_v9.13.16) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-combobox/library/package.json b/packages/react-components/react-combobox/library/package.json index 4500264946ddb9..5944cefc3a1ab2 100644 --- a/packages/react-components/react-combobox/library/package.json +++ b/packages/react-components/react-combobox/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-combobox", - "version": "9.13.16", + "version": "9.13.17", "description": "Fluent UI React Combobox component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,18 +19,18 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-aria": "^9.13.14", "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-field": "^9.1.85", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-portal": "^9.4.41", - "@fluentui/react-positioning": "^9.16.1", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-portal": "^9.4.42", + "@fluentui/react-positioning": "^9.16.2", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-components/CHANGELOG.json b/packages/react-components/react-components/CHANGELOG.json index c695eca381bf9f..1a601a7b97fa76 100644 --- a/packages/react-components/react-components/CHANGELOG.json +++ b/packages/react-components/react-components/CHANGELOG.json @@ -1,6 +1,319 @@ { "name": "@fluentui/react-components", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:07 GMT", + "tag": "@fluentui/react-components_v9.58.0", + "version": "9.58.0", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-popover", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-positioning", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-radio", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-switch", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-table", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-tabs", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-tabster", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "docs: fix invalid TSdoc that is causing warnings within generate-api task" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-tabster", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-toast", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-tooltip", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-tooltip", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-tree", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-utilities", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-virtualizer", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-virtualizer", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-accordion", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-aria", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-avatar", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-combobox", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-components", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-conformance", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-icons-compat", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-menu", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-message-bar", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-motion", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-motion-components-preview", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-motion-components-preview", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-nav-preview", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + } + ], + "minor": [ + { + "author": "makotom@microsoft.com", + "package": "@fluentui/react-provider", + "commit": "a8c0c467fdcdb1f721350b5cbd4ed6dd84e0715c", + "comment": "fix: Updating FluentProvider types to avoid implicit import in API definition." + }, + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-tag-picker", + "commit": "e706ac0ac7f2aa46a7f6f48efda24938a539a835", + "comment": "feature: single line layout" + }, + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-tree", + "commit": "246f5b3ed047531f7a329ad8ca7e5693cd3838a9", + "comment": "feature: introduces navigationMode property" + }, + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-tree", + "commit": "620ea3f1daa6a4cf9bb37961569f4756c3b3f95f", + "comment": "feature: TreeRootReset component" + }, + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-components", + "commit": "e706ac0ac7f2aa46a7f6f48efda24938a539a835", + "comment": "feature: re-export react-tag-picker context" + }, + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-components", + "commit": "620ea3f1daa6a4cf9bb37961569f4756c3b3f95f", + "comment": "feature: TreeRootReset component" + }, + { + "author": "matejera@microsoft.com", + "package": "@fluentui/react-nav-preview", + "commit": "93063df115dbd3bec400c581353b190e7952de6e", + "comment": "[BREAKING CHANGE] Replacing NavSize type and size prop with NavDensity type and density prop to avoid collisions with size on base Drawer component. " + } + ], + "patch": [ + { + "author": "carla.muntean@microsoft.com", + "package": "@fluentui/react-spinbutton", + "commit": "5afd9daa49ae9ca719260238b2b64451e575d913", + "comment": "fix spinbutton test" + }, + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-tag-picker", + "commit": "b987de6afa58c99706f17fa52aa0d64fc1f38643", + "comment": "bugfix: secondaryContent not displaying properly" + }, + { + "author": "viktorgenaev@microsoft.com", + "package": "@fluentui/react-tooltip", + "commit": "4db8229aa6938526432af9511f247072c21a72ac", + "comment": "fix: wrong call of useIsNavigatingWithKeyboard" + }, + { + "author": "dmytrokirpa@microsoft.com", + "package": "@fluentui/react-utilities", + "commit": "8cf401d626def27ad679f9e53928533df9f9ef52", + "comment": "fix: add autoCorrect and minLength input properties support to getNativeProps utility" + }, + { + "author": "makotom@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "e7a954abbbe42a13ba302f28710a908cd34b72b9", + "comment": "chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages." + }, + { + "author": "vkozlova@microsoft.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "9ed5fce8dda03bb85d583a23478ed298e51d305d", + "comment": "fix: focus jumps to inputY instead of next element" + }, + { + "author": "v.kozlova13@gmail.com", + "package": "@fluentui/react-color-picker-preview", + "commit": "f1a15496cf7c7121f4d163e2394d5647fbe9eb96", + "comment": "feat: Added `transparent` option to the AlphaSlider" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-link", + "commit": "928fdced4834242a829327af1db00f51f9dbd382", + "comment": "fix: support Enter and Space interaction, if rendered as span" + }, + { + "author": "makotom@microsoft.com", + "package": "@fluentui/react-migration-v8-v9", + "commit": "e7a954abbbe42a13ba302f28710a908cd34b72b9", + "comment": "chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages." + }, + { + "author": "olfedias@microsoft.com", + "package": "@fluentui/react-motion", + "commit": "ab6a30284d152c9ecde274e0cfc0579d002a7bbb", + "comment": "feat: add extended support for reduced motion" + }, + { + "author": "robertpenner@microsoft.com", + "package": "@fluentui/react-motion-components-preview", + "commit": "9331bcc59d84d033784c73eab870155a02286ce5", + "comment": "refactor(Collapse): streamline motion atom functions" + }, + { + "author": "matejera@microsoft.com", + "package": "@fluentui/react-nav-preview", + "commit": "befe9020d9198ff7f3d7e9042fc2c249c874b050", + "comment": "fix: Speeding up animations in Nav." + }, + { + "author": "matejera@microsoft.com", + "package": "@fluentui/react-nav-preview", + "commit": "e561700253aaaf2c6e17e5c70bf10c12c434bd96", + "comment": "fix - changing hover animation curve to linear." + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:32 GMT", "tag": "@fluentui/react-components_v9.57.0", diff --git a/packages/react-components/react-components/CHANGELOG.md b/packages/react-components/react-components/CHANGELOG.md index afacfc2fae0f59..e790e19b05fd4c 100644 --- a/packages/react-components/react-components/CHANGELOG.md +++ b/packages/react-components/react-components/CHANGELOG.md @@ -1,9 +1,55 @@ # Change Log - @fluentui/react-components -This log was last generated on Wed, 08 Jan 2025 18:33:32 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:07 GMT and should not be manually modified. <!-- Start content --> +## [9.58.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-components_v9.58.0) + +Wed, 22 Jan 2025 14:00:07 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-components_v9.57.0..@fluentui/react-components_v9.58.0) + +### Minor changes + +- `@fluentui/react-provider` + - fix: Updating FluentProvider types to avoid implicit import in API definition. ([PR #33590](https://github.com/microsoft/fluentui/pull/33590) by makotom@microsoft.com) +- `@fluentui/react-tag-picker` + - feature: single line layout ([PR #32247](https://github.com/microsoft/fluentui/pull/32247) by bernardo.sunderhus@gmail.com) +- `@fluentui/react-tree` + - feature: introduces navigationMode property ([PR #33658](https://github.com/microsoft/fluentui/pull/33658) by bernardo.sunderhus@gmail.com) + - feature: TreeRootReset component ([PR #33663](https://github.com/microsoft/fluentui/pull/33663) by bernardo.sunderhus@gmail.com) +- `@fluentui/react-components` + - feature: re-export react-tag-picker context ([PR #32247](https://github.com/microsoft/fluentui/pull/32247) by bernardo.sunderhus@gmail.com) + - feature: TreeRootReset component ([PR #33663](https://github.com/microsoft/fluentui/pull/33663) by bernardo.sunderhus@gmail.com) +- `@fluentui/react-nav-preview` + - [BREAKING CHANGE] Replacing NavSize type and size prop with NavDensity type and density prop to avoid collisions with size on base Drawer component. ([PR #33559](https://github.com/microsoft/fluentui/pull/33559) by matejera@microsoft.com) + +### Patches + +- `@fluentui/react-spinbutton` + - fix spinbutton test ([PR #33680](https://github.com/microsoft/fluentui/pull/33680) by carla.muntean@microsoft.com) +- `@fluentui/react-tag-picker` + - bugfix: secondaryContent not displaying properly ([PR #33689](https://github.com/microsoft/fluentui/pull/33689) by bernardo.sunderhus@gmail.com) +- `@fluentui/react-tooltip` + - fix: wrong call of useIsNavigatingWithKeyboard ([PR #33666](https://github.com/microsoft/fluentui/pull/33666) by viktorgenaev@microsoft.com) +- `@fluentui/react-utilities` + - fix: add autoCorrect and minLength input properties support to getNativeProps utility ([PR #33642](https://github.com/microsoft/fluentui/pull/33642) by dmytrokirpa@microsoft.com) +- `@fluentui/react-color-picker-preview` + - chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages. ([PR #33611](https://github.com/microsoft/fluentui/pull/33611) by makotom@microsoft.com) + - fix: focus jumps to inputY instead of next element ([PR #33620](https://github.com/microsoft/fluentui/pull/33620) by vkozlova@microsoft.com) + - feat: Added `transparent` option to the AlphaSlider ([PR #33572](https://github.com/microsoft/fluentui/pull/33572) by v.kozlova13@gmail.com) +- `@fluentui/react-link` + - fix: support Enter and Space interaction, if rendered as span ([PR #33587](https://github.com/microsoft/fluentui/pull/33587) by vgenaev@gmail.com) +- `@fluentui/react-migration-v8-v9` + - chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages. ([PR #33611](https://github.com/microsoft/fluentui/pull/33611) by makotom@microsoft.com) +- `@fluentui/react-motion` + - feat: add extended support for reduced motion ([PR #33353](https://github.com/microsoft/fluentui/pull/33353) by olfedias@microsoft.com) +- `@fluentui/react-motion-components-preview` + - refactor(Collapse): streamline motion atom functions ([PR #33463](https://github.com/microsoft/fluentui/pull/33463) by robertpenner@microsoft.com) +- `@fluentui/react-nav-preview` + - fix: Speeding up animations in Nav. ([PR #33588](https://github.com/microsoft/fluentui/pull/33588) by matejera@microsoft.com) + - fix - changing hover animation curve to linear. ([PR #33633](https://github.com/microsoft/fluentui/pull/33633) by matejera@microsoft.com) + ## [9.57.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-components_v9.57.0) Wed, 08 Jan 2025 18:33:32 GMT diff --git a/packages/react-components/react-components/package.json b/packages/react-components/react-components/package.json index ba48442cdf3a95..01a23fc53c6cee 100644 --- a/packages/react-components/react-components/package.json +++ b/packages/react-components/react-components/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-components", - "version": "9.57.0", + "version": "9.58.0", "description": "Suite package for converged React components", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -16,66 +16,66 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-accordion": "^9.5.13", + "@fluentui/react-accordion": "^9.5.14", "@fluentui/react-alert": "9.0.0-beta.124", - "@fluentui/react-avatar": "^9.6.48", - "@fluentui/react-badge": "^9.2.49", - "@fluentui/react-button": "^9.3.99", - "@fluentui/react-card": "^9.0.101", - "@fluentui/react-checkbox": "^9.2.45", - "@fluentui/react-combobox": "^9.13.16", - "@fluentui/react-dialog": "^9.11.27", - "@fluentui/react-divider": "^9.2.81", - "@fluentui/react-drawer": "^9.6.7", - "@fluentui/react-field": "^9.1.84", - "@fluentui/react-image": "^9.1.79", + "@fluentui/react-avatar": "^9.6.49", + "@fluentui/react-badge": "^9.2.50", + "@fluentui/react-button": "^9.3.100", + "@fluentui/react-card": "^9.0.102", + "@fluentui/react-checkbox": "^9.2.46", + "@fluentui/react-combobox": "^9.13.17", + "@fluentui/react-dialog": "^9.11.28", + "@fluentui/react-divider": "^9.2.82", + "@fluentui/react-drawer": "^9.6.8", + "@fluentui/react-field": "^9.1.85", + "@fluentui/react-image": "^9.1.80", "@fluentui/react-infobutton": "9.0.0-beta.102", - "@fluentui/react-infolabel": "^9.0.55", - "@fluentui/react-input": "^9.4.97", - "@fluentui/react-label": "^9.1.82", - "@fluentui/react-link": "^9.3.6", - "@fluentui/react-list": "^9.0.0", - "@fluentui/react-menu": "^9.14.25", - "@fluentui/react-overflow": "^9.2.6", - "@fluentui/react-persona": "^9.2.107", - "@fluentui/react-portal": "^9.4.41", - "@fluentui/react-popover": "^9.9.30", - "@fluentui/react-positioning": "^9.16.1", - "@fluentui/react-progress": "^9.1.95", - "@fluentui/react-provider": "^9.18.3", - "@fluentui/react-radio": "^9.2.40", - "@fluentui/react-select": "^9.1.95", + "@fluentui/react-infolabel": "^9.0.56", + "@fluentui/react-input": "^9.4.98", + "@fluentui/react-label": "^9.1.83", + "@fluentui/react-link": "^9.3.7", + "@fluentui/react-list": "^9.0.1", + "@fluentui/react-menu": "^9.14.26", + "@fluentui/react-overflow": "^9.2.7", + "@fluentui/react-persona": "^9.2.108", + "@fluentui/react-portal": "^9.4.42", + "@fluentui/react-popover": "^9.9.31", + "@fluentui/react-positioning": "^9.16.2", + "@fluentui/react-progress": "^9.1.96", + "@fluentui/react-provider": "^9.19.0", + "@fluentui/react-radio": "^9.2.41", + "@fluentui/react-select": "^9.1.96", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-skeleton": "^9.1.24", - "@fluentui/react-slider": "^9.2.4", - "@fluentui/react-spinbutton": "^9.2.96", - "@fluentui/react-spinner": "^9.5.6", - "@fluentui/react-swatch-picker": "^9.1.18", - "@fluentui/react-switch": "^9.1.102", - "@fluentui/react-table": "^9.15.27", - "@fluentui/react-tabs": "^9.6.6", - "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-tags": "^9.3.28", - "@fluentui/react-textarea": "^9.3.96", + "@fluentui/react-skeleton": "^9.1.25", + "@fluentui/react-slider": "^9.2.5", + "@fluentui/react-spinbutton": "^9.2.97", + "@fluentui/react-spinner": "^9.5.7", + "@fluentui/react-swatch-picker": "^9.1.19", + "@fluentui/react-switch": "^9.1.103", + "@fluentui/react-table": "^9.15.28", + "@fluentui/react-tabs": "^9.6.7", + "@fluentui/react-tabster": "^9.23.3", + "@fluentui/react-tags": "^9.3.29", + "@fluentui/react-textarea": "^9.3.97", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-toast": "^9.3.64", - "@fluentui/react-toolbar": "^9.2.14", - "@fluentui/react-tooltip": "^9.5.3", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-text": "^9.4.31", - "@fluentui/react-virtualizer": "9.0.0-alpha.90", - "@fluentui/react-tree": "^9.8.12", + "@fluentui/react-toast": "^9.3.65", + "@fluentui/react-toolbar": "^9.2.15", + "@fluentui/react-tooltip": "^9.5.4", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-text": "^9.4.32", + "@fluentui/react-virtualizer": "9.0.0-alpha.91", + "@fluentui/react-tree": "^9.9.0", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", - "@fluentui/react-message-bar": "^9.3.0", - "@fluentui/react-breadcrumb": "^9.0.48", - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-rating": "^9.0.27", - "@fluentui/react-search": "^9.0.27", - "@fluentui/react-teaching-popover": "^9.2.0", - "@fluentui/react-tag-picker": "^9.3.14", - "@fluentui/react-motion": "^9.6.6", - "@fluentui/react-carousel": "^9.4.4" + "@fluentui/react-message-bar": "^9.3.1", + "@fluentui/react-breadcrumb": "^9.0.49", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-rating": "^9.0.28", + "@fluentui/react-search": "^9.0.28", + "@fluentui/react-teaching-popover": "^9.2.1", + "@fluentui/react-tag-picker": "^9.4.0", + "@fluentui/react-motion": "^9.6.7", + "@fluentui/react-carousel": "^9.4.5" }, "peerDependencies": { "@types/react": ">=16.14.0 <19.0.0", diff --git a/packages/react-components/react-context-selector/CHANGELOG.json b/packages/react-components/react-context-selector/CHANGELOG.json index 87a070ca7ae9e8..8404e6721276b8 100644 --- a/packages/react-components/react-context-selector/CHANGELOG.json +++ b/packages/react-components/react-context-selector/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-context-selector", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-context-selector_v9.1.72", + "version": "9.1.72", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-context-selector", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-context-selector_v9.1.71", diff --git a/packages/react-components/react-context-selector/CHANGELOG.md b/packages/react-components/react-context-selector/CHANGELOG.md index b1e76c5e9f53a7..e31ba859334729 100644 --- a/packages/react-components/react-context-selector/CHANGELOG.md +++ b/packages/react-components/react-context-selector/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-context-selector -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.1.72](https://github.com/microsoft/fluentui/tree/@fluentui/react-context-selector_v9.1.72) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-context-selector_v9.1.71..@fluentui/react-context-selector_v9.1.72) + +### Patches + +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.71](https://github.com/microsoft/fluentui/tree/@fluentui/react-context-selector_v9.1.71) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-context-selector/package.json b/packages/react-components/react-context-selector/package.json index 0e787078551d1b..49f1992c90f8f3 100644 --- a/packages/react-components/react-context-selector/package.json +++ b/packages/react-components/react-context-selector/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-context-selector", - "version": "9.1.71", + "version": "9.1.72", "description": "React useContextSelector hook in userland", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -16,7 +16,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@swc/helpers": "^0.5.1" }, "peerDependencies": { diff --git a/packages/react-components/react-datepicker-compat/library/CHANGELOG.json b/packages/react-components/react-datepicker-compat/library/CHANGELOG.json index 9d9fff5f088e67..e633ab6f8a85f5 100644 --- a/packages/react-components/react-datepicker-compat/library/CHANGELOG.json +++ b/packages/react-components/react-datepicker-compat/library/CHANGELOG.json @@ -1,6 +1,69 @@ { "name": "@fluentui/react-datepicker-compat", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-datepicker-compat_v0.4.61", + "version": "0.4.61", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-calendar-compat to v0.1.26", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-input to v9.4.98", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-popover to v9.9.31", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-positioning to v9.16.2", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-datepicker-compat", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-datepicker-compat_v0.4.60", diff --git a/packages/react-components/react-datepicker-compat/library/CHANGELOG.md b/packages/react-components/react-datepicker-compat/library/CHANGELOG.md index c05f0a647e00ec..1277b0d87b59d9 100644 --- a/packages/react-components/react-datepicker-compat/library/CHANGELOG.md +++ b/packages/react-components/react-datepicker-compat/library/CHANGELOG.md @@ -1,9 +1,26 @@ # Change Log - @fluentui/react-datepicker-compat -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [0.4.61](https://github.com/microsoft/fluentui/tree/@fluentui/react-datepicker-compat_v0.4.61) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-datepicker-compat_v0.4.60..@fluentui/react-datepicker-compat_v0.4.61) + +### Patches + +- Bump @fluentui/react-calendar-compat to v0.1.26 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-input to v9.4.98 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-popover to v9.9.31 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-positioning to v9.16.2 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [0.4.60](https://github.com/microsoft/fluentui/tree/@fluentui/react-datepicker-compat_v0.4.60) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-datepicker-compat/library/package.json b/packages/react-components/react-datepicker-compat/library/package.json index c389c90fbe7add..e18db5a152383a 100644 --- a/packages/react-components/react-datepicker-compat/library/package.json +++ b/packages/react-components/react-datepicker-compat/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-datepicker-compat", - "version": "0.4.60", + "version": "0.4.61", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,18 +21,18 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-calendar-compat": "^0.1.25", - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-calendar-compat": "^0.1.26", + "@fluentui/react-field": "^9.1.85", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-input": "^9.4.97", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-popover": "^9.9.30", - "@fluentui/react-portal": "^9.4.41", - "@fluentui/react-positioning": "^9.16.1", + "@fluentui/react-input": "^9.4.98", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-popover": "^9.9.31", + "@fluentui/react-portal": "^9.4.42", + "@fluentui/react-positioning": "^9.16.2", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-dialog/library/CHANGELOG.json b/packages/react-components/react-dialog/library/CHANGELOG.json index db2f8af9726443..281dd4720b0954 100644 --- a/packages/react-components/react-dialog/library/CHANGELOG.json +++ b/packages/react-components/react-dialog/library/CHANGELOG.json @@ -1,6 +1,63 @@ { "name": "@fluentui/react-dialog", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-dialog_v9.11.28", + "version": "9.11.28", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-motion to v9.6.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-dialog", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-dialog_v9.11.27", diff --git a/packages/react-components/react-dialog/library/CHANGELOG.md b/packages/react-components/react-dialog/library/CHANGELOG.md index c81c59e32589b5..dee22beab2ce14 100644 --- a/packages/react-components/react-dialog/library/CHANGELOG.md +++ b/packages/react-components/react-dialog/library/CHANGELOG.md @@ -1,9 +1,25 @@ # Change Log - @fluentui/react-dialog -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.11.28](https://github.com/microsoft/fluentui/tree/@fluentui/react-dialog_v9.11.28) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-dialog_v9.11.27..@fluentui/react-dialog_v9.11.28) + +### Patches + +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion to v9.6.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.11.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-dialog_v9.11.27) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-dialog/library/package.json b/packages/react-components/react-dialog/library/package.json index 35ebfdfe0dbc31..761fcd369479e2 100644 --- a/packages/react-components/react-dialog/library/package.json +++ b/packages/react-components/react-dialog/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-dialog", - "version": "9.11.27", + "version": "9.11.28", "description": "Dialog component for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -24,18 +24,18 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-motion": "^9.6.6", - "@fluentui/react-motion-components-preview": "^0.4.2", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-motion": "^9.6.7", + "@fluentui/react-motion-components-preview": "^0.4.3", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-aria": "^9.13.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-portal": "^9.4.42", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-divider/library/CHANGELOG.json b/packages/react-components/react-divider/library/CHANGELOG.json index cfd921712513ba..a6565fd3e7afff 100644 --- a/packages/react-components/react-divider/library/CHANGELOG.json +++ b/packages/react-components/react-divider/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-divider", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-divider_v9.2.82", + "version": "9.2.82", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-divider", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-divider", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-divider_v9.2.81", diff --git a/packages/react-components/react-divider/library/CHANGELOG.md b/packages/react-components/react-divider/library/CHANGELOG.md index 38a29a2f69e7f1..95d8e36cd4bad9 100644 --- a/packages/react-components/react-divider/library/CHANGELOG.md +++ b/packages/react-components/react-divider/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-divider -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.82](https://github.com/microsoft/fluentui/tree/@fluentui/react-divider_v9.2.82) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-divider_v9.2.81..@fluentui/react-divider_v9.2.82) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.81](https://github.com/microsoft/fluentui/tree/@fluentui/react-divider_v9.2.81) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-divider/library/package.json b/packages/react-components/react-divider/library/package.json index 485f8b83c26716..458ab8c0fe3bc2 100644 --- a/packages/react-components/react-divider/library/package.json +++ b/packages/react-components/react-divider/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-divider", - "version": "9.2.81", + "version": "9.2.82", "description": "Fluent UI component to visually separate content.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,10 +18,10 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-drawer/library/CHANGELOG.json b/packages/react-components/react-drawer/library/CHANGELOG.json index 673e1556b54f6e..d18f5ed840886d 100644 --- a/packages/react-components/react-drawer/library/CHANGELOG.json +++ b/packages/react-components/react-drawer/library/CHANGELOG.json @@ -1,6 +1,51 @@ { "name": "@fluentui/react-drawer", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-drawer_v9.6.8", + "version": "9.6.8", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-dialog to v9.11.28", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-motion to v9.6.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-drawer", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-drawer_v9.6.7", diff --git a/packages/react-components/react-drawer/library/CHANGELOG.md b/packages/react-components/react-drawer/library/CHANGELOG.md index 6ddf6d54166b1d..389e08fa9a4b73 100644 --- a/packages/react-components/react-drawer/library/CHANGELOG.md +++ b/packages/react-components/react-drawer/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-drawer -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.6.8](https://github.com/microsoft/fluentui/tree/@fluentui/react-drawer_v9.6.8) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-drawer_v9.6.7..@fluentui/react-drawer_v9.6.8) + +### Patches + +- Bump @fluentui/react-dialog to v9.11.28 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion to v9.6.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.6.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-drawer_v9.6.7) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-drawer/library/package.json b/packages/react-components/react-drawer/library/package.json index d94a138f8a88f9..86953cdefef275 100644 --- a/packages/react-components/react-drawer/library/package.json +++ b/packages/react-components/react-drawer/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-drawer", - "version": "9.6.7", + "version": "9.6.8", "description": "Drawer components for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,14 +20,14 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-dialog": "^9.11.27", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-motion": "^9.6.6", - "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-dialog": "^9.11.28", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-motion": "^9.6.7", + "@fluentui/react-portal": "^9.4.42", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-field/library/CHANGELOG.json b/packages/react-components/react-field/library/CHANGELOG.json index 71f917cde5b92f..dc0aca8dca928f 100644 --- a/packages/react-components/react-field/library/CHANGELOG.json +++ b/packages/react-components/react-field/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-field", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-field_v9.1.85", + "version": "9.1.85", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-field", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-field", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-field", + "comment": "Bump @fluentui/react-label to v9.1.83", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-field", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-field_v9.1.84", diff --git a/packages/react-components/react-field/library/CHANGELOG.md b/packages/react-components/react-field/library/CHANGELOG.md index 96c5540dc6f1da..26f293344ff396 100644 --- a/packages/react-components/react-field/library/CHANGELOG.md +++ b/packages/react-components/react-field/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-field -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.1.85](https://github.com/microsoft/fluentui/tree/@fluentui/react-field_v9.1.85) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-field_v9.1.84..@fluentui/react-field_v9.1.85) + +### Patches + +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-label to v9.1.83 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.84](https://github.com/microsoft/fluentui/tree/@fluentui/react-field_v9.1.84) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-field/library/package.json b/packages/react-components/react-field/library/package.json index e8e239bba65a46..a710ba55ee5bbe 100644 --- a/packages/react-components/react-field/library/package.json +++ b/packages/react-components/react-field/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-field", - "version": "9.1.84", + "version": "9.1.85", "description": "Fluent UI Field components", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,12 +19,12 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-label": "^9.1.82", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-label": "^9.1.83", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-icons-compat/library/CHANGELOG.json b/packages/react-components/react-icons-compat/library/CHANGELOG.json index 6c529be129823a..b91bbd49728cf5 100644 --- a/packages/react-components/react-icons-compat/library/CHANGELOG.json +++ b/packages/react-components/react-icons-compat/library/CHANGELOG.json @@ -1,6 +1,35 @@ { "name": "@fluentui/react-icons-compat", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:17 GMT", + "tag": "@fluentui/react-icons-compat_v0.1.8", + "version": "0.1.8", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-icons-compat", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-icons-compat", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-icons-compat", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-icons-compat_v0.1.7", diff --git a/packages/react-components/react-icons-compat/library/CHANGELOG.md b/packages/react-components/react-icons-compat/library/CHANGELOG.md index b43bc400205907..943fb5ecbc6f7b 100644 --- a/packages/react-components/react-icons-compat/library/CHANGELOG.md +++ b/packages/react-components/react-icons-compat/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-icons-compat -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:17 GMT and should not be manually modified. <!-- Start content --> +## [0.1.8](https://github.com/microsoft/fluentui/tree/@fluentui/react-icons-compat_v0.1.8) + +Wed, 22 Jan 2025 14:00:17 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-icons-compat_v0.1.7..@fluentui/react-icons-compat_v0.1.8) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [0.1.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-icons-compat_v0.1.7) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-icons-compat/library/package.json b/packages/react-components/react-icons-compat/library/package.json index cf92fb784977c4..7157ccac2091c4 100644 --- a/packages/react-components/react-icons-compat/library/package.json +++ b/packages/react-components/react-icons-compat/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-icons-compat", - "version": "0.1.7", + "version": "0.1.8", "description": "Package for icon utility methods used by font and svg icons.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -24,10 +24,10 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-image/library/CHANGELOG.json b/packages/react-components/react-image/library/CHANGELOG.json index 53cc360c714a0b..9c9fe5863d24ce 100644 --- a/packages/react-components/react-image/library/CHANGELOG.json +++ b/packages/react-components/react-image/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-image", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-image_v9.1.80", + "version": "9.1.80", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-image", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-image", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-image_v9.1.79", diff --git a/packages/react-components/react-image/library/CHANGELOG.md b/packages/react-components/react-image/library/CHANGELOG.md index dc84fa08a79a35..c8e493912d109d 100644 --- a/packages/react-components/react-image/library/CHANGELOG.md +++ b/packages/react-components/react-image/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-image -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.1.80](https://github.com/microsoft/fluentui/tree/@fluentui/react-image_v9.1.80) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-image_v9.1.79..@fluentui/react-image_v9.1.80) + +### Patches + +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.79](https://github.com/microsoft/fluentui/tree/@fluentui/react-image_v9.1.79) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-image/library/package.json b/packages/react-components/react-image/library/package.json index aed4249848420b..876221a2db9bae 100644 --- a/packages/react-components/react-image/library/package.json +++ b/packages/react-components/react-image/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-image", - "version": "9.1.79", + "version": "9.1.80", "description": "Fluent UI React Image component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,8 +19,8 @@ }, "dependencies": { "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-theme": "^9.1.24", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" diff --git a/packages/react-components/react-infolabel/library/CHANGELOG.json b/packages/react-components/react-infolabel/library/CHANGELOG.json index 412ff5f8625b2f..cd866b237967e1 100644 --- a/packages/react-components/react-infolabel/library/CHANGELOG.json +++ b/packages/react-components/react-infolabel/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-infolabel", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-infolabel_v9.0.56", + "version": "9.0.56", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-infolabel", + "comment": "Bump @fluentui/react-label to v9.1.83", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-infolabel", + "comment": "Bump @fluentui/react-popover to v9.9.31", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-infolabel", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-infolabel", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-infolabel", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-infolabel_v9.0.55", diff --git a/packages/react-components/react-infolabel/library/CHANGELOG.md b/packages/react-components/react-infolabel/library/CHANGELOG.md index fbbafa546ef0f0..0c6e12b8d9850c 100644 --- a/packages/react-components/react-infolabel/library/CHANGELOG.md +++ b/packages/react-components/react-infolabel/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-infolabel -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.56](https://github.com/microsoft/fluentui/tree/@fluentui/react-infolabel_v9.0.56) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-infolabel_v9.0.55..@fluentui/react-infolabel_v9.0.56) + +### Patches + +- Bump @fluentui/react-label to v9.1.83 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-popover to v9.9.31 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.55](https://github.com/microsoft/fluentui/tree/@fluentui/react-infolabel_v9.0.55) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-infolabel/library/package.json b/packages/react-components/react-infolabel/library/package.json index ca362048345b94..0eab2d3b7d2af5 100644 --- a/packages/react-components/react-infolabel/library/package.json +++ b/packages/react-components/react-infolabel/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-infolabel", - "version": "9.0.55", + "version": "9.0.56", "description": "InfoLabel component for Fluent UI v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,12 +21,12 @@ }, "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-label": "^9.1.82", - "@fluentui/react-popover": "^9.9.30", - "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-label": "^9.1.83", + "@fluentui/react-popover": "^9.9.31", + "@fluentui/react-tabster": "^9.23.3", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-input/library/CHANGELOG.json b/packages/react-components/react-input/library/CHANGELOG.json index ba43058f1db9cb..5dbc52d2ff923d 100644 --- a/packages/react-components/react-input/library/CHANGELOG.json +++ b/packages/react-components/react-input/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-input", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-input_v9.4.98", + "version": "9.4.98", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-input", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-input", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-input", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-input_v9.4.97", diff --git a/packages/react-components/react-input/library/CHANGELOG.md b/packages/react-components/react-input/library/CHANGELOG.md index 6bbbc3d63c5273..e39bf94c6b84e6 100644 --- a/packages/react-components/react-input/library/CHANGELOG.md +++ b/packages/react-components/react-input/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-input -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.4.98](https://github.com/microsoft/fluentui/tree/@fluentui/react-input_v9.4.98) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-input_v9.4.97..@fluentui/react-input_v9.4.98) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.4.97](https://github.com/microsoft/fluentui/tree/@fluentui/react-input_v9.4.97) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-input/library/package.json b/packages/react-components/react-input/library/package.json index d412181b1a0799..5a99dcbfc65858 100644 --- a/packages/react-components/react-input/library/package.json +++ b/packages/react-components/react-input/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-input", - "version": "9.4.97", + "version": "9.4.98", "description": "Fluent UI React Input component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,11 +19,11 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-field": "^9.1.85", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-jsx-runtime/CHANGELOG.json b/packages/react-components/react-jsx-runtime/CHANGELOG.json index f75a0a94944c02..032e36e6a5401d 100644 --- a/packages/react-components/react-jsx-runtime/CHANGELOG.json +++ b/packages/react-components/react-jsx-runtime/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-jsx-runtime", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-jsx-runtime_v9.0.50", + "version": "9.0.50", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-jsx-runtime", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-jsx-runtime_v9.0.48", diff --git a/packages/react-components/react-jsx-runtime/CHANGELOG.md b/packages/react-components/react-jsx-runtime/CHANGELOG.md index b4953cd7bda75c..10d4b3d4bfe8c6 100644 --- a/packages/react-components/react-jsx-runtime/CHANGELOG.md +++ b/packages/react-components/react-jsx-runtime/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-jsx-runtime -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.50](https://github.com/microsoft/fluentui/tree/@fluentui/react-jsx-runtime_v9.0.50) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-jsx-runtime_v9.0.48..@fluentui/react-jsx-runtime_v9.0.50) + +### Patches + +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.48](https://github.com/microsoft/fluentui/tree/@fluentui/react-jsx-runtime_v9.0.48) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-jsx-runtime/package.json b/packages/react-components/react-jsx-runtime/package.json index dd92ba6fb9fe72..66169ead93579b 100644 --- a/packages/react-components/react-jsx-runtime/package.json +++ b/packages/react-components/react-jsx-runtime/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-jsx-runtime", - "version": "9.0.49", + "version": "9.0.50", "description": "Custom JSX runtime for @fluentui/react-components", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,7 +18,7 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "react-is": "^17.0.2", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-label/library/CHANGELOG.json b/packages/react-components/react-label/library/CHANGELOG.json index 4efc646a403d9e..844a9c76c6fb76 100644 --- a/packages/react-components/react-label/library/CHANGELOG.json +++ b/packages/react-components/react-label/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-label", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-label_v9.1.83", + "version": "9.1.83", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-label", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-label", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-label_v9.1.82", diff --git a/packages/react-components/react-label/library/CHANGELOG.md b/packages/react-components/react-label/library/CHANGELOG.md index b79ad510eff75e..8efa645328f2c1 100644 --- a/packages/react-components/react-label/library/CHANGELOG.md +++ b/packages/react-components/react-label/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-label -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.1.83](https://github.com/microsoft/fluentui/tree/@fluentui/react-label_v9.1.83) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-label_v9.1.82..@fluentui/react-label_v9.1.83) + +### Patches + +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.82](https://github.com/microsoft/fluentui/tree/@fluentui/react-label_v9.1.82) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-label/library/package.json b/packages/react-components/react-label/library/package.json index 73b906301626c4..31e1dbec1914e5 100644 --- a/packages/react-components/react-label/library/package.json +++ b/packages/react-components/react-label/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-label", - "version": "9.1.82", + "version": "9.1.83", "description": "Fluent UI React Label component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,8 +20,8 @@ "dependencies": { "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-link/library/CHANGELOG.json b/packages/react-components/react-link/library/CHANGELOG.json index 8061cf7c2ee68f..59e2978f248640 100644 --- a/packages/react-components/react-link/library/CHANGELOG.json +++ b/packages/react-components/react-link/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-link", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:17 GMT", + "tag": "@fluentui/react-link_v9.3.7", + "version": "9.3.7", + "comments": { + "patch": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-link", + "commit": "928fdced4834242a829327af1db00f51f9dbd382", + "comment": "fix: support Enter and Space interaction, if rendered as span" + }, + { + "author": "beachball", + "package": "@fluentui/react-link", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-link", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-link", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-link_v9.3.6", diff --git a/packages/react-components/react-link/library/CHANGELOG.md b/packages/react-components/react-link/library/CHANGELOG.md index fcfc2d45b52b1e..050f8914edb7e7 100644 --- a/packages/react-components/react-link/library/CHANGELOG.md +++ b/packages/react-components/react-link/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-link -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:17 GMT and should not be manually modified. <!-- Start content --> +## [9.3.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-link_v9.3.7) + +Wed, 22 Jan 2025 14:00:17 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-link_v9.3.6..@fluentui/react-link_v9.3.7) + +### Patches + +- fix: support Enter and Space interaction, if rendered as span ([PR #33587](https://github.com/microsoft/fluentui/pull/33587) by vgenaev@gmail.com) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.3.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-link_v9.3.6) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-link/library/package.json b/packages/react-components/react-link/library/package.json index 91c545008a75ae..f90df1354b669c 100644 --- a/packages/react-components/react-link/library/package.json +++ b/packages/react-components/react-link/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-link", - "version": "9.3.6", + "version": "9.3.7", "description": "Fluent UI React Link component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,11 +20,11 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-list/library/CHANGELOG.json b/packages/react-components/react-list/library/CHANGELOG.json index 13cf7d94e5ff49..69b5f969c6660f 100644 --- a/packages/react-components/react-list/library/CHANGELOG.json +++ b/packages/react-components/react-list/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-list", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-list_v9.0.1", + "version": "9.0.1", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-list", + "comment": "Bump @fluentui/react-checkbox to v9.2.46", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-list", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-list", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-list", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-list", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:34 GMT", "tag": "@fluentui/react-list_v9.0.0", diff --git a/packages/react-components/react-list/library/CHANGELOG.md b/packages/react-components/react-list/library/CHANGELOG.md index 746ef1c75daf81..036c1df2e7b78e 100644 --- a/packages/react-components/react-list/library/CHANGELOG.md +++ b/packages/react-components/react-list/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-list -This log was last generated on Wed, 08 Jan 2025 18:33:34 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-list_v9.0.1) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-list_v9.0.0..@fluentui/react-list_v9.0.1) + +### Patches + +- Bump @fluentui/react-checkbox to v9.2.46 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-list_v9.0.0) Wed, 08 Jan 2025 18:33:34 GMT diff --git a/packages/react-components/react-list/library/package.json b/packages/react-components/react-list/library/package.json index 06086197b8399f..4aebcbb739740f 100644 --- a/packages/react-components/react-list/library/package.json +++ b/packages/react-components/react-list/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-list", - "version": "9.0.0", + "version": "9.0.1", "description": "React List v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -26,13 +26,13 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-checkbox": "^9.2.45", - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-checkbox": "^9.2.46", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@fluentui/react-shared-contexts": "^9.21.2", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" diff --git a/packages/react-components/react-menu/library/CHANGELOG.json b/packages/react-components/react-menu/library/CHANGELOG.json index ed7f7f386ba708..3e6fb8e39d44fa 100644 --- a/packages/react-components/react-menu/library/CHANGELOG.json +++ b/packages/react-components/react-menu/library/CHANGELOG.json @@ -1,6 +1,65 @@ { "name": "@fluentui/react-menu", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:18 GMT", + "tag": "@fluentui/react-menu_v9.14.26", + "version": "9.14.26", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-menu", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-positioning to v9.16.2", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-menu", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-menu_v9.14.25", diff --git a/packages/react-components/react-menu/library/CHANGELOG.md b/packages/react-components/react-menu/library/CHANGELOG.md index 75a603f314dc95..79721b8c26d433 100644 --- a/packages/react-components/react-menu/library/CHANGELOG.md +++ b/packages/react-components/react-menu/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-menu -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:18 GMT and should not be manually modified. <!-- Start content --> +## [9.14.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-menu_v9.14.26) + +Wed, 22 Jan 2025 14:00:18 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-menu_v9.14.25..@fluentui/react-menu_v9.14.26) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-positioning to v9.16.2 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.14.25](https://github.com/microsoft/fluentui/tree/@fluentui/react-menu_v9.14.25) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-menu/library/package.json b/packages/react-components/react-menu/library/package.json index ff33f37bbafc2d..33eb6dae9bc6b9 100644 --- a/packages/react-components/react-menu/library/package.json +++ b/packages/react-components/react-menu/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-menu", - "version": "9.14.25", + "version": "9.14.26", "description": "Fluent UI menu component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,16 +21,16 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-portal": "^9.4.41", - "@fluentui/react-positioning": "^9.16.1", + "@fluentui/react-portal": "^9.4.42", + "@fluentui/react-positioning": "^9.16.2", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-message-bar/library/CHANGELOG.json b/packages/react-components/react-message-bar/library/CHANGELOG.json index b0c4cd2750ca7b..35ce73a3fd4647 100644 --- a/packages/react-components/react-message-bar/library/CHANGELOG.json +++ b/packages/react-components/react-message-bar/library/CHANGELOG.json @@ -1,6 +1,59 @@ { "name": "@fluentui/react-message-bar", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:18 GMT", + "tag": "@fluentui/react-message-bar_v9.3.1", + "version": "9.3.1", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-message-bar", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-button to v9.3.100", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-motion to v9.6.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-link to v9.3.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-message-bar", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:34 GMT", "tag": "@fluentui/react-message-bar_v9.3.0", diff --git a/packages/react-components/react-message-bar/library/CHANGELOG.md b/packages/react-components/react-message-bar/library/CHANGELOG.md index 8ae29562aba1e7..e6343fe6223bb5 100644 --- a/packages/react-components/react-message-bar/library/CHANGELOG.md +++ b/packages/react-components/react-message-bar/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-message-bar -This log was last generated on Wed, 08 Jan 2025 18:33:34 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:18 GMT and should not be manually modified. <!-- Start content --> +## [9.3.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-message-bar_v9.3.1) + +Wed, 22 Jan 2025 14:00:18 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-message-bar_v9.3.0..@fluentui/react-message-bar_v9.3.1) + +### Patches + +- Bump @fluentui/react-button to v9.3.100 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion to v9.6.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-link to v9.3.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.3.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-message-bar_v9.3.0) Wed, 08 Jan 2025 18:33:34 GMT diff --git a/packages/react-components/react-message-bar/library/package.json b/packages/react-components/react-message-bar/library/package.json index e0524bef605bf4..3da19acc65cde8 100644 --- a/packages/react-components/react-message-bar/library/package.json +++ b/packages/react-components/react-message-bar/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-message-bar", - "version": "9.3.0", + "version": "9.3.1", "description": "Fluent UI MessageBar component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,15 +18,15 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-button": "^9.3.99", + "@fluentui/react-button": "^9.3.100", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-motion": "^9.6.6", - "@fluentui/react-motion-components-preview": "^0.4.2", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-motion": "^9.6.7", + "@fluentui/react-motion-components-preview": "^0.4.3", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-link": "^9.3.6", + "@fluentui/react-link": "^9.3.7", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-migration-v0-v9/library/CHANGELOG.json b/packages/react-components/react-migration-v0-v9/library/CHANGELOG.json index 4419d284333423..e4036357c8a3ec 100644 --- a/packages/react-components/react-migration-v0-v9/library/CHANGELOG.json +++ b/packages/react-components/react-migration-v0-v9/library/CHANGELOG.json @@ -1,6 +1,51 @@ { "name": "@fluentui/react-migration-v0-v9", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-migration-v0-v9_v9.2.27", + "version": "9.2.27", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-components to v9.58.0", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-migration-v0-v9", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-migration-v0-v9_v9.2.26", diff --git a/packages/react-components/react-migration-v0-v9/library/CHANGELOG.md b/packages/react-components/react-migration-v0-v9/library/CHANGELOG.md index 981da181f3b33e..ca058bd23be25a 100644 --- a/packages/react-components/react-migration-v0-v9/library/CHANGELOG.md +++ b/packages/react-components/react-migration-v0-v9/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-migration-v0-v9 -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-migration-v0-v9_v9.2.27) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-migration-v0-v9_v9.2.26..@fluentui/react-migration-v0-v9_v9.2.27) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-components to v9.58.0 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.26](https://github.com/microsoft/fluentui/tree/@fluentui/react-migration-v0-v9_v9.2.26) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-migration-v0-v9/library/package.json b/packages/react-components/react-migration-v0-v9/library/package.json index e858ab14609575..69f314595d9a13 100644 --- a/packages/react-components/react-migration-v0-v9/library/package.json +++ b/packages/react-components/react-migration-v0-v9/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-migration-v0-v9", - "version": "9.2.26", + "version": "9.2.27", "description": "Migration shim components and methods for hybrid v0/v9 applications building on Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,15 +20,15 @@ "@fluentui/scripts-storybook": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-components": "^9.57.0", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-components": "^9.58.0", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-migration-v8-v9/library/CHANGELOG.json b/packages/react-components/react-migration-v8-v9/library/CHANGELOG.json index fcdd600308112f..dc131c3d2f2724 100644 --- a/packages/react-components/react-migration-v8-v9/library/CHANGELOG.json +++ b/packages/react-components/react-migration-v8-v9/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-migration-v8-v9", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:18 GMT", + "tag": "@fluentui/react-migration-v8-v9_v9.6.46", + "version": "9.6.46", + "comments": { + "patch": [ + { + "author": "makotom@microsoft.com", + "package": "@fluentui/react-migration-v8-v9", + "commit": "e7a954abbbe42a13ba302f28710a908cd34b72b9", + "comment": "chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages." + }, + { + "author": "beachball", + "package": "@fluentui/react-migration-v8-v9", + "comment": "Bump @fluentui/react-components to v9.58.0", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-migration-v8-v9_v9.6.45", diff --git a/packages/react-components/react-migration-v8-v9/library/CHANGELOG.md b/packages/react-components/react-migration-v8-v9/library/CHANGELOG.md index 0accaa8a4bde60..489502fc3421f1 100644 --- a/packages/react-components/react-migration-v8-v9/library/CHANGELOG.md +++ b/packages/react-components/react-migration-v8-v9/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-migration-v8-v9 -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:18 GMT and should not be manually modified. <!-- Start content --> +## [9.6.46](https://github.com/microsoft/fluentui/tree/@fluentui/react-migration-v8-v9_v9.6.46) + +Wed, 22 Jan 2025 14:00:18 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-migration-v8-v9_v9.6.45..@fluentui/react-migration-v8-v9_v9.6.46) + +### Patches + +- chore: Moving @ctrl/tinycolor dependency to be a caret dependency in production packages. ([PR #33611](https://github.com/microsoft/fluentui/pull/33611) by makotom@microsoft.com) +- Bump @fluentui/react-components to v9.58.0 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.6.45](https://github.com/microsoft/fluentui/tree/@fluentui/react-migration-v8-v9_v9.6.45) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-migration-v8-v9/library/package.json b/packages/react-components/react-migration-v8-v9/library/package.json index df3233a522a3b5..ed73b6f337017c 100644 --- a/packages/react-components/react-migration-v8-v9/library/package.json +++ b/packages/react-components/react-migration-v8-v9/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-migration-v8-v9", - "version": "9.6.45", + "version": "9.6.46", "description": "Migration shim components and methods for hybrid v8/v9 applications building on Fluent UI React.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,7 +21,7 @@ "@ctrl/tinycolor": "^3.3.4", "@fluentui/fluent2-theme": "^8.107.125", "@fluentui/react": "^8.122.8", - "@fluentui/react-components": "^9.57.0", + "@fluentui/react-components": "^9.58.0", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-hooks": "^8.8.16", "@griffel/react": "^1.5.22", diff --git a/packages/react-components/react-motion-components-preview/library/CHANGELOG.json b/packages/react-components/react-motion-components-preview/library/CHANGELOG.json index a9a6bceff3452b..1fea2c4a8fd9d1 100644 --- a/packages/react-components/react-motion-components-preview/library/CHANGELOG.json +++ b/packages/react-components/react-motion-components-preview/library/CHANGELOG.json @@ -1,6 +1,35 @@ { "name": "@fluentui/react-motion-components-preview", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:19 GMT", + "tag": "@fluentui/react-motion-components-preview_v0.4.3", + "version": "0.4.3", + "comments": { + "none": [ + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-motion-components-preview", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-motion-components-preview", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "robertpenner@microsoft.com", + "package": "@fluentui/react-motion-components-preview", + "commit": "9331bcc59d84d033784c73eab870155a02286ce5", + "comment": "refactor(Collapse): streamline motion atom functions" + } + ] + } + }, { "date": "Mon, 09 Dec 2024 17:38:13 GMT", "tag": "@fluentui/react-motion-components-preview_v0.4.0", diff --git a/packages/react-components/react-motion-components-preview/library/CHANGELOG.md b/packages/react-components/react-motion-components-preview/library/CHANGELOG.md index af954ec47a0fa6..95601accd7b10d 100644 --- a/packages/react-components/react-motion-components-preview/library/CHANGELOG.md +++ b/packages/react-components/react-motion-components-preview/library/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-motion-components-preview -This log was last generated on Mon, 09 Dec 2024 17:38:13 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:19 GMT and should not be manually modified. <!-- Start content --> +## [0.4.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-motion-components-preview_v0.4.3) + +Wed, 22 Jan 2025 14:00:19 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-motion-components-preview_v0.4.0..@fluentui/react-motion-components-preview_v0.4.3) + +### Patches + +- refactor(Collapse): streamline motion atom functions ([PR #33463](https://github.com/microsoft/fluentui/pull/33463) by robertpenner@microsoft.com) + ## [0.4.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-motion-components-preview_v0.4.0) Mon, 09 Dec 2024 17:38:13 GMT diff --git a/packages/react-components/react-motion-components-preview/library/package.json b/packages/react-components/react-motion-components-preview/library/package.json index aad5bb8e23a1c0..b79d2d791b1125 100644 --- a/packages/react-components/react-motion-components-preview/library/package.json +++ b/packages/react-components/react-motion-components-preview/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-motion-components-preview", - "version": "0.4.2", + "version": "0.4.3", "description": "A preview package for Fluent UI motion components, providing a collection of components", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-components/react-motion/library/CHANGELOG.json b/packages/react-components/react-motion/library/CHANGELOG.json index 05292b2f68c12e..36d03049b7cccc 100644 --- a/packages/react-components/react-motion/library/CHANGELOG.json +++ b/packages/react-components/react-motion/library/CHANGELOG.json @@ -1,6 +1,35 @@ { "name": "@fluentui/react-motion", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:19 GMT", + "tag": "@fluentui/react-motion_v9.6.7", + "version": "9.6.7", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-motion", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "olfedias@microsoft.com", + "package": "@fluentui/react-motion", + "commit": "ab6a30284d152c9ecde274e0cfc0579d002a7bbb", + "comment": "feat: add extended support for reduced motion" + }, + { + "author": "beachball", + "package": "@fluentui/react-motion", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:34 GMT", "tag": "@fluentui/react-motion_v9.6.6", diff --git a/packages/react-components/react-motion/library/CHANGELOG.md b/packages/react-components/react-motion/library/CHANGELOG.md index 298064f61dda1d..8077e5720dac02 100644 --- a/packages/react-components/react-motion/library/CHANGELOG.md +++ b/packages/react-components/react-motion/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-motion -This log was last generated on Wed, 08 Jan 2025 18:33:34 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:19 GMT and should not be manually modified. <!-- Start content --> +## [9.6.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-motion_v9.6.7) + +Wed, 22 Jan 2025 14:00:19 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-motion_v9.6.6..@fluentui/react-motion_v9.6.7) + +### Patches + +- feat: add extended support for reduced motion ([PR #33353](https://github.com/microsoft/fluentui/pull/33353) by olfedias@microsoft.com) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.6.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-motion_v9.6.6) Wed, 08 Jan 2025 18:33:34 GMT diff --git a/packages/react-components/react-motion/library/package.json b/packages/react-components/react-motion/library/package.json index 2b96ece2a6d9b6..d07e4b0ab6e631 100644 --- a/packages/react-components/react-motion/library/package.json +++ b/packages/react-components/react-motion/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-motion", - "version": "9.6.6", + "version": "9.6.7", "description": "A package with utilities & motion definitions using Web Animations API", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -26,7 +26,7 @@ }, "dependencies": { "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@swc/helpers": "^0.5.1", "react-is": "^17.0.2" }, diff --git a/packages/react-components/react-nav-preview/library/CHANGELOG.json b/packages/react-components/react-nav-preview/library/CHANGELOG.json index f9ffcea5af28db..92a4e70911a994 100644 --- a/packages/react-components/react-nav-preview/library/CHANGELOG.json +++ b/packages/react-components/react-nav-preview/library/CHANGELOG.json @@ -1,6 +1,97 @@ { "name": "@fluentui/react-nav-preview", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:20 GMT", + "tag": "@fluentui/react-nav-preview_v0.11.0", + "version": "0.11.0", + "comments": { + "patch": [ + { + "author": "matejera@microsoft.com", + "package": "@fluentui/react-nav-preview", + "commit": "befe9020d9198ff7f3d7e9042fc2c249c874b050", + "comment": "fix: Speeding up animations in Nav." + }, + { + "author": "matejera@microsoft.com", + "package": "@fluentui/react-nav-preview", + "commit": "e561700253aaaf2c6e17e5c70bf10c12c434bd96", + "comment": "fix - changing hover animation curve to linear." + } + ], + "minor": [ + { + "author": "matejera@microsoft.com", + "package": "@fluentui/react-nav-preview", + "commit": "93063df115dbd3bec400c581353b190e7952de6e", + "comment": "[BREAKING CHANGE] Replacing NavSize type and size prop with NavDensity type and density prop to avoid collisions with size on base Drawer component. " + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-button to v9.3.100", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-tooltip to v9.5.4", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-divider to v9.2.82", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-drawer to v9.6.8", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-nav-preview", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ], + "none": [ + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-nav-preview", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-nav-preview_v0.10.7", diff --git a/packages/react-components/react-nav-preview/library/CHANGELOG.md b/packages/react-components/react-nav-preview/library/CHANGELOG.md index dc55f6c71f26f3..0809a7de2399aa 100644 --- a/packages/react-components/react-nav-preview/library/CHANGELOG.md +++ b/packages/react-components/react-nav-preview/library/CHANGELOG.md @@ -1,9 +1,32 @@ # Change Log - @fluentui/react-nav-preview -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:20 GMT and should not be manually modified. <!-- Start content --> +## [0.11.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-nav-preview_v0.11.0) + +Wed, 22 Jan 2025 14:00:20 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-nav-preview_v0.10.7..@fluentui/react-nav-preview_v0.11.0) + +### Minor changes + +- [BREAKING CHANGE] Replacing NavSize type and size prop with NavDensity type and density prop to avoid collisions with size on base Drawer component. ([PR #33559](https://github.com/microsoft/fluentui/pull/33559) by matejera@microsoft.com) +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-button to v9.3.100 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tooltip to v9.5.4 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-divider to v9.2.82 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-drawer to v9.6.8 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + +### Patches + +- fix: Speeding up animations in Nav. ([PR #33588](https://github.com/microsoft/fluentui/pull/33588) by matejera@microsoft.com) +- fix - changing hover animation curve to linear. ([PR #33633](https://github.com/microsoft/fluentui/pull/33633) by matejera@microsoft.com) + ## [0.10.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-nav-preview_v0.10.7) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-nav-preview/library/package.json b/packages/react-components/react-nav-preview/library/package.json index 00060495d63485..cd63420ec6d93f 100644 --- a/packages/react-components/react-nav-preview/library/package.json +++ b/packages/react-components/react-nav-preview/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-nav-preview", - "version": "0.10.7", + "version": "0.11.0", "description": "New fluentui react package", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,18 +18,18 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-button": "^9.3.99", - "@fluentui/react-tooltip": "^9.5.3", - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-divider": "^9.2.81", - "@fluentui/react-drawer": "^9.6.7", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-button": "^9.3.100", + "@fluentui/react-tooltip": "^9.5.4", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-divider": "^9.2.82", + "@fluentui/react-drawer": "^9.6.8", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-overflow/library/CHANGELOG.json b/packages/react-components/react-overflow/library/CHANGELOG.json index 07dd24749e0236..0c16c778776e50 100644 --- a/packages/react-components/react-overflow/library/CHANGELOG.json +++ b/packages/react-components/react-overflow/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-overflow", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-overflow_v9.2.7", + "version": "9.2.7", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-overflow", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-overflow", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-overflow_v9.2.4", diff --git a/packages/react-components/react-overflow/library/CHANGELOG.md b/packages/react-components/react-overflow/library/CHANGELOG.md index e0234500692649..4c5abc9e3b3d72 100644 --- a/packages/react-components/react-overflow/library/CHANGELOG.md +++ b/packages/react-components/react-overflow/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-overflow -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-overflow_v9.2.7) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-overflow_v9.2.4..@fluentui/react-overflow_v9.2.7) + +### Patches + +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-overflow_v9.2.4) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-overflow/library/package.json b/packages/react-components/react-overflow/library/package.json index f043a99aaff0e8..1aa47882df8e53 100644 --- a/packages/react-components/react-overflow/library/package.json +++ b/packages/react-components/react-overflow/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-overflow", - "version": "9.2.6", + "version": "9.2.7", "description": "React bindings for @fluentui/priority-overflow", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,9 +20,9 @@ }, "dependencies": { "@fluentui/priority-overflow": "^9.1.14", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-persona/library/CHANGELOG.json b/packages/react-components/react-persona/library/CHANGELOG.json index 309665ce51dffd..dbb114ffe5e19f 100644 --- a/packages/react-components/react-persona/library/CHANGELOG.json +++ b/packages/react-components/react-persona/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-persona", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-persona_v9.2.108", + "version": "9.2.108", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-persona", + "comment": "Bump @fluentui/react-avatar to v9.6.49", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-persona", + "comment": "Bump @fluentui/react-badge to v9.2.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-persona", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-persona", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-persona_v9.2.107", diff --git a/packages/react-components/react-persona/library/CHANGELOG.md b/packages/react-components/react-persona/library/CHANGELOG.md index ed990a25a7a6c1..5a23438117e548 100644 --- a/packages/react-components/react-persona/library/CHANGELOG.md +++ b/packages/react-components/react-persona/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-persona -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.108](https://github.com/microsoft/fluentui/tree/@fluentui/react-persona_v9.2.108) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-persona_v9.2.107..@fluentui/react-persona_v9.2.108) + +### Patches + +- Bump @fluentui/react-avatar to v9.6.49 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-badge to v9.2.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.107](https://github.com/microsoft/fluentui/tree/@fluentui/react-persona_v9.2.107) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-persona/library/package.json b/packages/react-components/react-persona/library/package.json index 9b28d4120f31a4..4ead50e3ebc1a5 100644 --- a/packages/react-components/react-persona/library/package.json +++ b/packages/react-components/react-persona/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-persona", - "version": "9.2.107", + "version": "9.2.108", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,12 +18,12 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-avatar": "^9.6.48", - "@fluentui/react-badge": "^9.2.49", + "@fluentui/react-avatar": "^9.6.49", + "@fluentui/react-badge": "^9.2.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-popover/library/CHANGELOG.json b/packages/react-components/react-popover/library/CHANGELOG.json index 5ce44b032d9446..854d56f04b9ff5 100644 --- a/packages/react-components/react-popover/library/CHANGELOG.json +++ b/packages/react-components/react-popover/library/CHANGELOG.json @@ -1,6 +1,65 @@ { "name": "@fluentui/react-popover", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:07 GMT", + "tag": "@fluentui/react-popover_v9.9.31", + "version": "9.9.31", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-popover", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-positioning to v9.16.2", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-popover", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-popover_v9.9.30", diff --git a/packages/react-components/react-popover/library/CHANGELOG.md b/packages/react-components/react-popover/library/CHANGELOG.md index f89e0f32d6635f..6d9a2eac4307ce 100644 --- a/packages/react-components/react-popover/library/CHANGELOG.md +++ b/packages/react-components/react-popover/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-popover -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:07 GMT and should not be manually modified. <!-- Start content --> +## [9.9.31](https://github.com/microsoft/fluentui/tree/@fluentui/react-popover_v9.9.31) + +Wed, 22 Jan 2025 14:00:07 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-popover_v9.9.30..@fluentui/react-popover_v9.9.31) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-positioning to v9.16.2 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.9.30](https://github.com/microsoft/fluentui/tree/@fluentui/react-popover_v9.9.30) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-popover/library/package.json b/packages/react-components/react-popover/library/package.json index 56a67c2063dc3d..ae4ba8440df206 100644 --- a/packages/react-components/react-popover/library/package.json +++ b/packages/react-components/react-popover/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-popover", - "version": "9.9.30", + "version": "9.9.31", "description": "Popover component for Fluent UI", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -22,15 +22,15 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-portal": "^9.4.41", - "@fluentui/react-positioning": "^9.16.1", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-portal": "^9.4.42", + "@fluentui/react-positioning": "^9.16.2", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-portal-compat/CHANGELOG.json b/packages/react-components/react-portal-compat/CHANGELOG.json index 90ce8c3c195e61..cd2586bea29037 100644 --- a/packages/react-components/react-portal-compat/CHANGELOG.json +++ b/packages/react-components/react-portal-compat/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-portal-compat", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-portal-compat_v9.0.178", + "version": "9.0.178", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-portal-compat", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-portal-compat", + "comment": "Bump @fluentui/react-components to v9.58.0", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-portal-compat_v9.0.177", diff --git a/packages/react-components/react-portal-compat/CHANGELOG.md b/packages/react-components/react-portal-compat/CHANGELOG.md index bd2c4bacc8df30..03ef3f564c639c 100644 --- a/packages/react-components/react-portal-compat/CHANGELOG.md +++ b/packages/react-components/react-portal-compat/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-portal-compat -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.178](https://github.com/microsoft/fluentui/tree/@fluentui/react-portal-compat_v9.0.178) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-portal-compat_v9.0.177..@fluentui/react-portal-compat_v9.0.178) + +### Patches + +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-components to v9.58.0 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.177](https://github.com/microsoft/fluentui/tree/@fluentui/react-portal-compat_v9.0.177) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-portal-compat/package.json b/packages/react-components/react-portal-compat/package.json index ba113e75699290..02c4d97aa460f7 100644 --- a/packages/react-components/react-portal-compat/package.json +++ b/packages/react-components/react-portal-compat/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-portal-compat", - "version": "9.0.177", + "version": "9.0.178", "description": "A package that contains compatibility layer for React Portals", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -23,11 +23,11 @@ }, "dependencies": { "@fluentui/react-portal-compat-context": "^9.0.13", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@swc/helpers": "^0.5.1" }, "peerDependencies": { - "@fluentui/react-components": "^9.57.0", + "@fluentui/react-components": "^9.58.0", "@types/react": ">=16.14.0 <19.0.0", "react": ">=16.14.0 <19.0.0" }, diff --git a/packages/react-components/react-portal/library/CHANGELOG.json b/packages/react-components/react-portal/library/CHANGELOG.json index c2d640a549518b..a3e9090d821139 100644 --- a/packages/react-components/react-portal/library/CHANGELOG.json +++ b/packages/react-components/react-portal/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-portal", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-portal_v9.4.42", + "version": "9.4.42", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-portal", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-portal", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-portal_v9.4.40", diff --git a/packages/react-components/react-portal/library/CHANGELOG.md b/packages/react-components/react-portal/library/CHANGELOG.md index 2d1121a69bd90a..4f20dcbccbc6a5 100644 --- a/packages/react-components/react-portal/library/CHANGELOG.md +++ b/packages/react-components/react-portal/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-portal -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.4.42](https://github.com/microsoft/fluentui/tree/@fluentui/react-portal_v9.4.42) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-portal_v9.4.40..@fluentui/react-portal_v9.4.42) + +### Patches + +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.4.40](https://github.com/microsoft/fluentui/tree/@fluentui/react-portal_v9.4.40) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-portal/library/package.json b/packages/react-components/react-portal/library/package.json index 3055707457ae4a..adddae60d67f8a 100644 --- a/packages/react-components/react-portal/library/package.json +++ b/packages/react-components/react-portal/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-portal", - "version": "9.4.41", + "version": "9.4.42", "description": "A utility component that creates portals compatible with Fluent UI", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,8 +19,8 @@ }, "dependencies": { "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-tabster": "^9.23.3", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", "use-disposable": "^1.0.1" diff --git a/packages/react-components/react-positioning/CHANGELOG.json b/packages/react-components/react-positioning/CHANGELOG.json index e22728dd3ce15f..a4759c705197aa 100644 --- a/packages/react-components/react-positioning/CHANGELOG.json +++ b/packages/react-components/react-positioning/CHANGELOG.json @@ -1,6 +1,29 @@ { "name": "@fluentui/react-positioning", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:07 GMT", + "tag": "@fluentui/react-positioning_v9.16.2", + "version": "9.16.2", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-positioning", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-positioning", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:34 GMT", "tag": "@fluentui/react-positioning_v9.16.1", diff --git a/packages/react-components/react-positioning/CHANGELOG.md b/packages/react-components/react-positioning/CHANGELOG.md index b1be7944e080cb..5dd00971347076 100644 --- a/packages/react-components/react-positioning/CHANGELOG.md +++ b/packages/react-components/react-positioning/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-positioning -This log was last generated on Wed, 08 Jan 2025 18:33:34 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:07 GMT and should not be manually modified. <!-- Start content --> +## [9.16.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-positioning_v9.16.2) + +Wed, 22 Jan 2025 14:00:07 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-positioning_v9.16.1..@fluentui/react-positioning_v9.16.2) + +### Patches + +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.16.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-positioning_v9.16.1) Wed, 08 Jan 2025 18:33:34 GMT diff --git a/packages/react-components/react-positioning/package.json b/packages/react-components/react-positioning/package.json index 87b6218997dcdf..d09f9636f75761 100644 --- a/packages/react-components/react-positioning/package.json +++ b/packages/react-components/react-positioning/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-positioning", - "version": "9.16.1", + "version": "9.16.2", "description": "A react wrapper around Popper.js for Fluent UI", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,7 +20,7 @@ "@floating-ui/devtools": "0.2.1", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-progress/library/CHANGELOG.json b/packages/react-components/react-progress/library/CHANGELOG.json index 4d4a0bbc6d3583..43b7a17dce0dfc 100644 --- a/packages/react-components/react-progress/library/CHANGELOG.json +++ b/packages/react-components/react-progress/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-progress", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-progress_v9.1.96", + "version": "9.1.96", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-progress", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-progress", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-progress", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-progress_v9.1.95", diff --git a/packages/react-components/react-progress/library/CHANGELOG.md b/packages/react-components/react-progress/library/CHANGELOG.md index ef369438ccf483..d5e9102c4726a4 100644 --- a/packages/react-components/react-progress/library/CHANGELOG.md +++ b/packages/react-components/react-progress/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-progress -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.1.96](https://github.com/microsoft/fluentui/tree/@fluentui/react-progress_v9.1.96) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-progress_v9.1.95..@fluentui/react-progress_v9.1.96) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.95](https://github.com/microsoft/fluentui/tree/@fluentui/react-progress_v9.1.95) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-progress/library/package.json b/packages/react-components/react-progress/library/package.json index 8b1fb03db94805..7850c1fad720ca 100644 --- a/packages/react-components/react-progress/library/package.json +++ b/packages/react-components/react-progress/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-progress", - "version": "9.1.95", + "version": "9.1.96", "description": "Progress component for FluentUI v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,11 +18,11 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-field": "^9.1.85", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-provider/library/CHANGELOG.json b/packages/react-components/react-provider/library/CHANGELOG.json index 05211ef22f12dc..96ddbc5237d61d 100644 --- a/packages/react-components/react-provider/library/CHANGELOG.json +++ b/packages/react-components/react-provider/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-provider", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:07 GMT", + "tag": "@fluentui/react-provider_v9.19.0", + "version": "9.19.0", + "comments": { + "minor": [ + { + "author": "makotom@microsoft.com", + "package": "@fluentui/react-provider", + "commit": "a8c0c467fdcdb1f721350b5cbd4ed6dd84e0715c", + "comment": "fix: Updating FluentProvider types to avoid implicit import in API definition." + }, + { + "author": "beachball", + "package": "@fluentui/react-provider", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-provider", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-provider", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-provider_v9.18.3", diff --git a/packages/react-components/react-provider/library/CHANGELOG.md b/packages/react-components/react-provider/library/CHANGELOG.md index 999afeec8067a1..76de9b8be5d36b 100644 --- a/packages/react-components/react-provider/library/CHANGELOG.md +++ b/packages/react-components/react-provider/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-provider -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:07 GMT and should not be manually modified. <!-- Start content --> +## [9.19.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-provider_v9.19.0) + +Wed, 22 Jan 2025 14:00:07 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-provider_v9.18.3..@fluentui/react-provider_v9.19.0) + +### Minor changes + +- fix: Updating FluentProvider types to avoid implicit import in API definition. ([PR #33590](https://github.com/microsoft/fluentui/pull/33590) by makotom@microsoft.com) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.18.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-provider_v9.18.3) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-provider/library/package.json b/packages/react-components/react-provider/library/package.json index 79600a7aa21537..b0a66feb3389ba 100644 --- a/packages/react-components/react-provider/library/package.json +++ b/packages/react-components/react-provider/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-provider", - "version": "9.18.3", + "version": "9.19.0", "description": "Fluent UI React provider component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,10 +20,10 @@ "dependencies": { "@fluentui/react-icons": "^2.0.245", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/core": "^1.16.0", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" diff --git a/packages/react-components/react-radio/library/CHANGELOG.json b/packages/react-components/react-radio/library/CHANGELOG.json index 57d6d9e181e407..19e752bb231ef3 100644 --- a/packages/react-components/react-radio/library/CHANGELOG.json +++ b/packages/react-components/react-radio/library/CHANGELOG.json @@ -1,6 +1,53 @@ { "name": "@fluentui/react-radio", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:08 GMT", + "tag": "@fluentui/react-radio_v9.2.41", + "version": "9.2.41", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-radio", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-radio", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-radio", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-radio", + "comment": "Bump @fluentui/react-label to v9.1.83", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-radio", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-radio", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-radio_v9.2.40", diff --git a/packages/react-components/react-radio/library/CHANGELOG.md b/packages/react-components/react-radio/library/CHANGELOG.md index a922d4370c8a52..6cb1319bd1e6bb 100644 --- a/packages/react-components/react-radio/library/CHANGELOG.md +++ b/packages/react-components/react-radio/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-radio -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:08 GMT and should not be manually modified. <!-- Start content --> +## [9.2.41](https://github.com/microsoft/fluentui/tree/@fluentui/react-radio_v9.2.41) + +Wed, 22 Jan 2025 14:00:08 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-radio_v9.2.40..@fluentui/react-radio_v9.2.41) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-label to v9.1.83 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.40](https://github.com/microsoft/fluentui/tree/@fluentui/react-radio_v9.2.40) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-radio/library/package.json b/packages/react-components/react-radio/library/package.json index 0c7a944e3a0dca..c41ee909a26c4d 100644 --- a/packages/react-components/react-radio/library/package.json +++ b/packages/react-components/react-radio/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-radio", - "version": "9.2.40", + "version": "9.2.41", "description": "Fluent UI Radio component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,13 +18,13 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-label": "^9.1.82", + "@fluentui/react-field": "^9.1.85", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-label": "^9.1.83", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-rating/library/CHANGELOG.json b/packages/react-components/react-rating/library/CHANGELOG.json index 753e044c2b8474..f1ab0e22419248 100644 --- a/packages/react-components/react-rating/library/CHANGELOG.json +++ b/packages/react-components/react-rating/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-rating", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-rating_v9.0.28", + "version": "9.0.28", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-rating", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-rating", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-rating", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-rating_v9.0.27", diff --git a/packages/react-components/react-rating/library/CHANGELOG.md b/packages/react-components/react-rating/library/CHANGELOG.md index 522b9b150e0900..0cea6b7a372a86 100644 --- a/packages/react-components/react-rating/library/CHANGELOG.md +++ b/packages/react-components/react-rating/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-rating -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.28](https://github.com/microsoft/fluentui/tree/@fluentui/react-rating_v9.0.28) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-rating_v9.0.27..@fluentui/react-rating_v9.0.28) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-rating_v9.0.27) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-rating/library/package.json b/packages/react-components/react-rating/library/package.json index 9813715e14f83c..5e333860ac8685 100644 --- a/packages/react-components/react-rating/library/package.json +++ b/packages/react-components/react-rating/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-rating", - "version": "9.0.27", + "version": "9.0.28", "description": "Rating component for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,11 +18,11 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-tabster": "^9.23.3", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-search/library/CHANGELOG.json b/packages/react-components/react-search/library/CHANGELOG.json index efa469de9a9e3d..efe039f129558b 100644 --- a/packages/react-components/react-search/library/CHANGELOG.json +++ b/packages/react-components/react-search/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-search", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-search_v9.0.28", + "version": "9.0.28", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-search", + "comment": "Bump @fluentui/react-input to v9.4.98", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-search", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-search", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-search_v9.0.27", diff --git a/packages/react-components/react-search/library/CHANGELOG.md b/packages/react-components/react-search/library/CHANGELOG.md index f8f5ef72e11ac7..b553f4fdc62bab 100644 --- a/packages/react-components/react-search/library/CHANGELOG.md +++ b/packages/react-components/react-search/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-search -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.0.28](https://github.com/microsoft/fluentui/tree/@fluentui/react-search_v9.0.28) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-search_v9.0.27..@fluentui/react-search_v9.0.28) + +### Patches + +- Bump @fluentui/react-input to v9.4.98 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-search_v9.0.27) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-search/library/package.json b/packages/react-components/react-search/library/package.json index 7ca2a9087c1ff9..1257b604d48dde 100644 --- a/packages/react-components/react-search/library/package.json +++ b/packages/react-components/react-search/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-search", - "version": "9.0.27", + "version": "9.0.28", "description": "Search input for Fluent UI v9", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,10 +19,10 @@ }, "dependencies": { "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-input": "^9.4.97", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-input": "^9.4.98", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-select/library/CHANGELOG.json b/packages/react-components/react-select/library/CHANGELOG.json index 1d631967311040..37b61313cd6b13 100644 --- a/packages/react-components/react-select/library/CHANGELOG.json +++ b/packages/react-components/react-select/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-select", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-select_v9.1.96", + "version": "9.1.96", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-select", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-select", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-select", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-select_v9.1.95", diff --git a/packages/react-components/react-select/library/CHANGELOG.md b/packages/react-components/react-select/library/CHANGELOG.md index 27c2d8590820de..f80dcd84e95845 100644 --- a/packages/react-components/react-select/library/CHANGELOG.md +++ b/packages/react-components/react-select/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-select -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.1.96](https://github.com/microsoft/fluentui/tree/@fluentui/react-select_v9.1.96) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-select_v9.1.95..@fluentui/react-select_v9.1.96) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.95](https://github.com/microsoft/fluentui/tree/@fluentui/react-select_v9.1.95) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-select/library/package.json b/packages/react-components/react-select/library/package.json index b1b41ae03e5701..b3094fbc5a399b 100644 --- a/packages/react-components/react-select/library/package.json +++ b/packages/react-components/react-select/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-select", - "version": "9.1.95", + "version": "9.1.96", "description": "Fluent UI React Select component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,12 +18,12 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-field": "^9.1.85", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-skeleton/library/CHANGELOG.json b/packages/react-components/react-skeleton/library/CHANGELOG.json index 900979ee683885..69e2b9b916a29c 100644 --- a/packages/react-components/react-skeleton/library/CHANGELOG.json +++ b/packages/react-components/react-skeleton/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-skeleton", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-skeleton_v9.1.25", + "version": "9.1.25", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-skeleton", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-skeleton", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-skeleton", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-skeleton_v9.1.24", diff --git a/packages/react-components/react-skeleton/library/CHANGELOG.md b/packages/react-components/react-skeleton/library/CHANGELOG.md index af93dc948549d1..35c05f03a2ef8a 100644 --- a/packages/react-components/react-skeleton/library/CHANGELOG.md +++ b/packages/react-components/react-skeleton/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-skeleton -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.1.25](https://github.com/microsoft/fluentui/tree/@fluentui/react-skeleton_v9.1.25) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-skeleton_v9.1.24..@fluentui/react-skeleton_v9.1.25) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.24](https://github.com/microsoft/fluentui/tree/@fluentui/react-skeleton_v9.1.24) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-skeleton/library/package.json b/packages/react-components/react-skeleton/library/package.json index 1c7f8beb5b1aad..1f3d0216127718 100644 --- a/packages/react-components/react-skeleton/library/package.json +++ b/packages/react-components/react-skeleton/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-skeleton", - "version": "9.1.24", + "version": "9.1.25", "description": "Converged v9 Skeleton Component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,11 +18,11 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-field": "^9.1.85", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-slider/library/CHANGELOG.json b/packages/react-components/react-slider/library/CHANGELOG.json index 897b1640bab726..205fa4f4409120 100644 --- a/packages/react-components/react-slider/library/CHANGELOG.json +++ b/packages/react-components/react-slider/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-slider", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-slider_v9.2.5", + "version": "9.2.5", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-slider", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-slider", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-slider", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-slider", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-slider_v9.2.4", diff --git a/packages/react-components/react-slider/library/CHANGELOG.md b/packages/react-components/react-slider/library/CHANGELOG.md index 8ed1e09a45b67a..a5f8ff77fafba5 100644 --- a/packages/react-components/react-slider/library/CHANGELOG.md +++ b/packages/react-components/react-slider/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-slider -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.5](https://github.com/microsoft/fluentui/tree/@fluentui/react-slider_v9.2.5) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-slider_v9.2.4..@fluentui/react-slider_v9.2.5) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-slider_v9.2.4) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-slider/library/package.json b/packages/react-components/react-slider/library/package.json index bc6355ab336e04..25383f9598bd23 100644 --- a/packages/react-components/react-slider/library/package.json +++ b/packages/react-components/react-slider/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-slider", - "version": "9.2.4", + "version": "9.2.5", "description": "Fluent UI React Slider component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,12 +19,12 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-field": "^9.1.85", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-spinbutton/library/CHANGELOG.json b/packages/react-components/react-spinbutton/library/CHANGELOG.json index 8018e6b7edd7e7..194c303dd08a15 100644 --- a/packages/react-components/react-spinbutton/library/CHANGELOG.json +++ b/packages/react-components/react-spinbutton/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-spinbutton", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:08 GMT", + "tag": "@fluentui/react-spinbutton_v9.2.97", + "version": "9.2.97", + "comments": { + "patch": [ + { + "author": "carla.muntean@microsoft.com", + "package": "@fluentui/react-spinbutton", + "commit": "5afd9daa49ae9ca719260238b2b64451e575d913", + "comment": "fix spinbutton test" + }, + { + "author": "beachball", + "package": "@fluentui/react-spinbutton", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-spinbutton", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-spinbutton", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-spinbutton_v9.2.96", diff --git a/packages/react-components/react-spinbutton/library/CHANGELOG.md b/packages/react-components/react-spinbutton/library/CHANGELOG.md index 05f57ff9e7d707..63a99ab1b6eb67 100644 --- a/packages/react-components/react-spinbutton/library/CHANGELOG.md +++ b/packages/react-components/react-spinbutton/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-spinbutton -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:08 GMT and should not be manually modified. <!-- Start content --> +## [9.2.97](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinbutton_v9.2.97) + +Wed, 22 Jan 2025 14:00:08 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-spinbutton_v9.2.96..@fluentui/react-spinbutton_v9.2.97) + +### Patches + +- fix spinbutton test ([PR #33680](https://github.com/microsoft/fluentui/pull/33680) by carla.muntean@microsoft.com) +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.96](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinbutton_v9.2.96) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-spinbutton/library/package.json b/packages/react-components/react-spinbutton/library/package.json index b5cf8472b53796..dcf681ca42c00b 100644 --- a/packages/react-components/react-spinbutton/library/package.json +++ b/packages/react-components/react-spinbutton/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-spinbutton", - "version": "9.2.96", + "version": "9.2.97", "description": "Fluent UI React SpinButton component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,12 +20,12 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-field": "^9.1.85", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-spinner/library/CHANGELOG.json b/packages/react-components/react-spinner/library/CHANGELOG.json index 1a41b356e3b9be..5ee2c71121d528 100644 --- a/packages/react-components/react-spinner/library/CHANGELOG.json +++ b/packages/react-components/react-spinner/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-spinner", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-spinner_v9.5.7", + "version": "9.5.7", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-spinner", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-spinner", + "comment": "Bump @fluentui/react-label to v9.1.83", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-spinner", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-spinner_v9.5.6", diff --git a/packages/react-components/react-spinner/library/CHANGELOG.md b/packages/react-components/react-spinner/library/CHANGELOG.md index 7074cc9fd1c101..084b82c4889fd6 100644 --- a/packages/react-components/react-spinner/library/CHANGELOG.md +++ b/packages/react-components/react-spinner/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-spinner -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.5.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinner_v9.5.7) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-spinner_v9.5.6..@fluentui/react-spinner_v9.5.7) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-label to v9.1.83 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.5.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-spinner_v9.5.6) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-spinner/library/package.json b/packages/react-components/react-spinner/library/package.json index 75407220d5e09c..9032c711b1683b 100644 --- a/packages/react-components/react-spinner/library/package.json +++ b/packages/react-components/react-spinner/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-spinner", - "version": "9.5.6", + "version": "9.5.7", "description": "Spinner component for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,11 +18,11 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-label": "^9.1.82", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-label": "^9.1.83", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-storybook-addon/package.json b/packages/react-components/react-storybook-addon/package.json index 85f0abd762c951..d30ffe975e0ab9 100644 --- a/packages/react-components/react-storybook-addon/package.json +++ b/packages/react-components/react-storybook-addon/package.json @@ -17,8 +17,8 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-provider": "^9.18.3", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-provider": "^9.19.0", "@fluentui/react-theme": "^9.1.24", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-swatch-picker/library/CHANGELOG.json b/packages/react-components/react-swatch-picker/library/CHANGELOG.json index 5cd3633c8601ca..a044421b73b5dd 100644 --- a/packages/react-components/react-swatch-picker/library/CHANGELOG.json +++ b/packages/react-components/react-swatch-picker/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-swatch-picker", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-swatch-picker_v9.1.19", + "version": "9.1.19", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-swatch-picker", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-swatch-picker", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-swatch-picker", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-swatch-picker", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-swatch-picker", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-swatch-picker_v9.1.18", diff --git a/packages/react-components/react-swatch-picker/library/CHANGELOG.md b/packages/react-components/react-swatch-picker/library/CHANGELOG.md index c26125e374a697..914866221f7d5a 100644 --- a/packages/react-components/react-swatch-picker/library/CHANGELOG.md +++ b/packages/react-components/react-swatch-picker/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-swatch-picker -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.1.19](https://github.com/microsoft/fluentui/tree/@fluentui/react-swatch-picker_v9.1.19) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-swatch-picker_v9.1.18..@fluentui/react-swatch-picker_v9.1.19) + +### Patches + +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.18](https://github.com/microsoft/fluentui/tree/@fluentui/react-swatch-picker_v9.1.18) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-swatch-picker/library/package.json b/packages/react-components/react-swatch-picker/library/package.json index c2bc2a4cb65ff9..20d0aa7289269f 100644 --- a/packages/react-components/react-swatch-picker/library/package.json +++ b/packages/react-components/react-swatch-picker/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-swatch-picker", - "version": "9.1.18", + "version": "9.1.19", "description": "New fluentui react package", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,14 +20,14 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-field": "^9.1.85", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-switch/library/CHANGELOG.json b/packages/react-components/react-switch/library/CHANGELOG.json index a04f296cc6c8f4..e0fb60d98d6771 100644 --- a/packages/react-components/react-switch/library/CHANGELOG.json +++ b/packages/react-components/react-switch/library/CHANGELOG.json @@ -1,6 +1,53 @@ { "name": "@fluentui/react-switch", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:08 GMT", + "tag": "@fluentui/react-switch_v9.1.103", + "version": "9.1.103", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-switch", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-switch", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-switch", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-switch", + "comment": "Bump @fluentui/react-label to v9.1.83", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-switch", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-switch", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-switch_v9.1.102", diff --git a/packages/react-components/react-switch/library/CHANGELOG.md b/packages/react-components/react-switch/library/CHANGELOG.md index 03080221d07978..44c9a75081a1a9 100644 --- a/packages/react-components/react-switch/library/CHANGELOG.md +++ b/packages/react-components/react-switch/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-switch -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:08 GMT and should not be manually modified. <!-- Start content --> +## [9.1.103](https://github.com/microsoft/fluentui/tree/@fluentui/react-switch_v9.1.103) + +Wed, 22 Jan 2025 14:00:08 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-switch_v9.1.102..@fluentui/react-switch_v9.1.103) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-label to v9.1.83 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.1.102](https://github.com/microsoft/fluentui/tree/@fluentui/react-switch_v9.1.102) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-switch/library/package.json b/packages/react-components/react-switch/library/package.json index 2b11b352e15869..ff4131e78d9d9a 100644 --- a/packages/react-components/react-switch/library/package.json +++ b/packages/react-components/react-switch/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-switch", - "version": "9.1.102", + "version": "9.1.103", "description": "Fluent UI React Switch component.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,14 +18,14 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-field": "^9.1.85", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-label": "^9.1.82", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-label": "^9.1.83", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-table/library/CHANGELOG.json b/packages/react-components/react-table/library/CHANGELOG.json index 8fe333c75e9d26..ade47e634f36ca 100644 --- a/packages/react-components/react-table/library/CHANGELOG.json +++ b/packages/react-components/react-table/library/CHANGELOG.json @@ -1,6 +1,71 @@ { "name": "@fluentui/react-table", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:09 GMT", + "tag": "@fluentui/react-table_v9.15.28", + "version": "9.15.28", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-table", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-avatar to v9.6.49", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-checkbox to v9.2.46", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-radio to v9.2.41", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-table", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-table_v9.15.27", diff --git a/packages/react-components/react-table/library/CHANGELOG.md b/packages/react-components/react-table/library/CHANGELOG.md index b9f25c208af8f2..52a719a83942f0 100644 --- a/packages/react-components/react-table/library/CHANGELOG.md +++ b/packages/react-components/react-table/library/CHANGELOG.md @@ -1,9 +1,25 @@ # Change Log - @fluentui/react-table -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:09 GMT and should not be manually modified. <!-- Start content --> +## [9.15.28](https://github.com/microsoft/fluentui/tree/@fluentui/react-table_v9.15.28) + +Wed, 22 Jan 2025 14:00:09 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-table_v9.15.27..@fluentui/react-table_v9.15.28) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-avatar to v9.6.49 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-checkbox to v9.2.46 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-radio to v9.2.41 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.15.27](https://github.com/microsoft/fluentui/tree/@fluentui/react-table_v9.15.27) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-table/library/package.json b/packages/react-components/react-table/library/package.json index c689784c43e4d0..28145b2790e3eb 100644 --- a/packages/react-components/react-table/library/package.json +++ b/packages/react-components/react-table/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-table", - "version": "9.15.27", + "version": "9.15.28", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,17 +21,17 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-avatar": "^9.6.48", - "@fluentui/react-checkbox": "^9.2.45", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-avatar": "^9.6.49", + "@fluentui/react-checkbox": "^9.2.46", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-radio": "^9.2.40", + "@fluentui/react-radio": "^9.2.41", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-tabs/library/CHANGELOG.json b/packages/react-components/react-tabs/library/CHANGELOG.json index 92a23bf4ad3592..105cdbebf4a28f 100644 --- a/packages/react-components/react-tabs/library/CHANGELOG.json +++ b/packages/react-components/react-tabs/library/CHANGELOG.json @@ -1,6 +1,47 @@ { "name": "@fluentui/react-tabs", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:09 GMT", + "tag": "@fluentui/react-tabs_v9.6.7", + "version": "9.6.7", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-tabs", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-tabs", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tabs", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tabs", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tabs", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:35 GMT", "tag": "@fluentui/react-tabs_v9.6.6", diff --git a/packages/react-components/react-tabs/library/CHANGELOG.md b/packages/react-components/react-tabs/library/CHANGELOG.md index aea9dcd16bdf24..42c7fcacdb8ac5 100644 --- a/packages/react-components/react-tabs/library/CHANGELOG.md +++ b/packages/react-components/react-tabs/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-tabs -This log was last generated on Wed, 08 Jan 2025 18:33:35 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:09 GMT and should not be manually modified. <!-- Start content --> +## [9.6.7](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabs_v9.6.7) + +Wed, 22 Jan 2025 14:00:09 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tabs_v9.6.6..@fluentui/react-tabs_v9.6.7) + +### Patches + +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.6.6](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabs_v9.6.6) Wed, 08 Jan 2025 18:33:35 GMT diff --git a/packages/react-components/react-tabs/library/package.json b/packages/react-components/react-tabs/library/package.json index a8fe90af743ee2..56a397316fd4f2 100644 --- a/packages/react-components/react-tabs/library/package.json +++ b/packages/react-components/react-tabs/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tabs", - "version": "9.6.6", + "version": "9.6.7", "description": "Fluent UI React tabs components", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,12 +18,12 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-tabster/CHANGELOG.json b/packages/react-components/react-tabster/CHANGELOG.json index 934289e9a14cd4..85af702d746bff 100644 --- a/packages/react-components/react-tabster/CHANGELOG.json +++ b/packages/react-components/react-tabster/CHANGELOG.json @@ -1,6 +1,35 @@ { "name": "@fluentui/react-tabster", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:09 GMT", + "tag": "@fluentui/react-tabster_v9.23.3", + "version": "9.23.3", + "comments": { + "none": [ + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-tabster", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "docs: fix invalid TSdoc that is causing warnings within generate-api task" + }, + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-tabster", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-tabster", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-tabster_v9.23.2", diff --git a/packages/react-components/react-tabster/CHANGELOG.md b/packages/react-components/react-tabster/CHANGELOG.md index 2f0c6f916a3473..2a36ad89843658 100644 --- a/packages/react-components/react-tabster/CHANGELOG.md +++ b/packages/react-components/react-tabster/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-tabster -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:09 GMT and should not be manually modified. <!-- Start content --> +## [9.23.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabster_v9.23.3) + +Wed, 22 Jan 2025 14:00:09 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tabster_v9.23.2..@fluentui/react-tabster_v9.23.3) + +### Patches + +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.23.2](https://github.com/microsoft/fluentui/tree/@fluentui/react-tabster_v9.23.2) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-tabster/package.json b/packages/react-components/react-tabster/package.json index ea1b271027f42b..9867f3108438b6 100644 --- a/packages/react-components/react-tabster/package.json +++ b/packages/react-components/react-tabster/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tabster", - "version": "9.23.2", + "version": "9.23.3", "description": "Utilities for focus management and facade for tabster", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,7 +19,7 @@ "dependencies": { "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", "keyborg": "^2.6.0", diff --git a/packages/react-components/react-tag-picker/library/CHANGELOG.json b/packages/react-components/react-tag-picker/library/CHANGELOG.json index 59c378ad76f988..1676118863d7ae 100644 --- a/packages/react-components/react-tag-picker/library/CHANGELOG.json +++ b/packages/react-components/react-tag-picker/library/CHANGELOG.json @@ -1,6 +1,89 @@ { "name": "@fluentui/react-tag-picker", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:10 GMT", + "tag": "@fluentui/react-tag-picker_v9.4.0", + "version": "9.4.0", + "comments": { + "minor": [ + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-tag-picker", + "commit": "e706ac0ac7f2aa46a7f6f48efda24938a539a835", + "comment": "feature: single line layout" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-combobox to v9.13.17", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-tags to v9.3.29", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-positioning to v9.16.2", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tag-picker", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ], + "patch": [ + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-tag-picker", + "commit": "b987de6afa58c99706f17fa52aa0d64fc1f38643", + "comment": "bugfix: secondaryContent not displaying properly" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-tag-picker_v9.3.14", diff --git a/packages/react-components/react-tag-picker/library/CHANGELOG.md b/packages/react-components/react-tag-picker/library/CHANGELOG.md index 47a429155cacba..aee4c9286db192 100644 --- a/packages/react-components/react-tag-picker/library/CHANGELOG.md +++ b/packages/react-components/react-tag-picker/library/CHANGELOG.md @@ -1,9 +1,32 @@ # Change Log - @fluentui/react-tag-picker -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:10 GMT and should not be manually modified. <!-- Start content --> +## [9.4.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-tag-picker_v9.4.0) + +Wed, 22 Jan 2025 14:00:10 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tag-picker_v9.3.14..@fluentui/react-tag-picker_v9.4.0) + +### Minor changes + +- feature: single line layout ([PR #32247](https://github.com/microsoft/fluentui/pull/32247) by bernardo.sunderhus@gmail.com) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-combobox to v9.13.17 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tags to v9.3.29 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-positioning to v9.16.2 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + +### Patches + +- bugfix: secondaryContent not displaying properly ([PR #33689](https://github.com/microsoft/fluentui/pull/33689) by bernardo.sunderhus@gmail.com) + ## [9.3.14](https://github.com/microsoft/fluentui/tree/@fluentui/react-tag-picker_v9.3.14) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-tag-picker/library/package.json b/packages/react-components/react-tag-picker/library/package.json index 20c3a7e79e3b55..f77e4154bb50ac 100644 --- a/packages/react-components/react-tag-picker/library/package.json +++ b/packages/react-components/react-tag-picker/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tag-picker", - "version": "9.3.14", + "version": "9.4.0", "description": "FluentUI TagPicker component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -28,20 +28,20 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-portal": "^9.4.41", - "@fluentui/react-tabster": "^9.23.2", - "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-portal": "^9.4.42", + "@fluentui/react-tabster": "^9.23.3", + "@fluentui/react-aria": "^9.13.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-combobox": "^9.13.16", - "@fluentui/react-tags": "^9.3.28", - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-positioning": "^9.16.1", + "@fluentui/react-combobox": "^9.13.17", + "@fluentui/react-tags": "^9.3.29", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-positioning": "^9.16.2", "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-field": "^9.1.85", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-tags/library/CHANGELOG.json b/packages/react-components/react-tags/library/CHANGELOG.json index 3184e3dc41e7c9..e1a8f0ffb188de 100644 --- a/packages/react-components/react-tags/library/CHANGELOG.json +++ b/packages/react-components/react-tags/library/CHANGELOG.json @@ -1,6 +1,45 @@ { "name": "@fluentui/react-tags", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-tags_v9.3.29", + "version": "9.3.29", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-tags", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tags", + "comment": "Bump @fluentui/react-avatar to v9.6.49", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tags", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tags", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tags", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-tags_v9.3.28", diff --git a/packages/react-components/react-tags/library/CHANGELOG.md b/packages/react-components/react-tags/library/CHANGELOG.md index e5767dadce9caf..5fc9c863131423 100644 --- a/packages/react-components/react-tags/library/CHANGELOG.md +++ b/packages/react-components/react-tags/library/CHANGELOG.md @@ -1,9 +1,22 @@ # Change Log - @fluentui/react-tags -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.3.29](https://github.com/microsoft/fluentui/tree/@fluentui/react-tags_v9.3.29) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tags_v9.3.28..@fluentui/react-tags_v9.3.29) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-avatar to v9.6.49 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.3.28](https://github.com/microsoft/fluentui/tree/@fluentui/react-tags_v9.3.28) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-tags/library/package.json b/packages/react-components/react-tags/library/package.json index 54045929a198da..a091cafa9ce80f 100644 --- a/packages/react-components/react-tags/library/package.json +++ b/packages/react-components/react-tags/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tags", - "version": "9.3.28", + "version": "9.3.29", "description": "Fluent UI Tag component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,14 +21,14 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-avatar": "^9.6.48", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-avatar": "^9.6.49", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-teaching-popover/library/CHANGELOG.json b/packages/react-components/react-teaching-popover/library/CHANGELOG.json index bf57242cc48bd5..c22aa33309b804 100644 --- a/packages/react-components/react-teaching-popover/library/CHANGELOG.json +++ b/packages/react-components/react-teaching-popover/library/CHANGELOG.json @@ -1,6 +1,57 @@ { "name": "@fluentui/react-teaching-popover", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-teaching-popover_v9.2.1", + "version": "9.2.1", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-popover to v9.9.31", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-button to v9.3.100", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-teaching-popover", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:35 GMT", "tag": "@fluentui/react-teaching-popover_v9.2.0", diff --git a/packages/react-components/react-teaching-popover/library/CHANGELOG.md b/packages/react-components/react-teaching-popover/library/CHANGELOG.md index dfd3e92c3e9a66..c2c1abd780c0cb 100644 --- a/packages/react-components/react-teaching-popover/library/CHANGELOG.md +++ b/packages/react-components/react-teaching-popover/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-teaching-popover -This log was last generated on Wed, 08 Jan 2025 18:33:35 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.1](https://github.com/microsoft/fluentui/tree/@fluentui/react-teaching-popover_v9.2.1) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-teaching-popover_v9.2.0..@fluentui/react-teaching-popover_v9.2.1) + +### Patches + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-popover to v9.9.31 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-button to v9.3.100 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-teaching-popover_v9.2.0) Wed, 08 Jan 2025 18:33:35 GMT diff --git a/packages/react-components/react-teaching-popover/library/package.json b/packages/react-components/react-teaching-popover/library/package.json index 71051338731bf5..eee25677d17eca 100644 --- a/packages/react-components/react-teaching-popover/library/package.json +++ b/packages/react-components/react-teaching-popover/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-teaching-popover", - "version": "9.2.0", + "version": "9.2.1", "description": "New fluentui react package", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -24,18 +24,18 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-popover": "^9.9.30", - "@fluentui/react-button": "^9.3.99", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-popover": "^9.9.31", + "@fluentui/react-button": "^9.3.100", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-context-selector": "^9.1.72", "use-sync-external-store": "^1.2.0" }, "peerDependencies": { diff --git a/packages/react-components/react-text/library/CHANGELOG.json b/packages/react-components/react-text/library/CHANGELOG.json index 000c38549c4fe4..30f1c35efa7f89 100644 --- a/packages/react-components/react-text/library/CHANGELOG.json +++ b/packages/react-components/react-text/library/CHANGELOG.json @@ -1,6 +1,27 @@ { "name": "@fluentui/react-text", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-text_v9.4.32", + "version": "9.4.32", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-text", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-text", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-text_v9.4.31", diff --git a/packages/react-components/react-text/library/CHANGELOG.md b/packages/react-components/react-text/library/CHANGELOG.md index 141a7d41f48f09..b1c462cf5032b2 100644 --- a/packages/react-components/react-text/library/CHANGELOG.md +++ b/packages/react-components/react-text/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-text -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.4.32](https://github.com/microsoft/fluentui/tree/@fluentui/react-text_v9.4.32) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-text_v9.4.31..@fluentui/react-text_v9.4.32) + +### Patches + +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.4.31](https://github.com/microsoft/fluentui/tree/@fluentui/react-text_v9.4.31) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-text/library/package.json b/packages/react-components/react-text/library/package.json index 915cb6d2e42d65..6ea7a240b36543 100644 --- a/packages/react-components/react-text/library/package.json +++ b/packages/react-components/react-text/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-text", - "version": "9.4.31", + "version": "9.4.32", "description": "Text is a typography and styling abstraction component that can be used to ensure the consistency of all text across your application.", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,8 +20,8 @@ "dependencies": { "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-textarea/library/CHANGELOG.json b/packages/react-components/react-textarea/library/CHANGELOG.json index 10476a2cd14da6..6bd3c149d8b66e 100644 --- a/packages/react-components/react-textarea/library/CHANGELOG.json +++ b/packages/react-components/react-textarea/library/CHANGELOG.json @@ -1,6 +1,33 @@ { "name": "@fluentui/react-textarea", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-textarea_v9.3.97", + "version": "9.3.97", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-textarea", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-textarea", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-textarea", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-textarea_v9.3.96", diff --git a/packages/react-components/react-textarea/library/CHANGELOG.md b/packages/react-components/react-textarea/library/CHANGELOG.md index 40d3ce4eb73a94..5f29245d00984a 100644 --- a/packages/react-components/react-textarea/library/CHANGELOG.md +++ b/packages/react-components/react-textarea/library/CHANGELOG.md @@ -1,9 +1,20 @@ # Change Log - @fluentui/react-textarea -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.3.97](https://github.com/microsoft/fluentui/tree/@fluentui/react-textarea_v9.3.97) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-textarea_v9.3.96..@fluentui/react-textarea_v9.3.97) + +### Patches + +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.3.96](https://github.com/microsoft/fluentui/tree/@fluentui/react-textarea_v9.3.96) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-textarea/library/package.json b/packages/react-components/react-textarea/library/package.json index ab0f6978f6093b..05f8e99c745a0d 100644 --- a/packages/react-components/react-textarea/library/package.json +++ b/packages/react-components/react-textarea/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-textarea", - "version": "9.3.96", + "version": "9.3.97", "description": "Fluent UI TextArea component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,11 +18,11 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-field": "^9.1.84", + "@fluentui/react-field": "^9.1.85", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-timepicker-compat/library/CHANGELOG.json b/packages/react-components/react-timepicker-compat/library/CHANGELOG.json index e8f43b5ac291f3..26eceb53a66260 100644 --- a/packages/react-components/react-timepicker-compat/library/CHANGELOG.json +++ b/packages/react-components/react-timepicker-compat/library/CHANGELOG.json @@ -1,6 +1,39 @@ { "name": "@fluentui/react-timepicker-compat", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-timepicker-compat_v0.2.47", + "version": "0.2.47", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-timepicker-compat", + "comment": "Bump @fluentui/react-combobox to v9.13.17", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-timepicker-compat", + "comment": "Bump @fluentui/react-field to v9.1.85", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-timepicker-compat", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-timepicker-compat", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-timepicker-compat_v0.2.46", diff --git a/packages/react-components/react-timepicker-compat/library/CHANGELOG.md b/packages/react-components/react-timepicker-compat/library/CHANGELOG.md index 99fddd77436dca..56dfa865555de6 100644 --- a/packages/react-components/react-timepicker-compat/library/CHANGELOG.md +++ b/packages/react-components/react-timepicker-compat/library/CHANGELOG.md @@ -1,9 +1,21 @@ # Change Log - @fluentui/react-timepicker-compat -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [0.2.47](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.47) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-timepicker-compat_v0.2.46..@fluentui/react-timepicker-compat_v0.2.47) + +### Patches + +- Bump @fluentui/react-combobox to v9.13.17 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-field to v9.1.85 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [0.2.46](https://github.com/microsoft/fluentui/tree/@fluentui/react-timepicker-compat_v0.2.46) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-timepicker-compat/library/package.json b/packages/react-components/react-timepicker-compat/library/package.json index 7c7f9cf217a4e6..a9cffa47b36f5f 100644 --- a/packages/react-components/react-timepicker-compat/library/package.json +++ b/packages/react-components/react-timepicker-compat/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-timepicker-compat", - "version": "0.2.46", + "version": "0.2.47", "description": "Fluent UI TimePicker Compat Component", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -28,12 +28,12 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-combobox": "^9.13.16", - "@fluentui/react-field": "^9.1.84", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-combobox": "^9.13.17", + "@fluentui/react-field": "^9.1.85", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-toast/library/CHANGELOG.json b/packages/react-components/react-toast/library/CHANGELOG.json index 7d756df4532bcf..470d7f6f3394f8 100644 --- a/packages/react-components/react-toast/library/CHANGELOG.json +++ b/packages/react-components/react-toast/library/CHANGELOG.json @@ -1,6 +1,65 @@ { "name": "@fluentui/react-toast", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:10 GMT", + "tag": "@fluentui/react-toast_v9.3.65", + "version": "9.3.65", + "comments": { + "none": [ + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-toast", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + } + ], + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-motion to v9.6.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toast", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:35 GMT", "tag": "@fluentui/react-toast_v9.3.64", diff --git a/packages/react-components/react-toast/library/CHANGELOG.md b/packages/react-components/react-toast/library/CHANGELOG.md index fd8c6b52b431d8..87e47117d5e877 100644 --- a/packages/react-components/react-toast/library/CHANGELOG.md +++ b/packages/react-components/react-toast/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-toast -This log was last generated on Wed, 08 Jan 2025 18:33:35 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:10 GMT and should not be manually modified. <!-- Start content --> +## [9.3.65](https://github.com/microsoft/fluentui/tree/@fluentui/react-toast_v9.3.65) + +Wed, 22 Jan 2025 14:00:10 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-toast_v9.3.64..@fluentui/react-toast_v9.3.65) + +### Patches + +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion to v9.6.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.3.64](https://github.com/microsoft/fluentui/tree/@fluentui/react-toast_v9.3.64) Wed, 08 Jan 2025 18:33:35 GMT diff --git a/packages/react-components/react-toast/library/package.json b/packages/react-components/react-toast/library/package.json index f293206e1e0164..71d03d3b86c9e9 100644 --- a/packages/react-components/react-toast/library/package.json +++ b/packages/react-components/react-toast/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-toast", - "version": "9.3.64", + "version": "9.3.65", "description": "Toast component for Fluent UI", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,16 +21,16 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.13", + "@fluentui/react-aria": "^9.13.14", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-motion": "^9.6.6", - "@fluentui/react-motion-components-preview": "^0.4.2", - "@fluentui/react-portal": "^9.4.41", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-motion": "^9.6.7", + "@fluentui/react-motion-components-preview": "^0.4.3", + "@fluentui/react-portal": "^9.4.42", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-toolbar/library/CHANGELOG.json b/packages/react-components/react-toolbar/library/CHANGELOG.json index 7687952f67677f..f9d6f20976c0cc 100644 --- a/packages/react-components/react-toolbar/library/CHANGELOG.json +++ b/packages/react-components/react-toolbar/library/CHANGELOG.json @@ -1,6 +1,57 @@ { "name": "@fluentui/react-toolbar", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:21 GMT", + "tag": "@fluentui/react-toolbar_v9.2.15", + "version": "9.2.15", + "comments": { + "patch": [ + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-button to v9.3.100", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-divider to v9.2.82", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-radio to v9.2.41", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-toolbar", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-toolbar_v9.2.14", diff --git a/packages/react-components/react-toolbar/library/CHANGELOG.md b/packages/react-components/react-toolbar/library/CHANGELOG.md index f8de414f13cd9f..059f33d62eba3b 100644 --- a/packages/react-components/react-toolbar/library/CHANGELOG.md +++ b/packages/react-components/react-toolbar/library/CHANGELOG.md @@ -1,9 +1,24 @@ # Change Log - @fluentui/react-toolbar -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:21 GMT and should not be manually modified. <!-- Start content --> +## [9.2.15](https://github.com/microsoft/fluentui/tree/@fluentui/react-toolbar_v9.2.15) + +Wed, 22 Jan 2025 14:00:21 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-toolbar_v9.2.14..@fluentui/react-toolbar_v9.2.15) + +### Patches + +- Bump @fluentui/react-button to v9.3.100 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-divider to v9.2.82 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-radio to v9.2.41 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.2.14](https://github.com/microsoft/fluentui/tree/@fluentui/react-toolbar_v9.2.14) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-toolbar/library/package.json b/packages/react-components/react-toolbar/library/package.json index d27a6121e3a1be..6133da3e46adcb 100644 --- a/packages/react-components/react-toolbar/library/package.json +++ b/packages/react-components/react-toolbar/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-toolbar", - "version": "9.2.14", + "version": "9.2.15", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -20,15 +20,15 @@ "@fluentui/scripts-cypress": "*" }, "dependencies": { - "@fluentui/react-button": "^9.3.99", - "@fluentui/react-divider": "^9.2.81", + "@fluentui/react-button": "^9.3.100", + "@fluentui/react-divider": "^9.2.82", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-context-selector": "^9.1.71", - "@fluentui/react-radio": "^9.2.40", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-context-selector": "^9.1.72", + "@fluentui/react-radio": "^9.2.41", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-tooltip/library/CHANGELOG.json b/packages/react-components/react-tooltip/library/CHANGELOG.json index 6a00ff1c9fcc92..1d706b1c65308b 100644 --- a/packages/react-components/react-tooltip/library/CHANGELOG.json +++ b/packages/react-components/react-tooltip/library/CHANGELOG.json @@ -1,6 +1,65 @@ { "name": "@fluentui/react-tooltip", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:11 GMT", + "tag": "@fluentui/react-tooltip_v9.5.4", + "version": "9.5.4", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-tooltip", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-tooltip", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + } + ], + "patch": [ + { + "author": "viktorgenaev@microsoft.com", + "package": "@fluentui/react-tooltip", + "commit": "4db8229aa6938526432af9511f247072c21a72ac", + "comment": "fix: wrong call of useIsNavigatingWithKeyboard" + }, + { + "author": "beachball", + "package": "@fluentui/react-tooltip", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tooltip", + "comment": "Bump @fluentui/react-portal to v9.4.42", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tooltip", + "comment": "Bump @fluentui/react-positioning to v9.16.2", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tooltip", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tooltip", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-tooltip_v9.5.3", diff --git a/packages/react-components/react-tooltip/library/CHANGELOG.md b/packages/react-components/react-tooltip/library/CHANGELOG.md index ec6e48cf3f019a..f13b87a2983da9 100644 --- a/packages/react-components/react-tooltip/library/CHANGELOG.md +++ b/packages/react-components/react-tooltip/library/CHANGELOG.md @@ -1,9 +1,23 @@ # Change Log - @fluentui/react-tooltip -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:11 GMT and should not be manually modified. <!-- Start content --> +## [9.5.4](https://github.com/microsoft/fluentui/tree/@fluentui/react-tooltip_v9.5.4) + +Wed, 22 Jan 2025 14:00:11 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tooltip_v9.5.3..@fluentui/react-tooltip_v9.5.4) + +### Patches + +- fix: wrong call of useIsNavigatingWithKeyboard ([PR #33666](https://github.com/microsoft/fluentui/pull/33666) by viktorgenaev@microsoft.com) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-portal to v9.4.42 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-positioning to v9.16.2 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.5.3](https://github.com/microsoft/fluentui/tree/@fluentui/react-tooltip_v9.5.3) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-tooltip/library/package.json b/packages/react-components/react-tooltip/library/package.json index 83f0b10c1d815f..afda8aba19adf7 100644 --- a/packages/react-components/react-tooltip/library/package.json +++ b/packages/react-components/react-tooltip/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tooltip", - "version": "9.5.3", + "version": "9.5.4", "description": "React components for building web experiences", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -19,13 +19,13 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-portal": "^9.4.41", - "@fluentui/react-positioning": "^9.16.1", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-portal": "^9.4.42", + "@fluentui/react-positioning": "^9.16.2", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-tree/library/CHANGELOG.json b/packages/react-components/react-tree/library/CHANGELOG.json index cfab14d7ff9094..d7952f046b000e 100644 --- a/packages/react-components/react-tree/library/CHANGELOG.json +++ b/packages/react-components/react-tree/library/CHANGELOG.json @@ -1,6 +1,101 @@ { "name": "@fluentui/react-tree", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:11 GMT", + "tag": "@fluentui/react-tree_v9.9.0", + "version": "9.9.0", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-tree", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ], + "minor": [ + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-tree", + "commit": "246f5b3ed047531f7a329ad8ca7e5693cd3838a9", + "comment": "feature: introduces navigationMode property" + }, + { + "author": "bernardo.sunderhus@gmail.com", + "package": "@fluentui/react-tree", + "commit": "620ea3f1daa6a4cf9bb37961569f4756c3b3f95f", + "comment": "feature: TreeRootReset component" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-aria to v9.13.14", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-avatar to v9.6.49", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-button to v9.3.100", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-checkbox to v9.2.46", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-context-selector to v9.1.72", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-motion-components-preview to v0.4.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-motion to v9.6.7", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-radio to v9.2.41", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-tabster to v9.23.3", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-tree", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-tree_v9.8.12", diff --git a/packages/react-components/react-tree/library/CHANGELOG.md b/packages/react-components/react-tree/library/CHANGELOG.md index 722c479af322d0..64afc767775b77 100644 --- a/packages/react-components/react-tree/library/CHANGELOG.md +++ b/packages/react-components/react-tree/library/CHANGELOG.md @@ -1,9 +1,30 @@ # Change Log - @fluentui/react-tree -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:11 GMT and should not be manually modified. <!-- Start content --> +## [9.9.0](https://github.com/microsoft/fluentui/tree/@fluentui/react-tree_v9.9.0) + +Wed, 22 Jan 2025 14:00:11 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-tree_v9.8.12..@fluentui/react-tree_v9.9.0) + +### Minor changes + +- feature: introduces navigationMode property ([PR #33658](https://github.com/microsoft/fluentui/pull/33658) by bernardo.sunderhus@gmail.com) +- feature: TreeRootReset component ([PR #33663](https://github.com/microsoft/fluentui/pull/33663) by bernardo.sunderhus@gmail.com) +- Bump @fluentui/react-aria to v9.13.14 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-avatar to v9.6.49 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-button to v9.3.100 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-checkbox to v9.2.46 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-context-selector to v9.1.72 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion-components-preview to v0.4.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-motion to v9.6.7 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-radio to v9.2.41 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-tabster to v9.23.3 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.8.12](https://github.com/microsoft/fluentui/tree/@fluentui/react-tree_v9.8.12) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-tree/library/package.json b/packages/react-components/react-tree/library/package.json index a9ac047a35ecdf..6233300e807ba1 100644 --- a/packages/react-components/react-tree/library/package.json +++ b/packages/react-components/react-tree/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-tree", - "version": "9.8.12", + "version": "9.9.0", "description": "Tree component for Fluent UI React", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -21,20 +21,20 @@ }, "dependencies": { "@fluentui/keyboard-keys": "^9.0.8", - "@fluentui/react-aria": "^9.13.13", - "@fluentui/react-avatar": "^9.6.48", - "@fluentui/react-button": "^9.3.99", - "@fluentui/react-checkbox": "^9.2.45", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-aria": "^9.13.14", + "@fluentui/react-avatar": "^9.6.49", + "@fluentui/react-button": "^9.3.100", + "@fluentui/react-checkbox": "^9.2.46", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", - "@fluentui/react-motion-components-preview": "^0.4.2", - "@fluentui/react-motion": "^9.6.6", - "@fluentui/react-radio": "^9.2.40", + "@fluentui/react-motion-components-preview": "^0.4.3", + "@fluentui/react-motion": "^9.6.7", + "@fluentui/react-radio": "^9.2.41", "@fluentui/react-shared-contexts": "^9.21.2", - "@fluentui/react-tabster": "^9.23.2", + "@fluentui/react-tabster": "^9.23.3", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-utilities": "^9.18.20", + "@fluentui/react-jsx-runtime": "^9.0.50", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-utilities-compat/library/package.json b/packages/react-components/react-utilities-compat/library/package.json index 3fa4d8ea8a47f5..807e045afe15f5 100644 --- a/packages/react-components/react-utilities-compat/library/package.json +++ b/packages/react-components/react-utilities-compat/library/package.json @@ -25,10 +25,10 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", + "@fluentui/react-jsx-runtime": "^9.0.50", "@fluentui/react-shared-contexts": "^9.21.2", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" }, diff --git a/packages/react-components/react-utilities/CHANGELOG.json b/packages/react-components/react-utilities/CHANGELOG.json index 367c066afffdfe..82821b0455d328 100644 --- a/packages/react-components/react-utilities/CHANGELOG.json +++ b/packages/react-components/react-utilities/CHANGELOG.json @@ -1,6 +1,29 @@ { "name": "@fluentui/react-utilities", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:12 GMT", + "tag": "@fluentui/react-utilities_v9.18.20", + "version": "9.18.20", + "comments": { + "patch": [ + { + "author": "dmytrokirpa@microsoft.com", + "package": "@fluentui/react-utilities", + "commit": "8cf401d626def27ad679f9e53928533df9f9ef52", + "comment": "fix: add autoCorrect and minLength input properties support to getNativeProps utility" + } + ], + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-utilities", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Mon, 16 Dec 2024 16:26:49 GMT", "tag": "@fluentui/react-utilities_v9.18.19", diff --git a/packages/react-components/react-utilities/CHANGELOG.md b/packages/react-components/react-utilities/CHANGELOG.md index 252e26ad6b2c13..d75cfc7c5792b6 100644 --- a/packages/react-components/react-utilities/CHANGELOG.md +++ b/packages/react-components/react-utilities/CHANGELOG.md @@ -1,9 +1,18 @@ # Change Log - @fluentui/react-utilities -This log was last generated on Mon, 16 Dec 2024 16:26:49 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:12 GMT and should not be manually modified. <!-- Start content --> +## [9.18.20](https://github.com/microsoft/fluentui/tree/@fluentui/react-utilities_v9.18.20) + +Wed, 22 Jan 2025 14:00:12 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-utilities_v9.18.19..@fluentui/react-utilities_v9.18.20) + +### Patches + +- fix: add autoCorrect and minLength input properties support to getNativeProps utility ([PR #33642](https://github.com/microsoft/fluentui/pull/33642) by dmytrokirpa@microsoft.com) + ## [9.18.19](https://github.com/microsoft/fluentui/tree/@fluentui/react-utilities_v9.18.19) Mon, 16 Dec 2024 16:26:49 GMT diff --git a/packages/react-components/react-utilities/package.json b/packages/react-components/react-utilities/package.json index 0bad717290ed49..e6e0b642888f94 100644 --- a/packages/react-components/react-utilities/package.json +++ b/packages/react-components/react-utilities/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-utilities", - "version": "9.18.19", + "version": "9.18.20", "description": "A set of general React-specific utilities.", "main": "lib-commonjs/index.js", "module": "lib/index.js", diff --git a/packages/react-components/react-virtualizer/library/CHANGELOG.json b/packages/react-components/react-virtualizer/library/CHANGELOG.json index b3b4da467af753..f379649aa8dd2e 100644 --- a/packages/react-components/react-virtualizer/library/CHANGELOG.json +++ b/packages/react-components/react-virtualizer/library/CHANGELOG.json @@ -1,6 +1,41 @@ { "name": "@fluentui/react-virtualizer", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:13 GMT", + "tag": "@fluentui/react-virtualizer_v9.0.0-alpha.91", + "version": "9.0.0-alpha.91", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-virtualizer", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + }, + { + "author": "martinhochel@microsoft.com", + "package": "@fluentui/react-virtualizer", + "commit": "2f88d062a57e6dc44ecd65df2ab067652ae4c7ce", + "comment": "fix: make api.md up to date" + } + ], + "prerelease": [ + { + "author": "beachball", + "package": "@fluentui/react-virtualizer", + "comment": "Bump @fluentui/react-jsx-runtime to v9.0.50", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + }, + { + "author": "beachball", + "package": "@fluentui/react-virtualizer", + "comment": "Bump @fluentui/react-utilities to v9.18.20", + "commit": "5e95b13c1b6f513e6bdd9a4c688139748f912695" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:36 GMT", "tag": "@fluentui/react-virtualizer_v9.0.0-alpha.90", diff --git a/packages/react-components/react-virtualizer/library/CHANGELOG.md b/packages/react-components/react-virtualizer/library/CHANGELOG.md index 5fc5628f4f265e..f11950b7bb7814 100644 --- a/packages/react-components/react-virtualizer/library/CHANGELOG.md +++ b/packages/react-components/react-virtualizer/library/CHANGELOG.md @@ -1,9 +1,19 @@ # Change Log - @fluentui/react-virtualizer -This log was last generated on Wed, 08 Jan 2025 18:33:36 GMT and should not be manually modified. +This log was last generated on Wed, 22 Jan 2025 14:00:13 GMT and should not be manually modified. <!-- Start content --> +## [9.0.0-alpha.91](https://github.com/microsoft/fluentui/tree/@fluentui/react-virtualizer_v9.0.0-alpha.91) + +Wed, 22 Jan 2025 14:00:13 GMT +[Compare changes](https://github.com/microsoft/fluentui/compare/@fluentui/react-virtualizer_v9.0.0-alpha.90..@fluentui/react-virtualizer_v9.0.0-alpha.91) + +### Changes + +- Bump @fluentui/react-jsx-runtime to v9.0.50 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) +- Bump @fluentui/react-utilities to v9.18.20 ([PR #33631](https://github.com/microsoft/fluentui/pull/33631) by beachball) + ## [9.0.0-alpha.90](https://github.com/microsoft/fluentui/tree/@fluentui/react-virtualizer_v9.0.0-alpha.90) Wed, 08 Jan 2025 18:33:36 GMT diff --git a/packages/react-components/react-virtualizer/library/package.json b/packages/react-components/react-virtualizer/library/package.json index c991049a75c83b..bb7d8232489ce7 100644 --- a/packages/react-components/react-virtualizer/library/package.json +++ b/packages/react-components/react-virtualizer/library/package.json @@ -1,6 +1,6 @@ { "name": "@fluentui/react-virtualizer", - "version": "9.0.0-alpha.90", + "version": "9.0.0-alpha.91", "description": "Generic and composable virtualizer framework built on browser intersection observer", "main": "lib-commonjs/index.js", "module": "lib/index.js", @@ -18,8 +18,8 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-jsx-runtime": "^9.0.49", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-jsx-runtime": "^9.0.50", + "@fluentui/react-utilities": "^9.18.20", "@fluentui/react-shared-contexts": "^9.21.2", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1" diff --git a/packages/react-components/recipes/package.json b/packages/react-components/recipes/package.json index 84a5bc9b94a2da..d42541dcc16a29 100644 --- a/packages/react-components/recipes/package.json +++ b/packages/react-components/recipes/package.json @@ -27,10 +27,10 @@ "@fluentui/react-storybook-addon-export-to-sandbox": "*" }, "dependencies": { - "@fluentui/react-provider": "^9.18.3", + "@fluentui/react-provider": "^9.19.0", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-text": "^9.4.31", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-text": "^9.4.32", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", "@fluentui/react-icons": "^2.0.245" diff --git a/packages/react-components/theme-designer/package.json b/packages/react-components/theme-designer/package.json index 4031580527472e..0eede2c6ca912b 100644 --- a/packages/react-components/theme-designer/package.json +++ b/packages/react-components/theme-designer/package.json @@ -17,12 +17,12 @@ "@fluentui/scripts-api-extractor": "*" }, "dependencies": { - "@fluentui/react-components": "^9.57.0", - "@fluentui/react-context-selector": "^9.1.71", + "@fluentui/react-components": "^9.58.0", + "@fluentui/react-context-selector": "^9.1.72", "@fluentui/react-icons": "^2.0.245", "@fluentui/react-storybook-addon-export-to-sandbox": "^0.1.0", "@fluentui/react-theme": "^9.1.24", - "@fluentui/react-utilities": "^9.18.19", + "@fluentui/react-utilities": "^9.18.20", "@griffel/react": "^1.5.22", "@swc/helpers": "^0.5.1", "dedent": "^1.2.0", diff --git a/packages/react-conformance/CHANGELOG.json b/packages/react-conformance/CHANGELOG.json index 482e753f9b5323..0ef7a01eab3896 100644 --- a/packages/react-conformance/CHANGELOG.json +++ b/packages/react-conformance/CHANGELOG.json @@ -1,6 +1,21 @@ { "name": "@fluentui/react-conformance", "entries": [ + { + "date": "Wed, 22 Jan 2025 14:00:17 GMT", + "tag": "@fluentui/react-conformance_v0.19.3", + "version": "0.19.3", + "comments": { + "none": [ + { + "author": "vgenaev@gmail.com", + "package": "@fluentui/react-conformance", + "commit": "fd420e1e0b66e04c8a423cff3eea6d21d9434d2d", + "comment": "chore: migrate from deprecation plugin to ts-eslint/no-deprecated rule" + } + ] + } + }, { "date": "Wed, 08 Jan 2025 18:33:33 GMT", "tag": "@fluentui/react-conformance_v0.19.3", From 82ef8b9000a1223756a4253aacde35fe4eaea401 Mon Sep 17 00:00:00 2001 From: Anush Gupta <74965306+Anush2303@users.noreply.github.com> Date: Wed, 22 Jan 2025 21:04:35 +0530 Subject: [PATCH 75/78] feat(declarative-chart): Support for Dashed and Dotted lines (#33694) --- ...-5f3118c9-244c-41d1-8067-bca1566ec9bd.json | 7 +++ .../react-charting/etc/react-charting.api.md | 1 + .../DeclarativeChart/DeclarativeChart.tsx | 1 - .../DeclarativeChart/PlotlySchemaAdapter.ts | 46 ++++++++++++++++++- .../VerticalStackedBarChart.base.tsx | 5 +- .../react-charting/src/types/IDataPoint.ts | 4 ++ 6 files changed, 60 insertions(+), 4 deletions(-) create mode 100644 change/@fluentui-react-charting-5f3118c9-244c-41d1-8067-bca1566ec9bd.json diff --git a/change/@fluentui-react-charting-5f3118c9-244c-41d1-8067-bca1566ec9bd.json b/change/@fluentui-react-charting-5f3118c9-244c-41d1-8067-bca1566ec9bd.json new file mode 100644 index 00000000000000..62e2f67fdb0cb4 --- /dev/null +++ b/change/@fluentui-react-charting-5f3118c9-244c-41d1-8067-bca1566ec9bd.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Support for dashed and dotted line in Declarative chart", + "packageName": "@fluentui/react-charting", + "email": "74965306+Anush2303@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/react-charting/etc/react-charting.api.md b/packages/charts/react-charting/etc/react-charting.api.md index 207610b95c35a0..8d333966eb58cf 100644 --- a/packages/charts/react-charting/etc/react-charting.api.md +++ b/packages/charts/react-charting/etc/react-charting.api.md @@ -1042,6 +1042,7 @@ export interface ILineDataInVerticalStackedBarChart { data?: number; // (undocumented) legend: string; + lineOptions?: ILineChartLineOptions; useSecondaryYScale?: boolean; // (undocumented) y: number; diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx b/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx index c84024a8684b7a..fc6dcf1dbd4050 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx +++ b/packages/charts/react-charting/src/components/DeclarativeChart/DeclarativeChart.tsx @@ -5,7 +5,6 @@ import { IRefObject } from '@fluentui/react/lib/Utilities'; import { DonutChart } from '../DonutChart/index'; import { VerticalStackedBarChart } from '../VerticalStackedBarChart/index'; import { PlotData, PlotlySchema } from './PlotlySchema'; -//import type { Data, Layout } from './PlotlySchema'; import { isArrayOrTypedArray, isDateArray, diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts index 728bc2cf4f1b38..b0ee50789c429a 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts +++ b/packages/charts/react-charting/src/components/DeclarativeChart/PlotlySchemaAdapter.ts @@ -39,6 +39,44 @@ interface ISecondaryYAxisValues { } const SUPPORTED_PLOT_TYPES = ['pie', 'bar', 'scatter', 'heatmap', 'sankey', 'indicator', 'histogram']; +const dashOptions = { + dot: { + strokeDasharray: '1, 5', + strokeLinecap: 'round', + strokeWidth: '2', + lineBorderWidth: '4', + }, + dash: { + strokeDasharray: '5, 5', + strokeLinecap: 'butt', + strokeWidth: '2', + lineBorderWidth: '4', + }, + longdash: { + strokeDasharray: '10, 5', + strokeLinecap: 'butt', + strokeWidth: '2', + lineBorderWidth: '4', + }, + dashdot: { + strokeDasharray: '5, 5, 1, 5', + strokeLinecap: 'butt', + strokeWidth: '2', + lineBorderWidth: '4', + }, + longdashdot: { + strokeDasharray: '10, 5, 1, 5', + strokeLinecap: 'butt', + strokeWidth: '2', + lineBorderWidth: '4', + }, + solid: { + strokeDasharray: '0', + strokeLinecap: 'butt', + strokeWidth: '2', + lineBorderWidth: '4', + }, +} as const; const isDate = (value: any): boolean => { const parsedDate = new Date(Date.parse(value)); if (isNaN(parsedDate.getTime())) { @@ -284,6 +322,9 @@ export const transformPlotlyJsonToVSBCProps = ( const color = getColor(legend, colorMap, isDarkTheme); mapXToDataPoints[x].lineData!.push({ legend, + ...(series.line?.dash && dashOptions[series.line.dash] + ? { lineOptions: { ...dashOptions[series.line.dash] } } + : {}), y: yVal, color, }); @@ -473,6 +514,9 @@ export const transformPlotlyJsonToScatterChartProps = ( return { legend, + ...(series.line?.dash && dashOptions[series.line.dash] + ? { lineOptions: { ...dashOptions[series.line.dash] } } + : {}), data: xValues.map((x, i: number) => ({ x: isString ? (isXDate ? new Date(x as string) : isXNumber ? parseFloat(x as string) : x) : x, y: series.y[i], @@ -592,7 +636,7 @@ export const transformPlotlyJsonToHeatmapProps = (input: PlotlySchema): IHeatMap }; // Initialize domain and range to default values - const defaultDomain = [zMin, zMax]; + const defaultDomain = [zMin, (zMax + zMin) / 2, zMax]; const defaultRange = [ getColorFromToken(DataVizPalette.color1), getColorFromToken(DataVizPalette.color2), diff --git a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx index 7b897388bb9203..5f2e25f9ac3745 100644 --- a/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx +++ b/packages/charts/react-charting/src/components/VerticalStackedBarChart/VerticalStackedBarChart.base.tsx @@ -441,8 +441,9 @@ export class VerticalStackedBarChartBase x2={x2} y2={y2} opacity={shouldHighlight ? 1 : 0.1} - strokeWidth={3} - strokeLinecap="round" + strokeWidth={lineObject[item][0].lineOptions?.strokeWidth ?? 3} + strokeLinecap={lineObject[item][0].lineOptions?.strokeLinecap ?? 'round'} + strokeDasharray={lineObject[item][0].lineOptions?.strokeDasharray} stroke={lineObject[item][i].color} transform={`translate(${xScaleBandwidthTranslate}, 0)`} {...(this._isLegendHighlighted(item) && { diff --git a/packages/charts/react-charting/src/types/IDataPoint.ts b/packages/charts/react-charting/src/types/IDataPoint.ts index dda593a408f4f5..5ca0f1393677e1 100644 --- a/packages/charts/react-charting/src/types/IDataPoint.ts +++ b/packages/charts/react-charting/src/types/IDataPoint.ts @@ -650,6 +650,10 @@ export interface ILineDataInVerticalStackedBarChart { * False by default. */ useSecondaryYScale?: boolean; + /** + * options for the line drawn + */ + lineOptions?: ILineChartLineOptions; } /** From d9e58109843ce340b96de6b8fefa12c5daf66443 Mon Sep 17 00:00:00 2001 From: Sean Monahan <seanmonahan@microsoft.com> Date: Wed, 22 Jan 2025 07:45:43 -0800 Subject: [PATCH 76/78] fix: remove forced synchronous layout in Drawer (#33665) --- ...t-drawer-592aa752-5056-4be4-bf91-b47f98cea7d4.json | 7 +++++++ .../src/components/DrawerBody/useDrawerBody.ts | 11 +++++++---- 2 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 change/@fluentui-react-drawer-592aa752-5056-4be4-bf91-b47f98cea7d4.json diff --git a/change/@fluentui-react-drawer-592aa752-5056-4be4-bf91-b47f98cea7d4.json b/change/@fluentui-react-drawer-592aa752-5056-4be4-bf91-b47f98cea7d4.json new file mode 100644 index 00000000000000..a38922c618dafb --- /dev/null +++ b/change/@fluentui-react-drawer-592aa752-5056-4be4-bf91-b47f98cea7d4.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "fix: remove forced synchronous layout in Drawer", + "packageName": "@fluentui/react-drawer", + "email": "seanmonahan@microsoft.com", + "dependentChangeType": "patch" +} diff --git a/packages/react-components/react-drawer/library/src/components/DrawerBody/useDrawerBody.ts b/packages/react-components/react-drawer/library/src/components/DrawerBody/useDrawerBody.ts index e4b8338791cb94..2542b992f883e9 100644 --- a/packages/react-components/react-drawer/library/src/components/DrawerBody/useDrawerBody.ts +++ b/packages/react-components/react-drawer/library/src/components/DrawerBody/useDrawerBody.ts @@ -65,15 +65,18 @@ export const useDrawerBody_unstable = (props: DrawerBodyProps, ref: React.Ref<HT }, [cancelAnimationFrame, setAnimationFrame, updateScrollState]); useIsomorphicLayoutEffect(() => { - updateScrollState(); + cancelAnimationFrame(); + setAnimationFrame(() => updateScrollState()); /* update scroll state when children changes */ - }, [props.children, updateScrollState]); + return () => cancelAnimationFrame(); + }, [props.children, cancelAnimationFrame, updateScrollState, setAnimationFrame]); useIsomorphicLayoutEffect(() => { - updateScrollState(); + cancelAnimationFrame(); + setAnimationFrame(() => updateScrollState()); return () => cancelAnimationFrame(); - }, [cancelAnimationFrame, updateScrollState]); + }, [cancelAnimationFrame, updateScrollState, setAnimationFrame]); return { components: { From d0f533ab48c3a296b03aa789da59f6dbdcf7cbb1 Mon Sep 17 00:00:00 2001 From: Valentyna <vkozlova@microsoft.com> Date: Wed, 22 Jan 2025 08:06:49 -0800 Subject: [PATCH 77/78] test(color-picker): Added VR tests for ColorSlider and AlphaSlider (#33672) --- .../ColorPicker/ColorPicker.stories.tsx | 18 ++++++++++++- .../src/stories/ColorPicker/utils.tsx | 27 ++++++++++++++----- 2 files changed, 37 insertions(+), 8 deletions(-) diff --git a/apps/vr-tests-react-components/src/stories/ColorPicker/ColorPicker.stories.tsx b/apps/vr-tests-react-components/src/stories/ColorPicker/ColorPicker.stories.tsx index fd45bdc75342b1..174df5aae6913f 100644 --- a/apps/vr-tests-react-components/src/stories/ColorPicker/ColorPicker.stories.tsx +++ b/apps/vr-tests-react-components/src/stories/ColorPicker/ColorPicker.stories.tsx @@ -1,6 +1,6 @@ import * as React from 'react'; import type { Meta } from '@storybook/react'; -import { ColorPicker } from '@fluentui/react-color-picker-preview'; +import { ColorPicker, ColorSlider, AlphaSlider } from '@fluentui/react-color-picker-preview'; import { SampleColorPicker } from './utils'; import { Steps } from 'storywright'; @@ -15,6 +15,22 @@ export default { export const Default = () => <SampleColorPicker color={{ h: 109, s: 1, v: 0.91 }} />; +export const ColorSliders = () => ( + <> + <ColorSlider color={{ h: 109, s: 1, v: 0.9 }} /> + <ColorSlider color={{ h: 184, s: 1, v: 0.9 }} vertical /> + </> +); + +export const AlphaSliders = () => ( + <> + <AlphaSlider color={{ h: 12, s: 1, v: 0.9, a: 0.7 }} /> + <AlphaSlider color={{ h: 59, s: 1, v: 1 }} vertical /> + <AlphaSlider color={{ h: 276, s: 1, v: 0.9, a: 0.2 }} transparency /> + <AlphaSlider color={{ h: 332, s: 1, v: 0.9, a: 0.1 }} transparency vertical /> + </> +); + export const DefaultDarkMode = getStoryVariant(Default, DARK_MODE); export const DefaultHighContrast = getStoryVariant(Default, HIGH_CONTRAST); diff --git a/apps/vr-tests-react-components/src/stories/ColorPicker/utils.tsx b/apps/vr-tests-react-components/src/stories/ColorPicker/utils.tsx index dd5166d0fa2db2..b8f5ae6a950f3b 100644 --- a/apps/vr-tests-react-components/src/stories/ColorPicker/utils.tsx +++ b/apps/vr-tests-react-components/src/stories/ColorPicker/utils.tsx @@ -6,11 +6,24 @@ import { ColorSlider, type ColorPickerProps, } from '@fluentui/react-color-picker-preview'; +import { makeStyles } from '@griffel/react'; -export const SampleColorPicker = (props: ColorPickerProps) => ( - <ColorPicker {...props}> - <ColorArea /> - <ColorSlider /> - <AlphaSlider /> - </ColorPicker> -); +const useStyles = makeStyles({ + example: { + width: '300px', + display: 'flex', + flexDirection: 'column', + gap: '8px', + }, +}); + +export const SampleColorPicker = (props: ColorPickerProps) => { + const styles = useStyles(); + return ( + <ColorPicker className={styles.example} {...props}> + <ColorArea /> + <ColorSlider /> + <AlphaSlider /> + </ColorPicker> + ); +}; From af631b94cfaa3e9a9d79160236a7f0679240777b Mon Sep 17 00:00:00 2001 From: Anush Gupta <74965306+Anush2303@users.noreply.github.com> Date: Wed, 22 Jan 2025 22:05:06 +0530 Subject: [PATCH 78/78] feat(react-charting): Heatmap text color based on Contrast Ratio (#33659) --- ...-e1bc4943-8298-429b-b844-5503943dff7c.json | 7 + packages/charts/react-charting/package.json | 2 + .../DeclarativeChartRTL.test.tsx.snap | 800 +++++++++--------- .../DeclarativeChart/imageExporter.ts | 10 +- .../HeatMapChart/HeatMapChart.base.tsx | 18 + .../HeatMapChart/HeatMapChart.styles.ts | 1 - .../HeatMapChartRTL.test.tsx.snap | 16 +- .../react-charting/src/utilities/colors.ts | 25 + .../react-charting/src/utilities/utilities.ts | 9 + yarn.lock | 7 +- 10 files changed, 476 insertions(+), 419 deletions(-) create mode 100644 change/@fluentui-react-charting-e1bc4943-8298-429b-b844-5503943dff7c.json diff --git a/change/@fluentui-react-charting-e1bc4943-8298-429b-b844-5503943dff7c.json b/change/@fluentui-react-charting-e1bc4943-8298-429b-b844-5503943dff7c.json new file mode 100644 index 00000000000000..6197adf65a9d81 --- /dev/null +++ b/change/@fluentui-react-charting-e1bc4943-8298-429b-b844-5503943dff7c.json @@ -0,0 +1,7 @@ +{ + "type": "patch", + "comment": "Heatmap text color based on contrast ratio", + "packageName": "@fluentui/react-charting", + "email": "74965306+Anush2303@users.noreply.github.com", + "dependentChangeType": "patch" +} diff --git a/packages/charts/react-charting/package.json b/packages/charts/react-charting/package.json index 78a0a53fde6f4e..3538c4ed6ed6d1 100644 --- a/packages/charts/react-charting/package.json +++ b/packages/charts/react-charting/package.json @@ -52,6 +52,7 @@ "@types/d3-shape": "^3.0.0", "@types/d3-time-format": "^3.0.0", "@types/d3-time": "^3.0.0", + "@types/d3-color": "^3.0.0", "@fluentui/set-version": "^8.2.23", "d3-array": "^3.0.0", "d3-axis": "^3.0.0", @@ -63,6 +64,7 @@ "d3-shape": "^3.0.0", "d3-time-format": "^3.0.0", "d3-time": "^3.0.0", + "d3-color": "^3.0.0", "tslib": "^2.1.0" }, "peerDependencies": { diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap index 5f131e387622e1..e6c11ebe4c8f29 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap +++ b/packages/charts/react-charting/src/components/DeclarativeChart/__snapshots__/DeclarativeChartRTL.test.tsx.snap @@ -5664,13 +5664,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5696,13 +5696,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5728,13 +5728,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5760,13 +5760,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5792,13 +5792,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5824,13 +5824,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5856,13 +5856,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5888,13 +5888,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5920,13 +5920,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5952,13 +5952,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -5984,13 +5984,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6016,13 +6016,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6048,13 +6048,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6080,13 +6080,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6112,13 +6112,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6144,13 +6144,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6176,13 +6176,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6208,13 +6208,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6240,13 +6240,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6272,13 +6272,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6304,13 +6304,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6336,13 +6336,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6368,13 +6368,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6400,13 +6400,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6432,13 +6432,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6464,13 +6464,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6496,13 +6496,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6528,13 +6528,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6560,13 +6560,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6592,13 +6592,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6624,13 +6624,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6656,13 +6656,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6688,13 +6688,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6720,13 +6720,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6752,13 +6752,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6784,13 +6784,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6816,13 +6816,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6848,13 +6848,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6880,13 +6880,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6912,13 +6912,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6944,13 +6944,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -6976,13 +6976,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7008,13 +7008,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7040,13 +7040,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7072,13 +7072,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7104,13 +7104,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7136,13 +7136,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7168,13 +7168,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7200,13 +7200,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7232,13 +7232,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7264,13 +7264,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7296,13 +7296,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7328,13 +7328,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7360,13 +7360,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7392,13 +7392,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7424,13 +7424,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7456,13 +7456,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7488,13 +7488,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7520,13 +7520,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7552,13 +7552,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7584,13 +7584,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7616,13 +7616,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7648,13 +7648,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7680,13 +7680,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7712,13 +7712,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7744,13 +7744,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7776,13 +7776,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7808,13 +7808,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7840,13 +7840,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7872,13 +7872,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7904,13 +7904,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7936,13 +7936,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -7968,13 +7968,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8000,13 +8000,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8032,13 +8032,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8064,13 +8064,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8096,13 +8096,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8128,13 +8128,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8160,13 +8160,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8192,13 +8192,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8224,13 +8224,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8256,13 +8256,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8288,13 +8288,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8320,13 +8320,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8352,13 +8352,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8384,13 +8384,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8416,13 +8416,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8448,13 +8448,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8480,13 +8480,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8512,13 +8512,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8544,13 +8544,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8576,13 +8576,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8608,13 +8608,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8640,13 +8640,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8672,13 +8672,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8704,13 +8704,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8736,13 +8736,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8768,13 +8768,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8800,13 +8800,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8832,13 +8832,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8864,13 +8864,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8896,13 +8896,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8928,13 +8928,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8960,13 +8960,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -8992,13 +8992,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9024,13 +9024,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9056,13 +9056,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9088,13 +9088,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9120,13 +9120,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9152,13 +9152,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9184,13 +9184,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9216,13 +9216,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9248,13 +9248,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9280,13 +9280,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9312,13 +9312,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9344,13 +9344,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9376,13 +9376,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9408,13 +9408,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9440,13 +9440,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9472,13 +9472,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9504,13 +9504,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9536,13 +9536,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9568,13 +9568,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9600,13 +9600,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9632,13 +9632,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9664,13 +9664,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9696,13 +9696,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9728,13 +9728,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9760,13 +9760,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9792,13 +9792,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9824,13 +9824,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9856,13 +9856,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9888,13 +9888,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9920,13 +9920,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9952,13 +9952,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -9984,13 +9984,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10016,13 +10016,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10048,13 +10048,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10080,13 +10080,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10112,13 +10112,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10144,13 +10144,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10176,13 +10176,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10208,13 +10208,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10240,13 +10240,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10272,13 +10272,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10304,13 +10304,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10336,13 +10336,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10368,13 +10368,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10400,13 +10400,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10432,13 +10432,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10464,13 +10464,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10496,13 +10496,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10528,13 +10528,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10560,13 +10560,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10592,13 +10592,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10624,13 +10624,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10656,13 +10656,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10688,13 +10688,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10720,13 +10720,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10752,13 +10752,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10784,13 +10784,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10816,13 +10816,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10848,13 +10848,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10880,13 +10880,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10912,13 +10912,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10944,13 +10944,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -10976,13 +10976,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11008,13 +11008,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11040,13 +11040,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11072,13 +11072,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11104,13 +11104,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11136,13 +11136,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11168,13 +11168,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11200,13 +11200,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11232,13 +11232,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11264,13 +11264,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11296,13 +11296,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11328,13 +11328,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11360,13 +11360,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11392,13 +11392,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11424,13 +11424,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11456,13 +11456,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11488,13 +11488,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11520,13 +11520,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11552,13 +11552,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11584,13 +11584,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11616,13 +11616,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11648,13 +11648,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11680,13 +11680,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11712,13 +11712,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11744,13 +11744,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11776,13 +11776,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11808,13 +11808,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11840,13 +11840,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11872,13 +11872,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11904,13 +11904,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11936,13 +11936,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -11968,13 +11968,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12000,13 +12000,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12032,13 +12032,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12064,13 +12064,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12096,13 +12096,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12128,13 +12128,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12160,13 +12160,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12192,13 +12192,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12224,13 +12224,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12256,13 +12256,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12288,13 +12288,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12320,13 +12320,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12352,13 +12352,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12384,13 +12384,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12416,13 +12416,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12448,13 +12448,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12480,13 +12480,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12512,13 +12512,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12544,13 +12544,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12576,13 +12576,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12608,13 +12608,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12640,13 +12640,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12672,13 +12672,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12704,13 +12704,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12736,13 +12736,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12768,13 +12768,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12800,13 +12800,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12832,13 +12832,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12864,13 +12864,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12896,13 +12896,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12928,13 +12928,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12960,13 +12960,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -12992,13 +12992,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13024,13 +13024,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13056,13 +13056,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13088,13 +13088,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13120,13 +13120,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13152,13 +13152,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13184,13 +13184,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13216,13 +13216,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13248,13 +13248,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13280,13 +13280,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13312,13 +13312,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13344,13 +13344,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13376,13 +13376,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13408,13 +13408,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13440,13 +13440,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13472,13 +13472,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13504,13 +13504,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13536,13 +13536,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13568,13 +13568,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13600,13 +13600,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13632,13 +13632,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13664,13 +13664,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13696,13 +13696,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13728,13 +13728,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13760,13 +13760,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13792,13 +13792,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13824,13 +13824,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13856,13 +13856,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13888,13 +13888,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13920,13 +13920,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13952,13 +13952,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -13984,13 +13984,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14016,13 +14016,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14048,13 +14048,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14080,13 +14080,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14112,13 +14112,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14144,13 +14144,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14176,13 +14176,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14208,13 +14208,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14240,13 +14240,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14272,13 +14272,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14304,13 +14304,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14336,13 +14336,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14368,13 +14368,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14400,13 +14400,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14432,13 +14432,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14464,13 +14464,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14496,13 +14496,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14528,13 +14528,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14560,13 +14560,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14592,13 +14592,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14624,13 +14624,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14656,13 +14656,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14688,13 +14688,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14720,13 +14720,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14752,13 +14752,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14784,13 +14784,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14816,13 +14816,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14848,13 +14848,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14880,13 +14880,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14912,13 +14912,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14944,13 +14944,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -14976,13 +14976,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15008,13 +15008,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15040,13 +15040,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15072,13 +15072,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15104,13 +15104,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15136,13 +15136,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15168,13 +15168,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15200,13 +15200,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15232,13 +15232,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15264,13 +15264,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15296,13 +15296,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15328,13 +15328,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15360,13 +15360,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15392,13 +15392,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15424,13 +15424,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15456,13 +15456,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15488,13 +15488,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15520,13 +15520,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15552,13 +15552,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15584,13 +15584,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15616,13 +15616,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15648,13 +15648,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15680,13 +15680,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15712,13 +15712,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15744,13 +15744,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15776,13 +15776,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15808,13 +15808,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15840,13 +15840,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15872,13 +15872,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15904,13 +15904,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15936,13 +15936,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -15968,13 +15968,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16000,13 +16000,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16032,13 +16032,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16064,13 +16064,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16096,13 +16096,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16128,13 +16128,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16160,13 +16160,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16192,13 +16192,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16224,13 +16224,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16256,13 +16256,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16288,13 +16288,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16320,13 +16320,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16352,13 +16352,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16384,13 +16384,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16416,13 +16416,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16448,13 +16448,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16480,13 +16480,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16512,13 +16512,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16544,13 +16544,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16576,13 +16576,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16608,13 +16608,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16640,13 +16640,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16672,13 +16672,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16704,13 +16704,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#ffffff" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16736,13 +16736,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16768,13 +16768,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16800,13 +16800,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16832,13 +16832,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16864,13 +16864,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16896,13 +16896,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16928,13 +16928,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16960,13 +16960,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -16992,13 +16992,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17024,13 +17024,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17056,13 +17056,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17088,13 +17088,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17120,13 +17120,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17152,13 +17152,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17184,13 +17184,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17216,13 +17216,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17248,13 +17248,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17280,13 +17280,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17312,13 +17312,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17344,13 +17344,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17376,13 +17376,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17408,13 +17408,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17440,13 +17440,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17472,13 +17472,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17504,13 +17504,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17536,13 +17536,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17568,13 +17568,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17600,13 +17600,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17632,13 +17632,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17664,13 +17664,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17696,13 +17696,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17728,13 +17728,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17760,13 +17760,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17792,13 +17792,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17824,13 +17824,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17856,13 +17856,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17888,13 +17888,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17920,13 +17920,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17952,13 +17952,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -17984,13 +17984,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18016,13 +18016,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18048,13 +18048,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18080,13 +18080,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18112,13 +18112,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18144,13 +18144,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18176,13 +18176,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18208,13 +18208,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18240,13 +18240,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18272,13 +18272,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18304,13 +18304,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18336,13 +18336,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18368,13 +18368,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18400,13 +18400,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > @@ -18432,13 +18432,13 @@ exports[`DeclarativeChart Should render heatmapchart in DeclarativeChart 1`] = ` { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(1.5664335664335665, 1.346153846153846)" > diff --git a/packages/charts/react-charting/src/components/DeclarativeChart/imageExporter.ts b/packages/charts/react-charting/src/components/DeclarativeChart/imageExporter.ts index cab5167bf6ccb2..ef5716d9fa2af4 100644 --- a/packages/charts/react-charting/src/components/DeclarativeChart/imageExporter.ts +++ b/packages/charts/react-charting/src/components/DeclarativeChart/imageExporter.ts @@ -1,4 +1,5 @@ import { create as d3Create, select as d3Select, Selection } from 'd3-selection'; +import { resolveCSSVariables } from '../../utilities/index'; /** * {@docCategory DeclarativeChart} @@ -196,15 +197,6 @@ function cloneLegendsToSVG(chartContainer: HTMLElement, svgWidth: number, svgHei }; } -const cssVarRegExp = /var\((--[a-zA-Z0-9\-]+)\)/g; - -function resolveCSSVariables(chartContainer: HTMLElement, styleRules: string) { - const containerStyles = getComputedStyle(chartContainer); - return styleRules.replace(cssVarRegExp, (match, group1) => { - return containerStyles.getPropertyValue(group1); - }); -} - function svgToPng(svgDataUrl: string, opts: IImageExportOptions = {}): Promise<string> { return new Promise((resolve, reject) => { const scale = opts.scale || 1; diff --git a/packages/charts/react-charting/src/components/HeatMapChart/HeatMapChart.base.tsx b/packages/charts/react-charting/src/components/HeatMapChart/HeatMapChart.base.tsx index cbd89e2e80b38f..7967f30f2a94a8 100644 --- a/packages/charts/react-charting/src/components/HeatMapChart/HeatMapChart.base.tsx +++ b/packages/charts/react-charting/src/components/HeatMapChart/HeatMapChart.base.tsx @@ -20,10 +20,12 @@ import { IDomainNRange, domainRangeOfXStringAxis, createStringYAxis, + resolveCSSVariables, } from '../../utilities/utilities'; import { Target } from '@fluentui/react'; import { format as d3Format } from 'd3-format'; import { timeFormat as d3TimeFormat } from 'd3-time-format'; +import { getColorContrast } from '../../utilities/colors'; type DataSet = { dataSet: RectanglesGraphData; @@ -351,6 +353,12 @@ export class HeatMapChartBase extends React.Component<IHeatMapChartProps, IHeatM }); }; + private _getInvertedTextColor = (color: string): string => { + return color === this.props.theme!.semanticColors.bodyText + ? this.props.theme!.semanticColors.bodyBackground + : this.props.theme!.semanticColors.bodyText; + }; + /** * This is the function which is responsible for * drawing the rectangle in the graph and also @@ -374,6 +382,15 @@ export class HeatMapChartBase extends React.Component<IHeatMapChartProps, IHeatM * data point such as x, y , value, rectText property of the rectangle */ const dataPointObject = this._dataSet[yAxisDataPoint][index]; + let styleRules = ''; + let foregroundColor = this.props.theme!.semanticColors.bodyText; + if (this.chartContainer) { + styleRules = resolveCSSVariables(this.chartContainer!, foregroundColor); + } + const contrastRatio = getColorContrast(styleRules, this._colorScale(dataPointObject.value)); + if (contrastRatio < 3) { + foregroundColor = this._getInvertedTextColor(foregroundColor); + } rectElement = ( <g key={id} @@ -401,6 +418,7 @@ export class HeatMapChartBase extends React.Component<IHeatMapChartProps, IHeatM textAnchor={'middle'} className={this._classNames.text} transform={`translate(${this._xAxisScale.bandwidth() / 2}, ${this._yAxisScale.bandwidth() / 2})`} + fill={foregroundColor} > {convertToLocaleString(dataPointObject.rectText, this.props.culture)} </text> diff --git a/packages/charts/react-charting/src/components/HeatMapChart/HeatMapChart.styles.ts b/packages/charts/react-charting/src/components/HeatMapChart/HeatMapChart.styles.ts index 49ac43d30a0d0b..d4b005062e412c 100644 --- a/packages/charts/react-charting/src/components/HeatMapChart/HeatMapChart.styles.ts +++ b/packages/charts/react-charting/src/components/HeatMapChart/HeatMapChart.styles.ts @@ -9,7 +9,6 @@ export const getHeatMapChartStyles = (props: IHeatMapChartStyleProps): IHeatMapC theme.fonts.medium, { pointerEvents: 'none', - fill: theme.palette.white, fontWeight: FontWeights.semibold, }, ], diff --git a/packages/charts/react-charting/src/components/HeatMapChart/__snapshots__/HeatMapChartRTL.test.tsx.snap b/packages/charts/react-charting/src/components/HeatMapChart/__snapshots__/HeatMapChartRTL.test.tsx.snap index 6234c328964630..8883b9f15e1586 100644 --- a/packages/charts/react-charting/src/components/HeatMapChart/__snapshots__/HeatMapChartRTL.test.tsx.snap +++ b/packages/charts/react-charting/src/components/HeatMapChart/__snapshots__/HeatMapChartRTL.test.tsx.snap @@ -828,13 +828,13 @@ exports[`HeatMapChart snapshot tests should render HeatMapChart correctly with n { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(143.11881188118812, 57.49009900990099)" /> @@ -858,13 +858,13 @@ exports[`HeatMapChart snapshot tests should render HeatMapChart correctly with n { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(143.11881188118812, 57.49009900990099)" /> @@ -888,13 +888,13 @@ exports[`HeatMapChart snapshot tests should render HeatMapChart correctly with n { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(143.11881188118812, 57.49009900990099)" /> @@ -918,13 +918,13 @@ exports[`HeatMapChart snapshot tests should render HeatMapChart correctly with n { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(143.11881188118812, 57.49009900990099)" /> @@ -1428,13 +1428,13 @@ exports[`HeatMapChart snapshot tests should render axis labels correctly When cu { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(143.11881188118812, 57.49009900990099)" > @@ -1460,13 +1460,13 @@ exports[`HeatMapChart snapshot tests should render axis labels correctly When cu { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(143.11881188118812, 57.49009900990099)" > @@ -1492,13 +1492,13 @@ exports[`HeatMapChart snapshot tests should render axis labels correctly When cu { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(143.11881188118812, 57.49009900990099)" > @@ -1524,13 +1524,13 @@ exports[`HeatMapChart snapshot tests should render axis labels correctly When cu { -moz-osx-font-smoothing: grayscale; -webkit-font-smoothing: antialiased; - fill: #ffffff; font-family: 'Segoe UI', 'Segoe UI Web (West European)', 'Segoe UI', -apple-system, BlinkMacSystemFont, 'Roboto', 'Helvetica Neue', sans-serif; font-size: 14px; font-weight: 600; pointer-events: none; } dominant-baseline="middle" + fill="#323130" text-anchor="middle" transform="translate(143.11881188118812, 57.49009900990099)" > diff --git a/packages/charts/react-charting/src/utilities/colors.ts b/packages/charts/react-charting/src/utilities/colors.ts index ff7ec92b35be45..d58c07bf0244d5 100644 --- a/packages/charts/react-charting/src/utilities/colors.ts +++ b/packages/charts/react-charting/src/utilities/colors.ts @@ -1,3 +1,5 @@ +import { rgb as d3Rgb } from 'd3-color'; + export const DataVizPalette = { color1: 'qualitative.1', color2: 'qualitative.2', @@ -141,3 +143,26 @@ export const getColorFromToken = (token: string, isDarkTheme: boolean = false): } return token; }; + +//For reference to how these numbers are calculated, refer https://www.w3.org/TR/WCAG/#dfn-contrast-ratio +const rgbLrgb1 = (v: number): number => { + return v <= 0.04045 ? v / 12.92 : ((v + 0.055) / 1.055) ** 2.4; +}; + +const rgbLrgb = ({ r, g, b }: { r: number; g: number; b: number }): { r: number; g: number; b: number } => { + return { + r: rgbLrgb1(r / 255), + g: rgbLrgb1(g / 255), + b: rgbLrgb1(b / 255), + }; +}; + +const lrgbLuminance = ({ r, g, b }: { r: number; g: number; b: number }): number => { + return 0.2126 * r + 0.7152 * g + 0.0722 * b; +}; + +export const getColorContrast = (c1: string, c2: string): number => { + const l1 = lrgbLuminance(rgbLrgb(d3Rgb(c1))); + const l2 = lrgbLuminance(rgbLrgb(d3Rgb(c2))); + return (Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05); +}; diff --git a/packages/charts/react-charting/src/utilities/utilities.ts b/packages/charts/react-charting/src/utilities/utilities.ts index 9396c424fdce08..1655dba0fbc66c 100644 --- a/packages/charts/react-charting/src/utilities/utilities.ts +++ b/packages/charts/react-charting/src/utilities/utilities.ts @@ -1426,3 +1426,12 @@ export function areArraysEqual(arr1?: string[], arr2?: string[]): boolean { } return true; } + +const cssVarRegExp = /var\((--[a-zA-Z0-9\-]+)\)/g; + +export function resolveCSSVariables(chartContainer: HTMLElement, styleRules: string) { + const containerStyles = getComputedStyle(chartContainer); + return styleRules.replace(cssVarRegExp, (match, group1) => { + return containerStyles.getPropertyValue(group1); + }); +} diff --git a/yarn.lock b/yarn.lock index 60998a81babad6..721f54e0470a68 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5079,6 +5079,11 @@ dependencies: "@types/d3-selection" "*" +"@types/d3-color@^3.0.0": + version "3.1.3" + resolved "https://registry.yarnpkg.com/@types/d3-color/-/d3-color-3.1.3.tgz#368c961a18de721da8200e80bf3943fb53136af2" + integrity sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A== + "@types/d3-dsv@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/d3-dsv/-/d3-dsv-3.0.0.tgz#f3c61fb117bd493ec0e814856feb804a14cfc311" @@ -9365,7 +9370,7 @@ d3-collection@^1.0.7: resolved "https://registry.yarnpkg.com/d3-collection/-/d3-collection-1.0.7.tgz#349bd2aa9977db071091c13144d5e4f16b5b310e" integrity sha512-ii0/r5f4sjKNTfh84Di+DpztYwqKhEyUlKoPrzUFfeSkWxjW49xU2QzO9qrPrNkpdI0XJkfzvmTu8V2Zylln6A== -"d3-color@1 - 3", d3-color@^3.1.0: +"d3-color@1 - 3", d3-color@^3.0.0, d3-color@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/d3-color/-/d3-color-3.1.0.tgz#395b2833dfac71507f12ac2f7af23bf819de24e2" integrity sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==